[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