Re: Manipulating Slot objects in Compile
- To: mathgroup at smc.vnet.net
- Subject: [mg24604] Re: Manipulating Slot objects in Compile
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Fri, 28 Jul 2000 17:23:42 -0400 (EDT)
- Organization: Universitaet Leipzig
- References: <8lj87k$8ot@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
can you tell me for what you need the Slot[] objects ?
You whant to generate cArg[[i]] and no Slot[1][[i]]
The implementation is simple
f[{x_, y_}] := x^2 y^3
arg = Table[Unique[], {2}];
grad = Map[D[f[arg], #] &, arg];
rules = Thread[
arg -> Table[
Hold[ cArg[[i]] ] /. i -> k, {k, 1,
2}] ]
and here is your function
c = Compile @@ {{{cArg, _Real, 1}}, Hold @@ {grad /. rules}} /.
Hold[a_Part] :> a /. Hold[a_] :> Unevaluated[a]
I explained yesterday how it works.
Regards
Jens
Johannes Ludsteck wrote:
>
> 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