Mercurial > hg > nnls-chroma
comparison viterbi.cpp @ 122:21181297da99 monophonicness
replacing unsigned/size_t iterators by int and casting others to int
author | matthiasm |
---|---|
date | Fri, 15 Apr 2011 11:31:37 +0000 |
parents | 7a8956e903e1 |
children | 3c731acad404 |
comparison
equal
deleted
inserted
replaced
121:072327bbb1a2 | 122:21181297da99 |
---|---|
2 #include "viterbi.h" | 2 #include "viterbi.h" |
3 #include <iostream> | 3 #include <iostream> |
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 unsigned nState = init.size(); | 7 int nState = init.size(); |
8 unsigned nFrame = obs.size(); | 8 int nFrame = obs.size(); |
9 | 9 |
10 // check for consistency | 10 // check for consistency |
11 if (trans[0].size() != nState || trans.size() != nState || obs[0].size() != nState) { | 11 if ((int)trans[0].size() != nState || (int)trans.size() != nState || (int)obs[0].size() != nState) { |
12 cerr << "ERROR: matrix sizes inconsistent." << endl; | 12 cerr << "ERROR: matrix sizes inconsistent." << endl; |
13 } | 13 } |
14 | 14 |
15 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 |
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) | 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) |
17 | 17 |
18 double deltasum = 0; | 18 double deltasum = 0; |
19 | 19 |
20 /* initialise first frame */ | 20 /* initialise first frame */ |
21 for (unsigned iState = 0; iState < nState; ++iState) { | 21 for (int iState = 0; iState < nState; ++iState) { |
22 delta[iState] = init[iState] * obs[0][iState]; | 22 delta[iState] = init[iState] * obs[0][iState]; |
23 deltasum += delta[iState]; | 23 deltasum += delta[iState]; |
24 } | 24 } |
25 for (unsigned iState = 0; iState < nState; ++iState) delta[iState] /= deltasum; // normalise (scale) | 25 for (int iState = 0; iState < nState; ++iState) delta[iState] /= deltasum; // normalise (scale) |
26 scale->push_back(1.0/deltasum); | 26 scale->push_back(1.0/deltasum); |
27 psi.push_back(vector<int>(nState,0)); | 27 psi.push_back(vector<int>(nState,0)); |
28 | 28 |
29 /* rest of the forward step */ | 29 /* rest of the forward step */ |
30 for (unsigned iFrame = 1; iFrame < nFrame; ++iFrame) { | 30 for (int iFrame = 1; iFrame < nFrame; ++iFrame) { |
31 deltasum = 0; | 31 deltasum = 0; |
32 psi.push_back(vector<int>(nState,0)); | 32 psi.push_back(vector<int>(nState,0)); |
33 /* every state wants to know which previous state suits it best */ | 33 /* every state wants to know which previous state suits it best */ |
34 for (unsigned jState = 0; jState < nState; ++jState) { | 34 for (int jState = 0; jState < nState; ++jState) { |
35 int bestState = nState - 1; | 35 int bestState = nState - 1; |
36 double bestValue = 0; | 36 double bestValue = 0; |
37 if (obs[iFrame][jState] > 0) { | 37 if (obs[iFrame][jState] > 0) { |
38 for (unsigned iState = 0; iState < nState; ++iState) { | 38 for (int iState = 0; iState < nState; ++iState) { |
39 double currentValue = delta[(iFrame-1) * nState + iState] * trans[iState][jState]; | 39 double currentValue = delta[(iFrame-1) * nState + iState] * trans[iState][jState]; |
40 if (currentValue > bestValue) { | 40 if (currentValue > bestValue) { |
41 bestValue = currentValue; | 41 bestValue = currentValue; |
42 bestState = iState; | 42 bestState = iState; |
43 } | 43 } |
47 delta[iFrame * nState + jState] = bestValue * obs[iFrame][jState]; | 47 delta[iFrame * nState + jState] = bestValue * obs[iFrame][jState]; |
48 deltasum += delta[iFrame * nState + jState]; | 48 deltasum += delta[iFrame * nState + jState]; |
49 psi[iFrame][jState] = bestState; | 49 psi[iFrame][jState] = bestState; |
50 } | 50 } |
51 if (deltasum > 0) { | 51 if (deltasum > 0) { |
52 for (unsigned iState = 0; iState < nState; ++iState) { | 52 for (int iState = 0; iState < nState; ++iState) { |
53 delta[iFrame * nState + iState] /= deltasum; // normalise (scale) | 53 delta[iFrame * nState + iState] /= deltasum; // normalise (scale) |
54 } | 54 } |
55 scale->push_back(1.0/deltasum); | 55 scale->push_back(1.0/deltasum); |
56 } else { | 56 } else { |
57 for (unsigned iState = 0; iState < nState; ++iState) { | 57 for (int iState = 0; iState < nState; ++iState) { |
58 delta[iFrame * nState + iState] = 1.0/nState; | 58 delta[iFrame * nState + iState] = 1.0/nState; |
59 } | 59 } |
60 scale->push_back(1.0); | 60 scale->push_back(1.0); |
61 } | 61 } |
62 | 62 |
63 } | 63 } |
64 | 64 |
65 /* initialise backward step */ | 65 /* initialise backward step */ |
66 double bestValue = 0; | 66 double bestValue = 0; |
67 for (unsigned iState = 0; iState < nState; ++iState) { | 67 for (int iState = 0; iState < nState; ++iState) { |
68 double currentValue = delta[(nFrame-1) * nState + iState]; | 68 double currentValue = delta[(nFrame-1) * nState + iState]; |
69 if (currentValue > bestValue) { | 69 if (currentValue > bestValue) { |
70 bestValue = currentValue; | 70 bestValue = currentValue; |
71 path[nFrame-1] = iState; | 71 path[nFrame-1] = iState; |
72 } | 72 } |