Thanks for chiming in! There's a lot to say about this topic, and I think 
it's great! I felt like Julia's differential equation solvers were behind 
where they should be, which was crazy to me since there is so many 
state-of-the-art mathematical packages in other areas (optimization, stats, 
etc.)

 There are a few reasons why I didn't go about helping ODE.jl. I think the 
API is the biggest one. My muse here was JuMP. I used JuMP for a few really 
difficult optimization problems, and just swapped around the solvers by 
switching a keyword argument, and it handled the rest. I thought it was 
beautiful and the idea was simple: put the information for a problem into a 
type, and then just wrap solvers. Once I had that idea and gave it a try on 
the FEM "scratch work" I had been playing with, I just thought that this is 
why Julia will be the future. So my idea was to structure problem 
specifying and solving as follows: defining a problem is defining a type, 
from there you dispatch to a solver which is preamble, solver algorithm, 
put solution to object, and then have helpers make the solver object easy 
to use. The key here is that the solver algorithm is just the middle: you 
can just swap out the middle part in seconds, not just as a user, but as a 
coder. If you look at sdeSolvers.jl, you can see what my final plan is 
going towards: define all of the solvers as drop in code, and choose one in 
a conditional (though with the loop as part of the "def" code, right now 
that's not the case, and there should be easy loop pre-ambles post-ambles 
for saving outputs etc). Once you have that structure, adding new solvers 
is easy! So I added all of the solvers in odeSolvers (i.e. all of the 
standard solvers which I think ODE.jl has as well, plus a few) in one 
morning, just adding a new "way to handle the middle". Having the special 
output type also made convergence testing and plotting free (plotting is 
then super nice because the solution types have recipes to Tom's 
Plots.jl!), and from there things were just in motion. 

Once I had that structure, I wanted it all to be similar so that way they 
could interact well. Even though they do currently use it, there will be 
(S)PDE solvers which allow for using method of lines discretizations which 
then just plug into (S)ODE solvers. And what about all of those C/Fortran 
solvers? They can also just be added as part of the routine, and to switch 
over to it the user just swaps a keyword argument. This freedom of solvers 
has both practical, academic, and educational advantages. The practical 
advantage is that with users able to change 10 characters to switch the 
solvers, inevitably adding new solvers becomes "free new features". Also, 
these features can be existing solvers. For example, if you guys are doing 
well, and option may be to use ODE.jl solvers (if not just to benchmark 
between them, our solvers will most likely converge over time to about the 
same speed). But academically, this structure let me (and anyone else) just 
experiment with different solvers. Everything else is handled for you 
(plotting, convergence tests, setting up the internals, saving everything), 
so you literally just write the loop. That's why I am using it to develop 
SDE algorithms. And lastly, education. For example, it will only take about 
10 lines to implement a Simpson's Rule solver for ODEs. This is a quiz 
problem I have to my undergrads: what order is it, and what's the region of 
stability? It's always unstable, so you'd never want to use it on a real 
problem. I plan to just add that as an option in the solver because it 
won't slow anything else down: it'll just be a bad option. The 
documentation will say it's a bad method, but this lets the curious 
students see what happens.

So once I had this JuMP-inspired idea, I was scared of ODE.jl's pace of 
development. I didn't want to wait to talk about API decisions and all 
that: So I made a prototype. Note that at first I wasn't going to step on 
ODE.jl's toes so I put in the README that it doesn't handle ODEs, but then 
I needed one to generate some silly figure, and so for fun I used to SDE 
solver template to then make the ODEProblem, coded RK solvers from memory, 
opened up Hairer's book and implemented Rosenbrock solvers, and tada I had 
an ODE solver suite some hours later. 

I don't think then that DifferentialEquations.jl and ODE,jl are 
diametrically opposed in any way. DifferentialEquations.jl is more this 
high-level interface to how to specify differential equation problems, 
interface with solvers, and then give a structured solution which is "easy 
to play with" (I think making an animation of a solution using animate(sol) 
is just too cool). It has a bunch of solvers because I was testing it all 
out and because that's what my PhD research is (stochastic solvers 
specifically, so of course I implement deterministic solvers all the time 
though!). ODE.jl is a set of ODE solvers, and can actually be used by 
DifferentialEquations.jl (though it hasn't yet).

How this should all be organized? I don't really know. I mentioned it on 
the newly formed JuliaMath organization. But I don't think anyone really 
cared, but that's also because I didn't "have" anything. Now that I have 
all of this implemented, the question is coming back (as it should). My 
take on it is that in this form, "differential equation problems" are all 
pretty much the same: they are a problem specification via some functions, 
some kind of mesh (either just time, or space and time), an associated 
solvers, and some helper functions for doing standard analyses of the 
solution. These pieces will then play with each other: solving an SDE can 
be solving a PDE if you want to do it via the Fokker-Plank / Forward 
Kolmogorov / Feynman-Kac way, solving a PDE might just discretize to an ODE 
problem. or you can solve some PDEs probabilistically by solving a Monte 
Carlo simulation of SDEs. That's why I kept them together. But to be 
honest,I don't care about organization as much as long as it's easy to just 
implement every possible way of solving things,

There's a lot left to do. I've only had this package for less than a month, 
and was taking 6 courses + 2 seminars per quarter this year, so I didn't 
get as much done as I hoped. However, I am turning in that last final in a 
few days, so I will be freed up to start working more on this. Also, I have 
a lot of private codes which are being submitted soon and once those are 
published we will really have some state-of-the-art functionality. Next 
year I have courses and plan to take this head on. So I am just going to 
keep doing as much as possible, and we as a community can discuss what we 
want to do with it.

Reply via email to