comparison viterbi.cpp @ 119:c4d1208e5ea9 monophonicness

tidying up a bit
author Matthias Mauch <mail@matthiasmauch.net>
date Thu, 31 Mar 2011 14:59:11 +0100
parents bf894897436d
children 7a8956e903e1
comparison
equal deleted inserted replaced
118:4663b1f184e8 119:c4d1208e5ea9
4 4
5 std::vector<int> ViterbiPath(std::vector<double> init, std::vector<vector<double> > trans, std::vector<vector<double> > obs, double *delta, vector<double> *scale) { 5 std::vector<int> ViterbiPath(std::vector<double> init, std::vector<vector<double> > trans, std::vector<vector<double> > obs, double *delta, vector<double> *scale) {
6 6
7 int nState = init.size(); 7 int nState = init.size();
8 int nFrame = obs.size(); 8 int nFrame = obs.size();
9 // cerr << nState << " " << nFrame << endl;
10 9
11 // check for consistency 10 // check for consistency
12 if (trans[0].size() != nState || trans.size() != nState || obs[0].size() != nState) { 11 if (trans[0].size() != nState || trans.size() != nState || obs[0].size() != nState) {
13 cerr << "ERROR: matrix sizes inconsistent." << endl; 12 cerr << "ERROR: matrix sizes inconsistent." << endl;
14 } 13 }
15 14
16 // vector<vector<double> > delta; // "matrix" of conditional probabilities
17 vector<vector<int> > psi; // "matrix" of remembered indices of the best transitions 15 vector<vector<int> > psi; // "matrix" of remembered indices of the best transitions
18 vector<int> path = vector<int>(nFrame, nState-1); // the final output path (current assignment arbitrary, makes sense only for Chordino, where nChord-1 is the "no chord" label) 16 vector<int> path = vector<int>(nFrame, nState-1); // the final output path (current assignment arbitrary, makes sense only for Chordino, where nChord-1 is the "no chord" label)
19 // vector<double> scale = vector<double>(nFrame, 0); // remembers by how much the vectors in delta are scaled.
20 17
21 double deltasum = 0; 18 double deltasum = 0;
22 19
23 /* initialise first frame */ 20 /* initialise first frame */
24 // delta.push_back(init);
25 for (int iState = 0; iState < nState; ++iState) { 21 for (int iState = 0; iState < nState; ++iState) {
26 delta[iState] = init[iState] * obs[0][iState]; 22 delta[iState] = init[iState] * obs[0][iState];
27 deltasum += delta[iState]; 23 deltasum += delta[iState];
28 } 24 }
29 for (int iState = 0; iState < nState; ++iState) delta[iState] /= deltasum; // normalise (scale) 25 for (int iState = 0; iState < nState; ++iState) delta[iState] /= deltasum; // normalise (scale)
30 scale->push_back(1.0/deltasum); 26 scale->push_back(1.0/deltasum);
31 psi.push_back(vector<int>(nState,0)); 27 psi.push_back(vector<int>(nState,0));
32 28
33 /* rest of the forward step */ 29 /* rest of the forward step */
34 for (int iFrame = 1; iFrame < nFrame; ++iFrame) { 30 for (int iFrame = 1; iFrame < nFrame; ++iFrame) {
35 // delta.push_back(vector<double>(nState,0));
36 deltasum = 0; 31 deltasum = 0;
37 psi.push_back(vector<int>(nState,0)); 32 psi.push_back(vector<int>(nState,0));
38 /* every state wants to know which previous state suits him best */ 33 /* every state wants to know which previous state suits it best */
39 for (int jState = 0; jState < nState; ++jState) { 34 for (int jState = 0; jState < nState; ++jState) {
40 int bestState = nState - 1; 35 int bestState = nState - 1;
41 double bestValue = 0; 36 double bestValue = 0;
42 if (obs[iFrame][jState] > 0) { 37 if (obs[iFrame][jState] > 0) {
43 for (int iState = 0; iState < nState; ++iState) { 38 for (int iState = 0; iState < nState; ++iState) {
46 bestValue = currentValue; 41 bestValue = currentValue;
47 bestState = iState; 42 bestState = iState;
48 } 43 }
49 } 44 }
50 } 45 }
51 // cerr << bestState <<" ::: " << bestValue << endl ; 46
52 delta[iFrame * nState + jState] = bestValue * obs[iFrame][jState]; 47 delta[iFrame * nState + jState] = bestValue * obs[iFrame][jState];
53 deltasum += delta[iFrame * nState + jState]; 48 deltasum += delta[iFrame * nState + jState];
54 psi[iFrame][jState] = bestState; 49 psi[iFrame][jState] = bestState;
55 } 50 }
56 if (deltasum > 0) { 51 if (deltasum > 0) {
78 } 73 }
79 74
80 /* rest of backward step */ 75 /* rest of backward step */
81 for (int iFrame = nFrame-2; iFrame > -1; --iFrame) { 76 for (int iFrame = nFrame-2; iFrame > -1; --iFrame) {
82 path[iFrame] = psi[iFrame+1][path[iFrame+1]]; 77 path[iFrame] = psi[iFrame+1][path[iFrame+1]];
83 // cerr << path[iFrame] << endl;
84 } 78 }
85 79
86 return path; 80 return path;
87 } 81 }