[mlpack-git] master: Avoid calculating distances after an Elkan prune. Slight, nearly negligible performance gains. (4a5add5)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Mar 12 16:01:43 EDT 2015


Repository : https://github.com/mlpack/mlpack

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/eddd7167d69b6c88b271ef2e51d1c20e13f1acd8...70342dd8e5c17e0c164cfb8189748671e9c0dd44

>---------------------------------------------------------------

commit 4a5add507fc5722cd3a992dca825392dd45af33b
Author: Ryan Curtin <ryan at ratml.org>
Date:   Tue Jan 13 16:04:44 2015 -0500

    Avoid calculating distances after an Elkan prune. Slight, nearly negligible performance gains.


>---------------------------------------------------------------

4a5add507fc5722cd3a992dca825392dd45af33b
 .../methods/kmeans/dual_tree_kmeans_rules_impl.hpp | 43 ++++++++++++----------
 1 file changed, 24 insertions(+), 19 deletions(-)

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 3208737..8608c03 100644
--- a/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp
+++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp
@@ -114,13 +114,8 @@ double DualTreeKMeansRules<MetricType, TreeType>::Score(
 
   double score = ElkanTypeScore(queryNode, referenceNode);
 
-  // We also have to update things if the closest query node is null.  This can
-  // probably be improved.
-  const double minDistance = referenceNode.MinDistance(&queryNode);
-  const double maxDistance = referenceNode.MaxDistance(&queryNode);
-  distanceCalculations += 2;
-  score = PellegMooreScore(queryNode, referenceNode, minDistance);
-
+  // If there's no closest query node assigned, but the parent has one, take
+  // that one.
   if (referenceNode.Stat().ClosestQueryNode() == NULL &&
       referenceNode.Parent() != NULL &&
       referenceNode.Parent()->Stat().ClosestQueryNode() != NULL)
@@ -132,19 +127,29 @@ double DualTreeKMeansRules<MetricType, TreeType>::Score(
         referenceNode.Stat().MaxQueryNodeDistance());
   }
 
-  if (maxDistance < referenceNode.Stat().MaxQueryNodeDistance() ||
-      referenceNode.Stat().ClosestQueryNode() == NULL)
-  {
-    referenceNode.Stat().ClosestQueryNode() = (void*) &queryNode;
-    referenceNode.Stat().MinQueryNodeDistance() = minDistance;
-    referenceNode.Stat().MaxQueryNodeDistance() = maxDistance;
-  }
-  else if (IsDescendantOf(*((TreeType*)
-      referenceNode.Stat().ClosestQueryNode()), queryNode))
+  if (score != DBL_MAX)
   {
-    referenceNode.Stat().ClosestQueryNode() == (void*) &queryNode;
-    referenceNode.Stat().MinQueryNodeDistance() = minDistance;
-    referenceNode.Stat().MaxQueryNodeDistance() = maxDistance;
+    // We also have to update things if the closest query node is null.  This
+    // can probably be improved.
+    const double minDistance = referenceNode.MinDistance(&queryNode);
+    const double maxDistance = referenceNode.MaxDistance(&queryNode);
+    distanceCalculations += 2;
+    score = PellegMooreScore(queryNode, referenceNode, minDistance);
+
+    if (maxDistance < referenceNode.Stat().MaxQueryNodeDistance() ||
+        referenceNode.Stat().ClosestQueryNode() == NULL)
+    {
+      referenceNode.Stat().ClosestQueryNode() = (void*) &queryNode;
+      referenceNode.Stat().MinQueryNodeDistance() = minDistance;
+      referenceNode.Stat().MaxQueryNodeDistance() = maxDistance;
+    }
+    else if (IsDescendantOf(*((TreeType*)
+        referenceNode.Stat().ClosestQueryNode()), queryNode))
+    {
+      referenceNode.Stat().ClosestQueryNode() == (void*) &queryNode;
+      referenceNode.Stat().MinQueryNodeDistance() = minDistance;
+      referenceNode.Stat().MaxQueryNodeDistance() = maxDistance;
+    }
   }
 
   if (score == DBL_MAX)



More information about the mlpack-git mailing list