commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] [gnuradio] 37/39: fec: LDPC: fixed issue with bit_flip


From: git
Subject: [Commit-gnuradio] [gnuradio] 37/39: fec: LDPC: fixed issue with bit_flip_decoder.
Date: Thu, 15 Oct 2015 21:21:34 +0000 (UTC)

This is an automated email from the git hooks/post-receive script.

jcorgan pushed a commit to branch master
in repository gnuradio.

commit 3688105f23791c00349d4fa01c3a4f671af3b00b
Author: Tom Rondeau <address@hidden>
Date:   Wed Oct 14 17:52:41 2015 -0400

    fec: LDPC: fixed issue with bit_flip_decoder.
    
    We can't use a raw pointer, so using a shared_ptr to the base class,
    instead, from the H and G matrices.
---
 gr-fec/include/gnuradio/fec/fec_mtrx.h              |  3 +++
 gr-fec/include/gnuradio/fec/ldpc_G_matrix.h         | 15 +++++++++++++--
 gr-fec/include/gnuradio/fec/ldpc_H_matrix.h         | 11 +++++++----
 gr-fec/include/gnuradio/fec/ldpc_bit_flip_decoder.h |  2 +-
 gr-fec/lib/fec_mtrx_impl.cc                         |  1 +
 gr-fec/lib/ldpc_G_matrix_impl.cc                    |  9 +++------
 gr-fec/lib/ldpc_G_matrix_impl.h                     |  5 ++---
 gr-fec/lib/ldpc_H_matrix_impl.cc                    | 11 +++--------
 gr-fec/lib/ldpc_H_matrix_impl.h                     |  8 +++-----
 gr-fec/lib/ldpc_bit_flip_decoder_impl.cc            |  4 ++--
 gr-fec/lib/ldpc_bit_flip_decoder_impl.h             |  5 +++--
 gr-fec/python/fec/qa_fecapi_ldpc.py                 | 20 ++++++++++----------
 gr-fec/swig/ldpc.i                                  |  1 +
 13 files changed, 52 insertions(+), 43 deletions(-)

diff --git a/gr-fec/include/gnuradio/fec/fec_mtrx.h 
b/gr-fec/include/gnuradio/fec/fec_mtrx.h
index 30b5ede..1dcee65 100644
--- a/gr-fec/include/gnuradio/fec/fec_mtrx.h
+++ b/gr-fec/include/gnuradio/fec/fec_mtrx.h
@@ -49,6 +49,9 @@ namespace gr {
 
       typedef boost::shared_ptr<matrix> matrix_sptr;
 
+      class fec_mtrx;
+      typedef boost::shared_ptr<fec_mtrx> fec_mtrx_sptr;
+
       /*!
        * \brief Read in an alist file and produce the matrix object.
        *
diff --git a/gr-fec/include/gnuradio/fec/ldpc_G_matrix.h 
b/gr-fec/include/gnuradio/fec/ldpc_G_matrix.h
index 32c38a1..36a5981 100644
--- a/gr-fec/include/gnuradio/fec/ldpc_G_matrix.h
+++ b/gr-fec/include/gnuradio/fec/ldpc_G_matrix.h
@@ -24,6 +24,7 @@
 #include <gnuradio/fec/api.h>
 #include <gnuradio/fec/fec_mtrx.h>
 #include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
 
 namespace gr {
   namespace fec {
@@ -50,7 +51,8 @@ namespace gr {
        * This variable can used by the ldpc_gen_mtrx_encoder and
        * ldpc_bit_flip_decoder classes.
        */
-      class FEC_API ldpc_G_matrix : virtual public fec_mtrx
+      class FEC_API ldpc_G_matrix : virtual public fec_mtrx,
+                                    public 
boost::enable_shared_from_this<ldpc_G_matrix>
       {
       public:
         typedef boost::shared_ptr<ldpc_G_matrix> sptr;
@@ -78,7 +80,16 @@ namespace gr {
                             unsigned int frame_size,
                             unsigned int max_iterations) const = 0;
 
-        virtual gr::fec::code::fec_mtrx* get_base_ptr() = 0;
+        /*!
+         * \brief A pointer to make SWIG work
+         *
+         * \details
+         * SWIG doesn't understand the parent class pointer to this
+         * child class for the make function of the
+         * ldpc_bit_flip_decoder; it's expecting a pointer to the base
+         * class. This returns a shared_from_this instance.
+         */
+        virtual gr::fec::code::fec_mtrx_sptr get_base_sptr() = 0;
       };
 
     }
