annotate test/TestDistanceMetric.cpp @ 246:aac9ad4064ea subsequence tip

Fix incorrect handling of silent tail in the non-subsequence MATCH phase; some debug output changes
author Chris Cannam
date Fri, 24 Jul 2020 14:29:55 +0100
parents 827176d3b6ec
children
rev   line source
Chris@186 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@131 2
Chris@131 3 #include "DistanceMetric.h"
Chris@131 4
Chris@131 5 #include <vector>
Chris@131 6 #include <iostream>
Chris@131 7 #include <cmath>
Chris@131 8
Chris@131 9 using namespace std;
Chris@131 10
Chris@131 11 #define BOOST_TEST_DYN_LINK
Chris@131 12 #define BOOST_TEST_MAIN
Chris@131 13
Chris@131 14 #include <boost/test/unit_test.hpp>
Chris@131 15
Chris@185 16 static feature_t getTestFeature(double m)
Chris@131 17 {
Chris@185 18 feature_t f;
Chris@185 19 int fd[] = { 0, 1, 2, 3 };
Chris@131 20 for (int i = 0; i < 4; ++i) {
Chris@186 21 f.push_back(featurebin_t(fd[i] * m));
Chris@131 22 }
Chris@131 23 return f;
Chris@131 24 }
Chris@131 25
Chris@131 26 BOOST_AUTO_TEST_SUITE(TestDistanceMetric)
Chris@131 27
Chris@186 28 BOOST_AUTO_TEST_CASE(scale)
Chris@186 29 {
Chris@186 30 DistanceMetric::Parameters params;
Chris@186 31 params.scale = 1.0;
Chris@186 32 DistanceMetric dm(params);
Chris@186 33
Chris@186 34 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0);
Chris@186 35 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1);
Chris@186 36 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2);
Chris@186 37
Chris@186 38 if (sizeof(distance_t) == 1) {
Chris@212 39 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), DISTANCE_MAX);
Chris@186 40 } else {
Chris@186 41 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256);
Chris@186 42 }
Chris@186 43
Chris@186 44 params.scale = 2.0;
Chris@186 45 dm = DistanceMetric(params);
Chris@186 46
Chris@186 47 if (sizeof(distance_t) == 1) {
Chris@186 48 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0);
Chris@186 49 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 2);
Chris@186 50 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 4);
Chris@212 51 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(128.0), DISTANCE_MAX);
Chris@186 52 } else {
Chris@186 53 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0);
Chris@186 54 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1);
Chris@186 55 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2);
Chris@186 56 BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256);
Chris@186 57 }
Chris@186 58 }
Chris@186 59
Chris@131 60 BOOST_AUTO_TEST_CASE(nonorm)
Chris@131 61 {
Chris@143 62 DistanceMetric::Parameters params;
Chris@143 63 params.norm = DistanceMetric::NoDistanceNormalisation;
Chris@143 64 DistanceMetric dm(params);
Chris@185 65 feature_t
Chris@186 66 e1 = getTestFeature(1),
Chris@186 67 e2 = getTestFeature(2),
Chris@186 68 e0 = getTestFeature(0);
Chris@131 69
Chris@146 70 double noise = 1e-3 * 4;
Chris@197 71 #ifdef USE_COMPACT_TYPES
Chris@197 72 noise = 1.0 / params.scale;
Chris@197 73 #endif
Chris@146 74
Chris@186 75 BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(0.0 + noise));
Chris@186 76 BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(6.0 + noise));
Chris@186 77 BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(6.0 + noise));
Chris@186 78 BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(0.0 + noise));
Chris@186 79 BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange(6.0 + noise));
Chris@186 80 BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(12.0 + noise));
Chris@133 81 }
Chris@133 82
Chris@133 83 BOOST_AUTO_TEST_CASE(sum)
Chris@133 84 {
Chris@143 85 DistanceMetric::Parameters params;
Chris@143 86 params.norm = DistanceMetric::NormaliseDistanceToSum;
Chris@143 87 DistanceMetric dm(params);
Chris@185 88 feature_t
Chris@186 89 e1 = getTestFeature(1),
Chris@186 90 e2 = getTestFeature(2),
Chris@186 91 e0 = getTestFeature(0);
Chris@133 92
Chris@146 93 double noise = 1e-3 * 4;
Chris@197 94 #ifdef USE_COMPACT_TYPES
Chris@197 95 noise = 1.0 / params.scale;
Chris@197 96 #endif
Chris@146 97
Chris@186 98 BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(1.0));
Chris@186 99 BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(1.0));
Chris@186 100 BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(1.0));
Chris@186 101 BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(noise / (12.0 + noise)));
Chris@186 102 BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange((6.0 + noise) / (18.0 + noise)));
Chris@186 103 BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(1.0));
Chris@131 104 }
Chris@131 105
Chris@131 106 BOOST_AUTO_TEST_SUITE_END()
Chris@131 107
Chris@131 108
Chris@131 109