added support for irregular FSMs
authoranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 4 Feb 2007 23:09:12 +0000 (23:09 +0000)
committeranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 4 Feb 2007 23:09:12 +0000 (23:09 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4371 221aa14e-8319-0410-a670-987f0aec2ac5

13 files changed:
gr-trellis/src/lib/fsm.cc
gr-trellis/src/lib/fsm.h
gr-trellis/src/lib/fsm.i
gr-trellis/src/lib/trellis_siso_combined_f.cc
gr-trellis/src/lib/trellis_siso_f.cc
gr-trellis/src/lib/trellis_viterbi_X.cc.t
gr-trellis/src/lib/trellis_viterbi_b.cc
gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
gr-trellis/src/lib/trellis_viterbi_combined_b.cc
gr-trellis/src/lib/trellis_viterbi_combined_i.cc
gr-trellis/src/lib/trellis_viterbi_combined_s.cc
gr-trellis/src/lib/trellis_viterbi_i.cc
gr-trellis/src/lib/trellis_viterbi_s.cc

index 22f7772b3c4ab98efcd206f42586e6bda860ddf6..6e3933894ddf2639b325fd5ddab544a51cad2e82 100644 (file)
@@ -47,7 +47,7 @@ fsm::fsm(const fsm &FSM)
   d_O=FSM.O();
   d_NS=FSM.NS();
   d_OS=FSM.OS();
-  d_PS=FSM.PS();
+  d_PS=FSM.PS(); // is this going to make a deep copy?
   d_PI=FSM.PI();
   d_TMi=FSM.TMi();
   d_TMl=FSM.TMl();
@@ -241,17 +241,21 @@ fsm::fsm(int mod_size, int ch_length)
 //######################################################################
 void fsm::generate_PS_PI()
 {
-  d_PS.resize(d_I*d_S);
-  d_PI.resize(d_I*d_S);
+  d_PS.resize(d_S);
+  d_PI.resize(d_S);
 
   for(int i=0;i<d_S;i++) {
+    d_PS[i].resize(d_I*d_S); // max possible size
+    d_PI[i].resize(d_I*d_S);
     int j=0;
     for(int ii=0;ii<d_S;ii++) for(int jj=0;jj<d_I;jj++) {
       if(d_NS[ii*d_I+jj]!=i) continue;
-      d_PS[i*d_I+j]=ii;
-      d_PI[i*d_I+j]=jj;
+      d_PS[i][j]=ii;
+      d_PI[i][j]=jj;
       j++;
     }
+    d_PS[i].resize(j);
+    d_PI[i].resize(j);
   }
 }
 
@@ -278,9 +282,11 @@ void fsm::generate_TM()
       done = find_es(s);
       attempts ++;
     }
-    if (done == false)
+    if (done == false) {
       //throw std::runtime_error ("fsm::generate_TM(): FSM appears to be disconnected\n");
       printf("fsm::generate_TM(): FSM appears to be disconnected\n");
+      printf("state %d cannot be reached from all other states\n",s);
+    }
   }
 }
 
index 4b0453a72a0085cb1e41fb092c0da6a23349807e..66b1f1cc843fd727c8332bd064d63d641c4c1d6a 100644 (file)
@@ -35,8 +35,8 @@ private:
   int d_O;
   std::vector<int> d_NS;
   std::vector<int> d_OS;
-  std::vector<int> d_PS;
-  std::vector<int> d_PI;
+  std::vector< std::vector<int> > d_PS;
+  std::vector< std::vector<int> > d_PI;
   std::vector<int> d_TMi;
   std::vector<int> d_TMl;
   void generate_PS_PI ();
@@ -54,8 +54,8 @@ public:
   int O () const { return d_O; }
   const std::vector<int> & NS () const { return d_NS; }
   const std::vector<int> & OS () const { return d_OS; }
-  const std::vector<int> & PS () const { return d_PS; }
-  const std::vector<int> & PI () const { return d_PI; }
+  const std::vector< std::vector<int> > & PS () const { return d_PS; }
+  const std::vector< std::vector<int> > & PI () const { return d_PI; }
   const std::vector<int> & TMi () const { return d_TMi; }
   const std::vector<int> & TMl () const { return d_TMl; }
 };
