[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