Re: Nested iterators in Compile

*To*: mathgroup at smc.vnet.net*Subject*: [mg55053] Re: [mg55010] Nested iterators in Compile*From*: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>*Date*: Thu, 10 Mar 2005 05:25:20 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

>-----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

**Follow-Ups**:**Re: Re: Nested iterators in Compile***From:*DrBob <drbob@bigfoot.com>