Mercurial > hg > match-vamp
changeset 69:696f6e7f2f31 refactors
distYSize no longer needed, and some tidying and checks
author | Chris Cannam |
---|---|
date | Tue, 18 Nov 2014 16:35:15 +0000 |
parents | a3efb15e7faf |
children | a130ec8e5eef |
files | src/DistanceMetric.cpp src/Finder.cpp src/Matcher.cpp src/Matcher.h |
diffstat | 4 files changed, 38 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/src/DistanceMetric.cpp Tue Nov 18 10:33:03 2014 +0000 +++ b/src/DistanceMetric.cpp Tue Nov 18 16:35:15 2014 +0000 @@ -32,6 +32,8 @@ assert(int(f2.size()) == featureSize); for (int i = 0; i < featureSize; i++) { + assert(f1[i] >= 0); + assert(f2[i] >= 0); d += fabs(f1[i] - f2[i]); sum += f1[i] + f2[i]; }
--- a/src/Finder.cpp Tue Nov 18 10:33:03 2014 +0000 +++ b/src/Finder.cpp Tue Nov 18 16:35:15 2014 +0000 @@ -51,11 +51,14 @@ bool Finder::find(int i1, int i2) { - if (i1 >= 0) { + if ((i1 >= 0) && (i1 < (int)pm1->m_first.size()) && + (i2 >= pm1->m_first[i1]) && (i2 < pm1->m_last[i1])) { index1 = i1; index2 = i2 - pm1->m_first[i1]; + return true; + } else { + return false; } - return (i1 >= 0) && (i2 >= pm1->m_first[i1]) && (i2 < pm1->m_last[i1]); } // find() void @@ -278,8 +281,15 @@ int Finder::retrievePath(bool smooth, vector<int> &pathx, vector<int> &pathy) { + pathx.clear(); + pathy.clear(); + int ex = pm2->getFrameCount() - 1; int ey = pm1->getFrameCount() - 1; + + if (ex < 0 || ey < 0) { + return 0; + } int x = ex; int y = ey; @@ -305,9 +315,6 @@ recalculatePathCostMatrix(0, 0, y, x); - pathx.clear(); - pathy.clear(); - // cerr << "start: x = " << x << ", y = " << y << endl; while (find(y, x) && ((x > 0) || (y > 0))) { @@ -332,7 +339,7 @@ y--; break; case Matcher::AdvanceNone: // this would indicate a bug, but we wouldn't want to hang -// cerr << "WARNING: Neither matcher advanced in path backtrack at (" << x << "," << y << ")" << endl; + cerr << "WARNING: Neither matcher advanced in path backtrack at (" << x << "," << y << ")" << endl; if (x > y) { x--; } else {
--- a/src/Matcher.cpp Tue Nov 18 10:33:03 2014 +0000 +++ b/src/Matcher.cpp Tue Nov 18 16:35:15 2014 +0000 @@ -86,7 +86,7 @@ if (m_initialised) return; m_frames = vector<vector<double> > - (m_blockSize, vector<double>(m_featureSize, 0)); + (m_blockSize, vector<double>(m_featureSize, -1.0)); m_distXSize = m_blockSize * 2; @@ -105,7 +105,6 @@ m_bestPathCost.resize(m_distXSize, vector<double>(distSize, 0)); m_distance.resize(m_distXSize, vector<float>(distSize, 0)); m_advance.resize(m_distXSize, vector<Advance>(distSize, AdvanceNone)); - m_distYSizes.resize(m_distXSize, distSize); m_first.resize(m_distXSize, 0); m_last.resize(m_distXSize, 0); } @@ -153,22 +152,30 @@ // distance[m_frameCount], and then truncate // distance[m_frameCount-m_blockSize] to its first len elements. // Same for bestPathCost. -/* - std::cerr << "Matcher(" << this << "): moving " << distYSizes[m_frameCount - m_blockSize] << " from " << m_frameCount - m_blockSize << " to " - << m_frameCount << ", allocating " << len << " for " - << m_frameCount - m_blockSize << std::endl; -*/ - m_distance[m_frameCount] = m_distance[m_frameCount - m_blockSize]; - m_distance[m_frameCount - m_blockSize].resize(len, 0); - m_bestPathCost[m_frameCount] = m_bestPathCost[m_frameCount - m_blockSize]; - m_bestPathCost[m_frameCount - m_blockSize].resize(len, 0); + vector<float> dOld = m_distance[m_frameCount - m_blockSize]; + vector<float> dNew(len, 0.f); - m_advance[m_frameCount] = m_advance[m_frameCount - m_blockSize]; - m_advance[m_frameCount - m_blockSize].resize(len, AdvanceNone); + vector<double> bpcOld = m_bestPathCost[m_frameCount - m_blockSize]; + vector<double> bpcNew(len, 0.0); + + vector<Advance> adOld = m_advance[m_frameCount - m_blockSize]; + vector<Advance> adNew(len, AdvanceNone); + + for (int i = 0; i < len; ++i) { + dNew[i] = dOld[i]; + bpcNew[i] = bpcOld[i]; + adNew[i] = adOld[i]; + } - m_distYSizes[m_frameCount] = m_distYSizes[m_frameCount - m_blockSize]; - m_distYSizes[m_frameCount - m_blockSize] = len; + m_distance[m_frameCount] = dOld; + m_distance[m_frameCount - m_blockSize] = dNew; + + m_bestPathCost[m_frameCount] = bpcOld; + m_bestPathCost[m_frameCount - m_blockSize] = bpcNew; + + m_advance[m_frameCount] = adOld; + m_advance[m_frameCount - m_blockSize] = adNew; } int stop = m_otherMatcher->m_frameCount; @@ -272,12 +279,11 @@ int idx = i - m_otherMatcher->m_first[j]; - if (idx == (int)m_otherMatcher->m_distYSizes[j]) { + if (idx == (int)m_otherMatcher->m_distance[j].size()) { // This should never happen, but if we allow arbitrary // pauses in either direction, and arbitrary lengths at // end, it is better than a segmentation fault. std::cerr << "Emergency resize: " << idx << " -> " << idx * 2 << std::endl; - m_otherMatcher->m_distYSizes[j] = idx * 2; m_otherMatcher->m_bestPathCost[j].resize(idx * 2, 0); m_otherMatcher->m_distance[j].resize(idx * 2, 0); m_otherMatcher->m_advance[j].resize(idx * 2, AdvanceNone);
--- a/src/Matcher.h Tue Nov 18 10:33:03 2014 +0000 +++ b/src/Matcher.h Tue Nov 18 16:35:15 2014 +0000 @@ -234,10 +234,6 @@ vector<int> m_first; vector<int> m_last; - /** Height of each column in distance, path cost, and advance - * direction matrices. */ - vector<int> m_distYSizes; - /** Width of distance, path cost, and advance direction matrices * and first and last vectors */ int m_distXSize;