MathGroup Archive 2005

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

Search the Archive

Re: Nested iterators in Compile

  • To: mathgroup at smc.vnet.net
  • Subject: [mg55032] Re: [mg55010] Nested iterators in Compile
  • From: "Christoph Lhotka" <lhotka at astro.univie.ac.at>
  • Date: Thu, 10 Mar 2005 05:24:35 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

Hello !

I would define your compiled function this way:

In[..]:=g = Compile[{{n, _Integer}}, Module[{i, j, s = 0},
      Do[s += j, {i, n}, {j, i}]; 
      Print[s]], {{s, _Integer}, {i, _Integer}, {j, _Integer}}]

(see Help Browser for more details on how to declare variables inside
subexpressions at the end of Compile)

The problem is, that you will get a similar error message, when you do not
define initial values for i and j, but the function worked, as you can see
here:

In[..]:= g[100]
Out[..]:=171700

To suppress the error message I defined a value for i and j, which should not
be wrong, because, i and j are set inside the do - loop. But there seems to be
a serious problem with it:

In[..]:=In[..]:=g = Compile[{{n, _Integer}}, Module[{i=0, j=0, s = 0},
      Do[s += j, {i, n}, {j, i}]; 
      Print[s]], {{s, _Integer}, {i, _Integer}, {j, _Integer}}]

any time, I use the function, it will nothing else return, but 0..

In[..]:=g[10/50/100/...]
Out[..]:=0

for any other initial value for i I get different results, so...

HOW CAN THE INITIAL VALUE FOR I INFLUENCE THE RESULT OF THE DO - LOOP?

as you can see in an uncompiled version, this should not influence anything:

In[..]:=G[n_] := Module[{i = 5, j = 3, s = 0}, Do[s += j, {i, n}, {j, i}];
Print[s]]

In[..]:=G[100]
Out[..]:=171700

Can anyone give some more explanation to this problem, some more information
on how the function compile really works?



On Wed, 9 Mar 2005 06:34:35 -0500 (EST)
 Maxim <ab_def at prontomail.com> wrote:
> 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
> 


-- Christoph Lhotka --
University of Vienna
Institute for Astronomy
Tuerkenschanzstr. 17 
1180 Vienna, Austria
fon. +43.1.4277.518.41
mail. lhotka at astro.univie.ac.at


  • Prev by Date: Re: findfit or solve?
  • Next by Date: Re: Canonical order...
  • Previous by thread: Re: Re: Nested iterators in Compile
  • Next by thread: Re: Nested iterators in Compile