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 }