MathGroup Archive 1998

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

Search the Archive

Compile lesson




Way back on 24 April 1997 Dave Withoff debugged some Compile code a user
sent to the mathgroup.  Before Dave debugged the code it ran slower
than  normal Mathematica code.  Dave explained that you should try to
get nothing  but a list of pseudocode instructions in the compiled
function.

More precisely, if you say
In[1]:=   funct=Compile[{vars},  blah; blah; blah ] Then you should be
able to do:
In[2]:=  funct[[3]]
and get a list of lists, where each of the sublists are all integers.

As I understand it your compiled function will execute quickly as long
as  can be converted to all psuedocode instructions.  Function "demo1"
below is  an example of a function that was compiled into 100%
pseudocode  instructions.  This is good.


In[1]:=
demo1=Compile[{x},Module[{y=0.0},
   If[x<0,y=2*x;];
   y+5 ]];
demo1[[3]]

Out[1]=
{{1,2},{4,1,0},{15,0.,1},{14,0,0},{24,0,2},{98,0,2,0},{90,0,6},{14,2,1},{24,
1,
    3},{38,3,0,3},{20,3,1},{91,1},{14,5,1},{24,1,3},{34,1,3,3},{9,3}}

____________________________________

The next line has the same problem as the function Dave debugged.  The
If  statement will return a Real if (x<0), and return Null if (x>=0). 
The  compiler doesn't know what the If statement will return, so it
isn't  translated into pseudocode.

In[2]:=
demo2=Compile[{x},Module[{y=0.0},
   If[x<0,y=2*x];
   y+5]];
demo2[[3]]

Out[2]=
{{1,2},{4,1,0},{15,0.,1},{14,0,0},{24,0,2},{98,0,2,0},{31,
    Function[{x},If[x<0,y=2
x]],{y,3,0,1,Module},6,0,17},{14,5,1},{24,1,3},{
    34,1,3,3},{9,3}}

________________________________________ The next function tries to
change the value of the function's argument. This can't be done with
pseudocode instructions, so standard Mathematica  code is used.

In[3]:=
demo3=Compile[{x}, If[x>10^20,x=10^20;];   ]; demo3[[3]]

Out[3]=
{{1, 2}, {4, 1, 0}, {14, 10, 0}, {37, 0, 0, 1},
  {37, 1, 1, 1, 2}, {19, 2, 1}, {37, 1, 1, 1, 2},
  {37, 0, 0, 2, 1}, {24, 1, 1}, {98, 1, 0, 0},
  {90, 0, 3}, {31, Function[{x}, x = 10^20], 6, 0, 17},
  {91, 1}, {12, 187}}

________________________________________ The next function tries to use
a Global variable.  We can't do this either  with pseudocode
instructions, so standard Mathematica code is used.

In[4]:=
num=10;
demo4=Compile[{x},x+num];
demo4[[3]]

Out[4]=
{{1,2},{4,1,0},{31,Function[{x},num],3,0,1},{34,0,1,1},{9,1}}

________________________________________ Any Mathematica function can be
used inside compile, but there may be no  advantage in using Compile if
some of the functions can't be translated into  pseudocode.  As
demonstrated above your code may not translate into  pseudocode even if
all the functions used are supported  by Compile.

In the lines above I gave a few reasons why Compile may not be able to 
translate a function into pseudocode.  If any members of the group have
other things to avoid inside Compile I would like to hear about them.

Ted Ersek




  • Prev by Date: [Fwd: How Mathematica select one of the roots?]
  • Next by Date: `Collect' with complex numbers??
  • Prev by thread: [Fwd: How Mathematica select one of the roots?]
  • Next by thread: Re: Compile lesson