[mlpack-git] master: Add support for copying the reference tree in NeighborSearch class. (53476a6)
gitdub at mlpack.org
gitdub at mlpack.org
Tue Aug 23 15:58:25 EDT 2016
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/1148f1652e139c9037eb3813550090313d089a30...a8a8a1381b529a01420de6e792a4a1e7bd58a626
>---------------------------------------------------------------
commit 53476a617e3a216049f423e3057bac7176ff34b5
Author: MarcosPividori <marcos.pividori at gmail.com>
Date: Fri Aug 12 16:08:11 2016 -0300
Add support for copying the reference tree in NeighborSearch class.
>---------------------------------------------------------------
53476a617e3a216049f423e3057bac7176ff34b5
.../methods/neighbor_search/neighbor_search.hpp | 39 ++++++++++++++++++++++
.../neighbor_search/neighbor_search_impl.hpp | 35 +++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/src/mlpack/methods/neighbor_search/neighbor_search.hpp b/src/mlpack/methods/neighbor_search/neighbor_search.hpp
index f9806af..385cb39 100644
--- a/src/mlpack/methods/neighbor_search/neighbor_search.hpp
+++ b/src/mlpack/methods/neighbor_search/neighbor_search.hpp
@@ -225,6 +225,35 @@ class NeighborSearch
const MetricType metric = MetricType());
/**
+ * Initialize the NeighborSearch object with a copy of the given
+ * pre-constructed reference tree (this is the tree built on the points that
+ * will be searched). Optionally, choose to use single-tree mode. Naive mode
+ * is not available as an option for this constructor. Additionally, an
+ * instantiated distance metric can be given, for cases where the distance
+ * metric holds data.
+ *
+ * This method will copy the given tree. You can avoid this copy by using the
+ * construct that takes a rvalue reference to the tree.
+ *
+ * @note
+ * Mapping the points of the matrix back to their original indices is not done
+ * when this constructor is used, so if the tree type you are using maps
+ * points (like BinarySpaceTree), then you will have to perform the re-mapping
+ * manually.
+ * @endnote
+ *
+ * @param referenceTree Pre-built tree for reference points.
+ * @param singleMode Whether single-tree computation should be used (as
+ * opposed to dual-tree computation).
+ * @param epsilon Relative approximate error (non-negative).
+ * @param metric Instantiated distance metric.
+ */
+ NeighborSearch(Tree& referenceTree,
+ const bool singleMode = false,
+ const double epsilon = 0,
+ const MetricType metric = MetricType());
+
+ /**
* Initialize the NeighborSearch object with the given pre-constructed
* reference tree (this is the tree built on the points that will be
* searched). Optionally, choose to use single-tree mode. Naive mode is not
@@ -340,6 +369,16 @@ class NeighborSearch
void Train(Tree* referenceTree);
/**
+ * Set the reference tree as a copy of the given reference tree.
+ *
+ * This method will copy the given tree. You can avoid this copy by using the
+ * Train() method that takes a rvalue reference to the tree.
+ *
+ * @param referenceTree Pre-built tree for reference points.
+ */
+ void Train(Tree& referenceTree);
+
+ /**
* Set the reference tree to a new reference tree.
*
* This method will take ownership of the given tree.
diff --git a/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp b/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
index 24fa9b2..a4a7cfe 100644
--- a/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
+++ b/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
@@ -324,6 +324,26 @@ template<typename SortPolicy,
template<typename> class DualTreeTraversalType,
template<typename> class SingleTreeTraversalType>
NeighborSearch<SortPolicy, MetricType, MatType, TreeType, DualTreeTraversalType,
+SingleTreeTraversalType>::NeighborSearch(Tree& referenceTree,
+ const bool singleMode,
+ const double epsilon,
+ const MetricType metric) :
+ NeighborSearch(new Tree(referenceTree), singleMode, epsilon,
+ metric)
+{
+ treeOwner = true;
+}
+
+// Construct the object.
+template<typename SortPolicy,
+ typename MetricType,
+ typename MatType,
+ template<typename TreeMetricType,
+ typename TreeStatType,
+ typename TreeMatType> class TreeType,
+ template<typename> class DualTreeTraversalType,
+ template<typename> class SingleTreeTraversalType>
+NeighborSearch<SortPolicy, MetricType, MatType, TreeType, DualTreeTraversalType,
SingleTreeTraversalType>::NeighborSearch(Tree&& referenceTree,
const bool singleMode,
const double epsilon,
@@ -520,6 +540,21 @@ template<typename SortPolicy,
template<typename> class DualTreeTraversalType,
template<typename> class SingleTreeTraversalType>
void NeighborSearch<SortPolicy, MetricType, MatType, TreeType,
+DualTreeTraversalType, SingleTreeTraversalType>::Train(Tree& referenceTree)
+{
+ Train(new Tree(referenceTree));
+ treeOwner = true;
+}
+
+template<typename SortPolicy,
+ typename MetricType,
+ typename MatType,
+ template<typename TreeMetricType,
+ typename TreeStatType,
+ typename TreeMatType> class TreeType,
+ template<typename> class DualTreeTraversalType,
+ template<typename> class SingleTreeTraversalType>
+void NeighborSearch<SortPolicy, MetricType, MatType, TreeType,
DualTreeTraversalType, SingleTreeTraversalType>::Train(Tree&& referenceTree)
{
Train(new Tree(std::move(referenceTree)));
More information about the mlpack-git
mailing list