/tests/kdtree_tests.cc

https://bitbucket.org/tetonedge/libsrvf · C++ · 87 lines · 70 code · 17 blank · 0 comment · 8 complexity · fc0d18821571156b7a4de5e3ec4ab3eb MD5 · raw file

  1. #include <boost/test/unit_test.hpp>
  2. #include <srvf/matrix.h>
  3. #include <srvf/kdtree.h>
  4. #include <srvf/numeric.h>
  5. #include <cstdlib>
  6. #include <vector>
  7. #include <algorithm>
  8. #define MY_CHECK_CLOSE(a,b) \
  9. BOOST_CHECK_EQUAL(srvf::numeric::almost_equal((a),(b)), true)
  10. #define MY_REQUIRE_CLOSE(a,b) \
  11. BOOST_REQUIRE_EQUAL(srvf::numeric::almost_equal((a),(b)), true)
  12. static srvf::Matrix randmat_(size_t r, size_t c, int modulus)
  13. {
  14. srvf::Matrix result(r,c);
  15. for (size_t i=0; i<result.size(); ++i)
  16. result[i] = (double)(rand() % modulus);
  17. return result;
  18. }
  19. BOOST_AUTO_TEST_SUITE(kdtree_tests)
  20. BOOST_AUTO_TEST_CASE(basic_test1)
  21. {
  22. srvf::KdTree<srvf::Matrix> tree;
  23. std::vector<srvf::Matrix> mats;
  24. for (size_t i=0; i<5000; ++i)
  25. {
  26. mats.push_back(randmat_(1,8,2000));
  27. tree.insert(mats.back());
  28. }
  29. for (size_t i=0; i<100; ++i)
  30. {
  31. srvf::Matrix query = randmat_(1,8,2000);
  32. double expected_min_dist=1e9;
  33. for (size_t j=0; j<mats.size(); ++j)
  34. {
  35. double cur_dist = query.distance_to(mats[j]);
  36. expected_min_dist = std::min(expected_min_dist, cur_dist);
  37. }
  38. double actual_min_dist=1e9;
  39. srvf::Matrix actual_nbr=tree.get_nearest_neighbor(query, &actual_min_dist);
  40. MY_CHECK_CLOSE(actual_min_dist, expected_min_dist);
  41. }
  42. }
  43. BOOST_AUTO_TEST_CASE(basic_test2)
  44. {
  45. srvf::KdTree<srvf::Matrix> tree;
  46. std::vector<srvf::Matrix> mats;
  47. std::vector<bool> intree;
  48. for (size_t i=0; i<100; ++i)
  49. {
  50. mats.push_back(randmat_(1,3,100));
  51. bool inserted = tree.insert_cond(mats.back(), 10.0);
  52. intree.push_back(inserted);
  53. double min_dist=1e9;
  54. for (size_t j=0; j+1<i; ++j)
  55. {
  56. if (intree[j])
  57. min_dist = std::min(min_dist, mats[i].distance_to(mats[j]));
  58. }
  59. BOOST_CHECK_EQUAL( (min_dist >= 10.0), inserted );
  60. }
  61. }
  62. BOOST_AUTO_TEST_CASE(timing_test1)
  63. {
  64. srvf::KdTree<srvf::Matrix> tree;
  65. for (size_t i=0; i<10000; ++i)
  66. {
  67. tree.insert_cond(randmat_(1,3,10), 0.05);
  68. }
  69. }
  70. BOOST_AUTO_TEST_SUITE_END()