/* * NICE-Core - efficient algebra and computer vision methods * - libbasicvector - An core/vector/template for new NICE libraries * See file License for license information. */ #ifdef NICE_USELIB_CPPUNIT #include "TestDistance.h" #include #include using namespace NICE; using namespace std; CPPUNIT_TEST_SUITE_REGISTRATION( TestDistance ); void TestDistance::setUp() { } void TestDistance::tearDown() { } void TestDistance::testConstructor() { } void TestDistance::testDistance() { Ipp32u size = 5; VectorT v1(size), v2(size); for(Ipp32u i=0; i* vDist; ManhattanDistance manDist; EuclidianDistance eucDist; MaximumDistance maxDist; MedianDistance medDist; Chi2Distance chiDist; SphericalDistance sphDist; SinDistance sinDist; CosDistance cosDist; KLDistance klDist; CPPUNIT_ASSERT_DOUBLES_EQUAL(eucDist(v1,v2), 5.47723, 1e-5); vDist = &eucDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist).calculate(v1,v2), eucDist.calculate(v1,v2), 1e-10); CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), eucDist(v1,v2), 1e-10); vDist = &manDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), manDist(v1,v2), 1e-10); vDist = &maxDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), maxDist(v1,v2), 1e-10); vDist = &medDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), medDist(v1,v2), 1e-10); vDist = &chiDist; // A delta greater than 1e-10 is on some machines too large (especially 32bit) CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), chiDist(v1,v2), 1e-7); vDist = &sphDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), sphDist(v1,v2), 1e-10); vDist = &sinDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), sinDist(v1,v2), 1e-10); vDist = &cosDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), cosDist(v1,v2), 1e-10); vDist = &klDist; CPPUNIT_ASSERT_DOUBLES_EQUAL((*vDist)(v1,v2), klDist(v1,v2), 1e-10); } void TestDistance::testEuclidianDistance() { { Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2}; Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1}; FloatVector v1(_d1, 6), v2(_d2, 6); EuclidianDistance eDist; Ipp32f eucDist = eDist(v1, v2); CPPUNIT_ASSERT_DOUBLES_EQUAL(0.324037, eucDist, 1e-6); } { Ipp8u _d1[6] = {1, 2, 2, 4, 3, 1}; Ipp8u _d2[6] = {2, 2, 3, 1, 2, 3}; VectorT v1(_d1, 6), v2(_d2, 6); EuclidianDistance eDist; Ipp8u eucDist = eDist(v1, v2); CPPUNIT_ASSERT_EQUAL(4, static_cast(eucDist)); } } void TestDistance::testCosinusDistance() { { Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2}; Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1}; FloatVector v1(_d1, 6), v2(_d2, 6); CosDistance cDist; Ipp32f cosDist = cDist(v1, v2); CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2335809, cosDist, 1e-6); //parallel Ipp32f _d3[6] = {0.2, 0.1, 0.3, 0.05, 0.1, 0.2}; Ipp32f _d4[6] = {0.4, 0.2 , 0.6, 0.1, 0.2, 0.4}; FloatVector v3(_d3, 6), v4(_d4, 6); cosDist = cDist(v3, v4); CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, cosDist, 1e-6); } } void TestDistance::testScalarProductDistance() { Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2}; Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1}; FloatVector v1(_d1, 6), v2(_d2, 6); ScalarProductDistance spdDist; Ipp32f spDist = spdDist(v1, v2); CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.17, spDist, 1e-6); } void TestDistance::testBhattacharyyaDistance() { Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2}; Ipp32f _d2[6] = {0.4, 0.1 , 0.1, 0.1, 0.2, 0.1}; FloatVector v1(_d1, 6), v2(_d2, 6); BhattacharyyaDistance bhDist; Ipp32f bDist = bhDist(v1, v2); CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2606228, bDist, 1e-6); } void TestDistance::testKLDistance() { Ipp32f _d1[6] = {0.2, 0.15, 0.3, 0.05, 0.1, 0.2}; Ipp32f _d2[6] = {0.4, 0.0 , 0.0, 0.0, 0.2, 0.1}; FloatVector v1(_d1, 6), v2(_d2, 6); KLDistance klDist; SwappedKLDistance sklDist; ExtendedKLDistance eklDist; CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0693147, klDist(v1, v2), 1e-6); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.346574, sklDist(v1, v2), 1e-6); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.138629, eklDist(v1, v2), 1e-6); } #endif