diff --git a/gr-fec/include/gnuradio/fec/ldpc_H_matrix.h 
b/gr-fec/include/gnuradio/fec/ldpc_H_matrix.h
index 37805a0..d770a65 100644
--- a/gr-fec/include/gnuradio/fec/ldpc_H_matrix.h
+++ b/gr-fec/include/gnuradio/fec/ldpc_H_matrix.h
@@ -24,6 +24,7 @@
 #include <gnuradio/fec/api.h>
 #include <gnuradio/fec/fec_mtrx.h>
 #include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
 
 namespace gr {
   namespace fec {
@@ -45,7 +46,8 @@ namespace gr {
        * python functions in:
        * 
/lib/python2.7/dist-packages/gnuradio/fec/LDPC/Generate_LDPC_matrix.py.
        */
-      class FEC_API ldpc_H_matrix : virtual public fec_mtrx
+      class FEC_API ldpc_H_matrix : virtual public fec_mtrx,
+                                    public 
boost::enable_shared_from_this<ldpc_H_matrix>
       {
       public:
         typedef boost::shared_ptr<ldpc_H_matrix> sptr;
@@ -86,13 +88,14 @@ namespace gr {
          * \brief A pointer to make SWIG work
          *
          * \details
-         * For some reason, SWIG isn't accepting a pointer to this
+         * SWIG doesn't understand the parent class pointer to this
          * child class for the make function of the
          * ldpc_bit_flip_decoder; it's expecting a pointer to the base
-         * class. So, this is just a workaround for SWIG and GRC.
+         * class. This returns a shared_from_this instance.
          */
-        virtual gr::fec::code::fec_mtrx *get_base_ptr() = 0;
+        virtual gr::fec::code::fec_mtrx_sptr get_base_sptr() = 0;
       };
+
     }
   }
 }
diff --git a/gr-fec/include/gnuradio/fec/ldpc_bit_flip_decoder.h 
b/gr-fec/include/gnuradio/fec/ldpc_bit_flip_decoder.h
index 13f8693..6ed0658 100644
--- a/gr-fec/include/gnuradio/fec/ldpc_bit_flip_decoder.h
+++ b/gr-fec/include/gnuradio/fec/ldpc_bit_flip_decoder.h
@@ -66,7 +66,7 @@ namespace gr {
          *        testing. May be increased for possibly better
          *        performance, but may slow things down.
          */
-        static generic_decoder::sptr make(const fec_mtrx *mtrx_obj,
+        static generic_decoder::sptr make(const fec_mtrx_sptr mtrx_obj,
                                           unsigned int max_iter=100);
 
         /*!
diff --git a/gr-fec/lib/fec_mtrx_impl.cc b/gr-fec/lib/fec_mtrx_impl.cc
index 3ce68ec..7c4dd34 100644
--- a/gr-fec/lib/fec_mtrx_impl.cc
+++ b/gr-fec/lib/fec_mtrx_impl.cc
@@ -487,6 +487,7 @@ namespace gr {
 
         return matrix_inverse;
       }
+
       bool
       fec_mtrx_impl::parity_bits_come_last() const
       {
diff --git a/gr-fec/lib/ldpc_G_matrix_impl.cc b/gr-fec/lib/ldpc_G_matrix_impl.cc
index 6474b16..d0a6df1 100644
--- a/gr-fec/lib/ldpc_G_matrix_impl.cc
+++ b/gr-fec/lib/ldpc_G_matrix_impl.cc
@@ -134,8 +134,6 @@ namespace gr {
         // Free memory
         gsl_matrix_free(P);
         gsl_matrix_free(P_transpose);
-
-        d_base_ptr = reinterpret_cast<fec_mtrx*>(this);
       }
 
 
@@ -278,11 +276,10 @@ namespace gr {
         gsl_matrix_free(x);
       }
 
-
-      gr::fec::code::fec_mtrx*
-      ldpc_G_matrix_impl::get_base_ptr()
+      gr::fec::code::fec_mtrx_sptr
+      ldpc_G_matrix_impl::get_base_sptr()
       {
-        return d_base_ptr;
+        return shared_from_this();
       }
 
       ldpc_G_matrix_impl::~ldpc_G_matrix_impl()
diff --git a/gr-fec/lib/ldpc_G_matrix_impl.h b/gr-fec/lib/ldpc_G_matrix_impl.h
index f272d0a..b9b119d 100644
--- a/gr-fec/lib/ldpc_G_matrix_impl.h
+++ b/gr-fec/lib/ldpc_G_matrix_impl.h
@@ -71,8 +71,6 @@ namespace gr {
         gr::logger_ptr d_logger;
         gr::logger_ptr d_debug_logger;
 
-        gr::fec::code::fec_mtrx *d_base_ptr;
-
       public:
         ldpc_G_matrix_impl(const std::string filename);
 
@@ -90,7 +88,7 @@ namespace gr {
 
         gsl_matrix* generate_H();
 
-        gr::fec::code::fec_mtrx* get_base_ptr();
+        gr::fec::code::fec_mtrx_sptr get_base_sptr();
 
         /*!
          * \brief Destructor
@@ -99,6 +97,7 @@ namespace gr {
          */
         virtual ~ldpc_G_matrix_impl();
       };
+
     }
   }
 }
