Mercurial > hg > match-vamp
changeset 186:af6120a32063 re-minimise
Fix tests
author | Chris Cannam |
---|---|
date | Thu, 26 Feb 2015 10:38:59 +0000 |
parents | a17b22abd551 |
children | ba0d2104abec |
files | src/DistanceMetric.cpp src/DistanceMetric.h test/TestDistanceMetric.cpp |
diffstat | 3 files changed, 67 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/DistanceMetric.cpp Thu Feb 26 10:28:23 2015 +0000 +++ b/src/DistanceMetric.cpp Thu Feb 26 10:38:59 2015 +0000 @@ -27,7 +27,10 @@ template <> uint8_t DistanceMetric::scaleIntoRange(double distance) { - return uint8_t(m_params.scale * distance); + double scaled = m_params.scale * distance; + if (scaled < 0) scaled = 0; + if (scaled > 255) scaled = 255; + return uint8_t(scaled); } template <> float @@ -52,6 +55,12 @@ } distance_t +DistanceMetric::scaleValueIntoDistanceRange(double value) +{ + return scaleIntoRange<distance_t>(value); +} + +distance_t DistanceMetric::calcDistance(const feature_t &f1, const feature_t &f2) {
--- a/src/DistanceMetric.h Thu Feb 26 10:28:23 2015 +0000 +++ b/src/DistanceMetric.h Thu Feb 26 10:38:59 2015 +0000 @@ -91,6 +91,11 @@ */ distance_t calcDistance(const feature_t &f1, const feature_t &f2); + + /** + * Mostly for internal use and testing + */ + distance_t scaleValueIntoDistanceRange(double value); private: Parameters m_params;
--- a/test/TestDistanceMetric.cpp Thu Feb 26 10:28:23 2015 +0000 +++ b/test/TestDistanceMetric.cpp Thu Feb 26 10:38:59 2015 +0000 @@ -1,3 +1,4 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "DistanceMetric.h" @@ -17,31 +18,63 @@ feature_t f; int fd[] = { 0, 1, 2, 3 }; for (int i = 0; i < 4; ++i) { - f.push_back(featurebin_t(fd[i] * m)); + f.push_back(featurebin_t(fd[i] * m)); } return f; } BOOST_AUTO_TEST_SUITE(TestDistanceMetric) +BOOST_AUTO_TEST_CASE(scale) +{ + DistanceMetric::Parameters params; + params.scale = 1.0; + DistanceMetric dm(params); + + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2); + + if (sizeof(distance_t) == 1) { + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 255); + } else { + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256); + } + + params.scale = 2.0; + dm = DistanceMetric(params); + + if (sizeof(distance_t) == 1) { + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 2); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 4); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(128.0), 255); + } else { + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2); + BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256); + } +} + BOOST_AUTO_TEST_CASE(nonorm) { DistanceMetric::Parameters params; params.norm = DistanceMetric::NoDistanceNormalisation; DistanceMetric dm(params); feature_t - e1 = getTestFeature(1), - e2 = getTestFeature(2), - e0 = getTestFeature(0); + e1 = getTestFeature(1), + e2 = getTestFeature(2), + e0 = getTestFeature(0); double noise = 1e-3 * 4; - BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), 0.0 + noise); - BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), 6.0 + noise); - BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), 6.0 + noise); - BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), 0.0 + noise); - BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), 6.0 + noise); - BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), 12.0 + noise); + BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(0.0 + noise)); + BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(6.0 + noise)); + BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(6.0 + noise)); + BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(0.0 + noise)); + BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange(6.0 + noise)); + BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(12.0 + noise)); } BOOST_AUTO_TEST_CASE(sum) @@ -50,18 +83,18 @@ params.norm = DistanceMetric::NormaliseDistanceToSum; DistanceMetric dm(params); feature_t - e1 = getTestFeature(1), - e2 = getTestFeature(2), - e0 = getTestFeature(0); + e1 = getTestFeature(1), + e2 = getTestFeature(2), + e0 = getTestFeature(0); double noise = 1e-3 * 4; - BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), 1.0); - BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), 1.0); - BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), 1.0); - BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), noise / (12.0 + noise)); - BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), (6.0 + noise) / (18.0 + noise)); - BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), 1.0); + BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(1.0)); + BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(1.0)); + BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(1.0)); + BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(noise / (12.0 + noise))); + BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange((6.0 + noise) / (18.0 + noise))); + BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(1.0)); } BOOST_AUTO_TEST_SUITE_END()