[mlpack-svn] r16302 - mlpack/trunk/src/mlpack/methods/range_search

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Mon Feb 17 09:53:41 EST 2014


Author: rcurtin
Date: Mon Feb 17 09:53:41 2014
New Revision: 16302

Log:
Clean up RangeSearch implementation so it works with TraversalInfo struct.


Modified:
   mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp

Modified: mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp	(original)
+++ mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp	Mon Feb 17 09:53:41 2014
@@ -49,9 +49,6 @@
   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 @@
   {
     // 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();
+      baseCase = traversalInfo.LastBaseCase();
 
-      // 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;
-        }
-      }
+      // Make sure that if BaseCase() is called, we don't duplicate results.
+      lastQueryIndex = queryNode.Point(0);
+      lastReferenceIndex = referenceNode.Point(0);
     }
-
-    if (!alreadyDone)
+    else
     {
       // 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);
-    }
 
     distances.Lo() = baseCase - queryNode.FurthestDescendantDistance()
         - referenceNode.FurthestDescendantDistance();
@@ -217,10 +168,7 @@
         + 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 @@
 
   // 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-svn mailing list