MathGroup Archive 2005

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

Search the Archive

Re: Nested iterators in Compile


Maxim,

A workaround that shouldn't affect performance is to write out the nested Do 
loops explicitly:

Compile[{n},
Module[{s = 0},
Do[
        Do[s += j, {j, i}],
        {i, n}
        ];
s
]][10]

The above returned 220 without problems.

Carl Woll


"Maxim" <ab_def at prontomail.com> wrote in message 
news:d0mo9g$75h$1 at smc.vnet.net...
> The fact that iterators work differently when used in Compile seems to
> lead to a serious limitation:
>
> In[1]:=
> Compile[{n},
>   Module[{s = 0},
>     Do[s += j, {i, n}, {j, i}];
>     s
> ]][10]
>
> CompiledFunction::cfse: Compiled expression i should be a machine-size
> real number.
>
> CompiledFunction::cfex: External evaluation error at instruction 4;
> proceeding with uncompiled evaluation.
>
> Out[1]=
> 220
>
> The iterator {j, i} is evaluated before any value is assigned to i, and
> the evaluation of the compiled code fails (and if we add the
> initialization i=0 before Do, we'll only get an empty loop as the result,
> unlike the uncompiled version). So we have to resort to some workarounds
> such as changing the inner iterator to {j, n} and adding If[j>i,
> Continue[]] to the loop body, which of course decreases the performance.
>
> Maxim Rytin
> m.r at inbox.ru
> 



  • Prev by Date: Re: String comparison
  • Next by Date: Re: RationalApproximation
  • Previous by thread: Re: Nested iterators in Compile
  • Next by thread: Re: Nested iterators in Compile