TestDistance.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*
  2. * NICE-Core - efficient algebra and computer vision methods
  3. * - libbasicvector - An core/vector/template for new NICE libraries
  4. * See file License for license information.
  5. */
  6. #ifdef NICE_USELIB_CPPUNIT
  7. #include "TestDistance.h"
  8. #include <string>
  9. #include <exception>
  10. using namespace NICE;
  11. using namespace std;
  12. CPPUNIT_TEST_SUITE_REGISTRATION( TestDistance );
  13. void TestDistance::setUp() {
  14. }
  15. void TestDistance::tearDown() {
  16. }
  17. void TestDistance::testConstructor() {
  18. }
  19. void TestDistance::testDistance() {
  20. Ipp32u size = 5;
  21. VectorT<Ipp32f> v1(size), v2(size);
  22. for(Ipp32u i=0; i<size; ++i) {
  23. v1[i] = i;
  24. v2[i] = 2*i;
  25. }
  26. VectorDistance<Ipp32f>* vDist;
  27. ManhattanDistance<Ipp32f> manDist;
  28. EuclidianDistance<Ipp32f> eucDist;
  29. MaximumDistance<Ipp32f> maxDist;
  30. MedianDistance<Ipp32f> medDist;
  31. Chi2Distance<Ipp32f> chiDist;
  32. SphericalDistance<Ipp32f> sphDist;
  33. SinDistance<Ipp32f> sinDist;
  34. CosDistance<Ipp32f> cosDist;
  35. KLDistance<Ipp32f> klDist;
  36. CPPUNIT_ASSERT_DOUBLES_EQUAL(eucDist(v1,v2), 5.47723, 1e-5);
  37. vDist = &eucDist;
  38. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist).calculate(v1,v2), eucDist.calculate(v1,v2), 1e-10);
  39. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), eucDist(v1,v2), 1e-10);
  40. vDist = &manDist;
  41. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), manDist(v1,v2), 1e-10);
  42. vDist = &maxDist;
  43. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), maxDist(v1,v2), 1e-10);
  44. vDist = &medDist;
  45. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), medDist(v1,v2), 1e-10);
  46. vDist = &chiDist;
  47. // A delta greater than 1e-10 is on some machines too large (especially 32bit)
  48. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), chiDist(v1,v2), 1e-7);
  49. vDist = &sphDist;
  50. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), sphDist(v1,v2), 1e-10);
  51. vDist = &sinDist;
  52. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), sinDist(v1,v2), 1e-10);
  53. vDist = &cosDist;
  54. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), cosDist(v1,v2), 1e-10);
  55. vDist = &klDist;
  56. CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), klDist(v1,v2), 1e-10);
  57. }
  58. void TestDistance::testEuclidianDistance() {
  59. {
  60. Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2};
  61. Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1};
  62. FloatVector v1(_d1, 6), v2(_d2, 6);
  63. EuclidianDistance<Ipp32f> eDist;
  64. Ipp32f eucDist = eDist(v1, v2);
  65. CPPUNIT_ASSERT_DOUBLES_EQUAL(0.324037, eucDist, 1e-6);
  66. }
  67. {
  68. Ipp8u _d1[6] = {1, 2, 2, 4, 3, 1};
  69. Ipp8u _d2[6] = {2, 2, 3, 1, 2, 3};
  70. VectorT<Ipp8u> v1(_d1, 6), v2(_d2, 6);
  71. EuclidianDistance<Ipp8u> eDist;
  72. Ipp8u eucDist = eDist(v1, v2);
  73. CPPUNIT_ASSERT_EQUAL(4, static_cast<int>(eucDist));
  74. }
  75. }
  76. void TestDistance::testCosinusDistance() {
  77. {
  78. Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2};
  79. Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1};
  80. FloatVector v1(_d1, 6), v2(_d2, 6);
  81. CosDistance<Ipp32f> cDist;
  82. Ipp32f cosDist = cDist(v1, v2);
  83. CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2335809, cosDist, 1e-6);
  84. //parallel
  85. Ipp32f _d3[6] = {0.2, 0.1, 0.3, 0.05, 0.1, 0.2};
  86. Ipp32f _d4[6] = {0.4, 0.2 , 0.6, 0.1, 0.2, 0.4};
  87. FloatVector v3(_d3, 6), v4(_d4, 6);
  88. cosDist = cDist(v3, v4);
  89. CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, cosDist, 1e-6);
  90. }
  91. }
  92. void TestDistance::testScalarProductDistance() {
  93. Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2};
  94. Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1};
  95. FloatVector v1(_d1, 6), v2(_d2, 6);
  96. ScalarProductDistance<Ipp32f> spdDist;
  97. Ipp32f spDist = spdDist(v1, v2);
  98. CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.17, spDist, 1e-6);
  99. }
  100. void TestDistance::testBhattacharyyaDistance() {
  101. Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2};
  102. Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1};
  103. FloatVector v1(_d1, 6), v2(_d2, 6);
  104. BhattacharyyaDistance<Ipp32f> bhDist;
  105. Ipp32f bDist = bhDist(v1, v2);
  106. CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2606228, bDist, 1e-6);
  107. }
  108. void TestDistance::testKLDistance() {
  109. Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2};
  110. Ipp32f _d2[6] = {0.4, 0.0 , 0.0, 0.0, 0.2, 0.1};
  111. FloatVector v1(_d1, 6), v2(_d2, 6);
  112. KLDistance<Ipp32f> klDist;
  113. SwappedKLDistance<Ipp32f> sklDist;
  114. ExtendedKLDistance<Ipp32f> eklDist;
  115. CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0693147, klDist(v1, v2), 1e-6);
  116. CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.346574, sklDist(v1, v2), 1e-6);
  117. CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.138629, eklDist(v1, v2), 1e-6);
  118. }
  119. #endif