[mlpack-git] master: Added the vantage point tree to RSModel and NSModel. (dbdf3ca)

gitdub at mlpack.org gitdub at mlpack.org
Mon Aug 8 14:31:12 EDT 2016


Repository : https://github.com/mlpack/mlpack
On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/acd81e11579f69e75aa8406b2982328c88cf1fde...1e9f0f39ea4443f0d595c395871ea8c6b27443af

>---------------------------------------------------------------

commit dbdf3ca4ebb753616dbfc1db832aa48bce4099b3
Author: Mikhail Lozhnikov <lozhnikovma at gmail.com>
Date:   Sat Jul 16 19:32:14 2016 +0300

    Added the vantage point tree to RSModel and NSModel.


>---------------------------------------------------------------

dbdf3ca4ebb753616dbfc1db832aa48bce4099b3
 src/mlpack/methods/neighbor_search/kfn_main.cpp     | 12 +++++++-----
 src/mlpack/methods/neighbor_search/knn_main.cpp     | 12 +++++++-----
 src/mlpack/methods/neighbor_search/ns_model.hpp     |  7 +++++--
 .../methods/neighbor_search/ns_model_impl.hpp       |  6 ++++++
 .../methods/range_search/range_search_main.cpp      | 12 +++++++-----
 src/mlpack/methods/range_search/rs_model.cpp        | 21 ++++++++++++++++++++-
 src/mlpack/methods/range_search/rs_model.hpp        |  6 +++++-
 src/mlpack/methods/range_search/rs_model_impl.hpp   | 14 ++++++++++++++
 src/mlpack/tests/aknn_test.cpp                      | 16 ++++++++++++----
 src/mlpack/tests/knn_test.cpp                       | 12 ++++++++----
 src/mlpack/tests/range_search_test.cpp              | 12 ++++++++----
 11 files changed, 99 insertions(+), 31 deletions(-)

diff --git a/src/mlpack/methods/neighbor_search/kfn_main.cpp b/src/mlpack/methods/neighbor_search/kfn_main.cpp
index 6adbc56..08cd95f 100644
--- a/src/mlpack/methods/neighbor_search/kfn_main.cpp
+++ b/src/mlpack/methods/neighbor_search/kfn_main.cpp
@@ -62,10 +62,10 @@ PARAM_INT("k", "Number of furthest neighbors to find.", "k", 0);
 // The user may specify the type of tree to use, and a few pararmeters for tree
 // building.
 PARAM_STRING("tree_type", "Type of tree to use: 'kd', 'cover', 'r', 'r-star', "
-    "'x', 'ball', 'hilbert-r', 'r-plus', 'r-plus-plus'.", "t", "kd");
-PARAM_INT("leaf_size", "Leaf size for tree building (used for kd-trees, R "
-    "trees, R* trees, X trees, Hilbert R trees, R+ trees and R++ trees).", "l",
-    20);
+    "'x', 'ball', 'hilbert-r', 'r-plus', 'r-plus-plus', 'vp'.", "t", "kd");
+PARAM_INT("leaf_size", "Leaf size for tree building (used for kd-trees, vp "
+    "trees, R trees, R* trees, X trees, Hilbert R trees, R+ trees and R++ "
+    "trees).", "l", 20);
 PARAM_FLAG("random_basis", "Before tree-building, project the data onto a "
     "random orthogonal basis.", "R");
 PARAM_INT("seed", "Random seed (if 0, std::time(NULL) is used).", "s", 0);
@@ -194,10 +194,12 @@ int main(int argc, char *argv[])
       tree = KFNModel::R_PLUS_TREE;
     else if (treeType == "r-plus-plus")
       tree = KFNModel::R_PLUS_PLUS_TREE;
+    else if (treeType == "vp")
+      tree = KFNModel::VP_TREE;
     else
       Log::Fatal << "Unknown tree type '" << treeType << "'; valid choices are "
           << "'kd', 'cover', 'r', 'r-star', 'x', 'ball', 'hilbert-r', "
