diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp index 6e61d73356..f08b4e15a7 100644 --- a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp +++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp @@ -165,6 +165,8 @@ bool IsDescendantOf( { if (potentialChild.Parent() == &potentialParent) return true; + else if (&potentialChild == &potentialParent) + return true; else if (potentialChild.Parent() == NULL) return false; else @@ -205,8 +207,8 @@ void DualTreeKMeans::TreeUpdate( const bool prunedLastIteration = node->Stat().HamerlyPruned(); node->Stat().HamerlyPruned() = false; - if (node->Begin() == 37408) - Log::Warn << "r37408c" << node->Count() << " has owner " << + if (node->Begin() == 23058) + Log::Warn << "r23058c" << node->Count() << " has owner " << node->Stat().Owner() << ".\n"; // The easy case: this node had an owner. @@ -229,8 +231,8 @@ node->Stat().Owner() << ".\n"; if (node->Stat().SecondClosestBound() == DBL_MAX && node->Parent() == NULL) node->Stat().SecondClosestBound() = 0.0; // Don't prune the root. - if (node->Begin() == 37408) - Log::Warn << "r37408c" << node->Count() << " scb " << + if (node->Begin() == 23058) + Log::Warn << "r23058c" << node->Count() << " scb " << node->Stat().SecondClosestBound() << " and lscb " << node->Stat().LastSecondClosestBound() << ".\n"; @@ -266,7 +268,7 @@ node->Stat().LastSecondClosestBound() << ".\n"; // of the second closest query node of the parent. if (node->Stat().SecondClosestQueryNode() != NULL) { - if (node->Begin() == 37408) + if (node->Begin() == 23058) { Log::Warn << "Second closest query node is q" << ((TreeType*) node->Stat().SecondClosestQueryNode())->Begin() << "c" << ((TreeType*) @@ -278,7 +280,7 @@ node->MinDistance((TreeType*) node->Stat().SecondClosestQueryNode()) << ".\n"; } if (node->Stat().ClosestQueryNode() != NULL) - if (node->Begin() == 37408) + if (node->Begin() == 23058) Log::Warn << "Closest query node: q" << ((TreeType*) node->Stat().ClosestQueryNode())->Begin() << "c" << ((TreeType*) node->Stat().ClosestQueryNode())->Count() << ", with MQND " << @@ -325,7 +327,7 @@ node->Stat().MinQueryNodeDistance() << ".\n"; if (secondClosestDistance < node->Stat().SecondClosestBound()) node->Stat().SecondClosestBound() = secondClosestDistance; - if (node->Begin() == 37408) + if (node->Begin() == 23058) Log::Warn << "After recalculation, closest for r" << node->Begin() << "c" << node->Count() << " is " << closest << ", with mQND " << node->Stat().MinQueryNodeDistance() << ", MQND" << node->Stat().MaxQueryNodeDistance() << ", and scb " << @@ -334,7 +336,7 @@ node->Stat().SecondClosestBound() << ", " << secondClosest << ".\n"; // if (node->Parent() != NULL && //node->Parent()->Stat().SecondClosestQueryNode() != NULL) -// if (node->Begin() == 37408) +// if (node->Begin() == 23058) // Log::Warn << "Parent's (r" << node->Parent()->Begin() << "c" //<< node->Parent()->Count() << ") second closest query node is q" << ((TreeType*) //node->Parent()->Stat().SecondClosestQueryNode())->Begin() << "c" << ((TreeType*) @@ -353,20 +355,30 @@ node->Stat().SecondClosestBound() << ", " << secondClosest << ".\n"; (TreeType*) parent->Stat().SecondClosestQueryNode(); TreeType* parentCqn = (parent == NULL) ? NULL : (TreeType*) parent->Stat().ClosestQueryNode(); + if (parentScqn != NULL && node->Begin() == 23058) + Log::Warn << "Parent (" << parent->Begin() << "c" << parent->Count() << +") SCB is " << parent->Stat().SecondClosestBound() << ", " + << "with q" << parentScqn->Begin() << "c" << parentScqn->Count() << +".\n"; if (scqn != NULL && parentScqn != NULL && !IsDescendantOf(*parentScqn, *scqn) && !IsDescendantOf(*parentCqn, *scqn) && (parent->Stat().SecondClosestBound() < node->Stat().SecondClosestBound())) { + if (node->Begin() == 23058) + Log::Warn << "Take parent's SCB of " << +parent->Stat().SecondClosestBound() << "; parent SCQN is " << +parentScqn->Begin() << "c" << parentScqn->Count() << ", parent CQN is " << +parentCqn->Begin() << "c" << parentCqn->Count() << ".\n"; node->Stat().SecondClosestBound() = parent->Stat().SecondClosestBound(); node->Stat().SecondClosestQueryNode() = parentScqn; } } - if (node->Begin() == 37408) + if (node->Begin() == 23058) { - Log::Warn << "Attempt Hamerly prune on r37408c" << node->Count() << + Log::Warn << "Attempt Hamerly prune on r23058c" << node->Count() << " with MQND " << node->Stat().MaxQueryNodeDistance() << ", scb " << node->Stat().SecondClosestBound() << ", owner " << node->Stat().Owner() << ", and clusterDistances " << clusterDistances[clusters] @@ -374,7 +386,7 @@ node->Stat().Owner() << ", and clusterDistances " << clusterDistances[clusters] } // Check the second bound. (This is time-consuming...) -/* arma::vec minDistances(centroids.n_cols); + arma::vec minDistances(centroids.n_cols); for (size_t j = 0; j < node->NumDescendants(); ++j) { arma::vec distances(centroids.n_cols); @@ -393,8 +405,8 @@ node->Stat().Owner() << ", and clusterDistances " << clusterDistances[clusters] } if (j == 0) - if (node->Begin() == 37408) - Log::Warn << "r37408c" << node->Count() << ": " << minDistances.t(); + if (node->Begin() == 23058) + Log::Warn << "r23058c" << node->Count() << ": " << minDistances.t(); if (secondClosestDist < node->Stat().SecondClosestBound() - 1e-15) { Log::Warn << "r" << node->Begin() << "c" << node->Count() << ":\n"; @@ -407,7 +419,7 @@ node->Stat().SecondClosestBound() << " is too loose! -- " << secondClosestDist << "! (" << node->Stat().SecondClosestBound() - secondClosestDist << ")\n"; } - }*/ + } if (node->Stat().MaxQueryNodeDistance() < node->Stat().SecondClosestBound() @@ -416,7 +428,7 @@ node->Stat().SecondClosestBound() << " is too loose! -- " << secondClosestDist node->Stat().HamerlyPruned() = true; if (!node->Parent()->Stat().HamerlyPruned()) { - if (node->Begin() == 37408) + if (node->Begin() == 23058) Log::Warn << "Mark r" << node->Begin() << "c" << node->Count() << " as " << "Hamerly pruned.\n"; hamerlyPruned += node->NumDescendants(); diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp index 7e1b09a2a6..28b6695f96 100644 --- a/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp +++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp @@ -113,8 +113,8 @@ double DualTreeKMeansRules::Score( traversalInfo.LastReferenceNode() = &referenceNode; - if (referenceNode.Begin() == 37408) - Log::Warn << "Visit r37408c" << referenceNode.Count() << ", q" << + if (referenceNode.Begin() == 23058) + Log::Warn << "Visit r23058c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" << queryNode.Count() << ".\n"; // If there's no closest query node assigned, but the parent has one, take @@ -123,8 +123,8 @@ queryNode.Begin() << "c" << queryNode.Count() << ".\n"; referenceNode.Parent() != NULL && referenceNode.Parent()->Stat().ClosestQueryNode() != NULL) { - if (referenceNode.Begin() == 37408) - Log::Warn << "Update closest query node for r37408c" << + if (referenceNode.Begin() == 23058) + Log::Warn << "Update closest query node for r23058c" << referenceNode.Count() << " to parent's, which is " << ((TreeType*) referenceNode.Parent()->Stat().ClosestQueryNode())->Begin() << "c" << @@ -139,8 +139,8 @@ referenceNode.Parent()->Stat().ClosestQueryNode())->Begin() << "c" << // referenceNode.Stat().SecondClosestBound() = std::min( // referenceNode.Parent()->Stat().SecondClosestBound(), // referenceNode.Stat().SecondClosestBound()); -// if (referenceNode.Begin() == 37408) -// Log::Warn << "Update second closest bound for r37408c" << +// if (referenceNode.Begin() == 23058) +// Log::Warn << "Update second closest bound for r23058c" << //referenceNode.Count() << " to parent's, which " // << "is " << referenceNode.Stat().SecondClosestBound() << ".\n"; } @@ -148,8 +148,8 @@ referenceNode.Parent()->Stat().ClosestQueryNode())->Begin() << "c" << double score = HamerlyTypeScore(referenceNode); if (score == DBL_MAX) { - if (referenceNode.Begin() == 37408) - Log::Warn << "Hamerly prune for r37408c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" << + if (referenceNode.Begin() == 23058) + Log::Warn << "Hamerly prune for r23058c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" << queryNode.Count() << ".\n"; if (origPruned == size_t(-1)) { @@ -175,8 +175,8 @@ queryNode.Count() << ".\n"; const double minDistance = referenceNode.MinDistance(&queryNode); ++distanceCalculations; score = PellegMooreScore(queryNode, referenceNode, minDistance); - if (referenceNode.Begin() == 37408) - Log::Warn << "mQND for r37408c" << referenceNode.Count() << " is " + if (referenceNode.Begin() == 23058) + Log::Warn << "mQND for r23058c" << referenceNode.Count() << " is " << referenceNode.Stat().MinQueryNodeDistance() << "; minDistance " << minDistance << ", scb " << referenceNode.Stat().SecondClosestBound() << ".\n"; @@ -195,8 +195,8 @@ referenceNode.Stat().SecondClosestBound() << ".\n"; referenceNode.Stat().MinQueryNodeDistance(); referenceNode.Stat().SecondClosestQueryNode() = referenceNode.Stat().ClosestQueryNode(); - if (referenceNode.Begin() == 37408) - Log::Warn << "scb for r37408c" << referenceNode.Count() << " taken " + if (referenceNode.Begin() == 23058) + Log::Warn << "scb for r23058c" << referenceNode.Count() << " taken " << "from minDistance, which is " << referenceNode.Stat().MinQueryNodeDistance() << ".\n"; } @@ -207,8 +207,8 @@ referenceNode.Stat().MinQueryNodeDistance() << ".\n"; { referenceNode.Stat().SecondClosestBound() = minDistance; referenceNode.Stat().SecondClosestQueryNode() = &queryNode; - if (referenceNode.Begin() == 37408) - Log::Warn << "scb for r37408c" << referenceNode.Count() << " taken " + if (referenceNode.Begin() == 23058) + Log::Warn << "scb for r23058c" << referenceNode.Count() << " taken " << "from minDistance for pruned query node, which is " << minDistance << ".\n"; } @@ -220,8 +220,8 @@ minDistance << ".\n"; referenceNode.Stat().MinQueryNodeDistance() = minDistance; referenceNode.Stat().MaxQueryNodeDistance() = maxDistance; - if (referenceNode.Begin() == 37408) - Log::Warn << "mQND for r37408c" << referenceNode.Count() << " updated to " << minDistance << " and " + if (referenceNode.Begin() == 23058) + Log::Warn << "mQND for r23058c" << referenceNode.Count() << " updated to " << minDistance << " and " << "MQND to " << maxDistance << " with furthest query node " << queryNode.Begin() << "c" << queryNode.Count() << ".\n"; } @@ -229,8 +229,8 @@ minDistance << ".\n"; else if (IsDescendantOf(*((TreeType*) referenceNode.Stat().ClosestQueryNode()), queryNode)) { - if (referenceNode.Begin() == 37408) - Log::Warn << "Old closest for r37408c" << referenceNode.Count() << + if (referenceNode.Begin() == 23058) + Log::Warn << "Old closest for r23058c" << referenceNode.Count() << " is q" << ((TreeType*) referenceNode.Stat().ClosestQueryNode())->Begin() << "c" << ((TreeType*) referenceNode.Stat().ClosestQueryNode())->Count() << " with mQND " << @@ -242,8 +242,8 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n"; referenceNode.Stat().MinQueryNodeDistance() = minDistance; referenceNode.Stat().MaxQueryNodeDistance() = maxDistance; - if (referenceNode.Begin() == 37408) - Log::Warn << "mQND for r37408c" << referenceNode.Count() << " updated to " << minDistance << " and " + if (referenceNode.Begin() == 23058) + Log::Warn << "mQND for r23058c" << referenceNode.Count() << " updated to " << minDistance << " and " << "MQND to " << maxDistance << " via descendant with fqn " << queryNode.Begin() << "c" << queryNode.Count() << ".\n"; } @@ -251,8 +251,8 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n"; { referenceNode.Stat().SecondClosestBound() = minDistance; referenceNode.Stat().SecondClosestQueryNode() = &queryNode; - if (referenceNode.Begin() == 37408) - Log::Warn << "scb for r37408c" << referenceNode.Count() << " updated to " << minDistance << " via " + if (referenceNode.Begin() == 23058) + Log::Warn << "scb for r23058c" << referenceNode.Count() << " updated to " << minDistance << " via " << queryNode.Begin() << "c" << queryNode.Count() << ".\n"; } } @@ -264,7 +264,7 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n"; ++distanceCalculations; if (minDistance < referenceNode.Stat().SecondClosestBound()) { - if (referenceNode.Begin() == 37408) + if (referenceNode.Begin() == 23058) Log::Warn << "After Elkan prune, update scb to " << minDistance << ".\n"; @@ -285,8 +285,8 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n"; if (score == DBL_MAX) { referenceNode.Stat().ClustersPruned() += queryNode.NumDescendants(); - if (referenceNode.Begin() == 37408) - Log::Warn << "For r37408c" << referenceNode.Count() << ", q" << + if (referenceNode.Begin() == 23058) + Log::Warn << "For r23058c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" << queryNode.Count() << " is pruned. Min distance is" << " " << queryNode.MinDistance(&referenceNode) << " and scb is " << referenceNode.Stat().SecondClosestBound() << ".\n"; @@ -344,7 +344,7 @@ double DualTreeKMeansRules::HamerlyTypeScore( { if (referenceNode.Stat().HamerlyPruned()) { -// if (referenceNode.Begin() == 37408) +// if (referenceNode.Begin() == 23058) // Log::Warn << "Hamerly prune! r" << referenceNode.Begin() << "c" << //referenceNode.Count() << ".\n"; return DBL_MAX; @@ -392,8 +392,8 @@ double DualTreeKMeansRules::ElkanTypeScore( queryNode)) && (&queryNode != (TreeType*) referenceNode.Stat().ClosestQueryNode())) { - if (referenceNode.Begin() == 37408) - Log::Warn << "Elkan prune r37408c" << referenceNode.Count() << ", q" << + if (referenceNode.Begin() == 23058) + Log::Warn << "Elkan prune r23058c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" << queryNode.Count() << "!\n"; // Then we can conclude d_max(best(N_r), N_r) <= d_min(N_q, N_r) which // means that N_q cannot possibly hold any clusters that own any points in @@ -413,14 +413,14 @@ double DualTreeKMeansRules::PellegMooreScore( // If the minimum distance to the node is greater than the bound, then every // cluster in the query node cannot possibly be the nearest neighbor of any of // the points in the reference node. -// if (referenceNode.Begin() == 37408) -// Log::Warn << "Pelleg-Moore prune attempt r37408c" << referenceNode.Count() << ", " +// if (referenceNode.Begin() == 23058) +// Log::Warn << "Pelleg-Moore prune attempt r23058c" << referenceNode.Count() << ", " // << "q" << queryNode.Begin() << "c" << queryNode.Count() << "; " // << "minDistance " << minDistance << ", MQND " << //referenceNode.Stat().MaxQueryNodeDistance() << ".\n"; if (minDistance > referenceNode.Stat().MaxQueryNodeDistance()) { -// if (referenceNode.Begin() == 37408) +// if (referenceNode.Begin() == 23058) // Log::Warn << "Attempt successful!\n"; return DBL_MAX; }