Hi Tim,

Thank you very much!

I followed your suggestions and have it working, I put v.self in the def
__init(self, start = True) method (which means I can initialize all my
vector parameters at start-of-program by placing them in the def __init()
method  and retrieve initial values in the work() function)

To retrieve initialized parameters once in the work() method I did:
global v           # my one trivial param here
if self.start == True
     v = self.v
     self.start = False
This works wonderfully and I am able to change the values of v at runtime.

Thanks again for the help!

George



On Thu, Jan 14, 2021 at 11:07 AM Tim Huggins <huggins.timo...@yahoo.com>
wrote:

> George,
>
> What is happening is that when you try to change the variable Python is
> interpreting that as a local variable and has no value yet for the equation
> you are attempting. I believe could use:
>
> global v
> v[0] += v[0]
>
> (Research the Python global keyword)
>
> However, in the GNURadio universe I really think you may be better off
> using self.v instead.
>
> Tim
>
> On Thursday, January 14, 2021, 11:42:46 AM EST, George Edwards <
> gedwards....@gmail.com> wrote:
>
>
> Hell Tim and Jeff,
>
> Problem, so when I make v global in my_init() method and use it is the
> work() method, it works good if I do not try to change the values in the
> vector v, let's say v came down as v = np.array([1.0 , 1.0 , 1.0]). If I
> try to change the values say  v[0] += v[0], etc. the program breaks with
> the message local variable v changes before assignment. I thought it was
> global and already assigned.
>
> Thanks for your help.
>
> George
>
>
> On Thu, Jan 14, 2021 at 9:17 AM George Edwards <gedwards....@gmail.com>
> wrote:
>
> Hi Tim and Jeff,
>
> Thanks for your help and insights. Being new to Python, I was looking at
> some Python videos and found my solution, I will make the numpy parameter
> vectors in the my_init() method "global" and that should solve the problem.
>
> Thank you!
>
> Regards,
> George
>
> On Thu, Jan 14, 2021 at 9:57 AM Tim Huggins <huggins.timo...@yahoo.com>
> wrote:
>
> George,
>
> "My understanding is the self.x, etc. is used to initialize param
> arguments in the def __init__() method and in my case, the only argument in
> this method is start"
>
>
> This is not correct, you can add a self.v in there so it looks like:
>
> def __init__(self, start = True):  # only default arguments here
>         gr.sync_block.__init__(
>             self,
>             name='text',   # will show up in GRC
>             in_sig=[()],
>             out_sig=[()]
>         )
>         # if an attribute with the same name as a parameter is found,
>         # a callback is registered (properties work, too).
>         self.start = start
>         self.v = self.my_init() #or whatever you want the  initial value
> to be
>
> Tim
>
>
> On Thursday, January 14, 2021, 10:38:36 AM EST, George Edwards <
> gedwards....@gmail.com> wrote:
>
>
> Hi Jeff,
>
> So I am new to Python programming, so some of the nuances I am not up on
> yet. My understanding is the self.x, etc. is used to initialize param
> arguments in the def __init__() method and in my case, the only argument in
> this method is start, there is no v for me to use self.v = v. v is used the
> work() and my_init() methods. At program startup work() calls my_init()
> method to get the initial values for the numpy array v (my_init() function
> will be called once only at startup when self.start is True). After
> initialization and v is passed back to the work(), the values in the numpy
> array v inside work will change on a sample to sample computation basis. My
> problem is how do I assign v its initial seed value at start up. If my
> program was simple with only one parameter v, I would initialize it inside
> the work() method, however, I have a bunch of other vector variables to
> initialize which is why I want to initialize all parameters inside a
> my_init() method that work() calls at startup.
>
> Thanks for the help.
>
> George
>
> On Thu, Jan 14, 2021 at 8:14 AM Jeff Long <willco...@gmail.com> wrote:
>
> You are already initializing self.start in exactly the same way you should
> be initializing self.v, right?
>
> On Wed, Jan 13, 2021 at 10:46 PM George Edwards <gedwards....@gmail.com>
> wrote:
>
> Hi Jeff,
>
> Thanks for your answer. You are right, it crashes on the second call.
>
> So how do I write the program to initialize a bunch of vectors in a
> "method strictly for initialization" when it first starts running? If this
> cannot be done, then I guess the only solution is to initialize them in the
> work() method even though it would make the work() method bulky?
>
> Thanks again for your help.
>
> Regards,
> George
>
> On Wed, Jan 13, 2021 at 8:12 PM Jeff Long <willco...@gmail.com> wrote:
>
> 'v' is a local variable in work(). It is probably crashing on the second
> call, where my_init() is not called, and thus there is no 'v'.
>
> On Wed, Jan 13, 2021 at 7:38 PM George Edwards <gedwards....@gmail.com>
> wrote:
>
> Hello,
>
> I am using a Gnuradio Python Block in my GRC signal processing and am
> having problems initializing my parameters. My system has a number of
> vector parameters to be initialized at startup. I will provide the gist of
> my goal in a scaled down version of my work.
> 1. In the def __init__(self, start = True)  method, "start" is the
> parameter that will be used in the program to run the initialization
> process and is set as follows:
>          self.start = start
> 2. In the work(self, input_items, output_items)  method, I have the
> following at the start of the method:
>          if self.start == True:
>                 v = self.my_init()    # go initialize all vectors
>
>          output_items[0][:] = in0*v[0] + in1*v[1] + in2*v[2]  #computation
> using v
>                                                      # with 3-inputs to
> the block
>
> 3. In the my_init(self) method I have:
>          self.start = False            # set start to False
>          v = np.array([1., 2., 3.])  #hypothetical to make this simple
>          return v
>
> When I run the GRC model, it tells me that "v" is referenced before
> assignment. I am confused because I thought that the method my_init() would
> have been called before the computation and would return the values for
> "v". On the other hand if I do the assignment in the work(...) method as  v
> = np.array([1., 2., 3.]), it works perfectly.
> Question: Why was the my_init() method not called properly to get  the
> values for the numpy array v?
>
> Thanks for the help!
>
> Regards,
> George
>
>
  • Problem i... George Edwards
    • Re: ... Jeff Long
      • ... George Edwards
        • ... Jeff Long
          • ... George Edwards
            • ... George Edwards
              • ... George Edwards
                • ... GNU Radio, the Free & Open-Source Toolkit for Software Radio
                • ... George Edwards

Reply via email to