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()