Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

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

Search the Archive

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


  • 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