-          << "'r-plus' and 'r-plus-plus'." << endl;
+          << "'r-plus', 'r-plus-plus' and 'vp'." << endl;
 
     kfn.TreeType() = tree;
     kfn.RandomBasis() = randomBasis;
diff --git a/src/mlpack/methods/neighbor_search/knn_main.cpp b/src/mlpack/methods/neighbor_search/knn_main.cpp
index 87bdb32..62fff18 100644
--- a/src/mlpack/methods/neighbor_search/knn_main.cpp
+++ b/src/mlpack/methods/neighbor_search/knn_main.cpp
@@ -63,10 +63,10 @@ PARAM_INT("k", "Number of nearest neighbors to find.", "k", 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', 'hilbert-r', 'r-plus', 'r-plus-plus'.", "t", "kd");
-PARAM_INT("leaf_size", "Leaf size for tree building (used for kd-trees, R "
-    "trees, R* trees, X trees, Hilbert R trees, R+ trees and R++ trees).", "l",
-    20);
+    "'x', 'ball', 'hilbert-r', 'r-plus', 'r-plus-plus', 'vp'.", "t", "kd");
+PARAM_INT("leaf_size", "Leaf size for tree building (used for kd-trees, vp "
+    "trees, R trees, R* trees, X trees, Hilbert R trees, R+ trees and R++ "
+    "trees).", "l", 20);
 PARAM_FLAG("random_basis", "Before tree-building, project the data onto a "
     "random orthogonal basis.", "R");
 PARAM_INT("seed", "Random seed (if 0, std::time(NULL) is used).", "s", 0);
@@ -179,10 +179,12 @@ int main(int argc, char *argv[])
       tree = KNNModel::R_PLUS_TREE;
     else if (treeType == "r-plus-plus")
       tree = KNNModel::R_PLUS_PLUS_TREE;
+    else if (treeType == "vp")
+      tree = KNNModel::VP_TREE;
     else
       Log::Fatal << "Unknown tree type '" << treeType << "'; valid choices are "
           << "'kd', 'cover', 'r', 'r-star', 'x', 'ball', 'hilbert-r', "
-          << "'r-plus' and 'r-plus-plus'." << endl;
+          << "'r-plus', 'r-plus-plus' and 'vp'." << endl;
 
     knn.TreeType() = tree;
     knn.RandomBasis() = randomBasis;
diff --git a/src/mlpack/methods/neighbor_search/ns_model.hpp b/src/mlpack/methods/neighbor_search/ns_model.hpp
index 38e4748..fc782fe 100644
--- a/src/mlpack/methods/neighbor_search/ns_model.hpp
+++ b/src/mlpack/methods/neighbor_search/ns_model.hpp
@@ -13,6 +13,7 @@
 #include <mlpack/core/tree/binary_space_tree.hpp>
 #include <mlpack/core/tree/cover_tree.hpp>
 #include <mlpack/core/tree/rectangle_tree.hpp>
+#include <mlpack/core/tree/vantage_point_tree.hpp>
 #include <boost/variant.hpp>
 #include "neighbor_search.hpp"
 
@@ -256,7 +257,8 @@ class NSModel
     X_TREE,
     HILBERT_R_TREE,
     R_PLUS_TREE,
-    R_PLUS_PLUS_TREE
+    R_PLUS_PLUS_TREE,
+    VP_TREE
   };
 
  private:
@@ -284,7 +286,8 @@ class NSModel
                  NSType<SortPolicy, tree::XTree>*,
                  NSType<SortPolicy, tree::HilbertRTree>*,
                  NSType<SortPolicy, tree::RPlusTree>*,
