This is against a Taylor integration method that utilizes taylor-mode automatic differentiation in a specifically
optimized way for ODE integration via its @taylorize
macro (for more details, see the documentation).
This demonstration is done on the classic Pleiades n-body problem, a non-stiff ODE since the Taylor integration methods
are only for non-stiff equations.
The spiral neural ODE was used as the training benchmark for both torchdiffeq (Python) and DiffEqFlux (Julia) which utilized the same architecture and 500 steps of ADAM. Both achived similar objective values at the end. Results:
- DiffEqFlux defaults: 7.4 seconds
- DiffEqFlux optimized: 2.7 seconds
- torchdiffeq: 288.965871299999 seconds
This example is a 4-dimensional geometric brownian motion. The code
for the torchsde version is pulled directly from the
torchsde README
so that it would be a fair comparison against the author's own code.
The only change to that example is the addition of a dt
choice so that
the simulation method and time step matches between the two different programs.
The SDE is solved 100 times. The summary of the results is as follows:
:((var"##MTIIPVar#414", var"##MTKArg#412")->begin | |
@inbounds begin | |
@sync begin | |
let (uβ, uβ, uβ, uβ, uβ , uβ, uβ, uβ, uβ, uββ) = (var"##MTKArg#412"[1], var"##MTKArg#412"[2], var"##MTKArg#412"[3], var"##MTKArg#412"[4], var"##MTKArg#412"[5], var"##MTKArg#412"[6], var"##MTKArg#412"[7], var"##MTKArg#412"[8], var"##MTKArg#412"[9], var"##MTKArg#412"[10]) | |
begin | |
Threads.@spawn begin | |
(var"##MTIIPVar#414").nzval[1] = -2 | |
(var"##MTIIPVar#414").nzval[2] = 1 | |
(var"##MTIIPVar#414").nzval[3] = 1 | |
(var"##MTIIPVar#414").nzval[4] = -2 |
fjac = (var"##MTIIPVar#585", var"##MTKArg#583")->begin | |
@inbounds begin | |
let (uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβ Λβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββ Λβ Λβ, uββΛβ Λβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛ |
multithreadedfjac = (var"##MTIIPVar#581", var"##MTKArg#579")->begin | |
@inbounds begin | |
let (uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβ Λβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uβΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββΛβ Λβ, uββ Λβ Λβ, uββΛβ Λβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββ ΛβΛβ, uββΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβ ΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uβΛβΛβ, uββΛβΛβ, uββΛβΛβ, uββΛβΛβ, uβ |
# Atom: | |
Version: 1.44.0 | |
Dev Mode: false | |
Official Release: true | |
{ | |
"http_parser": "2.8.0", | |
"node": "10.11.0", | |
"v8": "6.9.427.31-electron.0", | |
"uv": "1.23.0", | |
"zlib": "1.2.11", |
using OrdinaryDiffEq, RecursiveArrayTools, LinearAlgebra, Test, SparseArrays, SparseDiffTools, Sundials | |
# Define the constants for the PDE | |
const Ξ±β = 1.0 | |
const Ξ±β = 1.0 | |
const Ξ²β = 1.0 | |
const Ξ²β = 1.0 | |
const Ξ²β = 1.0 | |
const rβ = 1.0 | |
const rβ = 1.0 |
All are solved at reltol=1e-3, abstol=1e-6
using the fastest ODE solver of the respective package for the given problem.
- SciPy LSODA through odeint takes ~489ΞΌs
- SciPy LSODA through odeint with Numba takes ~257ΞΌs
- NumbaLSODA takes ~25ΞΌs
- DifferentialEquations.jl Rosenbrock23 takes ~9.2ΞΌs
<!DOCTYPE html> | |
<HTML lang = "en"> | |
<HEAD> | |
<meta charset="UTF-8"/> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> | |
<title>How Inexact Models Can Guide Decision Making in Systems Pharmacology</title> | |
<script type="text/x-mathjax-config"> | |
MathJax.Hub.Config({ |