MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: How to Compile this code (multiple random walks)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg118110] Re: How to Compile this code (multiple random walks)
  • From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
  • Date: Tue, 12 Apr 2011 06:00:07 -0400 (EDT)

On Mon, 11 Apr 2011, mfific at gmail.com wrote:

> Hi All,
>
> I would appreciate help with Compile function. Below is the code that
> I could not compiled. The output are the three random walk counters
> with (-5, 5) bounds, along with a counter for a number of steps. The
> compile does not work here, I assume because the output is a matrix
> (it works if there is only one counter). But I need these three
> counters running in parallel for later development. Any help would be
> appreciated.
>
> thanks,
>
> Mario Fific
>
> Transpose[{Range[0, Length[#] - 1], #}] &@
> NestWhileList[(# + {If[Random[] > .5, 1, -1],
>      If[Random[] > .5, 1, -1], If[Random[] > .5, 1, -1]}
>    ) &, {0, 0, 0}, -5 < #[[1]] < 5 && -5 < #[[2]] < 5 && -5 < #[[3]]
> < 5 & ]
>
>
>

Hi Mario,

I am not quite sure if there is a deeper reason (which I don not see right 
now) why NestWhileList can not be compiled. What is also odd, is that all 
elements created are packed but the returned list is not

Developer`PackedArrayQ@
  NestWhileList[(res = (# + Sign[RandomReal[{-1/2, 1/2}, {3}]]);
     Print[res, "", Developer`PackedArrayQ[res]]; res) &,
   Developer`ToPackedArray[{0, 0,
     0}], -5 < #[[1]] < 5 && -5 < #[[2]] < 5 && -5 < #[[3]] < 5 &]

I will file this as a suggestion - but as mentioned above, maybe there is 
something I do not get.

What follows not is a compiled version that does something quite similar - 
the difference being in

Sign[RandomReal[{-1/2, 1/2}, {3}]]

which may behave differently because it can return 0, your version 
(If[..]) can not, but you could change that.

cf = Compile[{}, Module[{start, n},
    start = {{0, 0, 0}};
    n = Length[start];
    While[
     -5 < start[[-1, 1]] < 5 && -5 < start[[-1, 2]] < 5 && -5 <
       start[[-1, 3]] < 5,
     start =
      Join[start, {start[[-1]] + Sign[RandomReal[{-1/2, 1/2}, {3}]]}]
     ];
    start
    ]]

cf[]

A another improvement could be to not use

Transpose[{Range[0, Length[#] - 1], #}] &@

This will unpack the the

Developer`PackedArrayQ@cf[]

You could either add the step, say, as the last entry in each of the 
returned lists, or keep it in a separate vector.

Hope this helps,

Oliver


  • Prev by Date: Re: Recognize multiple outputs
  • Next by Date: How to change the page margin?
  • Previous by thread: Re: How to Compile this code (multiple random walks)
  • Next by thread: Re: How to Compile this code (multiple random walks)