diff viterbi.cpp @ 50:b6cddb109482 matthiasm-plugin

added chord change value, some other tweaks
author matthiasm
date Mon, 25 Oct 2010 18:34:44 +0900
parents 109d3b2c7105
children 19f3b33a19fb
line wrap: on
line diff
--- a/viterbi.cpp	Mon Oct 25 16:58:32 2010 +0900
+++ b/viterbi.cpp	Mon Oct 25 18:34:44 2010 +0900
@@ -2,7 +2,7 @@
 #include "viterbi.h"
 #include <iostream>
 
-std::vector<int> ViterbiPath(std::vector<double> init, std::vector<vector<double> > trans, std::vector<vector<double> > obs) {
+std::vector<int> ViterbiPath(std::vector<double> init, std::vector<vector<double> > trans, std::vector<vector<double> > obs, double *delta) {
     
     int nState = init.size();
     int nFrame = obs.size();
@@ -12,8 +12,13 @@
     if (trans[0].size() != nState || trans.size() != nState || obs[0].size() != nState) {
         cerr << "ERROR: matrix sizes inconsistent." << endl;
     }
+    
+    for (int iState = 0; iState < nState; ++iState) delta[iState] = init[iState];
+    for (int iFrame = 1; iFrame < nFrame; ++iFrame) {
+        for (int iState = 0; iState < nState; ++iState) delta[iFrame*nState + iState];
+    }
         
-    vector<vector<double> > delta; // "matrix" of conditional probabilities    
+    // vector<vector<double> > delta; // "matrix" of conditional probabilities    
     vector<vector<int> > psi; //  "matrix" of remembered indices of the best transitions
     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)
     vector<double> scale = vector<double>(nFrame, 0); // remembers by how much the vectors in delta are scaled.
@@ -21,18 +26,18 @@
     double deltasum = 0;
     
     /* initialise first frame */
-    delta.push_back(init);    
+    // delta.push_back(init);    
     for (int iState = 0; iState < nState; ++iState) {
-        delta[0][iState] *= obs[0][iState];
-        deltasum += delta[0][iState];
+        delta[iState] *= obs[0][iState];
+        deltasum += delta[iState];
     }
-    for (int iState = 0; iState < nState; ++iState) delta[0][iState] /= deltasum; // normalise (scale)
+    for (int iState = 0; iState < nState; ++iState) delta[iState] /= deltasum; // normalise (scale)
     scale.push_back(1.0/deltasum);
     psi.push_back(vector<int>(nState,0));
     
     /* rest of the forward step */
     for (int iFrame = 1; iFrame < nFrame; ++iFrame) {
-        delta.push_back(vector<double>(nState,0));
+        // delta.push_back(vector<double>(nState,0));
         deltasum = 0;
         psi.push_back(vector<int>(nState,0));
         /* every state wants to know which previous state suits him best */
@@ -41,7 +46,7 @@
             double bestValue = 0;
             if (obs[iFrame][jState] > 0) {
                 for (int iState = 0; iState < nState; ++iState) {
-                    double currentValue = delta[iFrame-1][iState] * trans[iState][jState];
+                    double currentValue = delta[(iFrame-1) * nState + iState] * trans[iState][jState];
                     if (currentValue > bestValue) {
                         bestValue = currentValue;
                         bestState = iState;
@@ -49,18 +54,18 @@
                 }
             }
             // cerr << bestState <<" ::: " << bestValue << endl ;
-            delta[iFrame][jState] = bestValue * obs[iFrame][jState];
-            deltasum += delta[iFrame][jState];
+            delta[iFrame * nState + jState] = bestValue * obs[iFrame][jState];
+            deltasum += delta[iFrame * nState + jState];
             psi[iFrame][jState] = bestState;
         }
         if (deltasum > 0) {
             for (int iState = 0; iState < nState; ++iState) {            
-                delta[iFrame][iState] /= deltasum; // normalise (scale)
+                delta[iFrame * nState + iState] /= deltasum; // normalise (scale)
             }
             scale.push_back(1.0/deltasum);
         } else {
             for (int iState = 0; iState < nState; ++iState) {            
-                delta[iFrame][iState] = 1.0/nState;
+                delta[iFrame * nState + iState] = 1.0/nState;
             }
             scale.push_back(1.0);
         }
@@ -70,7 +75,7 @@
     /* initialise backward step */
     int bestValue = 0;
     for (int iState = 0; iState < nState; ++iState) {
-        double currentValue = delta[nFrame-1][iState];
+        double currentValue = delta[(nFrame-1) * nState + iState];
         if (currentValue > path[nFrame-1]) {
             bestValue = currentValue;            
             path[nFrame-1] = iState;