diff --git a/gr-fec/lib/ldpc_H_matrix_impl.cc b/gr-fec/lib/ldpc_H_matrix_impl.cc
index 74801cf..ae6fb9a 100644
--- a/gr-fec/lib/ldpc_H_matrix_impl.cc
+++ b/gr-fec/lib/ldpc_H_matrix_impl.cc
@@ -62,9 +62,6 @@ namespace gr {
 
         set_parameters_for_encoding();
 
-        // For info about this see get_base_ptr() function
-        //d_base_ptr = this;
-
         // The parity bits come first in this particular matrix
         // format (specifically required for the Richardson Urbanke
         // encoder)
@@ -80,8 +77,6 @@ namespace gr {
         d_p2 = gsl_matrix_alloc(phi_inverse()->size1, d_temp5->size2);
         d_temp6 = gsl_matrix_alloc(A()->size1, d_p2->size2);
         d_temp7 = gsl_matrix_alloc(d_temp6->size1, d_temp1->size2);
-
-        d_base_ptr = reinterpret_cast<fec_mtrx*>(this);
       } // Constructor
 
       const gsl_matrix*
@@ -410,10 +405,10 @@ namespace gr {
         gsl_matrix_free(x);
       }
 
-      gr::fec::code::fec_mtrx*
-      ldpc_H_matrix_impl::get_base_ptr()
+      gr::fec::code::fec_mtrx_sptr
+      ldpc_H_matrix_impl::get_base_sptr()
       {
-        return d_base_ptr;
+        return shared_from_this();
       }
 
       ldpc_H_matrix_impl::~ldpc_H_matrix_impl()
diff --git a/gr-fec/lib/ldpc_H_matrix_impl.h b/gr-fec/lib/ldpc_H_matrix_impl.h
index 67929a8..b4893ce 100644
--- a/gr-fec/lib/ldpc_H_matrix_impl.h
+++ b/gr-fec/lib/ldpc_H_matrix_impl.h
@@ -23,7 +23,6 @@
 
 #include "fec_mtrx_impl.h"
 #include <gnuradio/fec/ldpc_H_matrix.h>
-#include <gnuradio/fec/ldpc_G_matrix.h>
 
 namespace gr {
   namespace fec {
@@ -79,8 +78,6 @@ namespace gr {
          */
         const gsl_matrix *phi_inverse() const;
 
-        gr::fec::code::fec_mtrx *d_base_ptr;
-
       public:
         /*!
          * \brief Constructor given alist file and gap
@@ -112,15 +109,16 @@ namespace gr {
         //! Redefine these here as part of the public interface
         unsigned int k() const { return fec_mtrx_impl::k(); };
 
+        gr::fec::code::fec_mtrx_sptr get_base_sptr();
+
         /*!
          * \brief Destructor
          * \details
          * Calls the gsl_matrix_free function to free memory
          */
         virtual ~ldpc_H_matrix_impl();
-
-        gr::fec::code::fec_mtrx *get_base_ptr();
       };
+
     }
   }
 }
diff --git a/gr-fec/lib/ldpc_bit_flip_decoder_impl.cc 
b/gr-fec/lib/ldpc_bit_flip_decoder_impl.cc
index 49fd241..ed8eb07 100644
--- a/gr-fec/lib/ldpc_bit_flip_decoder_impl.cc
+++ b/gr-fec/lib/ldpc_bit_flip_decoder_impl.cc
@@ -35,14 +35,14 @@ namespace gr {
     namespace code {
 
       generic_decoder::sptr
-      ldpc_bit_flip_decoder::make(const fec_mtrx *mtrx_obj,
+      ldpc_bit_flip_decoder::make(const fec_mtrx_sptr mtrx_obj,
                                   unsigned int max_iter)
       {
         return generic_decoder::sptr
           (new ldpc_bit_flip_decoder_impl(mtrx_obj, max_iter));
       }
 
-      ldpc_bit_flip_decoder_impl::ldpc_bit_flip_decoder_impl(const fec_mtrx 
*mtrx_obj,
+      ldpc_bit_flip_decoder_impl::ldpc_bit_flip_decoder_impl(const 
fec_mtrx_sptr mtrx_obj,
                                                              unsigned int 
max_iter)
         : generic_decoder("ldpc_bit_flip_decoder")
       {
diff --git a/gr-fec/lib/ldpc_bit_flip_decoder_impl.h 
b/gr-fec/lib/ldpc_bit_flip_decoder_impl.h
index b2b1bbf..ba331be 100644
--- a/gr-fec/lib/ldpc_bit_flip_decoder_impl.h
+++ b/gr-fec/lib/ldpc_bit_flip_decoder_impl.h
@@ -39,13 +39,13 @@ namespace gr {
         double d_rate;
 
         // FEC matrix object to use for decoding
-        const fec_mtrx *d_mtrx;
+        fec_mtrx_sptr d_mtrx;
 
         // Maximum number of iterations to do in decoding algorithm
         unsigned int d_max_iterations;
 
       public:
-        ldpc_bit_flip_decoder_impl(const fec_mtrx *mtrx_obj,
+        ldpc_bit_flip_decoder_impl(const fec_mtrx_sptr mtrx_obj,
                                    unsigned int max_iter=100);
         ~ldpc_bit_flip_decoder_impl();
 
@@ -53,6 +53,7 @@ namespace gr {
         bool set_frame_size(unsigned int frame_size);
         double rate();
       };
+
     } /* namespace code */
   } /* namespace fec */
 } /* namespace gr */
diff --git a/gr-fec/python/fec/qa_fecapi_ldpc.py 
b/gr-fec/python/fec/qa_fecapi_ldpc.py
index e5a968b..52a05dc 100644
--- a/gr-fec/python/fec/qa_fecapi_ldpc.py
+++ b/gr-fec/python/fec/qa_fecapi_ldpc.py
@@ -48,7 +48,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
         k = LDPC_matrix_object.k()
         enc = fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)
-        dec = fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())
+        dec = 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())
         threading = None
         self.test = _qa_helper(10*k, enc, dec, threading)
         self.tb.connect(self.test)
@@ -65,7 +65,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
         k = LDPC_matrix_object.k()
         enc = fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)
-        dec = fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())
+        dec = 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())
         threading = 'ordinary'
         self.test = _qa_helper(10*k, enc, dec, threading)
         self.tb.connect(self.test)
