[mlpack-svn] r12693 - in 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 16 14:57:39 EDT 2012
Author: rcurtin
Date: 2012-05-16 14:57:39 -0400 (Wed, 16 May 2012)
New Revision: 12693
Added:
mlpack/trunk/src/mlpack/core/tree/traversers/dual_cover_tree_traverser.hpp
Modified:
mlpack/trunk/src/mlpack/core/tree/CMakeLists.txt
mlpack/trunk/src/mlpack/core/tree/binary_space_tree.hpp
Log:
Add preferred traverser and dual cover tree traverser (which doesn't prune at
the moment).
Modified: mlpack/trunk/src/mlpack/core/tree/CMakeLists.txt
===================================================================
--- mlpack/trunk/src/mlpack/core/tree/CMakeLists.txt 2012-05-16 18:46:38 UTC (rev 12692)
+++ mlpack/trunk/src/mlpack/core/tree/CMakeLists.txt 2012-05-16 18:57:39 UTC (rev 12693)
@@ -21,6 +21,7 @@
traversers/single_tree_depth_first_traverser.hpp
traversers/dual_tree_depth_first_traverser.hpp
traversers/dual_tree_breadth_first_traverser.hpp
+ traversers/dual_cover_tree_traverser.hpp
)
# add directory name to sources
Modified: mlpack/trunk/src/mlpack/core/tree/binary_space_tree.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/tree/binary_space_tree.hpp 2012-05-16 18:46:38 UTC (rev 12692)
+++ mlpack/trunk/src/mlpack/core/tree/binary_space_tree.hpp 2012-05-16 18:57:39 UTC (rev 12693)
@@ -11,7 +11,11 @@
#include "statistic.hpp"
#include "traversers/single_tree_depth_first_traverser.hpp"
+#include "traversers/dual_tree_depth_first_traverser.hpp"
+// Bad!
+#include <mlpack/methods/neighbor_search/neighbor_search_rules.hpp>
+
namespace mlpack {
namespace tree /** Trees and tree-building procedures. */ {
@@ -74,6 +78,22 @@
> Type;
};
+ template<typename RuleType>
+ struct PreferredDualTraverser
+ {
+ typedef DualTreeDepthFirstTraverser<
+ BinarySpaceTree<BoundType, StatisticType, MatType>,
+ RuleType
+ > Type;
+ };
+
+ template<typename SortPolicy, typename MetricType, typename TreeType>
+ struct PreferredRules
+ {
+ typedef neighbor::NeighborSearchRules<SortPolicy, MetricType, TreeType>
+ Type;
+ };
+
/**
* Construct this as the root node of a binary space tree using the given
* dataset. This will modify the ordering of the points in the dataset!
Added: mlpack/trunk/src/mlpack/core/tree/traversers/dual_cover_tree_traverser.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/tree/traversers/dual_cover_tree_traverser.hpp (rev 0)
+++ mlpack/trunk/src/mlpack/core/tree/traversers/dual_cover_tree_traverser.hpp 2012-05-16 18:57:39 UTC (rev 12693)
@@ -0,0 +1,91 @@
+/**
+ * @file dual_cover_tree_traverser.hpp
+ * @author Ryan Curtin
+ *
+ * A dual-tree traverser for the cover tree.
+ */
+#ifndef __MLPACK_CORE_TREE_DUAL_COVER_TREE_TRAVERSER_HPP
+#define __MLPACK_CORE_TREE_DUAL_COVER_TREE_TRAVERSER_HPP
+
+#include <mlpack/core.hpp>
+#include <queue>
+
+namespace mlpack {
+namespace tree {
+
+template<typename TreeType, typename RuleType>
+class DualCoverTreeTraverser
+{
+ public:
+ DualCoverTreeTraverser(RuleType& rule) : rule(rule), numPrunes(0) { }
+
+ void Traverse(TreeType& queryNode, TreeType& referenceNode)
+ {
+ Traverse(queryNode, referenceNode, size_t() - 1);
+ }
+
+ void Traverse(TreeType& queryNode, TreeType& referenceNode, size_t parent)
+ {
+ std::queue<TreeType*> referenceQueue;
+ std::queue<size_t> referenceParents;
+
+ referenceQueue.push(&referenceNode);
+ referenceParents.push(parent);
+
+ while (!referenceQueue.empty())
+ {
+ TreeType& reference = *referenceQueue.front();
+ referenceQueue.pop();
+
+ size_t refParent = referenceParents.front();
+ referenceParents.pop();
+
+ // Do the base case, if we need to.
+ if (refParent != reference.Point())
+ rule.BaseCase(queryNode.Point(), reference.Point());
+
+ if (((queryNode.Scale() < reference.Scale()) &&
+ (reference.NumChildren() != 0)) ||
+ (queryNode.NumChildren() == 0))
+ {
+ // We must descend the reference node. Pruning happens here.
+ for (size_t i = 0; i < reference.NumChildren(); ++i)
+ {
+ // Can we prune?
+ // if (!rule.CanPrune(queryNode, reference.Child(i)))
+ {
+ referenceQueue.push(&(reference.Child(i)));
+ referenceParents.push(reference.Point());
+ }
+// else
+ {
+ numPrunes++;
+ }
+ }
+ }
+ else
+ {
+ // We must descend the query node. No pruning happens here. For the
+ // self-child, we trick the recursion into thinking that the base case
+ // has already been done (which it has).
+ if (queryNode.NumChildren() >= 1)
+ Traverse(queryNode.Child(0), reference, reference.Point());
+
+ for (size_t i = 1; i < queryNode.NumChildren(); ++i)
+ Traverse(queryNode.Child(i), reference, size_t() - 1);
+ }
+ }
+ }
+
+ size_t NumPrunes() const { return numPrunes; }
+ size_t& NumPrunes() { return numPrunes; }
+
+ private:
+ RuleType& rule;
+ size_t numPrunes;
+};
+
+}; // namespace tree
+}; // namespace mlpack
+
+#endif
More information about the mlpack-svn
mailing list