Compile[] of Which[]
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1274] Compile[] of Which[]
- From: Jonathan Rich <rich at news.acns.nwu.edu>
- Date: Wed, 31 May 1995 03:25:41 -0400
- Organization: Northwestern University, Evanston, IL, US
I am trying to compile a procedure. In the course of this,
I came across what is either an error in the documentation, or
a bug, or something I don't understand properly. The documentation
for "Compile[]" (see MathSource #0203-971 by Matt Cook or
0204-028 by Jerry Keiper) clearly states that the testing function
"Which[]" is compilable. However in my experience, looking at the
guts of the CompiledFunction, it requests that "Which[]" be
evaluated externally, which defeats the whole purpose of Compile
and greatly slows down the calculation. This has forced me to
replace a single "Which" by numerous "If"s. Using this workaround
Compile will work as it should. However I would like clarification
on whether the documentation is in error or just what is going on.
Below is a very simple example to demonstrate the problem:
Mathematica 2.2 for HP9000 Series 700
Copyright 1988-93 Wolfram Research, Inc.
-- Motif graphics initialized --
In[1]:= fWhich=Compile[{a,b},
Which[ a<b,b,
a>b,a,
a==b,a
]
];
In[2]:= fIf=Compile[{a,b},
If[ a<b,b,
If[ a>b,a,a
]
]
];
In[3]:= fIf//InputForm
Out[3]//InputForm=
CompiledFunction[{_Real, _Real}, {2, 0, 4, 0},
{{1, 17}, {4, 1, 0}, {4, 2, 1}, {75, 0, 1, 0}, {69, 0, 3}, {17, 1, 3},
{70, 7}, {75, 1, 0, 1}, {69, 1, 3}, {17, 0, 2}, {70, 2}, {17, 0, 2},
{17, 2, 3}, {8, 3}}, Function[{a, b}, If[a < b, b, If[a > b, a, a]]]]
In[4]:= fWhich//InputForm
Out[4]//InputForm=
CompiledFunction[{_Real, _Real}, {0, 0, 3, 0},
{{1, 17}, {4, 1, 0}, {4, 2, 1},
{24, Function[{a, b}, Which[a < b, b, a > b, a, a == b, a]], 2}, {8, 2}},
Function[{a, b}, Which[a < b, b, a > b, a, a == b, a]]]
The above shows that "fif" is fully compiled but that in "fwhich" the
opcode 24 indicates that "Which[]" is considered non-compilable and so
must be evaluated externally despite the documentation which says otherwise.
Any clarification would be much appreciated.
Thanks.
--
Jonathan Rich
Geoscience Dept., NWU