[kepler-dev] How do I create nested loops in Kepler

Christopher Brooks cxh at eecs.berkeley.edu
Tue Jul 5 18:41:00 PDT 2005


Hi Dan,
I don't think that Ramp will reset to 0 during a run for you.
Try using Pulse instead.

I hacked up http://ptolemy.eecs.berkeley.edu/~cxh/models/parameterizedLoops.xml
which uses the Pulse actor.  One tricky part is that 
Pulse uses two arrays to determine what values are produced.

The Pulse docs say:

   The <i>values</i> parameter contains an ArrayToken, which specifies
   the sequence of values to produce at the output.  The <i>indexes</i>
   parameter contains an array of integers, which specifies when those values
   should be produced.  The array in the <i>indexes</i> parameter
   must have the same length as that in the
   <i>values</i> parameter or an exception will be thrown by the fire() method.
   Also, the <i>indexes</i> array must be increasing and non-negative,
   or an exception will be thrown when it is set.

The tricky part is to use an expression to create the array from 
0 to maximum-1
That expression is:
[0:1:(maximum-1)]
This similar to the Matlab syntax for creating an array.

Of course, if you know beforehand how far you want to count, then you can
hardwire it in; for example, use: {0,1,2}

The other trick is that I set the vectorizationFactor parameter of
the inner SDF Scheduler to fire the inner pulse actor the appropriate
number of times.

One slightly odd thing is that I'm using the Ramp in the outer model
to trigger the Pulse in the inner model.  This is more of a DE sort
of style, but seems to work here.

See the DDF Loop demo at ddf/demo/Loop/Loop.xml for a model that
dynamically changes the loop counts on the fly.

Someone like Steve or Edward might have some further refinements.

Hope this helps!

_Christopher

--------

    Hi All,
    
        I am having great difficulty in figuring out how to handle various 
    looping constructs in Kepler/Ptolemy. So I ask if someone can explain 
    how to handle nested loops (using SDF and/or PN directors)?
    
        For example, assume I want to count from 0 to 3 twice in a row so 
    that the output on a final text display is
    0
    1
    2
    0
    1
    2
    
    I've tried various ways using Ramp actors and Composite actors but 
    cannot seem to get this simple case to work.
    
    Thanks,
    Dan
    
    -- 
    *******************************************************************
    Dan Higgins                                  higgins at nceas.ucsb.edu
    http://www.nceas.ucsb.edu/    Ph: 805-893-5127
    National Center for Ecological Analysis and Synthesis (NCEAS) 
    Marine Science Building - Room 3405
    Santa Barbara, CA 93195
    *******************************************************************
--------



More information about the Kepler-dev mailing list