Mercurial > hg > match-vamp
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