[mlpack-git] master: Use !oldFromNewReferences.empty() instead of treeOwner to determine if the map oldFromNewReferences should be considered. (d85cd15)

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 d85cd152796965f22fa1a7fead85dae3c7e6a3b6
Author: MarcosPividori <marcos.pividori at gmail.com>
Date:   Tue Aug 23 16:04:54 2016 -0300

    Use !oldFromNewReferences.empty() instead of treeOwner to determine
    if the map oldFromNewReferences should be considered.


>---------------------------------------------------------------

d85cd152796965f22fa1a7fead85dae3c7e6a3b6
 .../neighbor_search/neighbor_search_impl.hpp       | 52 ++++++++++++----------
 1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp b/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
index af5d4cc..a32eb67 100644
--- a/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
+++ b/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
@@ -178,7 +178,6 @@ template<typename SortPolicy,
          template<typename> class SingleTreeTraversalType>
 NeighborSearch<SortPolicy, MetricType, MatType, TreeType, DualTreeTraversalType,
 SingleTreeTraversalType>::NeighborSearch(Tree& referenceTree,
-                                         std::vector<size_t>& oldFromNew,
                                          const NeighborSearchMode mode,
                                          const double epsilon,
                                          const MetricType metric) :
@@ -198,13 +197,6 @@ SingleTreeTraversalType>::NeighborSearch(Tree& referenceTree,
 
   if (epsilon < 0)
     throw std::invalid_argument("epsilon must be non-negative");
-  if (tree::TreeTraits<Tree>::RearrangesDataset)
-  {
-    if (oldFromNew.size() != referenceSet->n_cols)
-      throw std::invalid_argument("the size of oldFromNew vector must match the"
-          " number of points in the given dataset");
-    oldFromNewReferences = oldFromNew;
-  }
 }
 
 // Construct the object.
@@ -218,7 +210,6 @@ template<typename SortPolicy,
          template<typename> class SingleTreeTraversalType>
 NeighborSearch<SortPolicy, MetricType, MatType, TreeType, DualTreeTraversalType,
 SingleTreeTraversalType>::NeighborSearch(Tree&& referenceTree,
-                                         std::vector<size_t>&& oldFromNew,
                                          const NeighborSearchMode mode,
                                          const double epsilon,
                                          const MetricType metric) :
@@ -238,13 +229,6 @@ SingleTreeTraversalType>::NeighborSearch(Tree&& referenceTree,
 
   if (epsilon < 0)
     throw std::invalid_argument("epsilon must be non-negative");
-  if (tree::TreeTraits<Tree>::RearrangesDataset)
-  {
-    if (oldFromNew.size() != referenceSet->n_cols)
-      throw std::invalid_argument("the size of oldFromNew vector must match the"
-          " number of points in the given dataset");
-    oldFromNewReferences = std::move(oldFromNew);
-  }
 }
 
 // Construct the object without a reference dataset.
@@ -471,7 +455,10 @@ DualTreeTraversalType, SingleTreeTraversalType>::Train(
 
   // Clean up the old tree, if we built one.
   if (treeOwner && referenceTree)
+  {
+    oldFromNewReferences.clear();
     delete referenceTree;
+  }
 
   // We may need to rebuild the tree.
   if (searchMode != NAIVE_MODE)
@@ -512,7 +499,10 @@ DualTreeTraversalType, SingleTreeTraversalType>::Train(MatType&& referenceSetIn)
 
   // Clean up the old tree, if we built one.
   if (treeOwner && referenceTree)
+  {
+    oldFromNewReferences.clear();
     delete referenceTree;
+  }
 
   // We may need to rebuild the tree.
   if (searchMode != NAIVE_MODE)
@@ -561,7 +551,11 @@ DualTreeTraversalType, SingleTreeTraversalType>::Train(Tree* referenceTree)
         "naive search (without trees) is desired");
 
   if (treeOwner && this->referenceTree)
