[mlpack-git] master, mlpack-1.0.x: Clean up RangeSearch implementation so it works with TraversalInfo struct. (945fac6)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Mar 5 21:43:59 EST 2015


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

On branches: master,mlpack-1.0.x
Link       : https://github.com/mlpack/mlpack/compare/904762495c039e345beba14c1142fd719b3bd50e...f94823c800ad6f7266995c700b1b630d5ffdcf40

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

commit 945fac6fcd0cbfa7b108e254d7c6679785d3fb52
Author: Ryan Curtin <ryan at ratml.org>
Date:   Mon Feb 17 14:53:41 2014 +0000

    Clean up RangeSearch implementation so it works with TraversalInfo struct.


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

945fac6fcd0cbfa7b108e254d7c6679785d3fb52
 .../range_search/range_search_rules_impl.hpp       | 76 ++++------------------
 1 file changed, 13 insertions(+), 63 deletions(-)

diff --git a/src/mlpack/methods/range_search/range_search_rules_impl.hpp b/src/mlpack/methods/range_search/range_search_rules_impl.hpp
index 8103efb..f84ba37 100644
--- a/src/mlpack/methods/range_search/range_search_rules_impl.hpp
+++ b/src/mlpack/methods/range_search/range_search_rules_impl.hpp
@@ -49,9 +49,6 @@ double RangeSearchRules<MetricType, TreeType>::BaseCase(
   if ((lastQueryIndex == queryIndex) && (lastReferenceIndex == referenceIndex))
     return 0.0; // No value to return... this shouldn't do anything bad.
 
-//  if (queryIndex == 0 && referenceIndex == 0)
-//    Log::Warn << "base case 0 0 called!\n";
-
   const double distance = metric.Evaluate(querySet.unsafe_col(queryIndex),
       referenceSet.unsafe_col(referenceIndex));
 
@@ -148,68 +145,22 @@ double RangeSearchRules<MetricType, TreeType>::Score(TreeType& queryNode,
   {
     // It is possible that the base case has already been calculated.
     double baseCase = 0.0;
-    bool alreadyDone = false;
-    if (tree::TreeTraits<TreeType>::HasSelfChildren)
+    if ((traversalInfo.LastQueryNode() != NULL) &&
+        (traversalInfo.LastReferenceNode() != NULL) &&
+        (traversalInfo.LastQueryNode()->Point(0) == queryNode.Point(0)) &&
+        (traversalInfo.LastReferenceNode()->Point(0) == referenceNode.Point(0)))
     {
-      TreeType* lastQuery = (TreeType*) referenceNode.Stat().LastDistanceNode();
-      TreeType* lastRef = (TreeType*) queryNode.Stat().LastDistanceNode();
-
-      // Did the query node's last combination do the base case?
-      if ((lastRef != NULL) && (referenceNode.Point(0) == lastRef->Point(0)))
-      {
-        baseCase = queryNode.Stat().LastDistance();
-        alreadyDone = true;
-      }
-
-      // Did the reference node's last combination do the base case?
-      if ((lastQuery != NULL) && (queryNode.Point(0) == lastQuery->Point(0)))
-      {
-        baseCase = referenceNode.Stat().LastDistance();
-        alreadyDone = true;
-      }
-
-      // If the query node is a self-child, did the query parent's last
-      // combination do the base case?
-      if ((queryNode.Parent() != NULL) &&
-          (queryNode.Point(0) == queryNode.Parent()->Point(0)))
-      {
-        TreeType* lastParentRef = (TreeType*)
-            queryNode.Parent()->Stat().LastDistanceNode();
-        if ((lastParentRef != NULL) &&
-            (referenceNode.Point(0) == lastParentRef->Point(0)))
-        {
-          baseCase = queryNode.Parent()->Stat().LastDistance();
-          alreadyDone = true;
-        }
-      }
-
-      // If the reference node is a self-child, did the reference parent's last
-      // combination do the base case?
-      if ((referenceNode.Parent() != NULL) &&
-          (referenceNode.Point(0) == referenceNode.Parent()->Point(0)))
-      {
-        TreeType* lastQueryRef = (TreeType*)
-            referenceNode.Parent()->Stat().LastDistanceNode();
-        if ((lastQueryRef != NULL) &&
-            (queryNode.Point(0) == lastQueryRef->Point(0)))
-        {
-          baseCase = referenceNode.Parent()->Stat().LastDistance();
-          alreadyDone = true;
-        }
-      }
-    }
+      baseCase = traversalInfo.LastBaseCase();
 
-    if (!alreadyDone)
-    {
-      // We must calculate the base case.
-      baseCase = BaseCase(queryNode.Point(0), referenceNode.Point(0));
-    }
-    else
-    {
       // Make sure that if BaseCase() is called, we don't duplicate results.
       lastQueryIndex = queryNode.Point(0);
       lastReferenceIndex = referenceNode.Point(0);
     }
+    else
+    {
+      // We must calculate the base case.
+      baseCase = BaseCase(queryNode.Point(0), referenceNode.Point(0));
+    }
 
     distances.Lo() = baseCase - queryNode.FurthestDescendantDistance()
         - referenceNode.FurthestDescendantDistance();
@@ -217,10 +168,7 @@ double RangeSearchRules<MetricType, TreeType>::Score(TreeType& queryNode,
         + referenceNode.FurthestDescendantDistance();
 
     // Update the last distances performed for the query and reference node.
-    queryNode.Stat().LastDistanceNode() = (void*) &referenceNode;
-    queryNode.Stat().LastDistance() = baseCase;
-    referenceNode.Stat().LastDistanceNode() = (void*) &queryNode;
-    referenceNode.Stat().LastDistance() = baseCase;
+    traversalInfo.LastBaseCase() = baseCase;
   }
   else
   {
@@ -243,6 +191,8 @@ double RangeSearchRules<MetricType, TreeType>::Score(TreeType& queryNode,
 
   // Otherwise the score doesn't matter.  Recursion order is irrelevant in range
   // search.
+  traversalInfo.LastQueryNode() = &queryNode;
+  traversalInfo.LastReferenceNode() = &referenceNode;
   return 0.0;
 }
 



More information about the mlpack-git mailing list