[mlpack-git] master: Update NSModel to consider different Search Modes. (15cd3cc)
gitdub at mlpack.org
gitdub at mlpack.org
Sat Aug 20 14:56:07 EDT 2016
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/3274b05fcc545c3b36f783316fea2e22f79c3d03...1c77230c7d3b9c45fb102cd3c632d9c7248e085e
>---------------------------------------------------------------
commit 15cd3cc1d75fcbc89fba65d5b1ed45c62522b48c
Author: MarcosPividori <marcos.pividori at gmail.com>
Date: Tue Aug 16 05:07:38 2016 -0300
Update NSModel to consider different Search Modes.
>---------------------------------------------------------------
15cd3cc1d75fcbc89fba65d5b1ed45c62522b48c
src/mlpack/methods/neighbor_search/ns_model.hpp | 34 +++---
.../methods/neighbor_search/ns_model_impl.hpp | 136 +++++++++++----------
2 files changed, 87 insertions(+), 83 deletions(-)
diff --git a/src/mlpack/methods/neighbor_search/ns_model.hpp b/src/mlpack/methods/neighbor_search/ns_model.hpp
index 48f6b26..37eb703 100644
--- a/src/mlpack/methods/neighbor_search/ns_model.hpp
+++ b/src/mlpack/methods/neighbor_search/ns_model.hpp
@@ -197,25 +197,29 @@ class TrainVisitor : public boost::static_visitor<void>
};
/**
- * SingleModeVisitor exposes the SingleMode method of the given NSType.
+ * SearchModeVisitor exposes the SearchMode() method of the given NSType.
*/
-class SingleModeVisitor : public boost::static_visitor<bool&>
+class SearchModeVisitor : public boost::static_visitor<NeighborSearchMode>
{
public:
- //! Return whether or not single-tree search is enabled.
+ //! Return the search mode.
template<typename NSType>
- bool& operator()(NSType* ns) const;
+ NeighborSearchMode operator()(NSType* ns) const;
};
/**
- * NaiveVisitor exposes the Naive method of the given NSType.
+ * SetSearchModeVisitor modifies the SearchMode method of the given NSType.
*/
-class NaiveVisitor : public boost::static_visitor<bool&>
+class SetSearchModeVisitor : public boost::static_visitor<void>
{
+ NeighborSearchMode searchMode;
public:
- //! Return whether or not naive search is enabled.
+ //! Construct the SetSearchModeVisitor object with the given mode.
+ SetSearchModeVisitor(NeighborSearchMode searchMode);
+
+ //! Set the search mode.
template<typename NSType>
- bool& operator()(NSType *ns) const;
+ void operator()(NSType* ns) const;
};
/**
@@ -336,13 +340,10 @@ class NSModel
//! Expose the dataset.
const arma::mat& Dataset() const;
- //! Expose singleMode.
- bool SingleMode() const;
- bool& SingleMode();
-
- //! Expose naiveMode.
- bool Naive() const;
- bool& Naive();
+ //! Access the search mode.
+ NeighborSearchMode SearchMode() const;
+ //! Modify the search mode.
+ void SetSearchMode(const NeighborSearchMode mode);
//! Expose Epsilon.
double Epsilon() const;
@@ -371,8 +372,7 @@ class NSModel
//! Build the reference tree.
void BuildModel(arma::mat&& referenceSet,
const size_t leafSize,
- const bool naive,
- const bool singleMode,
+ const NeighborSearchMode searchMode,
const double epsilon = 0);
//! Perform neighbor search. The query set will be reordered.
diff --git a/src/mlpack/methods/neighbor_search/ns_model_impl.hpp b/src/mlpack/methods/neighbor_search/ns_model_impl.hpp
index 0abd617..a7efffe 100644
--- a/src/mlpack/methods/neighbor_search/ns_model_impl.hpp
+++ b/src/mlpack/methods/neighbor_search/ns_model_impl.hpp
@@ -208,21 +208,26 @@ void TrainVisitor<SortPolicy>::TrainLeaf(NSType* ns) const
}
}
-//! Expose the SingleMode method of the given NSType.
+//! Construct the SetSearchModeVisitor object with the given mode.
+SetSearchModeVisitor::SetSearchModeVisitor(NeighborSearchMode searchMode) :
+ searchMode(searchMode)
+{}
+
+//! Set the search mode.
template<typename NSType>
-bool& SingleModeVisitor::operator()(NSType* ns) const
+void SetSearchModeVisitor::operator()(NSType* ns) const
{
if (ns)
- return ns->SingleMode();
+ return ns->SetSearchMode(searchMode);
throw std::runtime_error("no neighbor search model initialized");
}
-//! Expose the Naive method of the given NSType.
+//! Return the search mode.
template<typename NSType>
-bool& NaiveVisitor::operator()(NSType* ns) const
+NeighborSearchMode SearchModeVisitor::operator()(NSType* ns) const
{
if (ns)
- return ns->Naive();
+ return ns->SearchMode();
throw std::runtime_error("no neighbor search model initialized");
}
@@ -331,30 +336,18 @@ const arma::mat& NSModel<SortPolicy>::Dataset() const
return boost::apply_visitor(ReferenceSetVisitor(), nSearch);
}
-//! Expose singleMode.
-template<typename SortPolicy>
-bool NSModel<SortPolicy>::SingleMode() const
-{
- return boost::apply_visitor(SingleModeVisitor(), nSearch);
-}
-
-template<typename SortPolicy>
-bool& NSModel<SortPolicy>::SingleMode()
-{
- return boost::apply_visitor(SingleModeVisitor(), nSearch);
-}
-
-//! Expose Naive.
+//! Access the search mode.
template<typename SortPolicy>
-bool NSModel<SortPolicy>::Naive() const
+NeighborSearchMode NSModel<SortPolicy>::SearchMode() const
{
- return boost::apply_visitor(NaiveVisitor(), nSearch);
+ return boost::apply_visitor(SearchModeVisitor(), nSearch);
}
+//! Modify the search mode.
template<typename SortPolicy>
-bool& NSModel<SortPolicy>::Naive()
+void NSModel<SortPolicy>::SetSearchMode(const NeighborSearchMode mode)
{
- return boost::apply_visitor(NaiveVisitor(), nSearch);
+ return boost::apply_visitor(SetSearchModeVisitor(mode), nSearch);
}
template<typename SortPolicy>
@@ -373,8 +366,7 @@ double& NSModel<SortPolicy>::Epsilon()
template<typename SortPolicy>
void NSModel<SortPolicy>::BuildModel(arma::mat&& referenceSet,
const size_t leafSize,
- const bool naive,
- const bool singleMode,
+ const NeighborSearchMode searchMode,
const double epsilon)
{
this->leafSize = leafSize;
@@ -417,7 +409,7 @@ void NSModel<SortPolicy>::BuildModel(arma::mat&& referenceSet,
if (randomBasis)
referenceSet = q * referenceSet;
- if (!naive)
+ if (searchMode != NAIVE_MODE)
{
Timer::Start("tree_building");
Log::Info << "Building reference tree..." << std::endl;
@@ -426,60 +418,52 @@ void NSModel<SortPolicy>::BuildModel(arma::mat&& referenceSet,
switch (treeType)
{
case KD_TREE:
- nSearch = new NSType<SortPolicy, tree::KDTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::KDTree>(searchMode, epsilon);
break;
case COVER_TREE:
- nSearch = new NSType<SortPolicy, tree::StandardCoverTree>(naive,
- singleMode, epsilon);
+ nSearch = new NSType<SortPolicy, tree::StandardCoverTree>(searchMode,
+ epsilon);
break;
case R_TREE:
- nSearch = new NSType<SortPolicy, tree::RTree>(naive, singleMode, epsilon);
+ nSearch = new NSType<SortPolicy, tree::RTree>(searchMode, epsilon);
break;
case R_STAR_TREE:
- nSearch = new NSType<SortPolicy, tree::RStarTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::RStarTree>(searchMode, epsilon);
break;
case BALL_TREE:
- nSearch = new NSType<SortPolicy, tree::BallTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::BallTree>(searchMode, epsilon);
break;
case X_TREE:
- nSearch = new NSType<SortPolicy, tree::XTree>(naive, singleMode, epsilon);
+ nSearch = new NSType<SortPolicy, tree::XTree>(searchMode, epsilon);
break;
case HILBERT_R_TREE:
- nSearch = new NSType<SortPolicy, tree::HilbertRTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::HilbertRTree>(searchMode, epsilon);
break;
case R_PLUS_TREE:
- nSearch = new NSType<SortPolicy, tree::RPlusTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::RPlusTree>(searchMode, epsilon);
break;
case R_PLUS_PLUS_TREE:
- nSearch = new NSType<SortPolicy, tree::RPlusPlusTree>(naive, singleMode,
+ nSearch = new NSType<SortPolicy, tree::RPlusPlusTree>(searchMode,
epsilon);
break;
case VP_TREE:
- nSearch = new NSType<SortPolicy, tree::VPTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::VPTree>(searchMode, epsilon);
break;
case RP_TREE:
- nSearch = new NSType<SortPolicy, tree::RPTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::RPTree>(searchMode, epsilon);
break;
case MAX_RP_TREE:
- nSearch = new NSType<SortPolicy, tree::MaxRPTree>(naive, singleMode,
- epsilon);
+ nSearch = new NSType<SortPolicy, tree::MaxRPTree>(searchMode, epsilon);
break;
case SPILL_TREE:
- nSearch = new SpillKNN(naive, singleMode, epsilon);
+ nSearch = new SpillKNN(searchMode, epsilon);
break;
}
TrainVisitor<SortPolicy> tn(std::move(referenceSet), leafSize, tau, rho);
boost::apply_visitor(tn, nSearch);
- if (!naive)
+ if (searchMode != NAIVE_MODE)
{
Timer::Stop("tree_building");
Log::Info << "Tree built." << std::endl;
@@ -498,15 +482,23 @@ void NSModel<SortPolicy>::Search(arma::mat&& querySet,
querySet = q * querySet;
Log::Info << "Searching for " << k << " neighbors with ";
- if (!Naive() && !SingleMode())
- Log::Info << "dual-tree " << TreeName() << " search..." << std::endl;
- else if (!Naive())
- Log::Info << "single-tree " << TreeName() << " search..." << std::endl;
- else
- Log::Info << "brute-force (naive) search..." << std::endl;
- if (Epsilon() != 0 && !Naive())
- Log::Info << "Maximum of " << Epsilon() * 100 << "% relative error."
- << std::endl;
+
+ switch (SearchMode())
+ {
+ case NAIVE_MODE:
+ Log::Info << "brute-force (naive) search..." << std::endl;
+ break;
+ case SINGLE_TREE_MODE:
+ Log::Info << "single-tree " << TreeName() << " search..." << std::endl;
+ break;
+ case DUAL_TREE_MODE:
+ Log::Info << "dual-tree " << TreeName() << " search..." << std::endl;
+ break;
+ case GREEDY_SINGLE_TREE_MODE:
+ Log::Info << "greedy single-tree " << TreeName() << " search..."
+ << std::endl;
+ break;
+ }
BiSearchVisitor<SortPolicy> search(querySet, k, neighbors, distances,
leafSize, tau, rho);
@@ -520,13 +512,25 @@ void NSModel<SortPolicy>::Search(const size_t k,
arma::mat& distances)
{
Log::Info << "Searching for " << k << " neighbors with ";
- if (!Naive() && !SingleMode())
- Log::Info << "dual-tree " << TreeName() << " search..." << std::endl;
- else if (!Naive())
- Log::Info << "single-tree " << TreeName() << " search..." << std::endl;
- else
- Log::Info << "brute-force (naive) search..." << std::endl;
- if (Epsilon() != 0 && !Naive())
+
+ switch (SearchMode())
+ {
+ case NAIVE_MODE:
+ Log::Info << "brute-force (naive) search..." << std::endl;
+ break;
+ case SINGLE_TREE_MODE:
+ Log::Info << "single-tree " << TreeName() << " search..." << std::endl;
+ break;
+ case DUAL_TREE_MODE:
+ Log::Info << "dual-tree " << TreeName() << " search..." << std::endl;
+ break;
+ case GREEDY_SINGLE_TREE_MODE:
+ Log::Info << "greedy single-tree " << TreeName() << " search..."
+ << std::endl;
+ break;
+ }
+
+ if (Epsilon() != 0 && SearchMode() != NAIVE_MODE)
Log::Info << "Maximum of " << Epsilon() * 100 << "% relative error."
<< std::endl;
More information about the mlpack-git
mailing list