+  {
+    oldFromNewReferences.clear();
     delete this->referenceTree;
+  }
+
   if (setOwner && referenceSet)
     delete this->referenceSet;
 
@@ -590,7 +584,11 @@ DualTreeTraversalType, SingleTreeTraversalType>::Train(Tree& referenceTree)
         "naive search (without trees) is desired");
 
   if (treeOwner && this->referenceTree)
+  {
+    oldFromNewReferences.clear();
     delete this->referenceTree;
+  }
+
   if (setOwner && referenceSet)
     delete this->referenceSet;
 
@@ -619,7 +617,11 @@ DualTreeTraversalType, SingleTreeTraversalType>::Train(Tree&& referenceTree)
         "naive search (without trees) is desired");
 
   if (treeOwner && this->referenceTree)
+  {
+    oldFromNewReferences.clear();
     delete this->referenceTree;
+  }
+
   if (setOwner && referenceSet)
     delete this->referenceSet;
 
@@ -682,7 +684,7 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
       distancePtr = new arma::mat; // Query indices need to be mapped.
       neighborPtr = new arma::Mat<size_t>;
     }
-    else if (treeOwner)
+    else if (!oldFromNewReferences.empty())
       neighborPtr = new arma::Mat<size_t>; // Reference indices need mapping.
   }
 
@@ -792,7 +794,7 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
   // Map points back to original indices, if necessary.
   if (tree::TreeTraits<Tree>::RearrangesDataset)
   {
-    if (searchMode == DUAL_TREE_MODE && treeOwner)
+    if (searchMode == DUAL_TREE_MODE && !oldFromNewReferences.empty())
     {
       // We must map both query and reference indices.
       neighbors.set_size(k, querySet.n_cols);
@@ -833,7 +835,7 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
       delete neighborPtr;
       delete distancePtr;
     }
-    else if (treeOwner)
+    else if (!oldFromNewReferences.empty())
     {
       // We must map reference indices only.
       neighbors.set_size(k, querySet.n_cols);
@@ -892,7 +894,8 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
   // We won't need to map query indices, but will we need to map distances?
   arma::Mat<size_t>* neighborPtr = &neighbors;
 
-  if (treeOwner && tree::TreeTraits<Tree>::RearrangesDataset)
+  if (!oldFromNewReferences.empty() &&
+      tree::TreeTraits<Tree>::RearrangesDataset)
     neighborPtr = new arma::Mat<size_t>;
 
   neighborPtr->set_size(k, querySet.n_cols);
@@ -920,7 +923,8 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
   Timer::Stop("computing_neighbors");
 
   // Do we need to map indices?
-  if (treeOwner && tree::TreeTraits<Tree>::RearrangesDataset)
+  if (!oldFromNewReferences.empty() &&
+      tree::TreeTraits<Tree>::RearrangesDataset)
   {
     // We must map reference indices only.
     neighbors.set_size(k, querySet.n_cols);
@@ -968,7 +972,8 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
   arma::Mat<size_t>* neighborPtr = &neighbors;
   arma::mat* distancePtr = &distances;
 
-  if (tree::TreeTraits<Tree>::RearrangesDataset && treeOwner)
+  if (!oldFromNewReferences.empty() &&
+      tree::TreeTraits<Tree>::RearrangesDataset)
   {
     // We will always need to rearrange in this case.
     distancePtr = new arma::mat;
@@ -1090,7 +1095,8 @@ DualTreeTraversalType, SingleTreeTraversalType>::Search(
   Timer::Stop("computing_neighbors");
 
   // Do we need to map the reference indices?
-  if (treeOwner && tree::TreeTraits<Tree>::RearrangesDataset)
+  if (!oldFromNewReferences.empty() &&
+      tree::TreeTraits<Tree>::RearrangesDataset)
   {
     neighbors.set_size(k, referenceSet->n_cols);
     distances.set_size(k, referenceSet->n_cols);




More information about the mlpack-git mailing list