-                 NSType<SortPolicy, tree::RPlusPlusTree>*> nSearch;
+                 NSType<SortPolicy, tree::RPlusPlusTree>*,
+                 NSType<SortPolicy, tree::VPTree>*> nSearch;
 
  public:
   /**
diff --git a/src/mlpack/methods/neighbor_search/ns_model_impl.hpp b/src/mlpack/methods/neighbor_search/ns_model_impl.hpp
index acbed6c..2ca8be5 100644
--- a/src/mlpack/methods/neighbor_search/ns_model_impl.hpp
+++ b/src/mlpack/methods/neighbor_search/ns_model_impl.hpp
@@ -394,6 +394,10 @@ void NSModel<SortPolicy>::BuildModel(arma::mat&& referenceSet,
       nSearch = new NSType<SortPolicy, tree::RPlusPlusTree>(naive, singleMode,
           epsilon);
       break;
+    case VP_TREE:
+      nSearch = new NSType<SortPolicy, tree::VPTree>(naive, singleMode,
+          epsilon);
+      break;
   }
 
   TrainVisitor<SortPolicy> tn(std::move(referenceSet), leafSize);
@@ -478,6 +482,8 @@ std::string NSModel<SortPolicy>::TreeName() const
       return "R+ tree";
     case R_PLUS_PLUS_TREE:
       return "R++ tree";
+    case VP_TREE:
+      return "Vantage point tree";
     default:
       return "unknown tree";
   }
diff --git a/src/mlpack/methods/range_search/range_search_main.cpp b/src/mlpack/methods/range_search/range_search_main.cpp
index c8ea2a5..4db62f7 100644
--- a/src/mlpack/methods/range_search/range_search_main.cpp
+++ b/src/mlpack/methods/range_search/range_search_main.cpp
@@ -70,10 +70,10 @@ 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', 'hilbert-r', 'r-plus', 'r-plus-plus'.", "t", "kd");
-PARAM_INT("leaf_size", "Leaf size for tree building (used for kd-trees, R "
-    "trees, R* trees, X trees, Hilbert R trees, R+ trees and R++ trees).", "l",
-    20);
+    "'x', 'ball', 'hilbert-r', 'r-plus', 'r-plus-plus', 'vp'.", "t", "kd");
+PARAM_INT("leaf_size", "Leaf size for tree building (used for kd-trees, vp "
+    "trees, R trees, R* trees, X trees, Hilbert R trees, R+ trees and R++ "
+    "trees).", "l", 20);
 PARAM_FLAG("random_basis", "Before tree-building, project the data onto a "
     "random orthogonal basis.", "R");
 PARAM_INT("seed", "Random seed (if 0, std::time(NULL) is used).", "s", 0);
@@ -181,10 +181,12 @@ int main(int argc, char *argv[])
       tree = RSModel::R_PLUS_TREE;
     else if (treeType == "r-plus-plus")
       tree = RSModel::R_PLUS_PLUS_TREE;
+    else if (treeType == "vp")
+      tree = RSModel::VP_TREE;
     else
       Log::Fatal << "Unknown tree type '" << treeType << "; valid choices are "
           << "'kd', 'cover', 'r', 'r-star', 'x', 'ball', 'hilbert-r', "
-          << "'r-plus' and 'r-plus-plus'." << endl;
+          << "'r-plus', 'r-plus-plus' and 'vp'." << 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 1cf3938..10514c6 100644
--- a/src/mlpack/methods/range_search/rs_model.cpp
+++ b/src/mlpack/methods/range_search/rs_model.cpp
@@ -25,7 +25,8 @@ RSModel::RSModel(TreeTypes treeType, bool randomBasis) :
     xTreeRS(NULL),
     hilbertRTreeRS(NULL),
     rPlusTreeRS(NULL),
-    rPlusPlusTreeRS(NULL)
+    rPlusPlusTreeRS(NULL),
+    vpTreeRS(NULL)
 {
   // Nothing to do.
 }
@@ -140,6 +141,11 @@ void RSModel::BuildModel(arma::mat&& referenceSet,
       rPlusPlusTreeRS = new RSType<tree::RPlusPlusTree>(move(referenceSet), naive,
           singleMode);
       break;
+
+    case VP_TREE:
+      vpTreeRS = new RSType<tree::VPTree>(move(referenceSet), naive,
+          singleMode);
+      break;
   }
 
   if (!naive)
@@ -261,6 +267,10 @@ void RSModel::Search(arma::mat&& querySet,
     case R_PLUS_PLUS_TREE:
       rPlusPlusTreeRS->Search(querySet, range, neighbors, distances);
       break;
+
+    case VP_TREE:
+      vpTreeRS->Search(querySet, range, neighbors, distances);
+      break;
   }
 }
 
@@ -315,6 +325,10 @@ void RSModel::Search(const math::Range& range,
     case R_PLUS_PLUS_TREE:
       rPlusPlusTreeRS->Search(range, neighbors, distances);
       break;
+
+    case VP_TREE:
+      vpTreeRS->Search(range, neighbors, distances);
+      break;
   }
 }
 
@@ -341,6 +355,8 @@ std::string RSModel::TreeName() const
       return "R+ tree";
     case R_PLUS_PLUS_TREE:
       return "R++ tree";
+    case VP_TREE:
+      return "Vantage point tree";
     default:
       return "unknown tree";
   }
@@ -367,6 +383,8 @@ void RSModel::CleanMemory()
     delete rPlusTreeRS;
   if (rPlusPlusTreeRS)
     delete rPlusPlusTreeRS;
+  if (vpTreeRS)
+    delete vpTreeRS;
 
   kdTreeRS = NULL;
   coverTreeRS = NULL;
@@ -377,4 +395,5 @@ void RSModel::CleanMemory()
   hilbertRTreeRS = NULL;
   rPlusTreeRS = NULL;
   rPlusPlusTreeRS = NULL;
+  vpTreeRS = NULL;
 }
diff --git a/src/mlpack/methods/range_search/rs_model.hpp b/src/mlpack/methods/range_search/rs_model.hpp
index 7903d37..8c7af3b 100644
--- a/src/mlpack/methods/range_search/rs_model.hpp
+++ b/src/mlpack/methods/range_search/rs_model.hpp
@@ -13,6 +13,7 @@
 #include <mlpack/core/tree/binary_space_tree.hpp>
 #include <mlpack/core/tree/cover_tree.hpp>
 #include <mlpack/core/tree/rectangle_tree.hpp>
+#include <mlpack/core/tree/vantage_point_tree.hpp>
 
 #include "range_search.hpp"
 
@@ -32,7 +33,8 @@ class RSModel
     X_TREE,
     HILBERT_R_TREE,
     R_PLUS_TREE,
-    R_PLUS_PLUS_TREE
+    R_PLUS_PLUS_TREE,
+    VP_TREE
   };
 
  private:
@@ -69,6 +71,8 @@ class RSModel
   RSType<tree::RPlusTree>* rPlusTreeRS;
   //! R++ tree based range search object (NULL if not in use).
   RSType<tree::RPlusPlusTree>* rPlusPlusTreeRS;
+  //! VP tree based range search object (NULL if not in use).
+  RSType<tree::VPTree>* vpTreeRS;
 
  public:
   /**
diff --git a/src/mlpack/methods/range_search/rs_model_impl.hpp b/src/mlpack/methods/range_search/rs_model_impl.hpp
index 98fa7a8..fbc6580 100644
--- a/src/mlpack/methods/range_search/rs_model_impl.hpp
+++ b/src/mlpack/methods/range_search/rs_model_impl.hpp
@@ -65,6 +65,10 @@ void RSModel::Serialize(Archive& ar, const unsigned int /* version */)
     case R_PLUS_PLUS_TREE:
       ar & CreateNVP(rPlusPlusTreeRS, "range_search_model");
       break;
