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