# HG changeset patch # User Chris Cannam # Date 1417083247 0 # Node ID 3616d541d69e53c8fd22613647e54f9877750576 # Parent c603d77b00acce8b8da389ac0ae635ced47a177f Error-checking code optional diff -r c603d77b00ac -r 3616d541d69e src/Finder.cpp --- a/src/Finder.cpp Thu Nov 27 08:13:29 2014 +0000 +++ b/src/Finder.cpp Thu Nov 27 10:14:07 2014 +0000 @@ -43,12 +43,6 @@ Matcher::Advance Finder::getExpandDirection(int row, int col) { - return getExpandDirection(row, col, false); -} // getExpandDirection() - -Matcher::Advance -Finder::getExpandDirection(int row, int col, bool check) -{ double min = m_m->getPathCost(row, col); int bestRow = row; @@ -148,9 +142,12 @@ } } +#ifdef PERFORM_ERROR_CHECKS Finder::ErrorPosition Finder::checkPathCostMatrix() { + cerr << "Finder: Checking path-cost matrix..." << endl; + ErrorPosition err; int r1 = 0; @@ -209,20 +206,38 @@ updateTo = min; - } else if (c > rowStart) { // first row - // horizontal from (r,c-1) - dir = Matcher::AdvanceOther; - updateTo = m_m->getPathCost(r, c-1) + newCost; + } else { // first row + + if (c > rowStart) { + // horizontal from (r,c-1) + dir = Matcher::AdvanceOther; + updateTo = m_m->getPathCost(r, c-1) + newCost; + } } - if (m_m->getPathCost(r, c) != updateTo) { - err.type = ErrorPosition::CostError; - err.r = r; - err.c = c; - err.advance = dir; - err.costWas = m_m->getPathCost(r, c); - err.costShouldBe = updateTo; - return err; + if (dir != Matcher::AdvanceNone) { + if (m_m->getPathCost(r, c) != updateTo) { + cerr << "CostError found" << endl; + err.type = ErrorPosition::CostError; + err.r = r; + err.c = c; + err.advance = dir; + err.costWas = m_m->getPathCost(r, c); + err.costShouldBe = updateTo; + return err; + } + } else { + // AdvanceNone should occur only at r = r1, c = c1 + if (r != r1 || c != c1) { + cerr << "AdvanceNone error found" << endl; + err.type = ErrorPosition::NoAdvance; + err.r = r; + err.c = c; + err.advance = dir; + err.costWas = m_m->getPathCost(r, c); + err.costShouldBe = updateTo; + return err; + } } } @@ -230,8 +245,10 @@ prevRowStop = rowStop; } + cerr << "No errors found" << endl; return err; -} +} +#endif int Finder::retrievePath(bool smooth, vector &pathx, vector &pathy) @@ -239,6 +256,19 @@ pathx.clear(); pathy.clear(); +#ifdef PERFORM_ERROR_CHECKS + ErrorPosition err = checkPathCostMatrix(); + if (err.type != ErrorPosition::NoError) { + cerr << "\nWARNING: Checking path-cost matrix returned mismatch:" << endl; + cerr << "Type: " << err.type << endl; + cerr << "At row " << err.r << ", column " << err.c << " advancing " + << err.advance << "\nPrev cost " << err.prevCost + << " plus distance " << err.distance << " gives " + << err.costShouldBe << ", but matrix contains " << err.costWas + << "\n" << endl; + } +#endif + int ex = m_m->getOtherFrameCount() - 1; int ey = m_m->getFrameCount() - 1; diff -r c603d77b00ac -r 3616d541d69e src/Finder.h --- a/src/Finder.h Thu Nov 27 08:13:29 2014 +0000 +++ b/src/Finder.h Thu Nov 27 10:14:07 2014 +0000 @@ -39,7 +39,6 @@ void setDurations(int d1, int d2); Matcher::Advance getExpandDirection(int row, int col); - Matcher::Advance getExpandDirection(int row, int col, bool check); /** Calculates a rectangle of the path cost matrix so that the * minimum cost path between the bottom left and top right @@ -67,8 +66,9 @@ int retrievePath(bool smooth, std::vector &pathx, std::vector &pathy); protected: +#ifdef PERFORM_ERROR_CHECKS struct ErrorPosition { - enum Type { NoError = 0, CostError }; + enum Type { NoError = 0, CostError, NoAdvance }; ErrorPosition() : type(NoError) { } Type type; int r; @@ -80,7 +80,8 @@ double costShouldBe; }; ErrorPosition checkPathCostMatrix(); - +#endif + Matcher *m_m; int m_duration1; int m_duration2;