RE: Speeding up Replacement Rules
- To: mathgroup at smc.vnet.net
- Subject: [mg24686] RE: [mg24527] Speeding up Replacement Rules
- From: Wolf Hartmut <hwolf at debis.com>
- Date: Fri, 4 Aug 2000 01:19:08 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
a partial answer (I hope) at
> -----Original Message-----
> From: Johannes Ludsteck [SMTP:ludsteck at zew.de]
To: mathgroup at smc.vnet.net
> Sent: Monday, July 24, 2000 9:04 AM
> To: mathgroup at smc.vnet.net
> Subject: [mg24527] Speeding up Replacement Rules
>
> Dear MathGroup Members,
> I use Mathematica to compute the hessian of a complicated
> function of a vector of about 50 variables. My problem with the job
> is that I need the mean of the hessian for about 50000 sets of
> vector values.
>
> Of course, it is simpe to compute a symbolic expression of the
> hessian in two steps:
> g=Map[D[f[args],#]&,args];
> h=Map[D[g,#]&,args];
> and to use this to compute the mean by defining a list of 500000
> replacement rules, and to replace the stuff with
> (Plus@@(h/.rules))/50000;
>
> This works fine but very sloooooooow. Since I have to redo the
> computation of the mean some hundred times, I nead a drastic
> gain in speed. I think that the main reason for the poor performance
> of my strategy is that the replacement operation is slow. I think it
> should be possible to generate a Compiled function object which is
> much faster. Since I expect that this will require some time, I would
> like to know whether the increase in speed will compensate me for
> the pains of the implementation.
> Of course, if someone has Mathematica code which takes a vector
> valued function and generates a Compiled gradient or hessian
> function, I will accept it gratefully.
>
[Hartmut Wolf]
you may get your compiled Hessian just along the lines of my reply to
"[mg24584] Manipulating Slot objects in Compile":
f[{x_, y_}] := x^2 y^3
dimension = 2;
Clear[cArg]
Off[Part::"partd"]
cArgList = Table[cArg[[i]], {i, dimension}]
hessian =
Compile[{{cArg, _Real, 1}},
Evaluate[Map[D[Map[D[f[cArgList], #] &, cArgList], #] &, cArgList]]]
CompiledFunction[{cArg}, {{2 cArg[[2]]^3,
6 cArg[[1]] cArg[[2]]^2}, {6 cArg[[1]] cArg[[2]]^2,
6 cArg[[1]]^2 cArg[[2]]}}, "-CompiledCode-"]
(This is not the output of the computation, but generated from that to make
it visible here). Compare to
D[f[{x, y}], x, x]
2*y^3
D[f[{x, y}], x, y]
6*x*y^2
D[f[{x, y}], y, y]
6*x^2*y
hessian[{0.5, 0.7}]
{{0.686, 1.47}, {1.47, 1.05}}
> The simple advice to compute the hessian by hand and to put this
> in a Compiled function is worthless for me, since I have to apply
> the mean hessian computation to a variety of different functions.
>
>
> Thank you,
> 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