Chris@186: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 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@185: static feature_t getTestFeature(double m) Chris@131: { Chris@185: feature_t f; Chris@185: int fd[] = { 0, 1, 2, 3 }; Chris@131: for (int i = 0; i < 4; ++i) { Chris@186: f.push_back(featurebin_t(fd[i] * m)); Chris@131: } Chris@131: return f; Chris@131: } Chris@131: Chris@131: BOOST_AUTO_TEST_SUITE(TestDistanceMetric) Chris@131: Chris@186: BOOST_AUTO_TEST_CASE(scale) Chris@186: { Chris@186: DistanceMetric::Parameters params; Chris@186: params.scale = 1.0; Chris@186: DistanceMetric dm(params); Chris@186: Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2); Chris@186: Chris@186: if (sizeof(distance_t) == 1) { Chris@212: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), DISTANCE_MAX); Chris@186: } else { Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256); Chris@186: } Chris@186: Chris@186: params.scale = 2.0; Chris@186: dm = DistanceMetric(params); Chris@186: Chris@186: if (sizeof(distance_t) == 1) { Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 2); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 4); Chris@212: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(128.0), DISTANCE_MAX); Chris@186: } else { Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2); Chris@186: BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256); Chris@186: } Chris@186: } Chris@186: 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@185: feature_t Chris@186: e1 = getTestFeature(1), Chris@186: e2 = getTestFeature(2), Chris@186: e0 = getTestFeature(0); Chris@131: Chris@146: double noise = 1e-3 * 4; Chris@197: #ifdef USE_COMPACT_TYPES Chris@197: noise = 1.0 / params.scale; Chris@197: #endif Chris@146: Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(0.0 + noise)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(6.0 + noise)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(6.0 + noise)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(0.0 + noise)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange(6.0 + noise)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(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@185: feature_t Chris@186: e1 = getTestFeature(1), Chris@186: e2 = getTestFeature(2), Chris@186: e0 = getTestFeature(0); Chris@133: Chris@146: double noise = 1e-3 * 4; Chris@197: #ifdef USE_COMPACT_TYPES Chris@197: noise = 1.0 / params.scale; Chris@197: #endif Chris@146: Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(1.0)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(1.0)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(1.0)); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(noise / (12.0 + noise))); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange((6.0 + noise) / (18.0 + noise))); Chris@186: BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(1.0)); Chris@131: } Chris@131: Chris@131: BOOST_AUTO_TEST_SUITE_END() Chris@131: Chris@131: Chris@131: