Hi Chad,

so in that case, the trick would probably be writing good unit tests!
For example, you could take the `for` loop out of your work, and put it
into a method of its own:

import numpy
from gnuradio import gr
from yall1 import *

class yall1_reconstruction_cc(gr.sync_block):
    """
    Yall1_reconstruction_block
    """
    def __init__(self,n,m):
        self.N = n
        self.M = m
        phi = 
np.load("/home/chad/Desktop/PROJECT/Python/Matrices/phi_mtx%(M)dx%(N)d.npy" 
%{"M":self.M,"N":self.N})
        psi = 
np.load("/home/chad/Desktop/PROJECT/Python/Matrices/psi_mtx%(N)dx%(N)d.npy" 
%{"N":self.N})
        self.alpha = np.dot(phi,psi)
        gr.sync_block.__init__(self,
            name="yall1_reconstruction",
            in_sig=[(np.complex64,self.M)],
            out_sig=[(np.complex64,self.N)])

    def work(self, input_items, output_items):
        in0 = input_items[0]
        output_items[0][:] = self._algo(in0)
        return len(output_items[0])


    def _algo(self, in):
        out = np.zeros((size,self.N),dtype = np.complex64)
        for i, vector in enumerate(in):
                recon = yall1(self.alpha, vector.reshape(self.M,1))*4.6
                out[i] = recon.reshape(self.N,)
        return out 
        

That way, you can write a unit test that first checks whether your for
loop does exactly what you think it does for "artificial" input, without
having to use the block in a GNU Radio flow graph.
It is does, the next step would be to write a unit test that uses
well-known input in a vector source, connects that to your block, and
connects that to a vector sink; validate .data() of that sink.

Best regards,
Marcus

On 10/30/2015 11:38 AM, Chad R wrote:
> Hi Marcus
>
> It's and adaption of the YALL1 Basis Pursuit Algorithm[1]. I
> simplified it a lot as I knew the case of signals I would be using so
> I have no need to parse it opts at run-time and can just leave those
> parameters constant. So I've adapted it that all I need to pass is the
> compressed vector and compression matrix. My Python implementation of
> the YALL1 algorithm works fine when I run it in a Python program but
> gives funny results in the GRC implementation. I'll look at what you
> said and get back to you if I don't understand something. Thanks for
> your help.
>
> Kind Regards
> Chad Richts
>
> [1] User’s Guide for YALL1: Your ALgorithms for L1
> Optimization: http://www.caam.rice.edu/~zhang/reports/tr0917.pdf
> <http://www.caam.rice.edu/%7Ezhang/reports/tr0917.pdf>
>
> On Thu, Oct 29, 2015 at 9:04 PM, Marcus Müller
> <marcus.muel...@ettus.com <mailto:marcus.muel...@ettus.com>> wrote:
>
>     Hi Chad,
>
>     thanks for re-posting your code; it's much clearer to read now.
>     I'm not quite sure what I'm looking at now: Is this your own
>     implementation of the yall1 minimization function, or something
>     that can be tested?
>     If I remember correctly, the matlab call has a matrix input, and a
>     "target" vector, and an options argument. Is there some accessible
>     documentation.
>
>     Other than my confusion whether this is a GNU Radio or a general
>     yall1 question, your code looks pretty good. A few thing's I'd note:
>
>       * self.alpha.shape  should be right
>       * check that input_items.shape and in0.shape are as you expect them
>
>     Best regards,
>     Marcus
>
>
>     On 10/29/2015 01:27 PM, Chad R wrote:
>>     Sorry. Something went wrong when I copied pasted it but my actual
>>     code is:
>>
>>     import numpy
>>     from gnuradio import gr
>>     from yall1 import *
>>
>>     class yall1_reconstruction_cc(gr.sync_block):
>>         """
>>         Yall1_reconstruction_block
>>         """
>>         def __init__(self,n,m):
>>      self.N = n
>>      self.M = m
>>      phi = 
>> np.load("/home/chad/Desktop/PROJECT/Python/Matrices/phi_mtx%(M)dx%(N)d.npy" 
>> %{"M":self.M,"N":self.N})
>>      psi = 
>> np.load("/home/chad/Desktop/PROJECT/Python/Matrices/psi_mtx%(N)dx%(N)d.npy" 
>> %{"N":self.N})
>>      self.alpha = np.dot(phi,psi)
>>             gr.sync_block.__init__(self,
>>                 name="yall1_reconstruction",
>>                 in_sig=[(np.complex64,self.M)],
>>                 out_sig=[(np.complex64,self.N)])
>>
>>         def work(self, input_items, output_items):
>>             in0 = input_items[0]
>>      size = np.shape(in0)[0]
>>      out = np.zeros((size,self.N),dtype = np.complex64)
>>      #out = yall1(self.alpha,in0[0]).reshape(self.N,)
>>      for i in range(0,size):
>>              recon = yall1(self.alpha, in0[i].reshape(self.M,1))*4.6
>>              out[i] = recon.reshape(self.N,)
>>             output_items[0][:] = out
>>             return len(output_items[0])
>>
>>
>>     On Thu, Oct 29, 2015 at 2:08 PM, Marcus Müller
>>     <marcus.muel...@ettus.com <mailto:marcus.muel...@ettus.com>> wrote:
>>
>>         Hi Chad,
>>
>>         there's something wrong with the indention of the lines
>>         between "def __init__" and "g.sync_block", and the same goes
>>         for your work function; so that's my first stab at explaining
>>         misbehaviour.
>>
>>
>>         Best regards,
>>         Marcus
>>
>>
>>         On 29.10.2015 13:01, Chad R wrote:
>>>         Good day every one
>>>
>>>         I have implemented a Python block but I am not getting the
>>>         results I expected. I get the results I expect at any
>>>         frequency=samp_rate/2^n where n is any integer. My block
>>>         makes use of a yall1 reconstruction algorithm to reconstruct
>>>         a signal from M=100 to N=1024 vector.
>>>         The code for my block is shown below:
>>>
>>>         class yall1_reconstruction_cc(gr.sync_block):
>>>             """
>>>             Yall1_reconstruction_block
>>>             """
>>>             def __init__(self,n,m):
>>>             self.N = n
>>>             self.M = m
>>>             phi =
>>>         
>>> np.load("/home/chad/Desktop/PROJECT/Python/Matrices/phi_mtx%(M)dx%(N)d.npy"
>>>         %{"M":self.M,"N":self.N})
>>>             psi =
>>>         
>>> np.load("/home/chad/Desktop/PROJECT/Python/Matrices/psi_mtx%(N)dx%(N)d.npy"
>>>         %{"N":self.N})
>>>             self.alpha = np.dot(phi,psi)
>>>                 gr.sync_block.__init__(self,
>>>                     name="yall1_reconstruction",
>>>                     in_sig=[(np.complex64,self.M)],
>>>                     out_sig=[(np.complex64,self.N)])
>>>
>>>             def work(self, input_items, output_items):
>>>                 in0 = input_items[0]
>>>             size = np.shape(in0)[0]
>>>             out = np.zeros((size,self.N),dtype = np.complex64)
>>>             #out = yall1(self.alpha,in0[0]).reshape(self.N,)
>>>             for i in range(0,size):
>>>                 recon = yall1(self.alpha, in0[i].reshape(self.M,1))*4.7
>>>                 out[i] = recon.reshape(self.N,)
>>>                 output_items[0][:] = out
>>>                 return len(output_items[0])
>>>
>>>         Have I implemented it right? or is my issue with my
>>>         implementation? I read through the tutorials but I feel some
>>>         aspects are quiet hard to follow.
>>>
>>>         Thank you in advance for your help
>>>
>>>         Chad Richs
>>>
>>>
>>>         _______________________________________________
>>>         Discuss-gnuradio mailing list
>>>         Discuss-gnuradio@gnu.org <mailto:Discuss-gnuradio@gnu.org>
>>>         https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>>
>>
>>         _______________________________________________
>>         Discuss-gnuradio mailing list
>>         Discuss-gnuradio@gnu.org <mailto:Discuss-gnuradio@gnu.org>
>>         https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>>
>>
>
>

_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to