On Sun, Apr 13, 2008 at 12:22 PM, Luc Maisonobe <[EMAIL PROTECTED]> wrote: > Hello, > > I have played with an idea for a new project for a few months. Asking for a > few advices both at the ApacheCon Europe and by direct contact, all > responses I received were quite positive and suggested me to set up a > component in sandbox. This message is the first public announcement and is > intended to collect the opinion of all the commons community about this > project. In short: can I play in sandbox with this or should I find another > place for it ? Another possibility would be to put it inside [math], but > that would be really strange. > > The project already has a name: Nabla, which is an operator used in > mathematics and physics for differentiation. It is a simple triangle > pointing downwards (see http://mathworld.wolfram.com/Nabla.html). Lets call > the component I want to develop [nabla] from now, to match our local habits > here. There is some code for it, but only developed by myself on my spare > time with my personal computer and never distributed to anyone. So I can > consider I developed it under Apache umbrella and put it on sandbox with the > Apache headers and license. I am already a commons committer and have filed > an Individual Contributor License Agreement to Apache. > > [nabla] will be a mathematics/physics library aimed at building the > symbolic differentiation of any function provided as a bytecode compiled > function. > > Here is a typical use case for such a library. For some simulation > purposes, suppose I use a class with a method computing the consumption of > performing an action as a function of its start time: > > public class DifficultComputation { > public double f(double t) { > // some lengthy equations here > } > } > > Now in addition to computing the consumption by itself, I want to be able > to compute the sensitivity of this consumption to start time changes. This > would allow me to say: if action is started at t = 10 seconds, then > consumption will be 1.2 kilograms, and this consumption will increase by 10 > grams for each second I delay the start. The value 10 grams per second of > delay is computing by differentiating the original equation. There are > several ways to do that. > > The first way relies on by mathematical transformations on the equations > implemented in the function f. It it implies mathematical analysis and new > development which is very error-prone (computing the differential of a > function is much more complex than computing the function itself). It is > only feasible if you know the equations or have the source code of the > function. This approach may be used with symbolic computation packages like > Mathematica, Axiom where you develop your equations using these programs, > and have them generate the implementation for you. However, the produce code > is only for some languages (typically fortran and C), it is awful and cannot > be maintained (it is not intended to be), and needs to be integrated with > the rest of the application which is already a difficult task. > > The second way is using numerical finite-differences schemes. These > algorithms basically compute several values by changing the start time by a > small known amount and looking at the various results. This implies setting > up the step, which may be difficult if you don't already know the behavior > of the function (should I use one microsecond or one century here, in fact > it depends on the problem). This is also either quite computation intensive > if you use high order schemes with 4, 6 or 8 points or inaccurate if you > don't use them. It is also impossible to use too close to functions > boundaries which are often locations were we really want to explore. > > [nabla] provides a third way to get this result. It analyses the bytecode > of the function at run time, performs the exact symbolic mathematical > transforms, and generates a new class implementing the differentiated > function. There is still a computation cost, but it is the same you would > get from a manually differentiated code, plus a one time bytecode > differentiation overhead (but we can also cache results). > > This approach has the following benefits: > - derivation is exact > - there are no problem-dependent step size to handle > - derivation can be computed even at domains boundaries > - there is no special handling of source > (no symbolic package with its own language, no source code > generation, no integration with the rest of application) > - one writes and maintains only the basic equation and get the > derivative for free > - it is effective even when source code is not available (but there > are licensing issues in this case of course, since what I do > automatically is really ... derived work) > > The only drawback I see is that functions calling native code cannot be > handled. In this case, we have a fallback available with finite-differences > schemes. > > The existing implementation is not yet ready for production. A lot of work > has been done, but there are many missing features. [nabla] can handle > simple functions from end to end (i.e. up to creating an instance of the > differentiated class that is fully functional). Making this code available > in the sandbox would allow to let people look at it, comment on it, > participate if they are interested and make it go live. > > What do you think about it ? > Luc > > I would say go ahead and commit it to the sandbox and lets see if we can build some community around it. The idea is interesting and I see how it could be useful assuming it could be made to work reliably and the byte code <-> original function differentiated byte code <-> analytical derivative mapping could be shown to lift with decent numerics and performance for a decent range of original functions. That is not obvious to me, but I have never thought about this kind of thing before.
In any case, I would say go ahead and commit to the sandbox. Phil > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]