Manipulating Slot objects in Compile
- To: mathgroup at smc.vnet.net
- Subject: [mg24584] Manipulating Slot objects in Compile
- From: "Johannes Ludsteck" <ludsteck at zew.de>
- Date: Tue, 25 Jul 2000 00:56:16 -0400 (EDT)
- Organization: Zentr. f. Europ. Wirtschaftsforsch
- Sender: owner-wri-mathgroup at wolfram.com
Dear Mathgroup Members,
I want to write a program which computes the gradient of any
function and then compiles this expression. I tried to do this by
manipulating Slot objects.
Unfortunately there is the following problem:
First I define an example function.
f[{x_, y_}] := x^2 y^3,
Then I generate a list of (unique) variables for differentiation:
arg = Table[Unique[], {2}]
{$1,$2}
and compute the gradient:
grad = Map[D[f[arg], #] &, arg]
{2 $1 $2^3, 3 $1^2 $2^2}
Then I generate a set of replacement rules
rules = Table[arg[[i]] -> Slot[][[i]], {i, 2}]
and use them in order to get compiled code by
applying r to grad
c = Compile[{{cArg, _Real, 1}},
Evaluate[Evaluate[grad /. r] &[cArg]]]
Unfortunately, Mathematica doesn't replace the Slot[] object by
cArg and I get the following Output:
CompiledFunction[{cArg},
( { 2 Slot[][[1]] Slot[][[2]]^3, 3 Slot[][[1]]^2 Slot[][[2]]^2 } & )[cArg],
-CompiledCode-]
Thus I tried to circumvent the problem by using Slot[1] instead:
rules = Table[arg[[i]] -> Slot[][[i]], {i, 2}]
Now the Slot[1] object disappeared, but Slot[1][[1]] was replaced
by 1 and I got again the false result:
c = Compile[{{cArg, _Real, 1}},
Evaluate[Evaluate[grad /. r] &[cArg]]]
now evaluates to
CompiledFunction[{cArg},
{ 2 cArg[[2]]^3, 3 cArg[[2]]^2}, -CompiledCode-]
The Problem here is that Slot[1][[1]] is replaced by 1.
How can I force Mathematica to replace Slot[][[i]] by cArg[[i]] or
to replace Slot[[1]][[1]] by cArg[[1]] instead, or is there any other
way to get a compiled gradient from any function?
Any suggestions?
Of course, the seemingly awkward usage of Unique[]
and Tables of rules is in order to collect the pieces of code into
one Module which does the job for any function of any dimension
(lenArg is the dimension of the argument list of function fun):
compiledGradient[fun_, lenArg_] :=
Module[{arg, rules, grad},
arg = Table[Unique[], {lenArg}];
grad = Map[D[fun[arg], #] &, arg];
rules = Table[arg[[i]] -> Slot[][[i]], {i, lenArg}];
Compile[{{cArg, _Real, 1}},
Evaluate[Evaluate[grad /. rules] &[cArg]]]]
Thank you and best regards,
Johannes Ludsteck
Johannes Ludsteck
Centre for European Economic Research (ZEW)
Department of Labour Economics,
Human Resources and Social Policy
Phone (+49)(0)621/1235-157
Fax (+49)(0)621/1235-225
P.O.Box 103443
D-68034 Mannheim
GERMANY
Email: ludsteck at zew.de