[mlpack-git] master: Update kmeans implementation to use rvalue references. (4f5ef3c)

gitdub at mlpack.org gitdub at mlpack.org
Mon Aug 29 13:23:32 EDT 2016


Repository : https://github.com/mlpack/mlpack
On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/1148f1652e139c9037eb3813550090313d089a30...a8a8a1381b529a01420de6e792a4a1e7bd58a626

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

commit 4f5ef3c036f6ae11f173005099e1c1add7b501b9
Author: MarcosPividori <marcos.pividori at gmail.com>
Date:   Mon Aug 29 14:23:32 2016 -0300

    Update kmeans implementation to use rvalue references.


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

4f5ef3c036f6ae11f173005099e1c1add7b501b9
 src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp
index ed21c4c..d8deb55 100644
--- a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp
+++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp
@@ -101,17 +101,17 @@ double DualTreeKMeans<MetricType, MatType, TreeType>::Iterate(
   std::vector<size_t> oldFromNewCentroids;
   Tree* centroidTree = BuildTree<Tree>(centroids, oldFromNewCentroids);
 
+  // Find the nearest neighbors of each of the clusters.  We have to make our
+  // own TreeType, which is a little bit abuse, but we know for sure the
+  // TreeStatType we have will work.
+  neighbor::NeighborSearch<neighbor::NearestNeighborSort, MetricType, MatType,
+      NNSTreeType> nns(std::move(*centroidTree));
+
   // Reset information in the tree, if we need to.
   if (iteration > 0)
   {
     Timer::Start("knn");
 
-    // Find the nearest neighbors of each of the clusters.  We have to make our
-    // own TreeType, which is a little bit abuse, but we know for sure the
-    // TreeStatType we have will work.
-    neighbor::NeighborSearch<neighbor::NearestNeighborSort, MetricType, MatType,
-        NNSTreeType> nns(centroidTree);
-
     // If the tree maps points, we need an intermediate result matrix.
     arma::mat* interclusterDistancesTemp =
         (tree::TreeTraits<Tree>::RearrangesDataset) ?
@@ -148,8 +148,9 @@ double DualTreeKMeans<MetricType, MatType, TreeType>::Iterate(
   // We won't use the KNN class here because we have our own set of rules.
   lastIterationCentroids = centroids;
   typedef DualTreeKMeansRules<MetricType, Tree> RuleType;
-  RuleType rules(centroidTree->Dataset(), dataset, assignments, upperBounds,
-      lowerBounds, metric, prunedPoints, oldFromNewCentroids, visited);
+  RuleType rules(nns.ReferenceTree().Dataset(), dataset, assignments,
+      upperBounds, lowerBounds, metric, prunedPoints, oldFromNewCentroids,
+      visited);
 
   typename Tree::template BreadthFirstDualTreeTraverser<RuleType>
       traverser(rules);
@@ -160,7 +161,7 @@ double DualTreeKMeans<MetricType, MatType, TreeType>::Iterate(
 
   // Set the number of pruned centroids in the root to 0.
   tree->Stat().Pruned() = 0;
-  traverser.Traverse(*tree, *centroidTree);
+  traverser.Traverse(*tree, nns.ReferenceTree());
   distanceCalculations += rules.BaseCases() + rules.Scores();
 
   Timer::Start("tree_mod");




More information about the mlpack-git mailing list