changeset 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 d4b3b5c2cb58
children f415747b151b
files src/DistanceMetric.cpp src/DistanceMetric.h
diffstat 2 files changed, 54 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/DistanceMetric.cpp	Thu Feb 26 12:26:33 2015 +0000
+++ b/src/DistanceMetric.cpp	Thu Feb 26 15:51:50 2015 +0000
@@ -22,14 +22,19 @@
 
 using namespace std;
 
-//#define DEBUG_DISTANCE_METRIC 1
+#define DEBUG_DISTANCE_METRIC 1
 
 template <> uint8_t
 DistanceMetric::scaleIntoRange(double distance)
 {
     double scaled = m_params.scale * distance;
-    if (scaled < 0) scaled = 0;
-    if (scaled > 255) scaled = 255;
+    if (scaled < 0) {
+        scaled = 0;
+    }
+    if (scaled > MaxDistance) {
+        scaled = MaxDistance;
+        ++m_overcount;
+    }
     return uint8_t(scaled);
 }
 
@@ -46,20 +51,53 @@
 }
 
 DistanceMetric::DistanceMetric(Parameters params) :
-    m_params(params)
+    m_params(params),
+    m_max(0),
+    m_overcount(0)
 {
 #ifdef DEBUG_DISTANCE_METRIC
-    cerr << "*** DistanceMetric: norm = " << m_params.norm
+    cerr << "*** DistanceMetric: metric = " << m_params.metric
+         << ", norm = " << m_params.norm
+         << ", noise = " << m_params.noise
+         << ", scale = " << m_params.scale
          << endl;
 #endif
 }
 
+DistanceMetric::~DistanceMetric()
+{
+#ifdef DEBUG_DISTANCE_METRIC
+    cerr << "*** DistanceMetric::~DistanceMetric: metric = " << m_params.metric
+         << ", norm = " << m_params.norm
+         << ", noise = " << m_params.noise;
+#ifdef USE_COMPACT_TYPES
+    cerr << ", scale = " << m_params.scale;
+    cerr << "\n*** DistanceMetric::~DistanceMetric: max scaled value = "
+         << distance_print_t(m_max)
+         << ", " << m_overcount << " clipped" << endl;
+#else
+    cerr << ", no scaling";
+    cerr << "\n*** DistanceMetric::~DistanceMetric: max value = "
+         << distance_print_t(m_max)
+         << endl;
+#endif
+#endif
+}
+
 distance_t
 DistanceMetric::scaleValueIntoDistanceRange(double value)
 {
     return scaleIntoRange<distance_t>(value);
 }
-    
+
+distance_t
+DistanceMetric::scaleAndTally(double value)
+{
+    distance_t dist = scaleIntoRange<distance_t>(value);
+    if (dist > m_max) m_max = dist;
+    return dist;
+}
+
 distance_t
 DistanceMetric::calcDistance(const feature_t &f1,
 			     const feature_t &f2)
@@ -88,7 +126,7 @@
         }
         if (d > 1.0) d = 1.0;
         
-        return scaleIntoRange<distance_t>(d); // normalisation param ignored
+        return scaleAndTally(d); // normalisation param ignored
     }
 
     if (m_params.metric == Manhattan) {
@@ -112,7 +150,7 @@
     }
     
     if (sum == 0) {
-        return scaleIntoRange<distance_t>(0);
+        return scaleAndTally(0);
     }
 
     double distance = 0;
@@ -140,5 +178,5 @@
         distance = d;
     }
     
-    return scaleIntoRange<distance_t>(distance);
+    return scaleAndTally(distance);
 }
--- a/src/DistanceMetric.h	Thu Feb 26 12:26:33 2015 +0000
+++ b/src/DistanceMetric.h	Thu Feb 26 15:51:50 2015 +0000
@@ -69,7 +69,7 @@
             metric(Manhattan),
             norm(NormaliseDistanceToLogSum),
             noise(AddNoise),
-            scale(90.)
+            scale(200.)
         {}
 
         Metric metric;
@@ -79,6 +79,8 @@
     };
     
     DistanceMetric(Parameters params);
+
+    ~DistanceMetric();
     
     /** Calculates the distance in some metric between two vectors,
      *  with an optional normalisation by the combined values in the
@@ -100,7 +102,11 @@
 private:
     Parameters m_params;
 
+    distance_t scaleAndTally(double);
     template <typename T> T scaleIntoRange(double);
+
+    distance_t m_max;
+    int m_overcount;
 };
 
 #endif