MathGroup Archive 1999

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

Search the Archive

Re: Compile problem: Mathematica 4

  • To: mathgroup at smc.vnet.net
  • Subject: [mg18806] Re: [mg18777] Compile problem: Mathematica 4
  • From: David Withoff <withoff at wolfram.com>
  • Date: Thu, 22 Jul 1999 08:19:25 -0400
  • Sender: owner-wri-mathgroup at wolfram.com

> Hi.
>
> What is wrong with the following (simplified) compile statement?  It seems
> that the Compiler doesn't recognise that Round[] returns an object with a
> Head of Integer.  Can I explicitly tell the compiler that this is the case?
>
> Thanks for help/comments in advance.
>
> Paul
>
> Code follows:
> 
> In[4]:=
> f=Compile[{{x, _Real,1}}, i=Round[2.3]; x[[i]]++;Return[x]]
> 
> Compile::cpintlt:
>     i at position 2 of x[[i]] should be either a non-zero integer or a
> vector of \
>     non-zero integers; evaluation will use the uncompiled function."
> 
> Out[4]=
> CompiledFunction[{x},i=Round[2.3]; x[[i]]++;Return[x], -CompiledCode-]
> 
> In[5]:=
> Round[2.3] //Head
> 
> Out[5]=
> Integer

Try this instead:

f=Compile[{{x, _Real,1}}, Block[{i,var=x},
        i=Round[2.3]; var[[i]]++;Return[var]]]

or

f=Compile[{{x, _Real,1}}, Block[{var=x},
        i=Round[2.3]; var[[i]]++;Return[var]], {{i, _Integer}}]

In your example i is a global variable, and as such could be affected by
global rules.  There could, for example, be a global rule that causes i to
redefine itself each time it is used.  To be strictly logically correct
the compiler needs to allow for this possibility.  You can specify that i
will always be an integer by including the type specification {i, _Integer}
in the third argument of Compile.  You don't need to do this in the current
version of Mathematica (Version 4), which effectively ignores the possibility
of such global effects, but the behavior of older versions of Mathematica
(I am guessing that you are using an older version) is also correct.

Alternatively, if you localize i, such as by using Block, that part of the
problem will also go away.  Localizing variables is a recommended approach
to this sort of thing in any version of Mathematica.

An unrelated problem with this example is that it tries to assign a value
to a number.  The expression x[[i]]++, where x is a list of numbers, picks
out an element from that list and tries to increment it.  Mathematica will
not let you do that.  That is the reason for introducing the variable var
in the above examples.

Dave Withoff
Wolfram Research


  • Prev by Date: Re: Re: Slow Version 4 Front End
  • Next by Date: Re: Limit of an Integer Function
  • Previous by thread: Compile problem: Mathematica 4
  • Next by thread: Re: Compile problem: Mathematica 4