[mlpack-svn] r16415 - mlpack/trunk/src/mlpack/methods/range_search
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Wed Apr 9 18:27:08 EDT 2014
Author: rcurtin
Date: Wed Apr 9 18:27:08 2014
New Revision: 16415
Log:
Patch from Saheb for #301; refactor RangeSearch constructors so that leafSize is
not a parameter.
Modified:
mlpack/trunk/src/mlpack/methods/range_search/range_search.hpp
mlpack/trunk/src/mlpack/methods/range_search/range_search_impl.hpp
Modified: mlpack/trunk/src/mlpack/methods/range_search/range_search.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/range_search/range_search.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/range_search/range_search.hpp Wed Apr 9 18:27:08 2014
@@ -9,11 +9,8 @@
#define __MLPACK_METHODS_RANGE_SEARCH_RANGE_SEARCH_HPP
#include <mlpack/core.hpp>
-
#include <mlpack/core/metrics/lmetric.hpp>
-
#include <mlpack/core/tree/binary_space_tree.hpp>
-
#include "range_search_stat.hpp"
namespace mlpack {
@@ -54,7 +51,6 @@
const typename TreeType::Mat& querySet,
const bool naive = false,
const bool singleMode = false,
- const size_t leafSize = 20,
const MetricType metric = MetricType());
/**
@@ -79,7 +75,6 @@
RangeSearch(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/range_search/range_search_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/range_search/range_search_impl.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/range_search/range_search_impl.hpp Wed Apr 9 18:27:08 2014
@@ -16,18 +16,40 @@
namespace mlpack {
namespace range {
+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);
+}
+
template<typename MetricType, typename TreeType>
RangeSearch<MetricType, TreeType>::RangeSearch(
- const typename TreeType::Mat& referenceSet,
- const typename TreeType::Mat& querySet,
+ 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),
treeOwner(!naive), // If in naive mode, we are not building any trees.
hasQuerySet(true),
naive(naive),
@@ -38,16 +60,26 @@
// Build the trees.
Timer::Start("range_search/tree_building");
+ // Copy the datasets, if they will be modified during tree building.
+ if (tree::TreeTraits<TreeType>::RearrangesDataset)
+ {
+ referenceCopy = referenceSetIn;
+ queryCopy = querySetIn;
+ }
+
// If in naive mode, then we do not 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 we are in dual-tree mode, we need to build a query tree too.
if (!singleMode)
- queryTree = new TreeType(queryCopy, oldFromNewQueries,
- (naive ? queryCopy.n_cols : leafSize));
+ queryTree = BuildTree<TreeType>(
+ const_cast<typename TreeType::Mat&>(querySet), oldFromNewQueries);
}
Timer::Stop("range_search/tree_building");
@@ -55,14 +87,14 @@
template<typename MetricType, typename TreeType>
RangeSearch<MetricType, TreeType>::RangeSearch(
- const typename TreeType::Mat& referenceSet,
+ 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),
queryTree(NULL),
treeOwner(!naive), // If in naive mode, we are not building any trees.
hasQuerySet(false),
@@ -74,13 +106,20 @@
// Build the trees.
Timer::Start("range_search/tree_building");
+ // Copy the dataset, if it will be modified during tree building.
+ if (tree::TreeTraits<TreeType>::RearrangesDataset)
+ referenceCopy = referenceSetIn;
+
// If in naive mode, then we do not 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 using dual-tree mode, then we need a second tree.
if (!singleMode)
queryTree = new TreeType(*referenceTree);
}
@@ -165,10 +204,15 @@
std::vector<std::vector<size_t> >* neighborPtr = &neighbors;
std::vector<std::vector<double> >* distancePtr = &distances;
- if (treeOwner && !(singleMode && hasQuerySet))
- distancePtr = new std::vector<std::vector<double> >;
- if (treeOwner)
- neighborPtr = new std::vector<std::vector<size_t> >;
+ // Mapping is only necessary if the tree rearranges points.
+ if (tree::TreeTraits<TreeType>::RearrangesDataset)
+ {
+ if (treeOwner && !(singleMode && hasQuerySet))
+ distancePtr = new std::vector<std::vector<double> >; // Query indices need to be mapped.
+
+ if (treeOwner)
+ neighborPtr = new std::vector<std::vector<size_t> >; // All indices need mapping.
+ }
// Resize each vector.
neighborPtr->clear(); // Just in case there was anything in it.
@@ -216,7 +260,8 @@
<< "." << std::endl;
// Map points back to original indices, if necessary.
- if (!treeOwner)
+
+ if (!treeOwner || !tree::TreeTraits<TreeType>::RearrangesDataset)
{
// No mapping needed. We are done.
return;
More information about the mlpack-svn
mailing list