Re: Question: Compile in Mathematica 8.0

*To*: mathgroup at smc.vnet.net*Subject*: [mg114714] Re: Question: Compile in Mathematica 8.0*From*: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>*Date*: Tue, 14 Dec 2010 06:53:49 -0500 (EST)

Hi again, I have to make this clear since I just read my own message on the list: Of course, n*(n - 1)/2 *is* always an integer when n is one. But that's not what I wanted to express. What I wanted to say is that it depends on how this expression is evaluated whether there appear non-integer values during the evaluation. Look e.g. at In[5]:= FullForm[n*(n-1)/2] Out[5]//FullForm= Times[Rational[1,2],Plus[-1,n],n] But even when Rational[1,2] would not appear... who knows in which order the expression is evaluated in the compiled version? Maybe like that n*((n-1)/2) The rest of my original message stays hopefully right. Cheers Patrick On Mon, 2010-12-13 at 03:54 -0500, Patrick Scheibe wrote: > Hi, > > the situation is simple. What should the compiler assume, when it sees > something like this: > > len = n*(n - 1)/2 > > Is it in any case an Integer? No. So lets give Compile a hint, that we > want len to be an integer: > > Compile[{{n, _Integer}}, > Module[ > {len = 0}, > len = n*(n - 1)/2; > ] > ] > > and now Compile tell us instantly: > > Compile::cset: "Variable len of type \!\(\"_Integer\"\) encountered in > assignment of type \!\(\"_Real\"\)." > > So what you want is maybe: > > v1 = Compile[{{n, _Integer}}, Module[ > {g, len = 0}, > len = Quotient[n*(n - 1), 2]; > g = RandomVariate[NormalDistribution[0., 1.], len]]] > > and everthing is fine. > > In[9]:= v1[3] > > Out[9]= {0.884713, 0.228091, 0.874789} > > Hope this helps. > > Cheers > Patrick > > On Sat, 2010-12-11 at 01:52 -0500, Asim wrote: > > Hi > > > > I am not sure why the first function named v works and why the second > > function named v1 does not compile. The only difference between the > > two functions is in the variable called len which controls the number > > of random numbers that are generated. > > > > I am using Mathematica 8.0 on Windows Vista machine. > > > > Thanks > > > > Asim > > > > > > > > First function: > > > > > > v = Compile[{{n, _Integer}}, > > Module[ > > {g, len}, > > len = n*(n - 1); > > g = RandomVariate[NormalDistribution[0., 1.], len] > > ] > > ] > > > > Output is > > > > CompiledFunction[{n},Module[{g,len},len=n > > (n-1);g=RandomVariate[NormalDistribution[0.,1.],len]],-CompiledCode-] > > > > v[3] > > > > {0.0866864,-0.271121,-0.431317,-0.6787,-1.29246,0.550486} > > > > Second Function: > > > > v1 = Compile[{{n, _Integer}}, > > Module[ > > {g, len}, > > len = n*(n - 1)/2; > > g = RandomVariate[NormalDistribution[0., 1.], len] > > ] > > ] > > > > CompiledFunction[{n},Module[{g,len},len=1/2 n > > (n-1);g=RandomVariate[NormalDistribution[0.,1.],len]],-CompiledCode-] > > > > v1[3] > > > > During evaluation of In[42]:= CompiledFunction::cfse: Compiled > > expression {-0.325949,1.72381,0.368231} should be a machine-size > > integer. >> > > > > During evaluation of In[42]:= CompiledFunction::cfex: Could not > > complete external evaluation at instruction 8; proceeding with > > uncompiled evaluation. >> > > > > Out[42]= {0.295626, 0.664446, 0.654626} > > > > > > > > > >