>
> I agree, keyword-args are a maintenance headache (and also potentially
> bad for performance). That was indeed one of the reason to make
> Parameters.jl to generate the keyword constructors for the types
> automatically. Then use the types instead of keyword functions.
>
> Concerning the implementation I was not very clear: I don't mean to
> argue that you should not use any fancy type, etc., in your solvers
> (maybe call them integrators?) but that you should also provide a dumb
> interface for them (eventually) so they can be used outside of
> DifferentialEquations. (And yes, the @def does feel like unnecessary
> metaprogramming).
>
Yeah, in its current use it's unnecessary. I am doing a bit of a turn
around on it now that I am implementing external integrators (nice word
choice. That's what I've been doing in research papers, I'll carry that
over to the package). Indeed, for adding external integrators to be the
same as adding new solvers internally, calling internal integrators should
be calling a function. That is pretty much in line with how I am using
integrators which just make a few matrices and call IterativeSolvers.jl or
NLSolve.jl (which are some of the FEM methods), and so it will also
generalize to using ODE.jl, ODEInterface.jl, PETSc.jl, etc. Also, all of my
GPU / Xeon Phi integrators for SDEs simply call C/Cuda functions (currently
not released), and so those will be easier to make into function calls. So
while @def was really quick and easy for building geometric multigrid
solvers (for an example, see /src/fdm/stokesSolvers.jl), in the end I took
the idea too far. It's looking like most of it should be all switched to
function calls.
One thing that will be nice though is to use @def for loop header and
footers. For example, there are many different rejection sampling adaptive
algorithms which do the same routine for determining rejections and
adjusting step size, and at the top of every loop I update the iteration
(and hit the RNG for SDE methods), so I think the most maintainable way to
write the integrators will be to make them their own function which is just
a loop, which does:
while t<T
@odeloopheader
...
#Write out the method here
...
if adaptive
@odeadaptivefooter
else
@odefooter
end
end
That way adding maximum iterations or any of those other goodies is just
one change to the header or footer macro, and it will then propagate
through to every method. Also part of my footers is the progressbar logic:
atomLoaded ? Main.Atom.progress((t-tspan[1])/(tspan[2]-tspan[1])) : nothing
#Use
Atom's progressbar if loaded
Since Juno/Atom is set to become the default IDE, I think it would be good
to support its special functions (when available), which for now is the
progressbar (which works really well!).
> > Yes, those and Sundials are what I have in mind as methods the user can
> > choose. I don't really know how to handle the dependency issue though:
> do
> > you require these packages? Right now I require Plots and PyPlot. Is
> that
> > necessary? Is requiring NLSolve necessary when it's only used for the
> > implicit methods? ForwardDiff is only used in the Rosenbrock methods
> > (currently), should it be a dependency? Or should I detail a list of
> what
> > methods need what dependencies? I haven't settled on this, and may open
> an
> > issue.
>
> The issue is https://github.com/JuliaLang/julia/issues/6195
>
> There is https://github.com/MikeInnes/Requires.jl (but it does not work
> 100%).
>
> And here is how Plots.jl does it:
>
> https://github.com/tbreloff/Plots.jl/blob/cf4d78c87c773453945f181cce2f1fe495c94798/src/backends/pyplot.jl#L59
Tom Breloff's recent change to plots will make it so that way I only
require RecipesBase.jl, and then have it in documentation that to use the
plotting functionality, you have to install Plots.jl and a backend
(preferably PyPlot). So I think the first thing in the documentation will
be a dependency chart/explanation, i.e. to use ___________ methods, you
need __________. A nice little graphic will solve it.
I think I will tag the a new minor version to make the latest tagged
version compatible with the new Plots and have all the latest integrators.
I will cram to make the internal change to functions, add in calls to the
other libraries (at least for ODEs), and change the dependency setup before
the major release. With that I will have a blog post on the vision, and
make it easier for others to start contributing. That will happen when my
paper on the SDE methods is published (resubmitting by the end of the week,
so at least by the end of summer, and I hope by midsummer) which will allow
me to pull in a private branch where a lot of my development has been. When
I get there, we should talk about whether some of the parts should be
broken out to their own packages and stitched together via
DifferentialEquations.jl (that would definitely make the tests quicker!)
Thanks for helping me get more focus! Do you plan on moving to ODE.jl to
JuliaMath? When I hit the major release, I think we should be considering
bringing us together under some organization.