Chris@131: Chris@131: #include "DistanceMetric.h" Chris@131: Chris@131: #include Chris@131: #include Chris@131: #include Chris@131: Chris@131: using namespace std; Chris@131: Chris@131: #define BOOST_TEST_DYN_LINK Chris@131: #define BOOST_TEST_MAIN Chris@131: Chris@131: #include Chris@131: Chris@131: static vector getTestFeature(double m) Chris@131: { Chris@131: vector f; Chris@131: double fd[] = { 0, 1, 2, 3 }; Chris@131: for (int i = 0; i < 4; ++i) { Chris@131: f.push_back(fd[i] * m); Chris@131: } Chris@131: return f; Chris@131: } Chris@131: Chris@131: BOOST_AUTO_TEST_SUITE(TestDistanceMetric) Chris@131: Chris@131: BOOST_AUTO_TEST_CASE(nonorm) Chris@131: { Chris@143: DistanceMetric::Parameters params; Chris@143: params.norm = DistanceMetric::NoDistanceNormalisation; Chris@143: DistanceMetric dm(params); Chris@131: vector Chris@131: e1 = getTestFeature(1), Chris@131: e2 = getTestFeature(2), Chris@131: e0 = getTestFeature(0); Chris@131: Chris@146: double noise = 1e-3 * 4; Chris@146: Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), 0.0 + noise); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), 6.0 + noise); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), 6.0 + noise); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), 0.0 + noise); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), 6.0 + noise); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), 12.0 + noise); Chris@133: } Chris@133: Chris@133: BOOST_AUTO_TEST_CASE(sum) Chris@133: { Chris@143: DistanceMetric::Parameters params; Chris@143: params.norm = DistanceMetric::NormaliseDistanceToSum; Chris@143: DistanceMetric dm(params); Chris@133: vector Chris@133: e1 = getTestFeature(1), Chris@133: e2 = getTestFeature(2), Chris@133: e0 = getTestFeature(0); Chris@133: Chris@146: double noise = 1e-3 * 4; Chris@146: Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), 1.0); Chris@133: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), 1.0); Chris@133: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), 1.0); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), noise / (12.0 + noise)); Chris@146: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), (6.0 + noise) / (18.0 + noise)); Chris@133: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), 1.0); Chris@131: } Chris@131: Chris@131: BOOST_AUTO_TEST_SUITE_END() Chris@131: Chris@131: Chris@131: