[mlpack-svn] r15801 - mlpack/trunk/src/mlpack/tests
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Tue Sep 17 22:05:18 EDT 2013
Author: rcurtin
Date: Tue Sep 17 22:05:18 2013
New Revision: 15801
Log:
Refactor test to clean tree statistics before running new range searches.
Modified:
mlpack/trunk/src/mlpack/tests/range_search_test.cpp
Modified: mlpack/trunk/src/mlpack/tests/range_search_test.cpp
==============================================================================
--- mlpack/trunk/src/mlpack/tests/range_search_test.cpp (original)
+++ mlpack/trunk/src/mlpack/tests/range_search_test.cpp Tue Sep 17 22:05:18 2013
@@ -35,6 +35,17 @@
}
}
+// Clean a tree's statistics.
+template<typename TreeType>
+void CleanTree(TreeType& node)
+{
+ node.Stat().LastDistanceNode() = NULL;
+ node.Stat().LastDistance() = 0.0;
+
+ for (size_t i = 0; i < node.NumChildren(); ++i)
+ CleanTree(node.Child(i));
+}
+
/**
* Simple range-search test with small, synthetic dataset. This is an
* exhaustive test, which checks that each method for performing the calculation
@@ -571,13 +582,11 @@
* Ensure that range search with cover trees works by comparing with the kd-tree
* implementation.
*/
-BOOST_AUTO_TEST_CASE(RangeSearchCoverTreeTest)
+BOOST_AUTO_TEST_CASE(CoverTreeTest)
{
arma::mat data;
data.randu(8, 1000); // 1000 points in 8 dimensions.
- // Set up kd-tree range search.
- RangeSearch<> kdsearch(data);
// Set up cover tree range search.
typedef tree::CoverTree<metric::EuclideanDistance, tree::FirstPointIsRoot,
RangeSearchStat> CoverTreeType;
@@ -588,6 +597,9 @@
// Four trials with different ranges.
for (size_t r = 0; r < 4; ++r)
{
+ // Set up kd-tree range search.
+ RangeSearch<> kdsearch(data);
+
Range range;
switch (r)
{
@@ -617,6 +629,9 @@
vector<vector<size_t> > coverNeighbors;
vector<vector<double> > coverDistances;
+ // Clean the tree statistics.
+ CleanTree(tree);
+
// Run the searches.
kdsearch.Search(range, kdNeighbors, kdDistances);
coversearch.Search(range, coverNeighbors, coverDistances);
@@ -644,15 +659,13 @@
/**
* Ensure that range search with cover trees works when using two datasets.
*/
-BOOST_AUTO_TEST_CASE(RangeSearchCoverTreeTwoDatasetsTest)
+BOOST_AUTO_TEST_CASE(CoverTreeTwoDatasetsTest)
{
arma::mat data;
data.randu(8, 1000); // 1000 points in 8 dimensions.
arma::mat queries;
queries.randu(8, 350); // 350 points in 8 dimensions.
- // Set up kd-tree range search.
- RangeSearch<> kdsearch(data, queries);
// Set up cover tree range search.
typedef tree::CoverTree<metric::EuclideanDistance, tree::FirstPointIsRoot,
RangeSearchStat> CoverTreeType;
@@ -664,6 +677,10 @@
// Four trials with different ranges.
for (size_t r = 0; r < 4; ++r)
{
+ // Set up kd-tree range search. We don't have an easy way to rebuild the
+ // tree, so we'll just reinstantiate it here each loop time.
+ RangeSearch<> kdsearch(data, queries);
+
Range range;
switch (r)
{
@@ -673,11 +690,11 @@
break;
case 1:
// A bounded range on both sides.
- range = Range(0.5, 1.5);
+ range = Range(0.85, 1.05);
break;
case 2:
// A range with no upper bound.
- range = Range(0.8, DBL_MAX);
+ range = Range(1.35, DBL_MAX);
break;
case 3:
// A range which should have no results.
@@ -693,9 +710,13 @@
vector<vector<size_t> > coverNeighbors;
vector<vector<double> > coverDistances;
+ // Clean the trees.
+ CleanTree(tree);
+ CleanTree(queryTree);
+
// Run the searches.
- kdsearch.Search(range, kdNeighbors, kdDistances);
coversearch.Search(range, coverNeighbors, coverDistances);
+ kdsearch.Search(range, kdNeighbors, kdDistances);
// Sort before comparison.
vector<vector<pair<double, size_t> > > kdSorted;
@@ -706,14 +727,13 @@
// Now compare the results.
for (size_t i = 0; i < kdSorted.size(); ++i)
{
- BOOST_REQUIRE_EQUAL(kdSorted[i].size(), coverSorted[i].size());
-
for (size_t j = 0; j < kdSorted[i].size(); ++j)
{
BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, coverSorted[i][j].second);
BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, coverSorted[i][j].first,
1e-5);
}
+ BOOST_REQUIRE_EQUAL(kdSorted[i].size(), coverSorted[i].size());
}
}
}
@@ -721,13 +741,11 @@
/**
* Ensure that single-tree cover tree range search works.
*/
-BOOST_AUTO_TEST_CASE(RangeSearchCoverTreeSingleTreeTest)
+BOOST_AUTO_TEST_CASE(CoverTreeSingleTreeTest)
{
arma::mat data;
data.randu(8, 1000); // 1000 points in 8 dimensions.
- // Set up kd-tree range search.
- RangeSearch<> kdsearch(data, true);
// Set up cover tree range search.
typedef tree::CoverTree<metric::EuclideanDistance, tree::FirstPointIsRoot,
RangeSearchStat> CoverTreeType;
@@ -738,6 +756,9 @@
// Four trials with different ranges.
for (size_t r = 0; r < 4; ++r)
{
+ // Set up kd-tree range search.
+ RangeSearch<> kdsearch(data, true);
+
Range range;
switch (r)
{
@@ -767,6 +788,9 @@
vector<vector<size_t> > coverNeighbors;
vector<vector<double> > coverDistances;
+ // Clean the tree statistics.
+ CleanTree(tree);
+
// Run the searches.
kdsearch.Search(range, kdNeighbors, kdDistances);
coversearch.Search(range, coverNeighbors, coverDistances);
More information about the mlpack-svn
mailing list