MathGroup Archive 2005

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

Search the Archive

Re: Nested iterators in Compile


>-----Original Message-----
>From: Maxim [mailto:ab_def at prontomail.com] 
To: mathgroup at smc.vnet.net
>Sent: Wednesday, March 09, 2005 12:35 PM
>To: mathgroup at smc.vnet.net
>Subject: [mg55053] [mg55010] Nested iterators in Compile
>
>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
>
>


Maxim,

I had told you this before: 

using compiled functions needs some sort of purposive pragmatism. 
Also mistrust any compiled function f with

In[3]:= FreeQ[f[[-2]], Function]
Out[3]= False


This case can be solved easily:
 
In[4]:= f2 = Compile[{{n, _Integer}},
           Module[{s = 0}, Do[Do[s += j, {j, i}], {i, n}];
            s]];

In[5]:= f2[10]
Out[5]= 220

In[6]:= FreeQ[f2[[-2]], Function]
Out[6]= True



--
Hartmut Wolf


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