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