@@ -82,7 +82,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
         k = LDPC_matrix_object.k()
         enc = fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)
-        dec = fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())
+        dec = 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())
         threading = 'capillary'
         self.test = _qa_helper(10*k, enc, dec, threading)
         self.tb.connect(self.test)
@@ -99,7 +99,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
         k = LDPC_matrix_object.k()
         enc = map((lambda a: 
fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)), range(0,1))
-        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())), range(0,1))
+        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())), range(0,1))
         threading = None
         self.test = _qa_helper(10*k, enc, dec, threading)
         self.tb.connect(self.test)
@@ -116,7 +116,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
         k = LDPC_matrix_object.k()
         enc = map((lambda a: 
fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)), range(0,1))
-        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())), range(0,1))
+        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())), range(0,1))
         threading = 'ordinary'
         self.test = _qa_helper(10*k, enc, dec, threading)
         self.tb.connect(self.test)
@@ -133,7 +133,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
         k = LDPC_matrix_object.k()
         enc = map((lambda a: 
fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)), range(0,1))
-        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())), range(0,1))
+        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())), range(0,1))
         threading = 'capillary'
         self.test = _qa_helper(10*k, enc, dec, threading)
         self.tb.connect(self.test)
@@ -157,7 +157,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
         dec = []
         for n in range(0,dims):
             H = fec.ldpc_H_matrix(filename, gap)
-            dec.append(fec.ldpc_bit_flip_decoder.make(H.get_base_ptr()))
+            dec.append(fec.ldpc_bit_flip_decoder.make(H.get_base_sptr()))
 
         k = 27
         threading = 'ordinary'
@@ -177,7 +177,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
 #        LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
 #        k = LDPC_matrix_object.k()
 #        enc = map((lambda a: 
fec.ldpc_par_mtrx_encoder.make_H(LDPC_matrix_object)), range(0,dims))
-#        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())), 
range(0,dims))
+#        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())), 
range(0,dims))
 #        threading = 'capillary'
 #        self.test = _qa_helper(dims*k, enc, dec, threading)
 #        self.tb.connect(self.test)
@@ -206,7 +206,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
 #        LDPC_matrix_object = fec.ldpc_H_matrix(filename, gap)
 #        k = LDPC_matrix_object.k()
 #        # enc = map((lambda a: fec.ldpc_encoder_make(LDPC_matrix_object)), 
range(0,dims))
-#        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())), 
range(0,dims))
+#        dec = map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())), 
range(0,dims))
 #        threading = 'capillary'
 #        self.assertRaises(AttributeError, lambda: extended_decoder(dec, 
threading=threading, puncpat="11"))
 #
@@ -244,7 +244,7 @@ class test_fecapi_ldpc(gr_unittest.TestCase):
 #        k = LDPC_matrix_object.k()
 #        dims1 = 16
 #        dims2 = 16
-#        dec = map((lambda b: map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_ptr())), 
range(0,dims1))), range(0,dims2))
+#        dec = map((lambda b: map((lambda a: 
fec.ldpc_bit_flip_decoder.make(LDPC_matrix_object.get_base_sptr())), 
range(0,dims1))), range(0,dims2))
 #        threading = 'capillary'
 #
 #        self.assertRaises(AttributeError, lambda: extended_decoder(dec, 
threading=threading, puncpat="11"))
diff --git a/gr-fec/swig/ldpc.i b/gr-fec/swig/ldpc.i
index 48f0417..27ee80d 100644
--- a/gr-fec/swig/ldpc.i
+++ b/gr-fec/swig/ldpc.i
@@ -21,6 +21,7 @@
  */
 
 %template(matrix_sptr) boost::shared_ptr<gr::fec::code::matrix>;
+%template(fec_mtrx_sptr) boost::shared_ptr<gr::fec::code::fec_mtrx>;
 
 %template(ldpc_H_matrix_sptr) boost::shared_ptr<gr::fec::code::ldpc_H_matrix>;
 %pythoncode %{



reply via email to

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