annotate src/Finder.h @ 154:4159f6b71942 structure

More cost query methods
author Chris Cannam
date Fri, 23 Jan 2015 14:55:19 +0000
parents 3673e2dae6a7
children 28c73e5db2eb
rev   line source
cannam@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@0 2
cannam@0 3 /*
cannam@0 4 Vamp feature extraction plugin using the MATCH audio alignment
cannam@0 5 algorithm.
cannam@0 6
cannam@0 7 Centre for Digital Music, Queen Mary, University of London.
cannam@0 8 This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
cannam@0 9
cannam@0 10 This program is free software; you can redistribute it and/or
cannam@0 11 modify it under the terms of the GNU General Public License as
cannam@0 12 published by the Free Software Foundation; either version 2 of the
cannam@0 13 License, or (at your option) any later version. See the file
cannam@0 14 COPYING included with this distribution for more information.
cannam@0 15 */
cannam@0 16
cannam@0 17 #ifndef _FINDER_H_
cannam@0 18 #define _FINDER_H_
cannam@0 19
cannam@0 20 #include <vector>
cannam@0 21 #include <iostream>
cannam@0 22
cannam@0 23 #include "Matcher.h"
cannam@0 24
Chris@72 25 class Finder
Chris@72 26 {
cannam@0 27 public:
Chris@72 28 Finder(Matcher *pm);
cannam@0 29
cannam@0 30 ~Finder();
cannam@0 31
Chris@154 32 void setMatcher(Matcher *pm);
Chris@154 33
Chris@60 34 /**
Chris@60 35 * Tell the finder that one or both files ends sooner than it
Chris@60 36 * thought, i.e. that some of the trailing features are silence or
Chris@60 37 * otherwise to be ignored. d1 and d2 are feature frame counts for
Chris@60 38 * matchers 1 and 2 respectively. If this is not called, the full
Chris@60 39 * duration of each input will be considered.
Chris@60 40 */
Chris@60 41 void setDurations(int d1, int d2);
Chris@147 42
Chris@147 43 /**
Chris@154 44 * Find the location and cost of the column with the cheapest path
Chris@154 45 * cost within the given row. If the row is out of range, return
Chris@154 46 * false and leave the bestCol and bestCost variables unchanged.
Chris@154 47 */
Chris@154 48 bool getBestRowCost(int row, int &bestCol, double &bestCost);
Chris@154 49
Chris@154 50 /**
Chris@154 51 * Find the location and cost of the row with the cheapest path
Chris@154 52 * cost within the given column. If the column is out of range,
Chris@154 53 * return false and leave the bestRow and bestCost variables
Chris@154 54 * unchanged.
Chris@154 55 */
Chris@154 56 bool getBestColCost(int col, int &bestRow, double &bestCost);
Chris@154 57
Chris@154 58 /**
Chris@147 59 * Find the location and cost of the cheapest path cost within the
Chris@147 60 * final row and column of the search area, given that the area
Chris@147 61 * extends as far as the point at (row, col). This is used by
Chris@147 62 * getExpandDirection and can also be used, for example, to
Chris@147 63 * determine the current best estimate alignment for a frame we
Chris@147 64 * have just reached.
Chris@147 65 */
Chris@147 66 void getBestEdgeCost(int row, int col,
Chris@147 67 int &bestRow, int &bestCol,
Chris@147 68 double &bestCost);
Chris@147 69
Chris@147 70 /**
Chris@147 71 * Calculate which direction to expand the search area in, given
Chris@147 72 * that so far it extends as far as the point at (row, col).
Chris@147 73 */
Chris@45 74 Matcher::Advance getExpandDirection(int row, int col);
Chris@45 75
cannam@0 76 /** Calculates a rectangle of the path cost matrix so that the
cannam@0 77 * minimum cost path between the bottom left and top right
cannam@0 78 * corners can be computed. Caches previous values to avoid
cannam@0 79 * calling find() multiple times, and is several times faster as
cannam@0 80 * a result.
cannam@0 81 *
cannam@0 82 * @param r1 the bottom of the rectangle to be calculated
cannam@0 83 * @param c1 the left side of the rectangle to be calculated
cannam@0 84 * @param r2 the top of the rectangle to be calculated
cannam@0 85 * @param c2 the right side of the rectangle to be calculated
cannam@0 86 */
cannam@0 87 void recalculatePathCostMatrix(int r1, int c1, int r2, int c2);
cannam@0 88
Chris@30 89 /**
Chris@30 90 * Track back after all of the matchers have been fed in order to
Chris@30 91 * obtain the lowest cost path available. Path x and y coordinate
Chris@30 92 * pairs are returned in corresponding elements of pathx and
Chris@30 93 * pathy. Return value is the length of the returned path: only
Chris@30 94 * this many elements from pathx and pathy are valid (any
Chris@30 95 * subsequent ones may be spurious).
Chris@31 96 *
Chris@31 97 * @param smooth whether to smooth the path before returning it
Chris@30 98 */
Chris@31 99 int retrievePath(bool smooth, std::vector<int> &pathx, std::vector<int> &pathy);
Chris@72 100
Chris@72 101 protected:
Chris@82 102 #ifdef PERFORM_ERROR_CHECKS
Chris@81 103 struct ErrorPosition {
Chris@86 104 enum Type { NoError = 0, WrongCost, WrongAdvance, NoAdvance };
Chris@81 105 ErrorPosition() : type(NoError) { }
Chris@81 106 Type type;
Chris@81 107 int r;
Chris@81 108 int c;
Chris@81 109 double prevCost;
Chris@81 110 float distance;
Chris@81 111 double costWas;
Chris@81 112 double costShouldBe;
Chris@84 113 Matcher::Advance advanceWas;
Chris@84 114 Matcher::Advance advanceShouldBe;
Chris@81 115 };
Chris@81 116 ErrorPosition checkPathCostMatrix();
Chris@92 117 void checkAndReport();
Chris@82 118 #endif
Chris@82 119
Chris@147 120 Matcher *m_m; // I do not own this
Chris@147 121
Chris@72 122 int m_duration1;
Chris@72 123 int m_duration2;
Chris@147 124 };
cannam@0 125
cannam@0 126 #endif