Mercurial > hg > nnls-chroma
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 } |