+
+    case VP_TREE:
+      ar & CreateNVP(vpTreeRS, "range_search_model");
+      break;
   }
 }
 
@@ -88,6 +92,8 @@ inline const arma::mat& RSModel::Dataset() const
     return rPlusTreeRS->ReferenceSet();
   else if (rPlusPlusTreeRS)
     return rPlusPlusTreeRS->ReferenceSet();
+  else if (vpTreeRS)
+    return vpTreeRS->ReferenceSet();
 
   throw std::runtime_error("no range search model initialized");
 }
@@ -112,6 +118,8 @@ inline bool RSModel::SingleMode() const
     return rPlusTreeRS->SingleMode();
   else if (rPlusPlusTreeRS)
     return rPlusPlusTreeRS->SingleMode();
+  else if (vpTreeRS)
+    return vpTreeRS->SingleMode();
 
   throw std::runtime_error("no range search model initialized");
 }
@@ -136,6 +144,8 @@ inline bool& RSModel::SingleMode()
     return rPlusTreeRS->SingleMode();
   else if (rPlusPlusTreeRS)
     return rPlusPlusTreeRS->SingleMode();
+  else if (vpTreeRS)
+    return vpTreeRS->SingleMode();
 
   throw std::runtime_error("no range search model initialized");
 }
@@ -160,6 +170,8 @@ inline bool RSModel::Naive() const
     return rPlusTreeRS->Naive();
   else if (rPlusPlusTreeRS)
     return rPlusPlusTreeRS->Naive();
