From ggrothendieck at gmail.com  Tue May 19 15:57:34 2009
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Tue, 19 May 2009 09:57:34 -0400
Subject: [Rd] Automatic Differentiation for R
In-Reply-To: <18962.44855.753611.51326@lynne.math.ethz.ch>
References: <mailman.23.1239789606.8943.r-devel@r-project.org> 
	<49E5E171.6030603@uottawa.ca>
	<971536df0904150653v3680b512x44d9c2987e69628b@mail.gmail.com> 
	<18962.44855.753611.51326@lynne.math.ethz.ch>
Message-ID: <971536df0905190657t168a4be2w4887c8308dd50810@mail.gmail.com>

On Tue, May 19, 2009 at 9:08 AM, Martin Maechler
<maechler at stat.math.ethz.ch> wrote:
> [MM stumbling over on old thread ... he'd be interested]
>
>>>>>> "GaGr" == Gabor Grothendieck <ggrothendieck at gmail.com>
>>>>>> ? ? on Wed, 15 Apr 2009 09:53:18 -0400 writes:
>
> ? ?GaGr> Not sure if this is sufficient for your needs but R does include symbolic
> ? ?GaGr> differentiation, see ?D, and the Ryacas and rSymPy
> ? ?GaGr> packages interface R to the yacas and sympy computer algebra
> ? ?GaGr> systems (CAS) and those system include symbolic differentiation.
>
> No, symbolic differentiation is not enough.
> Automatic Differentiation (AD) is something much more general (in one
> way) and much less mathematical from ?a classical view point:
> But then, AD is much more generally useful for minimization as, basically,
> the input is an R function
> ? ?f(x) ? ? ? ? ? ? ? {with x multidimensional}
> or ?f(x1,x2, ..., xp) ?{with scalar x1, x2, ..}
> and the output is again an R function
> which computes f() and all {or just selected} partial
> derivatives ?d f / d{xi}.
>
> Now consider that the function f() ?can contain if() and while()
> clauses and conceptually ever language feature of R.
> In practice, I'm pretty sure the list of features would have to
> be restricted, similarly as they'd have to for an R compiler to
> be feasible.
>
> I agree that ?AD for R would be very nice and could be very
> useful.
> I'd also be interested to help AD people learn the S4 classes
> and methods (hoping that it's close enough to what they call
> "operator overloading" something I'd presume to be less general
> than the powerful S4 class/methods system).

The overloading facilities present have already been discussed in
this thread including a complete illustration of using them for the
problem at hand.

rSymPy and Ryacas both support overloading.

Ryacas also supports automatic differentiation
of one line R functions but its not fully developed and very limited.
See demo("Ryacas-Function") which shows differentiation of the
Burr CDF to get the PDF.

Here are a few more simpler examples to illustrate overloading in
these packages.

> library(Ryacas)
Loading required package: XML
> x <- Sym("x")
> x+x
[1] "Starting Yacas!"
expression(2 * x)

> library(rSymPy)
Loading required package: rJava
> source("http://rsympy.googlecode.com/svn/trunk/R/Sym.R")
> y <- Sym(sympy("var('y')"))
> y+y
[1] "2*y"

Check the home pages of the packages for more info.



[Rd] Automatic Differentiation for R
Gabor Grothendieck