commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r4371 - gnuradio/trunk/gr-trellis/src/lib


From: anastas
Subject: [Commit-gnuradio] r4371 - gnuradio/trunk/gr-trellis/src/lib
Date: Sun, 4 Feb 2007 16:09:12 -0700 (MST)

Author: anastas
Date: 2007-02-04 16:09:12 -0700 (Sun, 04 Feb 2007)
New Revision: 4371

Modified:
   gnuradio/trunk/gr-trellis/src/lib/fsm.cc
   gnuradio/trunk/gr-trellis/src/lib/fsm.h
   gnuradio/trunk/gr-trellis/src/lib/fsm.i
   gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc
   gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc
Log:
added support for irregular FSMs

Modified: gnuradio/trunk/gr-trellis/src/lib/fsm.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/fsm.cc    2007-02-04 20:12:37 UTC (rev 
4370)
+++ gnuradio/trunk/gr-trellis/src/lib/fsm.cc    2007-02-04 23:09:12 UTC (rev 
4371)
@@ -47,7 +47,7 @@
   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 @@
 //######################################################################
 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 @@
       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);
+    }
   }
 }
 

Modified: gnuradio/trunk/gr-trellis/src/lib/fsm.h
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/fsm.h     2007-02-04 20:12:37 UTC (rev 
4370)
+++ gnuradio/trunk/gr-trellis/src/lib/fsm.h     2007-02-04 23:09:12 UTC (rev 
4371)
@@ -35,8 +35,8 @@
   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 @@
   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; }
 };

Modified: gnuradio/trunk/gr-trellis/src/lib/fsm.i
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/fsm.i     2007-02-04 20:12:37 UTC (rev 
4370)
+++ gnuradio/trunk/gr-trellis/src/lib/fsm.i     2007-02-04 23:09:12 UTC (rev 
4371)
@@ -27,8 +27,8 @@
   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 @@
   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; }
 };

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc        
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc        
2007-02-04 23:09:12 UTC (rev 4371)
@@ -138,8 +138,8 @@
 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 @@
       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;

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc 2007-02-04 20:12:37 UTC 
(rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc 2007-02-04 23:09:12 UTC 
(rev 4371)
@@ -129,8 +129,8 @@
 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 @@
       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;

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t    2007-02-04 
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t    2007-02-04 
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
 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 @@
       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 @@
   }
 
   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];
   }
 
 }

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc      2007-02-04 
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc      2007-02-04 
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
 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 @@
       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 @@
   }
 
   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];
   }
 
 }

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t   
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t   
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
 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 @@
       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 @@
   }
 
   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;

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc     
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc     
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
 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 @@
       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 @@
   }
 
   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;

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc     
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc     
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
 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 @@
       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 @@
   }
 
   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;

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc     
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc     
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
 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 @@
       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 @@
   }
 
   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;

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc      2007-02-04 
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc      2007-02-04 
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
 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 @@
       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 @@
   }
 
   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];
   }
 
 }

Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc      2007-02-04 
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc      2007-02-04 
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
 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 @@
       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 @@
   }
 
   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];
   }
 
 }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]