+  else if (vpTreeRS)
+    return vpTreeRS->Naive();
 
   throw std::runtime_error("no range search model initialized");
 }
@@ -184,6 +196,8 @@ inline bool& RSModel::Naive()
     return rPlusTreeRS->Naive();
   else if (rPlusPlusTreeRS)
     return rPlusPlusTreeRS->Naive();
+  else if (vpTreeRS)
+    return vpTreeRS->Naive();
 
   throw std::runtime_error("no range search model initialized");
 }
diff --git a/src/mlpack/tests/aknn_test.cpp b/src/mlpack/tests/aknn_test.cpp
index f38978d..98466b4 100644
--- a/src/mlpack/tests/aknn_test.cpp
+++ b/src/mlpack/tests/aknn_test.cpp
@@ -287,7 +287,7 @@ BOOST_AUTO_TEST_CASE(KNNModelTest)
   arma::mat referenceData = arma::randu<arma::mat>(10, 200);
 
   // Build all the possible models.
-  KNNModel models[14];
+  KNNModel models[20];
   models[0] = KNNModel(KNNModel::TreeTypes::KD_TREE, true);
   models[1] = KNNModel(KNNModel::TreeTypes::KD_TREE, false);
   models[2] = KNNModel(KNNModel::TreeTypes::COVER_TREE, true);
@@ -302,6 +302,12 @@ BOOST_AUTO_TEST_CASE(KNNModelTest)
   models[11] = KNNModel(KNNModel::TreeTypes::BALL_TREE, false);
   models[12] = KNNModel(KNNModel::TreeTypes::HILBERT_R_TREE, true);
   models[13] = KNNModel(KNNModel::TreeTypes::HILBERT_R_TREE, false);
+  models[14] = KNNModel(KNNModel::TreeTypes::R_PLUS_TREE, true);
+  models[15] = KNNModel(KNNModel::TreeTypes::R_PLUS_TREE, false);
+  models[16] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, true);
+  models[17] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, false);
+  models[18] = KNNModel(KNNModel::TreeTypes::VP_TREE, true);
+  models[19] = KNNModel(KNNModel::TreeTypes::VP_TREE, false);
 
   for (size_t j = 0; j < 3; ++j)
   {
@@ -311,7 +317,7 @@ BOOST_AUTO_TEST_CASE(KNNModelTest)
     arma::mat distancesExact;
     aknn.Search(queryData, 3, neighborsExact, distancesExact);
 
-    for (size_t i = 0; i < 14; ++i)
+    for (size_t i = 0; i < 20; ++i)
     {
       // We only have std::move() constructors so make a copy of our data.
       arma::mat referenceCopy(referenceData);
@@ -352,7 +358,7 @@ BOOST_AUTO_TEST_CASE(KNNModelMonochromaticTest)
   arma::mat referenceData = arma::randu<arma::mat>(10, 200);
 
   // Build all the possible models.
-  KNNModel models[18];
+  KNNModel models[20];
   models[0] = KNNModel(KNNModel::TreeTypes::KD_TREE, true);
   models[1] = KNNModel(KNNModel::TreeTypes::KD_TREE, false);
   models[2] = KNNModel(KNNModel::TreeTypes::COVER_TREE, true);
@@ -371,6 +377,8 @@ BOOST_AUTO_TEST_CASE(KNNModelMonochromaticTest)
   models[15] = KNNModel(KNNModel::TreeTypes::R_PLUS_TREE, false);
   models[16] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, true);
   models[17] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, false);
