[mlpack-svn] r12730 - mlpack/trunk/src/mlpack/methods/maxip

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Fri May 18 23:44:35 EDT 2012


Author: rcurtin
Date: 2012-05-18 23:44:34 -0400 (Fri, 18 May 2012)
New Revision: 12730

Modified:
   mlpack/trunk/src/mlpack/methods/maxip/max_ip_impl.hpp
Log:
Rewrite to only use one queue.  Not very happy with this implementation.


Modified: mlpack/trunk/src/mlpack/methods/maxip/max_ip_impl.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/maxip/max_ip_impl.hpp	2012-05-19 02:39:04 UTC (rev 12729)
+++ mlpack/trunk/src/mlpack/methods/maxip/max_ip_impl.hpp	2012-05-19 03:44:34 UTC (rev 12730)
@@ -15,6 +15,14 @@
 namespace mlpack {
 namespace maxip {
 
+template<typename TreeType>
+struct SearchFrame
+{
+  TreeType* node;
+  size_t parent;
+  double parentEval;
+};
+
 template<typename KernelType>
 MaxIP<KernelType>::MaxIP(const arma::mat& referenceSet,
                          bool single,
@@ -124,28 +132,31 @@
     // Screw the CoverTreeTraverser, we'll implement it by hand.
     for (size_t queryIndex = 0; queryIndex < querySet.n_cols; ++queryIndex)
     {
-      std::queue<tree::CoverTree<IPMetric<KernelType> >*> pointQueue;
-      std::queue<size_t> parentQueue;
-      std::queue<double> parentEvalQueue;
-      pointQueue.push(referenceTree);
-      parentQueue.push(size_t() - 1); // Has no parent.
-      parentEvalQueue.push(0); // No possible parent evaluation.
+      std::queue<SearchFrame<tree::CoverTree<IPMetric<KernelType> > > >
+          frameQueue;
 
+      SearchFrame<tree::CoverTree<IPMetric<KernelType> > > nextFrame;
+      nextFrame.node = referenceTree;
+      nextFrame.parent = size_t() - 1;
+      nextFrame.parentEval = 0;
+
+      frameQueue.push(nextFrame);
+
       tree::CoverTree<IPMetric<KernelType> >* referenceNode;
       size_t currentParent;
       double currentParentEval;
       double eval; // Kernel evaluation.
 
-      while (!pointQueue.empty())
+      while (!frameQueue.empty())
       {
         // Get the information for this node.
-        referenceNode = pointQueue.front();
-        currentParent = parentQueue.front();
-        currentParentEval = parentEvalQueue.front();
+        const SearchFrame<tree::CoverTree<IPMetric<KernelType> > >& frame =
+            frameQueue.front();
+        referenceNode = frame.node;
+        currentParent = frame.parent;
+        currentParentEval = frame.parentEval;
 
-        pointQueue.pop();
-        parentQueue.pop();
-        parentEvalQueue.pop();
+        frameQueue.pop();
 
         // See if this has the same parent.
         if (referenceNode->Point() == currentParent)
@@ -183,9 +194,13 @@
           // We can't prune.  So add our children.
           for (size_t i = 0; i < referenceNode->NumChildren(); ++i)
           {
-            pointQueue.push(&(referenceNode->Child(i)));
-            parentQueue.push(referenceNode->Point());
-            parentEvalQueue.push(eval);
+            SearchFrame<tree::CoverTree<IPMetric<KernelType> > > nextFrame;
+
+            nextFrame.node = &(referenceNode->Child(i));
+            nextFrame.parent = referenceNode->Point();
+            nextFrame.parentEval = eval;
+
+            frameQueue.push(nextFrame);
           }
         }
         else




More information about the mlpack-svn mailing list