[mlpack-svn] r16362 - mlpack/trunk/src/mlpack/methods/neighbor_search
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Mon Mar 10 17:15:42 EDT 2014
Author: rcurtin
Date: Mon Mar 10 17:15:41 2014
New Revision: 16362
Log:
Modified patch from Saheb for #301; this unifies the constructors for
NeighborSearch so they work with all tree types. The modifications I've made
make it so that the referenceCopy and queryCopy matrices aren't full copies of
the referenceSet and querySet matrices when the tree doesn't modify them (in the
case where they aren't modified, it's not necessary to copy them, that's just a
waste of memory).
Modified:
mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search.hpp
mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
Modified: mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search.hpp Mon Mar 10 17:15:41 2014
@@ -72,7 +72,6 @@
const typename TreeType::Mat& querySet,
const bool naive = false,
const bool singleMode = false,
- const size_t leafSize = 20,
const MetricType metric = MetricType());
/**
@@ -99,7 +98,6 @@
NeighborSearch(const typename TreeType::Mat& referenceSet,
const bool naive = false,
const bool singleMode = false,
- const size_t leafSize = 20,
const MetricType metric = MetricType());
/**
Modified: mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp Mon Mar 10 17:15:41 2014
@@ -15,19 +15,42 @@
namespace mlpack {
namespace neighbor {
+//! Call the tree constructor that does mapping.
+template<typename TreeType>
+TreeType* BuildTree(
+ typename TreeType::Mat& dataset,
+ std::vector<size_t>& oldFromNew,
+ typename boost::enable_if_c<
+ tree::TreeTraits<TreeType>::RearrangesDataset == true, TreeType*
+ >::type = 0)
+{
+ return new TreeType(dataset, oldFromNew);
+}
+
+//! Call the tree constructor that does not do mapping.
+template<typename TreeType>
+TreeType* BuildTree(
+ const typename TreeType::Mat& dataset,
+ const std::vector<size_t>& /* oldFromNew */,
+ const typename boost::enable_if_c<
+ tree::TreeTraits<TreeType>::RearrangesDataset == false, TreeType*
+ >::type = 0)
+{
+ return new TreeType(dataset);
+}
+
// Construct the object.
template<typename SortPolicy, typename MetricType, typename TreeType>
NeighborSearch<SortPolicy, MetricType, TreeType>::
-NeighborSearch(const typename TreeType::Mat& referenceSet,
- const typename TreeType::Mat& querySet,
+NeighborSearch(const typename TreeType::Mat& referenceSetIn,
+ const typename TreeType::Mat& querySetIn,
const bool naive,
const bool singleMode,
- const size_t leafSize,
const MetricType metric) :
- referenceCopy(referenceSet),
- queryCopy(querySet),
- referenceSet(referenceCopy),
- querySet(queryCopy),
+ referenceSet(tree::TreeTraits<TreeType>::RearrangesDataset ? referenceCopy
+ : referenceSetIn),
+ querySet(tree::TreeTraits<TreeType>::RearrangesDataset ? queryCopy
+ : querySetIn),
referenceTree(NULL),
queryTree(NULL),
treeOwner(!naive), // False if a tree was passed. If naive, then no trees.
@@ -42,15 +65,26 @@
// We'll time tree building, but only if we are building trees.
Timer::Start("tree_building");
+ // Copy the datasets, if they will be modified during tree building.
+ if (tree::TreeTraits<TreeType>::RearrangesDataset)
+ {
+ referenceCopy = referenceSetIn;
+ queryCopy = querySetIn;
+ }
+
// If not in naive mode, then we need to build trees.
if (!naive)
{
- referenceTree = new TreeType(referenceCopy, oldFromNewReferences,
- (naive ? referenceCopy.n_cols : leafSize));
+ // The const_cast is safe; if RearrangesDataset == false, then it'll be
+ // casted back to const anyway, and if not, referenceSet points to
+ // referenceCopy, which isn't const.
+ referenceTree = BuildTree<TreeType>(
+ const_cast<typename TreeType::Mat&>(referenceSet),
+ oldFromNewReferences);
if (!singleMode)
- queryTree = new TreeType(queryCopy, oldFromNewQueries,
- (naive ? querySet.n_cols : leafSize));
+ queryTree = BuildTree<TreeType>(
+ const_cast<typename TreeType::Mat&>(querySet), oldFromNewQueries);
}
// Stop the timer we started above (if we need to).
@@ -60,14 +94,14 @@
// Construct the object.
template<typename SortPolicy, typename MetricType, typename TreeType>
NeighborSearch<SortPolicy, MetricType, TreeType>::
-NeighborSearch(const typename TreeType::Mat& referenceSet,
+NeighborSearch(const typename TreeType::Mat& referenceSetIn,
const bool naive,
const bool singleMode,
- const size_t leafSize,
const MetricType metric) :
- referenceCopy(referenceSet),
- referenceSet(referenceCopy),
- querySet(referenceCopy),
+ referenceSet(tree::TreeTraits<TreeType>::RearrangesDataset ? referenceCopy
+ : referenceSetIn),
+ querySet(tree::TreeTraits<TreeType>::RearrangesDataset ? referenceCopy
+ : referenceSetIn),
referenceTree(NULL),
queryTree(NULL),
treeOwner(!naive), // If naive, then we are not building any trees.
@@ -79,11 +113,20 @@
// We'll time tree building, but only if we are building trees.
Timer::Start("tree_building");
+ // Copy the dataset, if it will be modified during tree building.
+ if (tree::TreeTraits<TreeType>::RearrangesDataset)
+ referenceCopy = referenceSetIn;
+
// If not in naive mode, then we may need to construct trees.
if (!naive)
{
- referenceTree = new TreeType(referenceCopy, oldFromNewReferences,
- (naive ? referenceSet.n_cols : leafSize));
+ // The const_cast is safe; if RearrangesDataset == false, then it'll be
+ // casted back to const anyway, and if not, referenceSet points to
+ // referenceCopy, which isn't const.
+ referenceTree = BuildTree<TreeType>(
+ const_cast<typename TreeType::Mat&>(referenceSet),
+ oldFromNewReferences);
+
if (!singleMode)
queryTree = new TreeType(*referenceTree);
}
@@ -180,10 +223,15 @@
arma::Mat<size_t>* neighborPtr = &resultingNeighbors;
arma::mat* distancePtr = &distances;
- if (treeOwner && !(singleMode && hasQuerySet))
- distancePtr = new arma::mat; // Query indices need to be mapped.
- if (treeOwner)
- neighborPtr = new arma::Mat<size_t>; // All indices need mapping.
+ // Mapping is only necessary if the tree rearranges points.
+ if (tree::TreeTraits<TreeType>::RearrangesDataset)
+ {
+ if (treeOwner && !(singleMode && hasQuerySet))
+ distancePtr = new arma::mat; // Query indices need to be mapped.
+
+ if (treeOwner)
+ neighborPtr = new arma::Mat<size_t>; // All indices need mapping.
+ }
// Set the size of the neighbor and distance matrices.
neighborPtr->set_size(k, querySet.n_cols);
@@ -225,7 +273,7 @@
Timer::Stop("computing_neighbors");
// Now, do we need to do mapping of indices?
- if (!treeOwner)
+ if (!treeOwner || !tree::TreeTraits<TreeType>::RearrangesDataset)
{
// No mapping needed. We are done.
return;
More information about the mlpack-svn
mailing list