+  models[18] = KNNModel(KNNModel::TreeTypes::VP_TREE, true);
+  models[19] = KNNModel(KNNModel::TreeTypes::VP_TREE, false);
 
   for (size_t j = 0; j < 2; ++j)
   {
@@ -380,7 +388,7 @@ BOOST_AUTO_TEST_CASE(KNNModelMonochromaticTest)
     arma::mat distancesExact;
     exact.Search(3, neighborsExact, distancesExact);
 
-    for (size_t i = 0; i < 18; ++i)
+    for (size_t i = 0; i < 20; ++i)
     {
       // We only have a std::move() constructor... so copy the data.
       arma::mat referenceCopy(referenceData);
diff --git a/src/mlpack/tests/knn_test.cpp b/src/mlpack/tests/knn_test.cpp
index 0de22b8..ffb6412 100644
--- a/src/mlpack/tests/knn_test.cpp
+++ b/src/mlpack/tests/knn_test.cpp
@@ -977,7 +977,7 @@ BOOST_AUTO_TEST_CASE(KNNModelTest)
   arma::mat referenceData = arma::randu<arma::mat>(10, 200);
 
   // Build all the possible models.
-  KNNModel models[18];
+  KNNModel models[20];
   models[0] = KNNModel(KNNModel::TreeTypes::KD_TREE, true);
   models[1] = KNNModel(KNNModel::TreeTypes::KD_TREE, false);
   models[2] = KNNModel(KNNModel::TreeTypes::COVER_TREE, true);
@@ -996,6 +996,8 @@ BOOST_AUTO_TEST_CASE(KNNModelTest)
   models[15] = KNNModel(KNNModel::TreeTypes::R_PLUS_TREE, false);
   models[16] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, true);
   models[17] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, false);
