comparison src/DistanceMetric.cpp @ 190:48f9c50587dc re-minimise

Print some info about scale range, so we can work out what scale factor to use
author Chris Cannam
date Thu, 26 Feb 2015 15:51:50 +0000
parents af6120a32063
children fa005e5e0953
comparison
equal deleted inserted replaced
189:d4b3b5c2cb58 190:48f9c50587dc
20 #include <cmath> 20 #include <cmath>
21 #include <iostream> 21 #include <iostream>
22 22
23 using namespace std; 23 using namespace std;
24 24
25 //#define DEBUG_DISTANCE_METRIC 1 25 #define DEBUG_DISTANCE_METRIC 1
26 26
27 template <> uint8_t 27 template <> uint8_t
28 DistanceMetric::scaleIntoRange(double distance) 28 DistanceMetric::scaleIntoRange(double distance)
29 { 29 {
30 double scaled = m_params.scale * distance; 30 double scaled = m_params.scale * distance;
31 if (scaled < 0) scaled = 0; 31 if (scaled < 0) {
32 if (scaled > 255) scaled = 255; 32 scaled = 0;
33 }
34 if (scaled > MaxDistance) {
35 scaled = MaxDistance;
36 ++m_overcount;
37 }
33 return uint8_t(scaled); 38 return uint8_t(scaled);
34 } 39 }
35 40
36 template <> float 41 template <> float
37 DistanceMetric::scaleIntoRange(double distance) 42 DistanceMetric::scaleIntoRange(double distance)
44 { 49 {
45 return distance; 50 return distance;
46 } 51 }
47 52
48 DistanceMetric::DistanceMetric(Parameters params) : 53 DistanceMetric::DistanceMetric(Parameters params) :
49 m_params(params) 54 m_params(params),
55 m_max(0),
56 m_overcount(0)
50 { 57 {
51 #ifdef DEBUG_DISTANCE_METRIC 58 #ifdef DEBUG_DISTANCE_METRIC
52 cerr << "*** DistanceMetric: norm = " << m_params.norm 59 cerr << "*** DistanceMetric: metric = " << m_params.metric
60 << ", norm = " << m_params.norm
61 << ", noise = " << m_params.noise
62 << ", scale = " << m_params.scale
53 << endl; 63 << endl;
64 #endif
65 }
66
67 DistanceMetric::~DistanceMetric()
68 {
69 #ifdef DEBUG_DISTANCE_METRIC
70 cerr << "*** DistanceMetric::~DistanceMetric: metric = " << m_params.metric
71 << ", norm = " << m_params.norm
72 << ", noise = " << m_params.noise;
73 #ifdef USE_COMPACT_TYPES
74 cerr << ", scale = " << m_params.scale;
75 cerr << "\n*** DistanceMetric::~DistanceMetric: max scaled value = "
76 << distance_print_t(m_max)
77 << ", " << m_overcount << " clipped" << endl;
78 #else
79 cerr << ", no scaling";
80 cerr << "\n*** DistanceMetric::~DistanceMetric: max value = "
81 << distance_print_t(m_max)
82 << endl;
83 #endif
54 #endif 84 #endif
55 } 85 }
56 86
57 distance_t 87 distance_t
58 DistanceMetric::scaleValueIntoDistanceRange(double value) 88 DistanceMetric::scaleValueIntoDistanceRange(double value)
59 { 89 {
60 return scaleIntoRange<distance_t>(value); 90 return scaleIntoRange<distance_t>(value);
61 } 91 }
62 92
93 distance_t
94 DistanceMetric::scaleAndTally(double value)
95 {
96 distance_t dist = scaleIntoRange<distance_t>(value);
97 if (dist > m_max) m_max = dist;
98 return dist;
99 }
100
63 distance_t 101 distance_t
64 DistanceMetric::calcDistance(const feature_t &f1, 102 DistanceMetric::calcDistance(const feature_t &f1,
65 const feature_t &f2) 103 const feature_t &f2)
66 { 104 {
67 double d = 0; 105 double d = 0;
86 if (m_params.noise == AddNoise) { 124 if (m_params.noise == AddNoise) {
87 d += 1e-2; 125 d += 1e-2;
88 } 126 }
89 if (d > 1.0) d = 1.0; 127 if (d > 1.0) d = 1.0;
90 128
91 return scaleIntoRange<distance_t>(d); // normalisation param ignored 129 return scaleAndTally(d); // normalisation param ignored
92 } 130 }
93 131
94 if (m_params.metric == Manhattan) { 132 if (m_params.metric == Manhattan) {
95 for (int i = 0; i < featureSize; i++) { 133 for (int i = 0; i < featureSize; i++) {
96 d += fabs(f1[i] - f2[i]); 134 d += fabs(f1[i] - f2[i]);
110 d += noise; 148 d += noise;
111 sum += noise; 149 sum += noise;
112 } 150 }
113 151
114 if (sum == 0) { 152 if (sum == 0) {
115 return scaleIntoRange<distance_t>(0); 153 return scaleAndTally(0);
116 } 154 }
117 155
118 double distance = 0; 156 double distance = 0;
119 157
120 if (m_params.norm == NormaliseDistanceToSum) { 158 if (m_params.norm == NormaliseDistanceToSum) {
138 } else { 176 } else {
139 177
140 distance = d; 178 distance = d;
141 } 179 }
142 180
143 return scaleIntoRange<distance_t>(distance); 181 return scaleAndTally(distance);
144 } 182 }