Re: Compiled function
- To: mathgroup at smc.vnet.net
- Subject: [mg93845] Re: Compiled function
- From: SigmundV <sigmundv at gmail.com>
- Date: Thu, 27 Nov 2008 05:28:39 -0500 (EST)
- References: <gggqfq$320$1@smc.vnet.net> <ggj7fo$j5d$1@smc.vnet.net>
Hello,
Thank you for the answer, Michael. How can you conclude that the code
does not compile fully in either case? I used the With construct so
that I would not have to change the Module each time I wanted a new
function fa. I also agree that Compile is scarcely documented. Perhaps
someone can tell us the reason for this.
/Sigmund
On Nov 26, 11:13 am, Michael Weyrauch <michael.weyra... at gmx.de> wrote:
> Hello,
>
> if you look at the compiled code, you will see, that it does not
> fully compile in both cases. It's only somewhat worse in case of
> fa with Piecewice[], since expressions with the Head Piecewise cannot be
> compiled anyway, since compiled code only supports real, complex,
> integer and a few other basic data.
>
> I suggest to rewrite the code using IF[] or other Mathematica
> constructs, which can be compiled easily.
>
> (Writing code that compiles properly in Mathematica is more an art than
> a science since Compile[ ] is really poorly documented. I hope this will
> change in the (distant?) future...)
>
> Michael
>
> SigmundV schrieb:
>
> > Dear group,
>
> > Consider the following:
>
> > derData[data_, h_] := (Drop[data, 1] - Drop[data, -1])/h;
> > front = With[
> > {fa =
> > Function[{x, y}, Piecewise[{{0, 2 <= x <= 3 && 2 <= y =
<= 3}}, 1],
> > Listable],
> > fc = Function[{x, y}, (x y + 10)^0]},
> > Compile[{{r, _Real, 2}, {dt, _Real}, {\[Theta], _Real}},
> > Module[{x, y, a, b, c, C = Cos[\[Theta]], S = Sin[\[Theta]]=
, da,
> > db, dc, dx, dy, cxy, xy, cxyxy, xnew, ynew,
> > dphi = 2 \[Pi]/1000},
>
> > x = r[[All, 1]]; y = r[[All, 2]];
> > dx = derData[x, dphi]; dx = Join[dx, {dx[[1]]}];
> > dy = derData[y, dphi]; dy = Join[dy, {dy[[1]]}];
>
> > a = fa[x, y];
> > b = 2 a; c = fc[x, y];
> > da = derData[a, dphi]; da = Join[da, {da[[1]]}]; db = =
2 da;
> > dc = derData[c, dphi]; dc = Join[dc, {dc[[1]]}];
>
> > cxy = dc dt + S dx + C dy; xy = C dx - S dy;
> > cxyxy = a^2 cxy^2 + b^2 xy^2;
>
> > xnew =
> > x + dt c S + dt^2 (-a^2 b db (dc dt S + dx))/cxyxy +
> > dt (a^2 C cxy - b^2 S xy) Sqrt[cxyxy - a^2 db^2 dt^2]/cx=
yxy;
> > ynew =
> > y + dt c C + dt^2 (-a^2 b db (dc dt C + dy))/cxyxy -
> > dt (a^2 S cxy + b^2 C xy) Sqrt[cxyxy - a^2 db^2 dt^2]/cx=
yxy;
>
> > Transpose[{xnew, ynew}]
>
> > ]
> > ]
> > ];
>
> > As you see, fa is a piecewise function, but the module won't compile.
> > However, when fa is a continuous function, like Exp[-(x^2 + y^2)], the
> > module compiles without problems. Can anyone shed some light on this?
> > Why does the compilation work in the latter case, but not in the
> > first?
>
> > King regards,
> > Sigmund Vestergaard