[mlpack-svn] r16304 - mlpack/trunk/src/mlpack/methods/fastmks

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Tue Feb 18 14:26:52 EST 2014


Author: rcurtin
Date: Tue Feb 18 14:26:52 2014
New Revision: 16304

Log:
Use TraversalInfo for FastMKS.  Right now, the parent-child prune is not
implementd, so this is significantly slower than the released version (but it at
least works, unlike the last svn revision).


Modified:
   mlpack/trunk/src/mlpack/methods/fastmks/fastmks_rules_impl.hpp

Modified: mlpack/trunk/src/mlpack/methods/fastmks/fastmks_rules_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/fastmks/fastmks_rules_impl.hpp	(original)
+++ mlpack/trunk/src/mlpack/methods/fastmks/fastmks_rules_impl.hpp	Tue Feb 18 14:26:52 2014
@@ -218,6 +218,7 @@
   // so we construct the same bounds that were used when Score() was called with
   // the parents, except with the tighter distance bounds.  Sometimes this
   // allows us to prune nodes without evaluating the base cases between them.
+/*
   if ((queryParent != NULL) &&
       (queryParent->Stat().LastKernelNode() == (void*) &referenceNode))
   {
@@ -276,7 +277,7 @@
 
     if (maxKernelBound < bestKernel)
       return DBL_MAX;
-  }
+  }*/
 
   // We were unable to perform a parent-child or parent-parent prune, so now we
   // must calculate kernel evaluation, if necessary.
@@ -284,67 +285,29 @@
   if (tree::TreeTraits<TreeType>::FirstPointIsCentroid)
   {
     // For this type of tree, we may have already calculated the base case in
-    // the parents.  So see if it is already cached there.
-    bool alreadyDone = false;
-    if ((queryNode.Parent() != NULL) &&
-        (queryNode.Parent()->Point(0) == queryNode.Point(0)))
-    {
-      TreeType* lastRef = (TreeType*)
-          queryNode.Parent()->Stat().LastKernelNode();
-      if (lastRef->Point(0) == referenceNode.Point(0))
-      {
-        // The query node parent was evaluated with the reference node.
-        kernelEval = queryNode.Parent()->Stat().LastKernel();
-        alreadyDone = true;
-      }
-    }
-
-    if ((referenceNode.Parent() != NULL) &&
-        (referenceNode.Parent()->Point(0) == referenceNode.Point(0)))
-    {
-      TreeType* lastQuery = (TreeType*)
-          referenceNode.Parent()->Stat().LastKernelNode();
-      if (lastQuery->Point(0) == queryNode.Point(0))
-      {
-        // The reference node parent was evaluated with the query node.
-        kernelEval = referenceNode.Parent()->Stat().LastKernel();
-        alreadyDone = true;
-      }
-    }
-
-    TreeType* lastRefNode = (TreeType*) referenceNode.Stat().LastKernelNode();
-    if ((lastRefNode != NULL) && (queryNode.Point(0) == lastRefNode->Point(0)))
+    // the parents.
+    if ((traversalInfo.LastQueryNode() != NULL) &&
+        (traversalInfo.LastReferenceNode() != NULL) &&
+        (traversalInfo.LastQueryNode()->Point(0) == queryNode.Point(0)) &&
+        (traversalInfo.LastReferenceNode()->Point(0) == referenceNode.Point(0)))
     {
-      // The kernel evaluation was already performed and is saved by the
-      // reference node.
-      kernelEval = referenceNode.Stat().LastKernel();
-      alreadyDone = true;
-    }
+      // Base case already done.
+      kernelEval = traversalInfo.LastBaseCase();
 
-    TreeType* lastQueryNode = (TreeType*) queryNode.Stat().LastKernelNode();
-    if ((lastQueryNode != NULL) &&
-        (referenceNode.Point(0) == lastQueryNode->Point(0)))
-    {
-      // The kernel evaluation was already performed and is saved by the query
-      // node.
-      kernelEval = queryNode.Stat().LastKernel();
-      alreadyDone = true;
+      // When BaseCase() is called after Score(), these must be correct so that
+      // another kernel evaluation is not performed.
+      lastQueryIndex = queryNode.Point(0);
+      lastReferenceIndex = referenceNode.Point(0);
     }
-
-    if (!alreadyDone)
+    else
     {
       // The kernel must be evaluated, but it is between points in the dataset,
       // so we can call BaseCase().  BaseCase() will set lastQueryIndex and
       // lastReferenceIndex correctly.
       kernelEval = BaseCase(queryNode.Point(0), referenceNode.Point(0));
     }
-    else
-    {
-      // When BaseCase() is called after Score(), these must be correct so that
-      // another kernel evaluation is not performed.
-      lastQueryIndex = queryNode.Point(0);
-      lastReferenceIndex = referenceNode.Point(0);
-    }
+
+    traversalInfo.LastBaseCase() = kernelEval;
   }
   else
   {
@@ -394,10 +357,8 @@
   }
 
   // Store relevant information for parent-child pruning.
-  queryNode.Stat().LastKernel() = kernelEval;
-  queryNode.Stat().LastKernelNode() = (void*) &referenceNode;
-  referenceNode.Stat().LastKernel() = kernelEval;
-  referenceNode.Stat().LastKernelNode() = (void*) &queryNode;
+  traversalInfo.LastQueryNode() = &queryNode;
+  traversalInfo.LastReferenceNode() = &referenceNode;
 
   // We return the inverse of the maximum kernel so that larger kernels are
   // recursed into first.



More information about the mlpack-svn mailing list