[mlpack-svn] r12680 - mlpack/trunk/src/mlpack/core/tree/traversers
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Fri May 11 12:56:03 EDT 2012
Author: rcurtin
Date: 2012-05-11 12:56:03 -0400 (Fri, 11 May 2012)
New Revision: 12680
Modified:
mlpack/trunk/src/mlpack/core/tree/traversers/dual_tree_depth_first_traverser.hpp
Log:
I didn't do this right; I forgot about the "UpdateAfterRecursion" step and broke
everything. So... revert to the recursive implementation for now.
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-11 16:19:51 UTC (rev 12679)
+++ mlpack/trunk/src/mlpack/core/tree/traversers/dual_tree_depth_first_traverser.hpp 2012-05-11 16:56:03 UTC (rev 12680)
@@ -10,7 +10,6 @@
#define __MLPACK_CORE_TREE_TRAVERSERS_DUAL_TREE_DEPTH_FIRST_TRAVERSER_HPP
#include <mlpack/core.hpp>
-#include <stack>
namespace mlpack {
namespace tree {
@@ -25,70 +24,48 @@
void Traverse(TreeType& queryNode, TreeType& referenceNode)
{
- // 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);
+ // Check if pruning can occur.
+ if (rule.CanPrune(queryNode, referenceNode))
+ {
+ numPrunes++;
+ return;
+ }
- while (!queryStack.empty())
+ // Run the base case for any points. We must have points in both trees.
+ if ((queryNode.NumPoints() > 0) && (referenceNode.NumPoints() > 0))
{
- TreeType& query = *queryStack.top();
- TreeType& reference = *referenceStack.top();
- queryStack.pop();
- referenceStack.pop();
+ 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));
+ }
- // Check if pruning can occur.
- if (rule.CanPrune(query, reference))
- {
- numPrunes++;
- continue;
- }
+ // 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);
- // 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);
+ // 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)));
}
+ 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