+  models[18] = KNNModel(KNNModel::TreeTypes::VP_TREE, true);
+  models[19] = KNNModel(KNNModel::TreeTypes::VP_TREE, false);
 
   for (size_t j = 0; j < 2; ++j)
   {
@@ -1005,7 +1007,7 @@ BOOST_AUTO_TEST_CASE(KNNModelTest)
     arma::mat baselineDistances;
     knn.Search(queryData, 3, baselineNeighbors, baselineDistances);
 
-    for (size_t i = 0; i < 18; ++i)
+    for (size_t i = 0; i < 20; ++i)
     {
       // We only have std::move() constructors so make a copy of our data.
       arma::mat referenceCopy(referenceData);
@@ -1049,7 +1051,7 @@ BOOST_AUTO_TEST_CASE(KNNModelMonochromaticTest)
   arma::mat referenceData = arma::randu<arma::mat>(10, 200);
 
   // Build all the possible models.
-  KNNModel models[18];
+  KNNModel models[20];
   models[0] = KNNModel(KNNModel::TreeTypes::KD_TREE, true);
   models[1] = KNNModel(KNNModel::TreeTypes::KD_TREE, false);
   models[2] = KNNModel(KNNModel::TreeTypes::COVER_TREE, true);
@@ -1068,6 +1070,8 @@ BOOST_AUTO_TEST_CASE(KNNModelMonochromaticTest)
   models[15] = KNNModel(KNNModel::TreeTypes::R_PLUS_TREE, false);
   models[16] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, true);
   models[17] = KNNModel(KNNModel::TreeTypes::R_PLUS_PLUS_TREE, false);
+  models[18] = KNNModel(KNNModel::TreeTypes::VP_TREE, true);
+  models[19] = KNNModel(KNNModel::TreeTypes::VP_TREE, false);
 
   for (size_t j = 0; j < 2; ++j)
   {
@@ -1077,7 +1081,7 @@ BOOST_AUTO_TEST_CASE(KNNModelMonochromaticTest)
     arma::mat baselineDistances;
     knn.Search(3, baselineNeighbors, baselineDistances);
 
-    for (size_t i = 0; i < 18; ++i)
+    for (size_t i = 0; i < 20; ++i)
     {
       // We only have a std::move() constructor... so copy the data.
       arma::mat referenceCopy(referenceData);
diff --git a/src/mlpack/tests/range_search_test.cpp b/src/mlpack/tests/range_search_test.cpp
index 7f28f2e..037f593 100644
--- a/src/mlpack/tests/range_search_test.cpp
+++ b/src/mlpack/tests/range_search_test.cpp
@@ -1249,7 +1249,7 @@ BOOST_AUTO_TEST_CASE(RSModelTest)
   arma::mat referenceData = arma::randu<arma::mat>(10, 200);
 
   // Build all the possible models.
-  RSModel models[18];
+  RSModel models[20];
   models[0] = RSModel(RSModel::TreeTypes::KD_TREE, true);
   models[1] = RSModel(RSModel::TreeTypes::KD_TREE, false);
   models[2] = RSModel(RSModel::TreeTypes::COVER_TREE, true);
@@ -1268,6 +1268,8 @@ BOOST_AUTO_TEST_CASE(RSModelTest)
   models[15] = RSModel(RSModel::TreeTypes::R_PLUS_TREE, false);
   models[16] = RSModel(RSModel::TreeTypes::R_PLUS_PLUS_TREE, true);
   models[17] = RSModel(RSModel::TreeTypes::R_PLUS_PLUS_TREE, false);
+  models[18] = RSModel(RSModel::TreeTypes::VP_TREE, true);
+  models[19] = RSModel(RSModel::TreeTypes::VP_TREE, false);
 
   for (size_t j = 0; j < 2; ++j)
   {
@@ -1281,7 +1283,7 @@ BOOST_AUTO_TEST_CASE(RSModelTest)
     vector<vector<pair<double, size_t>>> baselineSorted;
     SortResults(baselineNeighbors, baselineDistances, baselineSorted);
 
-    for (size_t i = 0; i < 18; ++i)
+    for (size_t i = 0; i < 20; ++i)
     {
       // We only have std::move() constructors, so make a copy of our data.
       arma::mat referenceCopy(referenceData);
@@ -1325,7 +1327,7 @@ BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest)
   arma::mat referenceData = arma::randu<arma::mat>(10, 200);
 
   // Build all the possible models.
-  RSModel models[18];
+  RSModel models[20];
   models[0] = RSModel(RSModel::TreeTypes::KD_TREE, true);
   models[1] = RSModel(RSModel::TreeTypes::KD_TREE, false);
   models[2] = RSModel(RSModel::TreeTypes::COVER_TREE, true);
@@ -1344,6 +1346,8 @@ BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest)
   models[15] = RSModel(RSModel::TreeTypes::R_PLUS_TREE, false);
   models[16] = RSModel(RSModel::TreeTypes::R_PLUS_PLUS_TREE, true);
   models[17] = RSModel(RSModel::TreeTypes::R_PLUS_PLUS_TREE, false);
+  models[18] = RSModel(RSModel::TreeTypes::VP_TREE, true);
+  models[19] = RSModel(RSModel::TreeTypes::VP_TREE, false);
 
   for (size_t j = 0; j < 2; ++j)
   {
@@ -1356,7 +1360,7 @@ BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest)
     vector<vector<pair<double, size_t>>> baselineSorted;
     SortResults(baselineNeighbors, baselineDistances, baselineSorted);
 
-    for (size_t i = 0; i < 18; ++i)
+    for (size_t i = 0; i < 20; ++i)
     {
       // We only have std::move() cosntructors, so make a copy of our data.
       arma::mat referenceCopy(referenceData);




More information about the mlpack-git mailing list