[mlpack-git] master: Added the Hilbert R tree to RSModel (8716e4a)
gitdub at mlpack.org
gitdub at mlpack.org
Tue Jun 28 10:38:53 EDT 2016
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/9dd66c7312ffcce6bc7b51aff00d38b75263f4b0...6077f120935e10ffa01d80a8398e28a90a8d011a
>---------------------------------------------------------------
commit 8716e4ac73fbdd8267d177f5cbf4c68f859e291c
Author: Mikhail Lozhnikov <lozhnikovma at gmail.com>
Date: Tue Jun 28 17:38:53 2016 +0300
Added the Hilbert R tree to RSModel
>---------------------------------------------------------------
8716e4ac73fbdd8267d177f5cbf4c68f859e291c
.../methods/range_search/range_search_main.cpp | 6 ++++--
src/mlpack/methods/range_search/rs_model.cpp | 21 ++++++++++++++++++++-
src/mlpack/methods/range_search/rs_model.hpp | 5 ++++-
src/mlpack/methods/range_search/rs_model_impl.hpp | 14 ++++++++++++++
4 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/src/mlpack/methods/range_search/range_search_main.cpp b/src/mlpack/methods/range_search/range_search_main.cpp
index 3606950..ca3f433 100644
--- a/src/mlpack/methods/range_search/range_search_main.cpp
+++ b/src/mlpack/methods/range_search/range_search_main.cpp
@@ -70,7 +70,7 @@ PARAM_DOUBLE("min", "Lower bound in range.", "L", 0.0);
// The user may specify the type of tree to use, and a few parameters for tree
// building.
PARAM_STRING("tree_type", "Type of tree to use: 'kd', 'cover', 'r', 'r-star', "
- "'x', 'ball'.", "t", "kd");
+ "'x', 'ball', 'hilbert-r'.", "t", "kd");
PARAM_INT("leaf_size", "Leaf size for tree building.", "l", 20);
PARAM_FLAG("random_basis", "Before tree-building, project the data onto a "
"random orthogonal basis.", "R");
@@ -173,9 +173,11 @@ int main(int argc, char *argv[])
tree = RSModel::BALL_TREE;
else if (treeType == "x")
tree = RSModel::X_TREE;
+ else if (treeType == "hilbert-r")
+ tree = RSModel::HILBERT_R_TREE;
else
Log::Fatal << "Unknown tree type '" << treeType << "; valid choices are "
- << "'kd', 'cover', 'r', 'r-star', 'x' and 'ball'." << endl;
+ << "'kd', 'cover', 'r', 'r-star', 'x', 'ball' and 'hilbert-r'." << endl;
rs.TreeType() = tree;
rs.RandomBasis() = randomBasis;
diff --git a/src/mlpack/methods/range_search/rs_model.cpp b/src/mlpack/methods/range_search/rs_model.cpp
index e0cdb18..1bf565a 100644
--- a/src/mlpack/methods/range_search/rs_model.cpp
+++ b/src/mlpack/methods/range_search/rs_model.cpp
@@ -22,7 +22,8 @@ RSModel::RSModel(TreeTypes treeType, bool randomBasis) :
rTreeRS(NULL),
rStarTreeRS(NULL),
ballTreeRS(NULL),
- xTreeRS(NULL)
+ xTreeRS(NULL),
+ hilbertRTreeRS(NULL)
{
// Nothing to do.
}
@@ -122,6 +123,11 @@ void RSModel::BuildModel(arma::mat&& referenceSet,
xTreeRS = new RSType<tree::XTree>(move(referenceSet), naive,
singleMode);
break;
+
+ case HILBERT_R_TREE:
+ hilbertRTreeRS = new RSType<tree::HilbertRTree>(move(referenceSet), naive,
+ singleMode);
+ break;
}
if (!naive)
@@ -231,6 +237,10 @@ void RSModel::Search(arma::mat&& querySet,
case X_TREE:
xTreeRS->Search(querySet, range, neighbors, distances);
break;
+
+ case HILBERT_R_TREE:
+ hilbertRTreeRS->Search(querySet, range, neighbors, distances);
+ break;
}
}
@@ -273,6 +283,10 @@ void RSModel::Search(const math::Range& range,
case X_TREE:
xTreeRS->Search(range, neighbors, distances);
break;
+
+ case HILBERT_R_TREE:
+ hilbertRTreeRS->Search(range, neighbors, distances);
+ break;
}
}
@@ -293,6 +307,8 @@ std::string RSModel::TreeName() const
return "ball tree";
case X_TREE:
return "X tree";
+ case HILBERT_R_TREE:
+ return "Hilbert R tree";
default:
return "unknown tree";
}
@@ -313,6 +329,8 @@ void RSModel::CleanMemory()
delete ballTreeRS;
if (xTreeRS)
delete xTreeRS;
+ if (hilbertRTreeRS)
+ delete hilbertRTreeRS;
kdTreeRS = NULL;
coverTreeRS = NULL;
@@ -320,4 +338,5 @@ void RSModel::CleanMemory()
rStarTreeRS = NULL;
ballTreeRS = NULL;
xTreeRS = NULL;
+ hilbertRTreeRS = NULL;
}
diff --git a/src/mlpack/methods/range_search/rs_model.hpp b/src/mlpack/methods/range_search/rs_model.hpp
index 9598981..d256c31 100644
--- a/src/mlpack/methods/range_search/rs_model.hpp
+++ b/src/mlpack/methods/range_search/rs_model.hpp
@@ -29,7 +29,8 @@ class RSModel
R_TREE,
R_STAR_TREE,
BALL_TREE,
- X_TREE
+ X_TREE,
+ HILBERT_R_TREE
};
private:
@@ -60,6 +61,8 @@ class RSModel
RSType<tree::BallTree>* ballTreeRS;
//! X tree based range search object (NULL if not in use).
RSType<tree::XTree>* xTreeRS;
+ //! Hilbert R tree based range search object (NULL if not in use).
+ RSType<tree::HilbertRTree>* hilbertRTreeRS;
public:
/**
diff --git a/src/mlpack/methods/range_search/rs_model_impl.hpp b/src/mlpack/methods/range_search/rs_model_impl.hpp
index 5a71faa..0f308d4 100644
--- a/src/mlpack/methods/range_search/rs_model_impl.hpp
+++ b/src/mlpack/methods/range_search/rs_model_impl.hpp
@@ -53,6 +53,10 @@ void RSModel::Serialize(Archive& ar, const unsigned int /* version */)
case X_TREE:
ar & CreateNVP(xTreeRS, "range_search_model");
break;
+
+ case HILBERT_R_TREE:
+ ar & CreateNVP(hilbertRTreeRS, "range_search_model");
+ break;
}
}
@@ -70,6 +74,8 @@ inline const arma::mat& RSModel::Dataset() const
return ballTreeRS->ReferenceSet();
else if (xTreeRS)
return xTreeRS->ReferenceSet();
+ else if (hilbertRTreeRS)
+ return hilbertRTreeRS->ReferenceSet();
throw std::runtime_error("no range search model initialized");
}
@@ -88,6 +94,8 @@ inline bool RSModel::SingleMode() const
return ballTreeRS->SingleMode();
else if (xTreeRS)
return xTreeRS->SingleMode();
+ else if (hilbertRTreeRS)
+ return hilbertRTreeRS->SingleMode();
throw std::runtime_error("no range search model initialized");
}
@@ -106,6 +114,8 @@ inline bool& RSModel::SingleMode()
return ballTreeRS->SingleMode();
else if (xTreeRS)
return xTreeRS->SingleMode();
+ else if (hilbertRTreeRS)
+ return hilbertRTreeRS->SingleMode();
throw std::runtime_error("no range search model initialized");
}
@@ -124,6 +134,8 @@ inline bool RSModel::Naive() const
return ballTreeRS->Naive();
else if (xTreeRS)
return xTreeRS->Naive();
+ else if (hilbertRTreeRS)
+ return hilbertRTreeRS->Naive();
throw std::runtime_error("no range search model initialized");
}
@@ -142,6 +154,8 @@ inline bool& RSModel::Naive()
return ballTreeRS->Naive();
else if (xTreeRS)
return xTreeRS->Naive();
+ else if (hilbertRTreeRS)
+ return hilbertRTreeRS->Naive();
throw std::runtime_error("no range search model initialized");
}
More information about the mlpack-git
mailing list