Q: I just have a simple question, because I cannot find some example about it. It is possible to iterate over a collection (arrays, list, etc) just to calculate some values in a function, when executing the simulation?

I want to calculate “mean” and “deviation” values, taking them from indexing 2 arrays I have in the declaration, to later send them as parameters for a normal distribution function (simulating a delay()). I need to use direct indexes like: if I have an array a=[100,250,300] in the declaration, then in a function I can get a[i], being i: 1..3. So, I can do calculations like a[i]+b[i]; a[i]/b[i]; etc.

I tried defining “colset”, “list” and also with “val”. Any of them is ok, because the values are constant and defined on the declaration section, just to index them I received a “i” value during simulation, so I need to do a[i], that’s it.

Can you help me please? Do you have some easy example?. I already checked CPN Tools examples and SML manuals, but I didn’t see this case.

Thank you in advance for any help you can give me.

A: You could use the list functions for this. In your case, if a is your list and i is your index (with base 1), then List.nth(a, i-1) provides you with a[i]. Note that you use arrays with base 1, whereas Standard ML uses lists with base 0, that’s why we need i-1.

You may also want to take a look at the Standard ML list structure. It contains generic list functions, and in particular the two fold functions. http://sml-family.org/Basis/list.html#SIG:LIST.foldl:VAL

The fold functions implement the same paradigm you may know as Googles MapReduce (actually MapReduce was inspired by the fold functions).

That allows you to implement a list sum and average functions as:

fun intSum (a, b) = a + b

fun listSum lst = List.foldl intSum 0 lst

fun listAvg [] = 0 | listAvg lst = (listSum lst) div (List.length lst)

Note the average has several issues: it uses integer division, so listAvg [1, 2] = 1 and it is prone to overflows, so listAvg [1000000000, 1000000000] will fail.

The intSum function is a misnomer; it will also work with lists of real.  listSum and listAvg will only work with ints (because of 0 and div; use 0.0 and / instead to make it use with reals).

Does CPN Tools take advantage of multi-core processors?