index 470da0eca8cae0c2cd8803da2e2a8a5f8ed102e2..cec45fce35fc7adf30060ae263d3fd5b38cf9eaf 100644 (file)
@@ -27,8 +27,8 @@ private:
   int d_O;
   std::vector<int> d_NS;
   std::vector<int> d_OS;
-  std::vector<int> d_PS;
-  std::vector<int> d_PI;
+  std::vector< std::vector<int> > d_PS;
+  std::vector< std::vector<int> > d_PI;
   std::vector<int> d_TMi;
   std::vector<int> d_TMl;
   void generate_PS_PI ();
@@ -45,8 +45,8 @@ public:
   int O () const { return d_O; }
   const std::vector<int> & NS () const { return d_NS; }
   const std::vector<int> & OS () const { return d_OS; }
-  const std::vector<int> & PS () const { return d_PS; }
-  const std::vector<int> & PI () const { return d_PI; }
+  const std::vector< std::vector<int> > & PS () const { return d_PS; }
+  const std::vector< std::vector<int> > & PI () const { return d_PI; }
   const std::vector<int> & TMi () const { return d_TMi; }
   const std::vector<int> & TMl () const { return d_TMl; }
 };
index 9ad0ae2417f20ca7ba92867a8a5bd2e11ad872fb..293c42e15df055e2db7ed3ef2be9cfb02acc8627 100644 (file)
@@ -138,8 +138,8 @@ inline float min_star(float a, float b)
 void siso_algorithm_combined(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              bool POSTI, bool POSTO,
@@ -171,9 +171,9 @@ void siso_algorithm_combined(int I, int S, int O,
       norm=INF;
       for(int j=0;j<S;j++) {
           minm=INF;
-          for(int i=0;i<I;i++) {
+          for(int i=0;i<PS[j].size();i++) {
               int i0 = j*I+i;
-              mm=alpha[k*S+PS[i0]]+priori[k*I+PI[i0]]+prioro[k*O+OS[PS[i0]*I+PI[i0]]];
+              mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
               minm=(*p2mymin)(minm,mm);
           }
           alpha[(k+1)*S+j]=minm;
index b3d18c2b7b071815c01d72ee9a41e5465ee89b70..9fe503eea47a37ecc5c474618e73a728e80ccbab 100644 (file)
@@ -129,8 +129,8 @@ inline float min_star(float a, float b)
 void siso_algorithm(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              bool POSTI, bool POSTO,
@@ -157,9 +157,9 @@ void siso_algorithm(int I, int S, int O,
       norm=INF;
       for(int j=0;j<S;j++) {
           minm=INF;
-          for(int i=0;i<I;i++) {
-              int i0 = j*I+i;
-              mm=alpha[k*S+PS[i0]]+priori[k*I+PI[i0]]+prioro[k*O+OS[PS[i0]*I+PI[i0]]];
+          for(int i=0;i<PS[j].size();i++) {
+              //int i0 = j*I+i;
+              mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
               minm=(*p2mymin)(minm,mm);
           }
           alpha[(k+1)*S+j]=minm;
index 3cf602ff1d8652f1852db1794e440a10a2ebe14e..e3d385b1c4807d94e28c080a2373820120e1f35c 100644 (file)
@@ -77,8 +77,8 @@ void
 void viterbi_algorithm(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              const float *in, @TYPE@ *out)//,
@@ -106,9 +106,9 @@ void viterbi_algorithm(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
-              int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+          for(int i=0;i<PS[j].size();i++) {
+              //int i0 = j*I+i;
+              if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@ void viterbi_algorithm(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (@TYPE@) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (@TYPE@) PI[st][i0];
+      st=PS[st][i0];
   }
 
 }
index e30f51388ac38bf8e6e3c39874421a6cc5d500e5..01c75381ced04bb62b3f0ad9844760735cc60f46 100644 (file)
@@ -77,8 +77,8 @@ trellis_viterbi_b::forecast (int noutput_items, gr_vector_int &ninput_items_requ
 void viterbi_algorithm(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              const float *in, unsigned char *out)//,
@@ -106,9 +106,9 @@ void viterbi_algorithm(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
-              int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+          for(int i=0;i<PS[j].size();i++) {
+              //int i0 = j*I+i;
+              if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@ void viterbi_algorithm(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (unsigned char) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (unsigned char) PI[st][i0];
+      st=PS[st][i0];
   }
 
 }
index e693c1d682036a0f8211c61c74ec8ad50a39c5e6..33f629099b459c3e2d4115c3c0b1ec595e4bb14d 100644 (file)
@@ -86,8 +86,8 @@ void
 void viterbi_algorithm_combined(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              int D,
@@ -119,9 +119,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
+          for(int i=0;i<PS[j].size();i++) {
               int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+              if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (@TYPE@) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (@TYPE@) PI[st][i0];
+      st=PS[st][i0];
   }
   
   delete [] metric;
index 73e98ffed6ffc9fcd4fd5fec69674c06a10b2756..62d877f6a0353a75c42c53ae7864b2b4646bfa83 100644 (file)
@@ -86,8 +86,8 @@ trellis_viterbi_combined_b::forecast (int noutput_items, gr_vector_int &ninput_i
 void viterbi_algorithm_combined(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              int D,
@@ -119,9 +119,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
+          for(int i=0;i<PS[j].size();i++) {
               int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+              if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (unsigned char) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (unsigned char) PI[st][i0];
+      st=PS[st][i0];
   }
   
   delete [] metric;
index 754decb57d1a3c4b2b57c5d729f127117ea4bec3..37a0355002c41fa77d35df895a551baca32c21c1 100644 (file)
@@ -86,8 +86,8 @@ trellis_viterbi_combined_i::forecast (int noutput_items, gr_vector_int &ninput_i
 void viterbi_algorithm_combined(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              int D,
@@ -119,9 +119,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
+          for(int i=0;i<PS[j].size();i++) {
               int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+              if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (int) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (int) PI[st][i0];
+      st=PS[st][i0];
   }
   
   delete [] metric;
index 24c1e56b50074dacc3d5311e5047419e3947317c..c332dd0d5387423679818d2cf64732ff7b35d0fe 100644 (file)
@@ -86,8 +86,8 @@ trellis_viterbi_combined_s::forecast (int noutput_items, gr_vector_int &ninput_i
 void viterbi_algorithm_combined(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              int D,
@@ -119,9 +119,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
+          for(int i=0;i<PS[j].size();i++) {
               int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+              if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@ void viterbi_algorithm_combined(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (short) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (short) PI[st][i0];
+      st=PS[st][i0];
   }
   
   delete [] metric;
index b81df8f13a4e9a064bf124a84056bc0768676e78..f5d61173b417a2655408f9fa5c984d19c62b2862 100644 (file)
@@ -77,8 +77,8 @@ trellis_viterbi_i::forecast (int noutput_items, gr_vector_int &ninput_items_requ
 void viterbi_algorithm(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              const float *in, int *out)//,
@@ -106,9 +106,9 @@ void viterbi_algorithm(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
-              int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+          for(int i=0;i<PS[j].size();i++) {
+              //int i0 = j*I+i;
+              if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@ void viterbi_algorithm(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (int) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (int) PI[st][i0];
+      st=PS[st][i0];
   }
 
 }
index e352a260431924942be0bf716447bae29fa61dcb..ccdd115584f51fb0a5fa5644385bff76e079ff7d 100644 (file)
@@ -77,8 +77,8 @@ trellis_viterbi_s::forecast (int noutput_items, gr_vector_int &ninput_items_requ
 void viterbi_algorithm(int I, int S, int O, 
              const std::vector<int> &NS,
              const std::vector<int> &OS,
-             const std::vector<int> &PS,
-             const std::vector<int> &PI,
+             const std::vector< std::vector<int> > &PS,
+             const std::vector< std::vector<int> > &PI,
              int K,
              int S0,int SK,
              const float *in, short *out)//,
@@ -106,9 +106,9 @@ void viterbi_algorithm(int I, int S, int O,
       for(int j=0;j<S;j++) { // for each next state do ACS
           minm=INF;
           minmi=0;
-          for(int i=0;i<I;i++) {
-              int i0 = j*I+i;
-              if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+          for(int i=0;i<PS[j].size();i++) {
+              //int i0 = j*I+i;
+              if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
                   minm=mm,minmi=i;
           }
           trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@ void viterbi_algorithm(int I, int S, int O,
   }
 
   for(int k=K-1;k>=0;k--) { // traceback
-      int i0=st*I+trace[k*S+st];
-      out[k]= (short) PI[i0];
-      st=PS[i0];
+      int i0=trace[k*S+st];
+      out[k]= (short) PI[st][i0];
+      st=PS[st][i0];
   }
 
 }