[mlpack-svn] r12668 - mlpack/trunk/src/mlpack/core/tree/traversers

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Wed May 9 18:11:05 EDT 2012


Author: rcurtin
Date: 2012-05-09 18:11:04 -0400 (Wed, 09 May 2012)
New Revision: 12668

Modified:
   mlpack/trunk/src/mlpack/core/tree/traversers/dual_tree_depth_first_traverser.hpp
Log:
Make this an iterative implementation.


Modified: mlpack/trunk/src/mlpack/core/tree/traversers/dual_tree_depth_first_traverser.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/tree/traversers/dual_tree_depth_first_traverser.hpp	2012-05-09 20:30:30 UTC (rev 12667)
+++ mlpack/trunk/src/mlpack/core/tree/traversers/dual_tree_depth_first_traverser.hpp	2012-05-09 22:11:04 UTC (rev 12668)
@@ -10,6 +10,7 @@
 #define __MLPACK_CORE_TREE_TRAVERSERS_DUAL_TREE_DEPTH_FIRST_TRAVERSER_HPP
 
 #include <mlpack/core.hpp>
+#include <stack>
 
 namespace mlpack {
 namespace tree {
@@ -24,48 +25,70 @@
 
   void Traverse(TreeType& queryNode, TreeType& referenceNode)
   {
-    // Check if pruning can occur.
-    if (rule.CanPrune(queryNode, referenceNode))
-    {
-      numPrunes++;
-      return;
-    }
+    // Each of these stacks should have the same number of elements in them.
+    std::stack<TreeType*> queryStack;
+    std::stack<TreeType*> referenceStack;
+    queryStack.push(&queryNode);
+    referenceStack.push(&referenceNode);
 
-    // Run the base case for any points.  We must have points in both trees.
-    if ((queryNode.NumPoints() > 0) && (referenceNode.NumPoints() > 0))
+    while (!queryStack.empty())
     {
-      for (size_t i = 0; i < queryNode.NumPoints(); ++i)
-        for (size_t j = 0; j < referenceNode.NumPoints(); ++j)
-          rule.BaseCase(queryNode.Point(i), referenceNode.Point(j));
-    }
+      TreeType& query = *queryStack.top();
+      TreeType& reference = *referenceStack.top();
+      queryStack.pop();
+      referenceStack.pop();
 
-    // Find the correct way to recurse given these two points.
-    arma::Mat<size_t> recursionOrder;
-    bool queryRecurse;
-    bool referenceRecurse;
-    rule.RecursionOrder(queryNode, referenceNode, recursionOrder, queryRecurse,
-                        referenceRecurse);
+      // Check if pruning can occur.
+      if (rule.CanPrune(query, reference))
+      {
+        numPrunes++;
+        return;
+      }
 
-    // The RuleType has told us what we need to recurse on; act accordingly.
-    if (queryRecurse && referenceRecurse) // Recurse on both trees.
-    {
-      for (size_t i = 0; i < recursionOrder.n_cols; ++i)
-        Traverse(queryNode.Child(recursionOrder(0, i)),
-                 referenceNode.Child(recursionOrder(1, i)));
+      // Run the base case for any points.  We must have points in both trees.
+      if ((query.NumPoints() > 0) && (reference.NumPoints() > 0))
+      {
+        for (size_t i = 0; i < query.NumPoints(); ++i)
+          for (size_t j = 0; j < reference.NumPoints(); ++j)
+            rule.BaseCase(query.Point(i), reference.Point(j));
+      }
+
+      // Find the correct way to recurse given these two points.
+      arma::Mat<size_t> recursionOrder;
+      bool queryRecurse;
+      bool referenceRecurse;
+      rule.RecursionOrder(query, reference, recursionOrder, queryRecurse,
+          referenceRecurse);
+
+      // The RuleType has told us what we need to recurse on; act accordingly.
+      if (queryRecurse && referenceRecurse) // Recurse on both trees.
+      {
+        for (size_t i = 0; i < recursionOrder.n_cols; ++i)
+        {
+          queryStack.push(&(query.Child(recursionOrder(0, i))));
+          referenceStack.push(&(reference.Child(recursionOrder(1, i))));
+        }
+      }
+      else if (queryRecurse) // Only recurse on query tree.
+      {
+        for (size_t i = 0; i < recursionOrder.n_cols; ++i)
+        {
+          queryStack.push(&(query.Child(recursionOrder(0, i))));
+          referenceStack.push(&reference);
+        }
+      }
+      else if (referenceRecurse) // Only recurse on reference tree.
+      {
+        for (size_t i = 0; i < recursionOrder.n_cols; ++i)
+        {
+          queryStack.push(&query);
+          referenceStack.push(&(reference.Child(recursionOrder(1, i))));
+        }
+      }
+
+      // Now, after recursion, update any information.
+      rule.UpdateAfterRecursion(query, reference);
     }
-    else if (queryRecurse) // Only recurse on query tree.
-    {
-      for (size_t i = 0; i < recursionOrder.n_cols; ++i)
-        Traverse(queryNode.Child(recursionOrder(0, i)), referenceNode);
-    }
-    else if (referenceRecurse) // Only recurse on reference tree.
-    {
-      for (size_t i = 0; i < recursionOrder.n_cols; ++i)
-        Traverse(queryNode, referenceNode.Child(recursionOrder(1, i)));
-    }
-
-    // Now, after recursion, update any information.
-    rule.UpdateAfterRecursion(queryNode, referenceNode);
   }
 
   size_t NumPrunes() const { return numPrunes; }




More information about the mlpack-svn mailing list