diff --git a/Project.toml b/Project.toml index e37edd243..9bc3e4b46 100644 --- a/Project.toml +++ b/Project.toml @@ -32,6 +32,12 @@ TaylorIntegration = "92b13dbe-c966-51a2-8445-caca9f8a7d42" TaylorSeries = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" ToeplitzMatrices = "c751599d-da0a-543b-9d20-d0a503d91d24" +[weakdeps] +DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d" + +[extensions] +DiffEqDevToolsExt = "DiffEqDevTools" + [compat] ArrayAllocators = "0.3" DiffEqBase = "6.122" @@ -59,6 +65,7 @@ Statistics = "1" StructArrays = "0.4, 0.5, 0.6" TaylorIntegration = "0.8, 0.9, 0.10, 0.11, 0.12, 0.13, 0.14" TaylorSeries = "0.10, 0.11, 0.12, 0.13, 0.14, 0.15" +Test = "1" ToeplitzMatrices = "0.7, 0.8" julia = "1.6" diff --git a/benchmarks/Project.toml b/benchmarks/Project.toml index c7d748b6c..4abd083bc 100644 --- a/benchmarks/Project.toml +++ b/benchmarks/Project.toml @@ -1,5 +1,6 @@ [deps] DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" LSODA = "7f56f5a3-f504-529b-bc02-0b1fe5e64312" LoggingExtras = "e6f89c97-d47a-5376-807f-9c37f3926c36" @@ -18,3 +19,6 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4" Weave = "44d3d7a6-8a23-5bf8-98c5-b353f8df5ec9" deSolveDiffEq = "0518478a-701b-4815-806c-24ad5cb92f09" + +[compat] +DiffEqDevTools = "2.42.0" diff --git a/benchmarks/hodgkinhuxley.jmd b/benchmarks/hodgkinhuxley.jmd index 67951d590..d99f78d29 100644 --- a/benchmarks/hodgkinhuxley.jmd +++ b/benchmarks/hodgkinhuxley.jmd @@ -1,21 +1,29 @@ # Hodgkin-Huxley benchmark -```julia -using LinearAlgebra, Statistics + +!!! note "Summary" + Hodgkin-Huxley is a four-dimensional ODE, which can be stiff or non-stiff depending on the parameters; + here we consider a non-stiff version. We see that: + - [**`EK0` is the fastest solver**.](@ref hh_solver_comparison) + - [**`RosenbrockExpEK` is slowest; but suffers less from smoothing than `EK0` and `EK1`**.](@ref hh_solver_comparison) + - [Results are similar for fixed time steps.](@ref hh_fixed_steps) + + +```julia, results="hidden" +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, SciMLBase, OrdinaryDiffEq, Plots, SimpleUnPack using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), + yticks=10.0 .^ (-6:1:5), ) ``` -### Hodgkin-Huxley problem definition - ```julia αm(V, VT) = -0.32 * (V - VT - 13) / (exp(-(V - VT - 13) / 4) - 1) βm(V, VT) = 0.28 * (V - VT - 40) / (exp((V - VT - 40) / 5) - 1) @@ -26,14 +34,14 @@ theme(:dao; αh(V, VT) = 0.128 * exp(-(V - VT - 17) / 18) βh(V, VT) = 4 / (1 + exp(-(V - VT - 40) / 5)) -Inj(t) = (10 <= t <= 90) ? 500one(t) : zero(t) +Inj(t) = (5 <= t <= 40) ? 500one(t) : zero(t) function f(du, u, p, t) @unpack gNa, gK, ENa, EK, area, C, Eleak, VT, gleak = p V, m, n, h = u - I_inj = Inj(t) * 1e-6 # uA + I_inj = Inj(t) * 1e-6 du[2] = dmdt = (αm(V, VT) * (1 - m) - βm(V, VT) * m) du[3] = dndt = (αn(V, VT) * (1 - n) - βn(V, VT) * n) @@ -53,9 +61,9 @@ n_inf(V, VT) = 1 / (1 + βn(V, VT) / αn(V, VT)) h_inf(V, VT) = 1 / (1 + βh(V, VT) / αh(V, VT)) u0 = [p.V0, m_inf(p.V0, p.VT), n_inf(p.V0, p.VT), h_inf(p.V0, p.VT)] -prob = ODEProblem{true,SciMLBase.FullSpecialize()}(f, u0, (0.0, 100.0), p) +prob = ODEProblem{true,SciMLBase.FullSpecialize()}(f, u0, (0.0, 50.0), p) -test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14, dense=false) +test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14) plot(test_sol, legend=false, layout=(4,1), @@ -64,10 +72,13 @@ plot(test_sol, xlabel=["" "" "" "t"], size = (1000, 600), color=[1 2 3 4], + xticks=:auto, yticks=:auto ) ``` -## Adaptive steps - no smoothing +## [Solver comparison: `EK0` vs. `EK1` vs `RosenbrockExpEK`](@id hh_solver_comparison) + +### Without smoothing ```julia DENSE = SAVE_EVERYSTEP = false @@ -92,26 +103,44 @@ reltols = 1.0 ./ 10.0 .^ (3:7) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Adaptive steps - no smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), +plot(wp, title="Adaptive steps - no smoothing", color=colors) + + +_ref_setups = [ + "Tsit5" => Dict(:alg => Tsit5()) + "Vern7" => Dict(:alg => Vern7()) + "RadauIIA5" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp_final = WorkPrecisionSet( + prob, abstols ./ 1000, reltols ./ 1000, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = false, + save_everystep = false, + maxiters = Int(1e7), ) +ref_wp_dense = WorkPrecisionSet( + prob, abstols ./ 1000, reltols ./ 1000, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = true, + save_everystep = true, + maxiters = Int(1e7), +) + +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) ``` -## Adaptive steps - with smoothing +### With smoothing ```julia DENSE = SAVE_EVERYSTEP = true @@ -136,28 +165,48 @@ reltols = 1.0 ./ 10.0 .^ (3:7) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Adaptive steps - with smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title="Adaptive steps - with smoothing", color=colors) +plot!(ref_wp_dense, x=:final, color=:gray, alpha=0.7, linestyle=:dash) ``` +```@raw html +
Interoplation errors (L2): +``` +```julia +plot(wp, x=:L2, title="Adaptive steps - with smoothing", color=colors) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` -## Fixed steps - no smoothing +### Calibration +```julia +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", color=colors) + +# Should be distributed according to a Chi-squared distribution: +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +plot_chisq_interval!(4) +``` + + +## [Fixed-step solver comparison](@id hh_fixed_steps) + +Without smothing: ```julia DENSE = SAVE_EVERYSTEP = false @@ -179,28 +228,19 @@ wp = WorkPrecisionSet( prob, abstols, reltols, setups; adaptive = false, names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Fixed steps - no smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title="Fixed steps - no smoothing", color=colors) ``` - -## Fixed steps - with smoothing - +```@raw html +
With smoothing: +``` ```julia DENSE = SAVE_EVERYSTEP = true @@ -222,41 +262,21 @@ wp = WorkPrecisionSet( prob, abstols, reltols, setups; adaptive = false, names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, -) - -plot( - wp, - title = "Fixed steps - with smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), + numruns = 5, ) -``` - - -## Appendix -Computer information: -```julia -using InteractiveUtils -InteractiveUtils.versioninfo() +plot(wp, title="Fixed steps - with smoothing", color=colors) ``` - -Package Information: -```julia -using Pkg -Pkg.status() +```@raw html +
``` -And the full manifest: -```julia -Pkg.status(mode=Pkg.PKGMODE_MANIFEST) +## Appendix +```julia, echo=false +include("utils.jl") +appendix() ``` diff --git a/benchmarks/lotkavolterra.jmd b/benchmarks/lotkavolterra.jmd index 33696d142..0f39dc556 100644 --- a/benchmarks/lotkavolterra.jmd +++ b/benchmarks/lotkavolterra.jmd @@ -1,23 +1,46 @@ # Lotka-Volterra benchmark -Adapted from + +!!! note "Summary" + Lotka-Volterra is a simple, low-dimensional, non-stiff ODE. We see that: + - [**`EK0` and `EK1` have a very similar runtime**.](@ref lv_ek0_vs_ek1) + But note that Lotka-Volterra is a non-stiff low-dimensional problem: + if it were stiff, [`EK1`](@ref) would be better; + if it were high-dimensional, [`EK0`](@ref) would be faster. + - [**Orders behave as in classic solvers: Use low order for low accuracy, medium order for medium accuracy, high order for high accuracy**](@ref lv_ek1_comparison). + - [**_Do not use `EK0` with order > 5_**](@ref lv_ek0_comparison): + The adaptive step size selection apparently does not work well for high orders right now. + - [**Use `diffusionmodel=DynamicDiffusion`**](@ref lv_diffusion): + Error-wise, the performance of the diffusion models is similar, but _the calibration of `FixedDiffusion` and `FixedMVDiffusion` with adaptive steps is currently broken_. + - [**Initialization schemes are all similar, but `initialization=TaylorModeInit` performs best.**](@ref lv_initialization) + - **If you only need to solve for the last time point, set `smooth=false`, `dense=false`, and `save_everystep=false`.** + This greatly reduces the run time of the solver. + + +Benchmark adapted from [SciMLBenchmarks.jl](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/NonStiffODE/LotkaVolterra_wpd/). -```julia -using LinearAlgebra, Statistics +```julia, results="hidden" +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Plots using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), ) -``` -### Lotka-Volterra problem definition +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` ```julia f = @ode_def LotkaVolterra begin @@ -29,11 +52,11 @@ tspan = (0.0, 10.0) u0 = [1.0, 1.0] prob = ODEProblem{true, SciMLBase.FullSpecialize}(f, u0, tspan, p) -test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14, dense=false) -plot(test_sol, title="Lotka-Volterra Solution", legend=false) +test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14) +plot(test_sol, title="Lotka-Volterra Solution", legend=false, xticks=:auto) ``` -## EK0 across orders +## [[`EK0`](@ref) Benchmark Across Orders](@id lv_ek0_comparison) ```julia DENSE = false; @@ -47,26 +70,93 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:13) -reltols = 1.0 ./ 10.0 .^ (1:10) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + +_ref_setups = [ + "Tsit5" => Dict(:alg => Tsit5()) + "Vern7" => Dict(:alg => Vern7()) + "RadauIIA5" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp_final = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = false, + save_everystep = false, + maxiters = Int(1e7), +) +ref_wp_dense = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = true, + save_everystep = true, + maxiters = Int(1e7), +) + +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) ``` -## EK1 across orders +```@raw html +
Discrete time-series errors (l2): +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; + +_setups = [ + "EK0(order=$order)" => Dict(:alg => EK0(order=order, smooth=DENSE)) + for order in 2:7 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) + +plot(wp, x=:l2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:l2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +```@raw html +
Interoplation errors (L2): +``` +```julia +plot(wp, x=:L2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +## [[`EK1`](@ref) Benchmark Across Orders](@id lv_ek1_comparison) ```julia DENSE = false; @@ -80,26 +170,68 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:13) -reltols = 1.0 ./ 10.0 .^ (1:10) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) + +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` + +```@raw html +
Discrete time-series errors (l2): +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; + +_setups = [ + "EK1(order=$order)" => Dict(:alg => EK1(order=order, smooth=DENSE)) + for order in 2:7 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, x=:l2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:l2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` -## EK0 vs. EK1 +```@raw html +
Interoplation errors (L2): +``` +```julia +plot(wp, x=:L2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +## [[`EK0`](@ref) vs. [`EK1`](@ref): Work-Precision](@id lv_ek0_vs_ek1) ```julia DENSE = false; @@ -119,70 +251,158 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:14) -reltols = 1.0 ./ 10.0 .^ (1:11) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) + +plot(wp, color=[1 1 1 1 2 2 2 2]) +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` + +```@raw html +
Interoplation errors (L2): +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; + +_setups = [ + "EK0(order=2)" => Dict(:alg => EK0(order=2, smooth=DENSE)) + "EK0(order=3)" => Dict(:alg => EK0(order=3, smooth=DENSE)) + "EK0(order=4)" => Dict(:alg => EK0(order=4, smooth=DENSE)) + "EK0(order=5)" => Dict(:alg => EK0(order=5, smooth=DENSE)) + "EK1(order=2)" => Dict(:alg => EK1(order=2, smooth=DENSE)) + "EK1(order=3)" => Dict(:alg => EK1(order=3, smooth=DENSE)) + "EK1(order=4)" => Dict(:alg => EK1(order=4, smooth=DENSE)) + "EK1(order=5)" => Dict(:alg => EK1(order=5, smooth=DENSE)) +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, color=[1 1 1 1 2 2 2 2], xticks = 10.0 .^ (-16:1:5)) +plot(wp, x=:L2, color=[1 1 1 1 2 2 2 2]) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) ``` +```@raw html +
+``` + +## [`EK0`](@ref) vs. [`EK1`](@ref): Calibration +```julia +plot(wp, x=:final, y=:chi2_final, color=[1 1 1 1 2 2 2 2], yguide="Chi-squared (final)") +plot_chisq_interval!(2) +``` + +## [Diffusion model comparison](@id lv_diffusion) -## DynamicDiffusion vs FixedDiffusion +### [`EK0`](@ref) with different diffusions ```julia DENSE = false; SAVE_EVERYSTEP = false; _setups = [ - "EK1(2) dynamic" => Dict(:alg => EK1(order=2, smooth=DENSE, diffusionmodel=DynamicDiffusion())) - "EK1(3) dynamic" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=DynamicDiffusion())) - "EK1(5) dynamic" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=DynamicDiffusion())) - "EK1(2) fixed" => Dict(:alg => EK1(order=2, smooth=DENSE, diffusionmodel=FixedDiffusion())) - "EK1(3) fixed" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=FixedDiffusion())) - "EK1(5) fixed" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK0(3) Dynamic" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK0(5) Dynamic" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK0(3) Fixed" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK0(5) Fixed" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK0(3) DynamicMV" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=DynamicMVDiffusion())) + "EK0(5) DynamicMV" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=DynamicMVDiffusion())) + "EK0(3) FixedMV" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=FixedMVDiffusion())) + "EK0(5) FixedMV" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=FixedMVDiffusion())) ] labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:14) -reltols = 1.0 ./ 10.0 .^ (1:11) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, color=[2 2 2 3 3 3], xticks = 10.0 .^ (-16:1:5)) +color = [2 2 3 3 4 4 5 5] +linestyle = [:solid :dash :solid :dash :solid :dash :solid :dash] +plot(wp; color, linestyle) ``` -## Comparison of the different initialization schemes +```julia +plot(wp; x=:final, y=:chi2_final, color, linestyle, yguide="Chi-squared (final)") +plot_chisq_interval!(2) +``` + +### [`EK1`](@ref) with different diffusions ```julia DENSE = false; SAVE_EVERYSTEP = false; -abstols = 1.0 ./ 10.0 .^ (4:14) -reltols = 1.0 ./ 10.0 .^ (1:11) +_setups = [ + "EK1(3) Dynamic" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK1(5) Dynamic" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK1(3) Fixed" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK1(5) Fixed" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=FixedDiffusion())) +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) + +color = [2 2 3 3] +linestyle = [:solid :dash :solid :dash] +plot(wp; color, linestyle) +``` + +```julia +plot(wp; x=:final, y=:chi2_final, color, linestyle, yguide="Chi-squared (final)") +plot_chisq_interval!(2) +``` + +## [Initialization scheme comparison](@id lv_initialization) + +```julia +DENSE = false; +SAVE_EVERYSTEP = false; + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) orders = (2, 3, 5, 8) ps = [] @@ -200,52 +420,26 @@ for o in orders wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) - p = plot(wp, color=[2 4 5 6], xticks = 10.0 .^ (-16:1:5)) + p = plot(wp, color=[2 4 5 6], xticks = 10.0 .^ (-16:1:5), title = "Order $o") push!(ps, p) end plot( ps..., layout=(length(orders), 1), - size = (1000, length(orders)*300), - xlabel=["" "" "" "Error"], + size = (800, length(orders)*300), + xlabel=["" "" "" "Error (final)"], ) ``` -## Conclusion - -- For such a low-dimensional problem the EK0 and EK1 have a very similar runtime. - Though note that by using ParameterizedFunctions.jl, the Jacobian of the vector field is available analytically. -- Orders behave as in classic solvers: - Use low order for low accuracy, medium order for medium accuracy, high order for high accuracy. -- Most likely, the default choice of `diffusionmodel=DynamicDiffusion` and `initialization=TaylorModeInit` are fine. - - ## Appendix - -Computer information: -```julia -using InteractiveUtils -InteractiveUtils.versioninfo() -``` - -Package Information: -```julia -using Pkg -Pkg.status() -``` - -And the full manifest: -```julia -Pkg.status(mode=Pkg.PKGMODE_MANIFEST) +```julia, echo=false +include("utils.jl") +appendix() ``` diff --git a/benchmarks/multi-language-wrappers.jmd b/benchmarks/multi-language-wrappers.jmd index 42076129b..cbaee17b2 100644 --- a/benchmarks/multi-language-wrappers.jmd +++ b/benchmarks/multi-language-wrappers.jmd @@ -11,25 +11,21 @@ using ODEInterface, ODEInterfaceDiffEq, Sundials, SciPyDiffEq, deSolveDiffEq, MA using LoggingExtras using ProbNumDiffEq -``` -```julia -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), + yticks=10.0 .^ (-6:1:5), ) -``` -```julia -# Constants used throughout this benchmark +# Constants used throughout this benchmark as we only consider final values const DENSE = false # used to decide if we smooth or not const SAVE_EVERYSTEP = false; -``` -```julia +# COLORS and a realted utility COLORS = Dict( "Julia" => :LightGreen, "Julia (static)" => :DarkGreen, @@ -47,9 +43,8 @@ tocolor(n) = if split(n, '(')[1] in keys(COLORS) else COLORS[split(n, ':')[1]] end -``` -```julia +# Do not show "deprecated warnings" deprecated_filter(log_args) = !contains(log_args.message, "deprecated") filtered_logger = ActiveFilteredLogger(deprecated_filter, global_logger()); ``` @@ -69,7 +64,7 @@ staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(f,SVector{2}(u0),tspan sol = solve(prob,Vern7(),abstol=1/10^14,reltol=1/10^14,dense=false) test_sol = sol -plot(sol, title="Lotka-Volterra Solution", legend=false) +plot(sol, title="Lotka-Volterra Solution", legend=false, xticks=:auto, yticks=:auto) ``` ```julia @@ -104,7 +99,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob, staticprob], abstols, reltols, setups; names = labels, - #print_names = true, appxsol = [test_sol, test_sol], dense = DENSE, save_everystep = SAVE_EVERYSTEP, @@ -115,13 +109,7 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Non-stiff 1: Lotka-Volterra", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Non-stiff 1: Lotka-Volterra", color = colors) ``` ## Non-Stiff Problem 2: Rigid Body @@ -138,7 +126,7 @@ prob = ODEProblem{true,SciMLBase.FullSpecialize()}(f,u0,tspan) staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(f,SVector{3}(u0),tspan) sol = solve(prob,Vern7(),abstol=1/10^14,reltol=1/10^14,dense=false) test_sol = sol -plot(sol, title="Rigid Body Solution", legend=false) +plot(sol, title="Rigid Body Solution", legend=false, xticks=:auto, yticks=:auto) ``` ```julia @@ -173,7 +161,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob,staticprob], abstols, reltols, setups; names = labels, - #print_names = true, appxsol = [test_sol, test_sol], dense = DENSE, save_everystep = SAVE_EVERYSTEP, @@ -184,13 +171,7 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Non-stiff 2: Rigid-Body", - color = colors, - xticks = 10.0 .^ (-12:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Non-stiff 2: Rigid-Body", color = colors) ``` ## Stiff Problem 1: ROBER @@ -207,7 +188,7 @@ prob = ODEProblem{true,SciMLBase.FullSpecialize()}(rober,u0,(0.0,1e5),p) staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(rober,SVector{3}(u0),(0.0,1e5),SVector{3}(p)) sol = solve(prob,CVODE_BDF(),abstol=1/10^14,reltol=1/10^14,dense=false) test_sol = sol -plot(sol, title="ROBER Solution", legend=false, xlims=(1e0, 1e5)) +plot(sol, title="ROBER Solution", legend=false, xlims=(1e0, 1e5), xticks=:auto, yticks=:auto) ``` ```julia @@ -239,7 +220,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob, staticprob], abstols, reltols, setups; names = labels, - #print_names = true, dense = DENSE, verbose = false, save_everystep = SAVE_EVERYSTEP, @@ -248,13 +228,7 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Stiff 1: ROBER", - color = colors, - xticks = 10.0 .^ (-16:1:4), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Stiff 1: ROBER", color = colors) ``` ## Stiff Problem 2: HIRES @@ -280,7 +254,7 @@ staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(f,SVector{8}(u0),(0.0, sol = solve(prob,Rodas5(),abstol=1/10^14,reltol=1/10^14, dense=false) test_sol = sol -plot(sol, title="HIRES Solution", legend=false) +plot(sol, title="HIRES Solution", legend=false, xticks=:auto, yticks=:auto) ``` ```julia @@ -313,7 +287,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob, staticprob], abstols, reltols, setups; names = labels, - #print_names = true, dense = false, verbose = false, save_everystep = false, @@ -323,31 +296,12 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Stiff 2: Hires", - color=colors, - xticks = 10.0 .^ (-16:1:4), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Stiff 2: Hires", color=colors) ``` ## Appendix - -Computer information: -```julia -using InteractiveUtils -InteractiveUtils.versioninfo() -``` - -Package Information: -```julia -using Pkg -Pkg.status() -``` - -And the full manifest: -```julia -Pkg.status(mode=Pkg.PKGMODE_MANIFEST) +```julia, echo=false +include("utils.jl") +appendix() ``` diff --git a/benchmarks/orego.jmd b/benchmarks/orego.jmd new file mode 100644 index 000000000..11c90dcd7 --- /dev/null +++ b/benchmarks/orego.jmd @@ -0,0 +1,118 @@ +# OREGO benchmark + + +!!! note "Summary" + - [**The `EK1` is able to solve mass-matrix DAEs.** To achieve low error, use order 4 or higher.](@ref orego_results) + - The order-to-error-tolerance heuristic holds: lower tolerance level ``\rightarrow`` higher order. + + +Adapted from +[SciMLBenchmarks.jl](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/DAE/OregoDAE/). + +```julia, results="hidden" +using LinearAlgebra, Statistics, Distributions +using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots +using ModelingToolkit +using ProbNumDiffEq + +Plots.theme( + :dao; + markerstrokewidth=0.5, + legend=:outertopright, + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), +) + +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` + +```julia +@variables t y1(t)=1.0 y2(t)=2.0 y3(t)=3.0 +@parameters p1=77.27 p2=8.375e-6 p3=0.161 +D = Differential(t) +eqs = [ + D(y1) ~ p1*(y2+y1*(1-p2*y1-y2)) + D(y2) ~ (y3-(1+y1)*y2)/p1 + D(y3) ~ p3*(y1-y3) +] +@named sys = ODESystem(eqs) +simpsys = structural_simplify(sys) +mmprob = ODEProblem(sys,[],(0.0,30.0)) +daeprob = DAEProblem(sys,[D(y1)=>77.26935286375, + D(y2)=>-0.012941633234114146, + D(y3)=>-0.322],[],(0.0,30.0)) +odaeprob = ODAEProblem(simpsys,[],(0.0,30.0)) + +ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14) + +plot(ref_sol, title="OREGO Solution", legend=false, xticks=:auto) +``` + +## [`EK1` across orders](@id orego_results) + +```julia +DENSE = false; +SAVE_EVERYSTEP = false; + +_setups = [ + "EK1($order)" => Dict(:alg => EK1(order=order, smooth=DENSE)) + for order in 2:6 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (6:10) +reltols = 1.0 ./ 10.0 .^ (3:7) + +wp = WorkPrecisionSet( + mmprob, abstols, reltols, setups; + names = labels, + appxsol = ref_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + numruns = 10, + maxiters = Int(1e7), +) + +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + + +_ref_setups = [ + "Rosenbrock23" => Dict(:alg => Rosenbrock23()) + "Rodas4P" => Dict(:alg => Rodas4P()) + "RadauIIA" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp = WorkPrecisionSet( + mmprob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = ref_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) +plot!(ref_wp, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` + +### Calibration + +```julia +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", + palette=Plots.palette([:blue, :red], length(_setups))) +plot_chisq_interval!(3) +``` + + +## Appendix +```julia, echo=false +include("utils.jl") +appendix() +``` diff --git a/benchmarks/pleiades.jmd b/benchmarks/pleiades.jmd index 770ca8f65..c13dcab9e 100644 --- a/benchmarks/pleiades.jmd +++ b/benchmarks/pleiades.jmd @@ -1,21 +1,34 @@ # Pleiades benchmark -```julia -using LinearAlgebra, Statistics -using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots + +!!! note "Summary" + Pleiades is a medium-dimensional, non-stiff, second-order ODE. We see that: + - [**The `EK0` is _much_ faster than the `EK1` as it scales linearly with the ODE dimension.**](@ref pleiades_results) + - [**If the problem is a second-order ODE, _implement it as a second-order ODE_!**](@ref pleiades_results) + + +```julia, results="hidden" +using LinearAlgebra, Statistics, Distributions +using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots, ODEInterfaceDiffEq using ModelingToolkit using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), ) -``` -### Pleiades problem definition +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` ```julia # first-order ODE @@ -67,15 +80,16 @@ du0 = [dx0; dy0] prob2 = SecondOrderODEProblem(pleiades2, du0, u0, tspan) probs = [prob1, prob2] -ref_sol1 = solve(prob1, Vern9(), abstol=1/10^14, reltol=1/10^14, dense=false) -ref_sol2 = solve(prob2, Vern9(), abstol=1/10^14, reltol=1/10^14, dense=false) +ref_sol1 = solve(prob1, Vern9(), abstol=1/10^14, reltol=1/10^14) +ref_sol2 = solve(prob2, Vern9(), abstol=1/10^14, reltol=1/10^14) ref_sols = [ref_sol1, ref_sol2] -plot(ref_sol1, idxs=[(14+i,21+i) for i in 1:7], title="Pleiades Solution", legend=false) +plot(ref_sol1, idxs=[(14+i,21+i) for i in 1:7], title="Pleiades Solution", legend=false, + xticks=:auto, yticks=:auto) scatter!(ref_sol1.u[end][15:21], ref_sol1.u[end][22:end], color=1:7) ``` -## First-order ODE vs. second-order ODE +## [`EK0` vs `EK1` & first-order vs. second-order](@id pleiades_results) ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -83,10 +97,10 @@ SAVE_EVERYSTEP = false; _setups = [ "EK0(3) (1st order ODE)" => Dict(:alg => EK0(order=3, smooth=DENSE), :prob_choice => 1) "EK0(5) (1st order ODE)" => Dict(:alg => EK0(order=5, smooth=DENSE), :prob_choice => 1) - "EK1(3) (1st order ODE)" => Dict(:alg => EK1(order=3, smooth=DENSE), :prob_choice => 1) - "EK1(5) (1st order ODE)" => Dict(:alg => EK1(order=5, smooth=DENSE), :prob_choice => 1) "EK0(4) (2nd order ODE)" => Dict(:alg => EK0(order=4, smooth=DENSE), :prob_choice => 2) "EK0(6) (2nd order ODE)" => Dict(:alg => EK0(order=6, smooth=DENSE), :prob_choice => 2) + "EK1(3) (1st order ODE)" => Dict(:alg => EK1(order=3, smooth=DENSE), :prob_choice => 1) + "EK1(5) (1st order ODE)" => Dict(:alg => EK1(order=5, smooth=DENSE), :prob_choice => 1) "EK1(4) (2nd order ODE)" => Dict(:alg => EK1(order=4, smooth=DENSE), :prob_choice => 2) "EK1(6) (2nd order ODE)" => Dict(:alg => EK1(order=6, smooth=DENSE), :prob_choice => 2) ] @@ -100,43 +114,45 @@ reltols = 1.0 ./ 10.0 .^ (3:8) wp = WorkPrecisionSet( probs, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = ref_sols, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, + numruns = 5, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, color=[1 1 2 2 3 3 4 4], - # xticks = 10.0 .^ (-16:1:5) +color = [1 1 1 1 2 2 2 2] +linestyle = [:solid :solid :dash :dash :solid :solid :dash :dash] +plot(wp; color, linestyle) + +_ref_setups = [ + "Classic: Tsit5" => Dict(:alg => Tsit5(), :prob_choice => 1) + "Classic: RadauIIA5" => Dict(:alg => RadauIIA5(), :prob_choice => 1) + "Classic: DPRKN6" => Dict(:alg => DPRKN6(), :prob_choice => 2) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp = WorkPrecisionSet( + probs, abstols ./ 1000, reltols ./ 1000, ref_setups; + names = ref_labels, + appxsol = ref_sols, + dense = false, + save_everystep = false, + maxiters = Int(1e7), ) +plot!(ref_wp, x=:final, color=:gray, alpha=0.7, linestyle=[:solid :solid :dash]) ``` +### Calibration -## Conclusion - -- If the problem is a second-order ODE, _implement it as a second-order ODE_! -- For best runtimes runtimes, use the `EK0`! - - -## Appendix - -Computer information: ```julia -using InteractiveUtils -InteractiveUtils.versioninfo() +plot(wp; x=:final, y=:chi2_final, color, linestyle) +plot_chisq_interval!(length(u0)*2) ``` -Package Information: -```julia -using Pkg -Pkg.status() -``` -And the full manifest: -```julia -Pkg.status(mode=Pkg.PKGMODE_MANIFEST) +## Appendix +```julia, echo=false +include("utils.jl") +appendix() ``` diff --git a/benchmarks/rober.jmd b/benchmarks/rober.jmd index 18c9b8771..f24a9accf 100644 --- a/benchmarks/rober.jmd +++ b/benchmarks/rober.jmd @@ -1,24 +1,36 @@ # ROBER benchmark + +!!! note "Summary" + - [**The `EK1` can solve mass-matrix DAEs.** But for this problem, it only works well for low tolerances.](@ref rober_results) + - For this problem it only works well for low tolerances, but the order-to-error-tolerance heuristic should in principle still hold: lower tolerance level ``\rightarrow`` higher order. + + Adapted from [SciMLBenchmarks.jl](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/DAE/ROBERDAE/). -```julia -using LinearAlgebra, Statistics +```julia, results="hidden" +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots using ModelingToolkit using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), ) -``` -### ROBER problem definition +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` ```julia @variables t y₁(t)=1.0 y₂(t)=0.0 y₃(t)=0.0 @@ -34,11 +46,11 @@ mmprob = ODEProblem(sys,[],(0.0,1e5)) daeprob = DAEProblem(sys,[D(y₁)=>-0.04, D(y₂)=>0.04, D(y₃)=>0.0],[],(0.0,1e5)) # can't handle this yet odaeprob = ODAEProblem(structural_simplify(sys),[],(0.0,1e5)) # can't handle this yet -ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14,dense=false) -plot(ref_sol, idxs=[y₁,y₂,y₃], title="ROBER Solution", legend=false, ylims=(0, 1)) +ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14) +plot(ref_sol, idxs=[y₁,y₂,y₃], title="ROBER Solution", legend=false, ylims=(0, 1), xticks=:auto) ``` -## EK1 across orders +## [`EK1` across orders](@id rober_results) ```julia DENSE = false; @@ -52,47 +64,51 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:8) -reltols = 1.0 ./ 10.0 .^ (1:5) +abstols = 1.0 ./ 10.0 .^ (4:7) +reltols = 1.0 ./ 10.0 .^ (1:4) wp = WorkPrecisionSet( mmprob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = ref_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) -``` - - -## Conclusion +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) -- The `EK1` can solve mass-matrix DAEs! But it only really works well for low errors. -- Order 3 seems to work well here. But the order-to-error-tolerance heuristic should in principle still hold: lower tolerance level ``\rightarrow`` higher order. +_ref_setups = [ + "Rosenbrock23" => Dict(:alg => Rosenbrock23()) + "Rodas4P" => Dict(:alg => Rodas4P()) + "RadauIIA" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp = WorkPrecisionSet( + mmprob, abstols ./ 10000, reltols ./ 10000, ref_setups; + names = ref_labels, + appxsol = ref_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) +plot!(ref_wp, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` -## Appendix +### Calibration -Computer information: ```julia -using InteractiveUtils -InteractiveUtils.versioninfo() +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", + palette=Plots.palette([:blue, :red], length(_setups))) +plot_chisq_interval!(3) ``` -Package Information: -```julia -using Pkg -Pkg.status() -``` -And the full manifest: -```julia -Pkg.status(mode=Pkg.PKGMODE_MANIFEST) +## Appendix +```julia, echo=false +include("utils.jl") +appendix() ``` diff --git a/benchmarks/runall.jl b/benchmarks/runall.jl index 2b7492379..446e02759 100644 --- a/benchmarks/runall.jl +++ b/benchmarks/runall.jl @@ -1,11 +1,37 @@ using Weave + +Weave.register_format!( + "custom", + Weave.GitHubMarkdown( + codestart=""" + ```@raw html +
Code: + ``` + ```julia""", + codeend=""" + ``` + ```@raw html +
+ ``` + """, + ), +) + ENV["GKSwstype"] = "nul" +set_chunk_defaults!( + :fig_width => 8, + :fig_height => 5, + :out_width => "100%", +) + FILES = [ "lotkavolterra.jmd", + "hodgkinhuxley.jmd", "vanderpol.jmd", - "rober.jmd", "pleiades.jmd", + "rober.jmd", + "orego.jmd", "multi-language-wrappers.jmd", ] @@ -14,8 +40,12 @@ for file in FILES @info "Weave file" file weave( file; - doctype="github", + doctype="custom", out_path=joinpath(filedir, "../docs/src/benchmarks/"), fig_ext=".svg", ) end + +restore_chunk_defaults!() +delete!(ENV, "GKSwstype") +nothing diff --git a/benchmarks/utils.jl b/benchmarks/utils.jl new file mode 100644 index 000000000..0667227ba --- /dev/null +++ b/benchmarks/utils.jl @@ -0,0 +1,50 @@ +using InteractiveUtils, Pkg, Markdown + +function appendix() + vinfo = sprint(InteractiveUtils.versioninfo) + proj = sprint(io -> Pkg.status(io=io)) + mani = sprint(io -> Pkg.status(io=io, mode=Pkg.PKGMODE_MANIFEST)) + + display(Markdown.parse(""" + ```@raw html +
Computer information: + ``` + ```julia + using InteractiveUtils + InteractiveUtils.versioninfo() + ``` + ``` + $(chomp(vinfo)) + ``` + ```@raw html +
+ ``` + + ```@raw html +
Package information: + ``` + ```julia + using Pkg + Pkg.status() + ``` + ``` + $(chomp(proj)) + ``` + ```@raw html +
+ ``` + + ```@raw html +
Full manifest: + ``` + ```julia + Pkg.status(mode=Pkg.PKGMODE_MANIFEST) + ``` + ``` + $(chomp(mani)) + ``` + ```@raw html +
+ ``` + """)) +end diff --git a/benchmarks/vanderpol.jmd b/benchmarks/vanderpol.jmd index a885aebe9..ed7e37683 100644 --- a/benchmarks/vanderpol.jmd +++ b/benchmarks/vanderpol.jmd @@ -1,21 +1,35 @@ # Van der Pol benchmark -```julia -using LinearAlgebra, Statistics +!!! note "Summary" + Van der Pol is a low-dimensional, stiff, second-order ODE. We see that: + - [**The `EK1` is very well able to solve stiff problems.**](@ref vdp_main_results) + - [**Since Van der Pol is actually a second-order ODE, _do solve it as a second-order ODE_.**](@ref vdp_second_order) + - [**Use the `TaylorInit` or `ForwardDiffInit` initialization.**](@ref vdp_initialization) + While `SimpleInit` works well for lower orders, it fails for higher orders. And since Taylor-mode initialization is fast and works well, there is no reason not to use it. + + +```julia, results="hidden" +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Plots using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks = 10.0 .^ (-16:1:16) ) -``` -### Van der Pol problem definition +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` ```julia function vanderpol!(du, u, p, t) @@ -23,15 +37,15 @@ function vanderpol!(du, u, p, t) du[2] = p[1] * ((1 - u[1]^2) * u[2] - u[1]) end p = [1e5] -tspan = (0.0, 6.3) +tspan = (0.0, 2.0) u0 = [2.0, 0.0] prob = ODEProblem(vanderpol!, u0, tspan, p) -test_sol = solve(prob, RadauIIA5(), abstol=1/10^14, reltol=1/10^14, dense=false) -plot(test_sol, title="Van der Pol Solution", legend=false, ylims=(-2.5, 2.5)) +test_sol = solve(prob, RadauIIA5(), abstol=1/10^14, reltol=1/10^14) +plot(test_sol, title="Van der Pol Solution", legend=false, ylims=(-5, 5), xticks=:auto) ``` -## EK1 across orders +## [`EK1` across orders](@id vdp_main_results) ```julia DENSE = false; @@ -45,26 +59,102 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (6:13) -reltols = 1.0 ./ 10.0 .^ (3:10) +abstols = 1.0 ./ 10.0 .^ (6:11) +reltols = 1.0 ./ 10.0 .^ (3:8) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + +_ref_setups = [ + "Rosenbrock23" => Dict(:alg => Rosenbrock23()) + "Rodas4P" => Dict(:alg => Rodas4P()) + "RadauIIA5" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp_final = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = false, + save_everystep = false, + maxiters = Int(1e7), +) +ref_wp_dense = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = true, + save_everystep = true, + maxiters = Int(1e7), +) + +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` + +```@raw html +
Discrete time-series errors (l2): +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; + +_setups = [ + "EK1($order)" => Dict(:alg => EK1(order=order, smooth=DENSE)) + for order in 3:7 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (6:11) +reltols = 1.0 ./ 10.0 .^ (3:8) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), + numruns = 5, +) + +plot(wp, x=:l2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:l2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +```@raw html +
Interpolation errors (L2): +``` +```julia +plot(wp, x=:L2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +## Calibration +```julia +plot(wp, x=:final, y=:chi2_final, yguide="Chi-squared (final)", + palette=Plots.palette([:blue, :red], length(_setups))) +plot_chisq_interval!(2) ``` -## Comparison of the different initialization schemes +## [Comparison of the different initialization schemes](@id vdp_initialization) ```julia DENSE = false; @@ -89,14 +179,11 @@ for o in orders wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) p = plot(wp, color=[2 4 5 6], xticks = 10.0 .^ (-16:1:5)) @@ -134,39 +221,37 @@ setups = last.(_setups) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) ``` -## Solving the first- vs second-order ODE +## [Solving the first- vs second-order ODE](@id vdp_second_order) ```julia function vanderpol2!(ddu, du, u, p, t) ddu[1] = p[1] * ((1 - u[1]^2) * du[1] - u[1]) end p = [1e5] -tspan = (0.0, 6.3) +tspan = (0.0, 2.0) u0 = [2.0] du0 = [0.0] prob2 = SecondOrderODEProblem(vanderpol2!, du0, u0, tspan, p) -test_sol2 = solve(prob2, RadauIIA5(), abstol=1/10^14, reltol=1/10^14, dense=false) -plot(test_sol2, title="Van der Pol Solution (2nd order)", legend=false, ylims=(-2.5, 2.5)) +test_sol2 = solve(prob2, RadauIIA5(), abstol=1/10^14, reltol=1/10^14) +# plot(test_sol2, title="Van der Pol Solution (2nd order)", legend=false, ylims=(-5, 5), xticks=:auto) +nothing ``` ```julia -DENSE = false; -SAVE_EVERYSTEP = false; +DENSE = true; +SAVE_EVERYSTEP = true; _setups = [ "EK1(3) 1st order" => Dict(:alg => EK1(order=3, smooth=DENSE)) @@ -182,47 +267,45 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (6:12) -reltols = 1.0 ./ 10.0 .^ (3:9) +abstols = 1.0 ./ 10.0 .^ (6:11) +reltols = 1.0 ./ 10.0 .^ (3:8) wp = WorkPrecisionSet( [prob, prob2], abstols, reltols, setups; names = labels, - #print_names = true, appxsol = [test_sol, test_sol2], dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot(wp, color=[1 1 1 1 2 2 2 2], xticks = 10.0 .^ (-16:1:5)) +color = [1 1 1 1 2 2 2 2] +plot(wp; x=:final, color) +plot!(ref_wp_dense, x=:final, color=:gray, alpha=0.7, linestyle=:dash) ``` - -## Conclusion - -- Use the `EK1` to solve stiff problems, with orders $\leq 6$ depending on the error tolerance. -- When the problem is actually a second-order ODE, as is the case for the Van der Pol system here, _solve it as a second-order ODE_. - - -## Appendix - -Computer information: +```@raw html +
Interpolation errors (L2): +``` ```julia -using InteractiveUtils -InteractiveUtils.versioninfo() +plot(wp; x=:L2, color) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` -Package Information: +### Calibration + ```julia -using Pkg -Pkg.status() +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", color) +plot_chisq_interval!(2) ``` -And the full manifest: -```julia -Pkg.status(mode=Pkg.PKGMODE_MANIFEST) + +## Appendix +```julia, echo=false +include("utils.jl") +appendix() ``` diff --git a/docs/make.jl b/docs/make.jl index ff3ea5fa6..5d25d8a69 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -59,6 +59,7 @@ makedocs( "Pleiades" => "benchmarks/pleiades.md", ], "Differential-Algebraic Equations (DAEs)" => [ + "OREGO" => "benchmarks/orego.md", "ROBER" => "benchmarks/rober.md", ], ], diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg index 4d430a147..57e779959 100644 --- a/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg +++ b/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg @@ -1,444 +1,444 @@ - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg index ea3995773..7427671dd 100644 --- a/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg +++ b/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg @@ -1,210 +1,246 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg index 26e5c0d39..30288f79a 100644 --- a/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg +++ b/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg @@ -1,206 +1,246 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg index 168bd1d36..c320fa281 100644 --- a/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg +++ b/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg @@ -1,170 +1,432 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg index 34a5ef173..da798d5ca 100644 --- a/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg +++ b/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg @@ -1,166 +1,265 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_7_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_7_1.svg new file mode 100644 index 000000000..3d4fa2459 --- /dev/null +++ b/docs/src/benchmarks/figures/hodgkinhuxley_7_1.svg @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_8_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_8_1.svg new file mode 100644 index 000000000..90d26f609 --- /dev/null +++ b/docs/src/benchmarks/figures/hodgkinhuxley_8_1.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_10_1.svg b/docs/src/benchmarks/figures/lotkavolterra_10_1.svg new file mode 100644 index 000000000..dc3d6cda3 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_10_1.svg @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_11_1.svg b/docs/src/benchmarks/figures/lotkavolterra_11_1.svg new file mode 100644 index 000000000..018fda313 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_11_1.svg @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_12_1.svg b/docs/src/benchmarks/figures/lotkavolterra_12_1.svg new file mode 100644 index 000000000..7d5e59c2d --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_12_1.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_13_1.svg b/docs/src/benchmarks/figures/lotkavolterra_13_1.svg new file mode 100644 index 000000000..6581609c6 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_13_1.svg @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_14_1.svg b/docs/src/benchmarks/figures/lotkavolterra_14_1.svg new file mode 100644 index 000000000..caebe21b0 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_14_1.svg @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_15_1.svg b/docs/src/benchmarks/figures/lotkavolterra_15_1.svg new file mode 100644 index 000000000..11b20c0e5 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_15_1.svg @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_16_1.svg b/docs/src/benchmarks/figures/lotkavolterra_16_1.svg new file mode 100644 index 000000000..663848b0e --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_16_1.svg @@ -0,0 +1,980 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_2_1.svg b/docs/src/benchmarks/figures/lotkavolterra_2_1.svg index 1c65f4707..aa6df4d06 100644 --- a/docs/src/benchmarks/figures/lotkavolterra_2_1.svg +++ b/docs/src/benchmarks/figures/lotkavolterra_2_1.svg @@ -1,148 +1,148 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_3_1.svg b/docs/src/benchmarks/figures/lotkavolterra_3_1.svg index af5fc0f55..a568ed880 100644 --- a/docs/src/benchmarks/figures/lotkavolterra_3_1.svg +++ b/docs/src/benchmarks/figures/lotkavolterra_3_1.svg @@ -1,318 +1,362 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_4_1.svg b/docs/src/benchmarks/figures/lotkavolterra_4_1.svg index a79cbf88d..5de32ddbc 100644 --- a/docs/src/benchmarks/figures/lotkavolterra_4_1.svg +++ b/docs/src/benchmarks/figures/lotkavolterra_4_1.svg @@ -1,320 +1,366 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_5_1.svg b/docs/src/benchmarks/figures/lotkavolterra_5_1.svg index 6f1183f7c..3017f307c 100644 --- a/docs/src/benchmarks/figures/lotkavolterra_5_1.svg +++ b/docs/src/benchmarks/figures/lotkavolterra_5_1.svg @@ -1,380 +1,366 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_6_1.svg b/docs/src/benchmarks/figures/lotkavolterra_6_1.svg index ba78c9332..bcb36ad23 100644 --- a/docs/src/benchmarks/figures/lotkavolterra_6_1.svg +++ b/docs/src/benchmarks/figures/lotkavolterra_6_1.svg @@ -1,364 +1,380 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_7_1.svg b/docs/src/benchmarks/figures/lotkavolterra_7_1.svg index 8bd7fe31e..814d6cc20 100644 --- a/docs/src/benchmarks/figures/lotkavolterra_7_1.svg +++ b/docs/src/benchmarks/figures/lotkavolterra_7_1.svg @@ -1,1144 +1,380 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_8_1.svg b/docs/src/benchmarks/figures/lotkavolterra_8_1.svg new file mode 100644 index 000000000..58288a0a3 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_8_1.svg @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/lotkavolterra_9_1.svg b/docs/src/benchmarks/figures/lotkavolterra_9_1.svg new file mode 100644 index 000000000..ae11ee8f3 --- /dev/null +++ b/docs/src/benchmarks/figures/lotkavolterra_9_1.svg @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_10_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_10_1.svg index b2af5c281..2b0ca7041 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_10_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_10_1.svg @@ -1,119 +1,416 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_11_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_11_1.svg index 6bb4f51ba..5f4ff4be8 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_11_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_11_1.svg @@ -1,418 +1,108 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_12_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_12_1.svg index d978818c5..b1a013077 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_12_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_12_1.svg @@ -1,108 +1,365 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_13_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_13_1.svg deleted file mode 100644 index 4216f142b..000000000 --- a/docs/src/benchmarks/figures/multi-language-wrappers_13_1.svg +++ /dev/null @@ -1,365 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_2_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_2_1.svg new file mode 100644 index 000000000..5fd691df4 --- /dev/null +++ b/docs/src/benchmarks/figures/multi-language-wrappers_2_1.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_3_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_3_1.svg new file mode 100644 index 000000000..c42741960 --- /dev/null +++ b/docs/src/benchmarks/figures/multi-language-wrappers_3_1.svg @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_4_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_4_1.svg new file mode 100644 index 000000000..2c0a0ccd2 --- /dev/null +++ b/docs/src/benchmarks/figures/multi-language-wrappers_4_1.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_5_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_5_1.svg new file mode 100644 index 000000000..2a014bbb2 --- /dev/null +++ b/docs/src/benchmarks/figures/multi-language-wrappers_5_1.svg @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_6_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_6_1.svg index c0c531f73..aa6a3a9cd 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_6_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_6_1.svg @@ -1,148 +1,119 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_7_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_7_1.svg index c0f6c8096..7d5217b67 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_7_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_7_1.svg @@ -1,439 +1,418 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_8_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_8_1.svg index d17a796ce..be7d1b0ba 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_8_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_8_1.svg @@ -1,111 +1,108 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/multi-language-wrappers_9_1.svg b/docs/src/benchmarks/figures/multi-language-wrappers_9_1.svg index bdffb26a8..e71bfdb75 100644 --- a/docs/src/benchmarks/figures/multi-language-wrappers_9_1.svg +++ b/docs/src/benchmarks/figures/multi-language-wrappers_9_1.svg @@ -1,425 +1,365 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/orego_2_1.svg b/docs/src/benchmarks/figures/orego_2_1.svg new file mode 100644 index 000000000..557d9c007 --- /dev/null +++ b/docs/src/benchmarks/figures/orego_2_1.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/orego_3_1.svg b/docs/src/benchmarks/figures/orego_3_1.svg new file mode 100644 index 000000000..a5e3d4f55 --- /dev/null +++ b/docs/src/benchmarks/figures/orego_3_1.svg @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/orego_4_1.svg b/docs/src/benchmarks/figures/orego_4_1.svg new file mode 100644 index 000000000..0f444da8b --- /dev/null +++ b/docs/src/benchmarks/figures/orego_4_1.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/pleiades_2_1.svg b/docs/src/benchmarks/figures/pleiades_2_1.svg index 32cdd7aee..8f7ff4ddf 100644 --- a/docs/src/benchmarks/figures/pleiades_2_1.svg +++ b/docs/src/benchmarks/figures/pleiades_2_1.svg @@ -1,156 +1,156 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/pleiades_3_1.svg b/docs/src/benchmarks/figures/pleiades_3_1.svg index 2cbf23824..c77fc7da1 100644 --- a/docs/src/benchmarks/figures/pleiades_3_1.svg +++ b/docs/src/benchmarks/figures/pleiades_3_1.svg @@ -1,330 +1,317 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/pleiades_4_1.svg b/docs/src/benchmarks/figures/pleiades_4_1.svg index 0779f282a..40671f86c 100644 --- a/docs/src/benchmarks/figures/pleiades_4_1.svg +++ b/docs/src/benchmarks/figures/pleiades_4_1.svg @@ -1,156 +1,359 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/pleiades_5_1.svg b/docs/src/benchmarks/figures/pleiades_5_1.svg deleted file mode 100644 index e26844737..000000000 --- a/docs/src/benchmarks/figures/pleiades_5_1.svg +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/benchmarks/figures/rober_2_1.svg b/docs/src/benchmarks/figures/rober_2_1.svg index f240ce94f..7a6c02c48 100644 --- a/docs/src/benchmarks/figures/rober_2_1.svg +++ b/docs/src/benchmarks/figures/rober_2_1.svg @@ -1,131 +1,131 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/rober_3_1.svg b/docs/src/benchmarks/figures/rober_3_1.svg index c22d4efba..67479e88f 100644 --- a/docs/src/benchmarks/figures/rober_3_1.svg +++ b/docs/src/benchmarks/figures/rober_3_1.svg @@ -1,148 +1,210 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/rober_4_1.svg b/docs/src/benchmarks/figures/rober_4_1.svg new file mode 100644 index 000000000..ad26bd764 --- /dev/null +++ b/docs/src/benchmarks/figures/rober_4_1.svg @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_10_1.svg b/docs/src/benchmarks/figures/vanderpol_10_1.svg new file mode 100644 index 000000000..fd4cf8618 --- /dev/null +++ b/docs/src/benchmarks/figures/vanderpol_10_1.svg @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_11_1.svg b/docs/src/benchmarks/figures/vanderpol_11_1.svg new file mode 100644 index 000000000..b6a82c88d --- /dev/null +++ b/docs/src/benchmarks/figures/vanderpol_11_1.svg @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_12_1.svg b/docs/src/benchmarks/figures/vanderpol_12_1.svg new file mode 100644 index 000000000..4aa8b946b --- /dev/null +++ b/docs/src/benchmarks/figures/vanderpol_12_1.svg @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_2_1.svg b/docs/src/benchmarks/figures/vanderpol_2_1.svg index 7b0e72aba..ca8fe5ab5 100644 --- a/docs/src/benchmarks/figures/vanderpol_2_1.svg +++ b/docs/src/benchmarks/figures/vanderpol_2_1.svg @@ -1,140 +1,110 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_3_1.svg b/docs/src/benchmarks/figures/vanderpol_3_1.svg index 79360d4f3..7e016e357 100644 --- a/docs/src/benchmarks/figures/vanderpol_3_1.svg +++ b/docs/src/benchmarks/figures/vanderpol_3_1.svg @@ -1,227 +1,250 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_4_1.svg b/docs/src/benchmarks/figures/vanderpol_4_1.svg index 8802fbb69..59b34af75 100644 --- a/docs/src/benchmarks/figures/vanderpol_4_1.svg +++ b/docs/src/benchmarks/figures/vanderpol_4_1.svg @@ -1,501 +1,393 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_5_1.svg b/docs/src/benchmarks/figures/vanderpol_5_1.svg index 032fd7beb..15cfa1468 100644 --- a/docs/src/benchmarks/figures/vanderpol_5_1.svg +++ b/docs/src/benchmarks/figures/vanderpol_5_1.svg @@ -1,165 +1,415 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_6_1.svg b/docs/src/benchmarks/figures/vanderpol_6_1.svg index 4b36cb9bf..a470aee3f 100644 --- a/docs/src/benchmarks/figures/vanderpol_6_1.svg +++ b/docs/src/benchmarks/figures/vanderpol_6_1.svg @@ -1,140 +1,374 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_7_1.svg b/docs/src/benchmarks/figures/vanderpol_7_1.svg index 3bcf19a8c..2b34ba07a 100644 --- a/docs/src/benchmarks/figures/vanderpol_7_1.svg +++ b/docs/src/benchmarks/figures/vanderpol_7_1.svg @@ -1,256 +1,491 @@ - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_8_1.svg b/docs/src/benchmarks/figures/vanderpol_8_1.svg new file mode 100644 index 000000000..381fae3ab --- /dev/null +++ b/docs/src/benchmarks/figures/vanderpol_8_1.svg @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/figures/vanderpol_9_1.svg b/docs/src/benchmarks/figures/vanderpol_9_1.svg new file mode 100644 index 000000000..4ca40d9dd --- /dev/null +++ b/docs/src/benchmarks/figures/vanderpol_9_1.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/benchmarks/hodgkinhuxley.md b/docs/src/benchmarks/hodgkinhuxley.md index ee410a4cf..2b60fafa8 100644 --- a/docs/src/benchmarks/hodgkinhuxley.md +++ b/docs/src/benchmarks/hodgkinhuxley.md @@ -1,24 +1,39 @@ # Hodgkin-Huxley benchmark + +!!! note "Summary" + Hodgkin-Huxley is a four-dimensional ODE, which can be stiff or non-stiff depending on the parameters; + here we consider a non-stiff version. We see that: + - [**`EK0` is the fastest solver**.](@ref hh_solver_comparison) + - [**`RosenbrockExpEK` is slowest; but suffers less from smoothing than `EK0` and `EK1`**.](@ref hh_solver_comparison) + - [Results are similar for fixed time steps.](@ref hh_fixed_steps) + + +```@raw html +
Code: +``` ```julia -using LinearAlgebra, Statistics +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, SciMLBase, OrdinaryDiffEq, Plots, SimpleUnPack using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), + yticks=10.0 .^ (-6:1:5), ) ``` +```@raw html +
+``` - - -### Hodgkin-Huxley problem definition - +```@raw html +
Code: +``` ```julia αm(V, VT) = -0.32 * (V - VT - 13) / (exp(-(V - VT - 13) / 4) - 1) βm(V, VT) = 0.28 * (V - VT - 40) / (exp((V - VT - 40) / 5) - 1) @@ -29,14 +44,14 @@ theme(:dao; αh(V, VT) = 0.128 * exp(-(V - VT - 17) / 18) βh(V, VT) = 4 / (1 + exp(-(V - VT - 40) / 5)) -Inj(t) = (10 <= t <= 90) ? 500one(t) : zero(t) +Inj(t) = (5 <= t <= 40) ? 500one(t) : zero(t) function f(du, u, p, t) @unpack gNa, gK, ENa, EK, area, C, Eleak, VT, gleak = p V, m, n, h = u - I_inj = Inj(t) * 1e-6 # uA + I_inj = Inj(t) * 1e-6 du[2] = dmdt = (αm(V, VT) * (1 - m) - βm(V, VT) * m) du[3] = dndt = (αn(V, VT) * (1 - n) - βn(V, VT) * n) @@ -56,9 +71,9 @@ n_inf(V, VT) = 1 / (1 + βn(V, VT) / αn(V, VT)) h_inf(V, VT) = 1 / (1 + βh(V, VT) / αh(V, VT)) u0 = [p.V0, m_inf(p.V0, p.VT), n_inf(p.V0, p.VT), h_inf(p.V0, p.VT)] -prob = ODEProblem{true,SciMLBase.FullSpecialize()}(f, u0, (0.0, 100.0), p) +prob = ODEProblem{true,SciMLBase.FullSpecialize()}(f, u0, (0.0, 50.0), p) -test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14, dense=false) +test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14) plot(test_sol, legend=false, layout=(4,1), @@ -67,15 +82,24 @@ plot(test_sol, xlabel=["" "" "" "t"], size = (1000, 600), color=[1 2 3 4], + xticks=:auto, yticks=:auto ) ``` +```@raw html +
+``` ![](figures/hodgkinhuxley_2_1.svg) -## Adaptive steps - no smoothing +## [Solver comparison: `EK0` vs. `EK1` vs `RosenbrockExpEK`](@id hh_solver_comparison) + +### Without smoothing +```@raw html +
Code: +``` ```julia DENSE = SAVE_EVERYSTEP = false @@ -99,31 +123,55 @@ reltols = 1.0 ./ 10.0 .^ (3:7) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Adaptive steps - no smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), +plot(wp, title="Adaptive steps - no smoothing", color=colors) + + +_ref_setups = [ + "Tsit5" => Dict(:alg => Tsit5()) + "Vern7" => Dict(:alg => Vern7()) + "RadauIIA5" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp_final = WorkPrecisionSet( + prob, abstols ./ 1000, reltols ./ 1000, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = false, + save_everystep = false, + maxiters = Int(1e7), +) +ref_wp_dense = WorkPrecisionSet( + prob, abstols ./ 1000, reltols ./ 1000, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = true, + save_everystep = true, + maxiters = Int(1e7), ) + +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` ![](figures/hodgkinhuxley_3_1.svg) -## Adaptive steps - with smoothing +### With smoothing +```@raw html +
Code: +``` ```julia DENSE = SAVE_EVERYSTEP = true @@ -147,32 +195,78 @@ reltols = 1.0 ./ 10.0 .^ (3:7) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Adaptive steps - with smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title="Adaptive steps - with smoothing", color=colors) +plot!(ref_wp_dense, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` ![](figures/hodgkinhuxley_4_1.svg) +```@raw html +
Interoplation errors (L2): +``` +```@raw html +
Code: +``` +```julia +plot(wp, x=:L2, title="Adaptive steps - with smoothing", color=colors) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/hodgkinhuxley_5_1.svg) + + +```@raw html +
+``` + + +### Calibration +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", color=colors) + +# Should be distributed according to a Chi-squared distribution: +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +plot_chisq_interval!(4) +``` +```@raw html +
+``` + +![](figures/hodgkinhuxley_6_1.svg) + + + -## Fixed steps - no smoothing +## [Fixed-step solver comparison](@id hh_fixed_steps) +Without smothing: +```@raw html +
Code: +``` ```julia DENSE = SAVE_EVERYSTEP = false @@ -194,32 +288,29 @@ wp = WorkPrecisionSet( prob, abstols, reltols, setups; adaptive = false, names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Fixed steps - no smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title="Fixed steps - no smoothing", color=colors) +``` +```@raw html +
``` -![](figures/hodgkinhuxley_5_1.svg) - - +![](figures/hodgkinhuxley_7_1.svg) -## Fixed steps - with smoothing +```@raw html +
With smoothing: +``` +```@raw html +
Code: +``` ```julia DENSE = SAVE_EVERYSTEP = true @@ -241,41 +332,40 @@ wp = WorkPrecisionSet( prob, abstols, reltols, setups; adaptive = false, names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot( - wp, - title = "Fixed steps - with smoothing", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title="Fixed steps - with smoothing", color=colors) +``` +```@raw html +
``` -![](figures/hodgkinhuxley_6_1.svg) - +![](figures/hodgkinhuxley_8_1.svg) +```@raw html +
+``` ## Appendix -Computer information: +```@raw html +
Computer information: +``` + ```julia using InteractiveUtils InteractiveUtils.versioninfo() ``` ``` -Julia Version 1.9.3 -Commit bed2cd540a1 (2023-08-24 14:43 UTC) +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) Build Info: Official https://julialang.org/ release Platform Info: @@ -290,11 +380,14 @@ Environment: JULIA_STACKTRACE_MINIMAL = true ``` +```@raw html +
+``` +```@raw html +
Package information: +``` - - -Package Information: ```julia using Pkg Pkg.status() @@ -302,52 +395,55 @@ Pkg.status() ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 [7073ff75] IJulia v1.24.2 [7f56f5a3] LSODA v0.7.5 [e6f89c97] LoggingExtras v1.0.3 [e2752cbe] MATLABDiffEq v1.2.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 - [1dea7af3] OrdinaryDiffEq v6.58.1 + [1dea7af3] OrdinaryDiffEq v6.59.1 [65888b18] ParameterizedFunctions v5.16.0 [91a5bcdd] Plots v1.39.0 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` - [0bca4576] SciMLBase v2.7.3 + [0bca4576] SciMLBase v2.8.1 [505e40e9] SciPyDiffEq v0.2.1 [ce78b400] SimpleUnPack v1.1.0 [90137ffa] StaticArrays v1.6.5 [c3572dad] Sundials v4.20.1 [44d3d7a6] Weave v0.10.12 [0518478a] deSolveDiffEq v0.1.1 -Warning The project dependencies or compat requirements have changed since -the manifest was last resolved. It is recommended to `Pkg.resolve()` or con -sider `Pkg.update()` if necessary. +Info Packages marked with ⌃ have new versions available and may be upgradable. ``` +```@raw html +
+``` +```@raw html +
Full manifest: +``` - - -And the full manifest: ```julia Pkg.status(mode=Pkg.PKGMODE_MANIFEST) ``` ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` - [47edcb42] ADTypes v0.2.4 + [47edcb42] ADTypes v0.2.5 ⌅ [c3fe647b] AbstractAlgebra v0.32.5 [621f4979] AbstractFFTs v1.5.0 [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 [79e6a3ab] Adapt v3.7.1 [ec485272] ArnoldiMethod v0.2.0 [c9d4266f] ArrayAllocators v0.3.0 [4fba245c] ArrayInterface v7.5.1 [6e4b80f9] BenchmarkTools v1.3.2 [e2ed5e7c] Bijections v0.1.6 - [d1d4a3ce] BitFlags v0.1.7 + [d1d4a3ce] BitFlags v0.1.8 [62783981] BitTwiddlingConvenienceFunctions v0.1.5 [fa961155] CEnum v0.5.0 [2a0fbf3d] CPUSummary v0.2.4 @@ -367,9 +463,10 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bbf7d656] CommonSubexpressions v0.3.0 [34da2185] Compat v4.10.0 [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 [2569d6c7] ConcreteStructs v0.2.3 [f0e56b4a] ConcurrentUtilities v2.3.0 - [8f4d0f93] Conda v1.9.1 +⌃ [8f4d0f93] Conda v1.9.1 [187b0558] ConstructionBase v1.5.4 [d38c429a] Contour v0.6.2 [587fd27a] CovarianceEstimation v0.2.9 @@ -381,9 +478,9 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [864edb3b] DataStructures v0.18.15 [e2d170a0] DataValueInterfaces v1.0.0 [8bb1440f] DelimitedFiles v1.9.1 -⌃ [2b5f629d] DiffEqBase v6.138.0 + [2b5f629d] DiffEqBase v6.139.0 [459566f4] DiffEqCallbacks v2.33.1 - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 [77a26b50] DiffEqNoiseProcess v5.19.0 [163ba53b] DiffResults v1.1.0 [b552c78f] DiffRules v1.15.1 @@ -402,7 +499,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [e2ba6199] ExprTools v0.1.10 [c87230d0] FFMPEG v0.4.1 [7a1cc6ca] FFTW v1.7.1 - [7034ab61] FastBroadcast v0.2.7 + [7034ab61] FastBroadcast v0.2.8 [9aa1b823] FastClosures v0.3.2 [442a2c76] FastGaussQuadrature v1.0.0 [29a986be] FastLapackInterface v2.0.0 @@ -433,6 +530,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [842dd82b] InlineStrings v1.4.0 [18e54dd8] IntegerMathUtils v0.1.2 [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 [41ab1584] InvertedIndices v1.3.0 [92d709cd] IrrationalConstants v0.2.2 [c8e1da08] IterTools v1.8.0 @@ -450,33 +548,33 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2ee39098] LabelledArrays v1.14.0 [984bce1d] LambertW v0.4.6 [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 [10f19ff3] LayoutPointers v0.1.15 [50d2b5c4] Lazy v0.15.1 [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 [d3d80556] LineSearches v7.2.0 -⌃ [7ed4a6bd] LinearSolve v2.15.0 + [7ed4a6bd] LinearSolve v2.20.0 [2ab3a3ac] LogExpFunctions v0.3.26 [e6f89c97] LoggingExtras v1.0.3 [bdcacae8] LoopVectorization v0.12.166 [10e44e05] MATLAB v0.8.4 [e2752cbe] MATLABDiffEq v1.2.0 - [33e6dc65] MKL v0.6.1 [d8e11817] MLStyle v0.4.17 [1914dd2f] MacroTools v0.5.11 [d125e4d3] ManualMemory v0.1.8 - [739be429] MbedTLS v1.1.7 + [739be429] MbedTLS v1.1.8 [442fdcdd] Measures v0.3.2 [e1d29d7a] Missings v1.1.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [46d2c3a1] MuladdMacro v0.2.4 [102ac46a] MultivariatePolynomials v0.5.2 - [ffc61752] Mustache v1.0.18 + [ffc61752] Mustache v1.0.19 [d8a4904e] MutableArithmetics v1.3.3 [d41bc354] NLSolversBase v7.8.3 [2774e3e8] NLsolve v4.5.1 [77ba4419] NaNMath v1.0.2 ⌅ [356022a1] NamedDims v0.2.50 -⌃ [8913a72c] NonlinearSolve v2.6.1 + [8913a72c] NonlinearSolve v2.8.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 [6fd5a793] Octavian v0.3.27 @@ -484,20 +582,20 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [4d8831e6] OpenSSL v1.4.1 [429524aa] Optim v1.7.8 [bac558e1] OrderedCollections v1.6.2 - [1dea7af3] OrdinaryDiffEq v6.58.1 - [90014a1f] PDMats v0.11.28 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 [fe68d972] PSDMatrices v0.4.6 [65ce6f38] PackageExtensionCompat v1.0.2 [65888b18] ParameterizedFunctions v5.16.0 [d96e819e] Parameters v0.12.3 - [69de0a69] Parsers v2.7.2 + [69de0a69] Parsers v2.8.0 [b98c9c47] Pipe v1.3.0 [32113eaa] PkgBenchmark v0.2.12 [ccf2f8ad] PlotThemes v3.1.0 [995b91a9] PlotUtils v1.3.5 [91a5bcdd] Plots v1.39.0 [e409e4f3] PoissonRandom v0.4.4 -⌃ [f517fe37] Polyester v0.7.8 + [f517fe37] Polyester v0.7.9 [1d0040c9] PolyesterWeave v0.2.1 ⌅ [f27b6e38] Polynomials v3.2.13 [2dfb63ee] PooledArrays v1.4.3 @@ -505,12 +603,13 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [d236fae5] PreallocationTools v0.4.12 [aea7be01] PrecompileTools v1.2.0 [21216c6a] Preferences v1.4.1 - [08abe8d2] PrettyTables v2.2.8 - [27ebfcd6] Primes v0.5.4 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` [33c8b6b6] ProgressLogging v0.1.4 - [438e738f] PyCall v1.96.1 + [438e738f] PyCall v1.96.2 [1fd47b50] QuadGK v2.9.1 +⌃ [8a4e6c94] QuasiMonteCarlo v0.3.2 [6f49c342] RCall v0.13.18 [74087812] Random123 v1.6.1 [fb686558] RandomExtensions v0.4.4 @@ -518,7 +617,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [3cdcf5f2] RecipesBase v1.3.4 [01d81517] RecipesPipeline v0.6.12 [731186ca] RecursiveArrayTools v2.38.10 - [f2c3362d] RecursiveFactorization v0.2.20 + [f2c3362d] RecursiveFactorization v0.2.21 [189a3867] Reexport v1.2.2 [05181044] RelocatableFolders v1.0.1 [ae029012] Requires v1.3.0 @@ -526,26 +625,27 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [79098fc4] Rmath v0.7.1 [47965b36] RootedTrees v2.19.2 [7e49a35a] RuntimeGeneratedFunctions v0.5.12 - [fdea26ae] SIMD v3.4.5 + [fdea26ae] SIMD v3.4.6 [94e857df] SIMDTypes v0.1.0 [476501e8] SLEEFPirates v0.6.42 - [0bca4576] SciMLBase v2.7.3 + [0bca4576] SciMLBase v2.8.1 [e9a6253c] SciMLNLSolve v0.1.9 -⌃ [c0aeaf25] SciMLOperators v0.3.6 + [c0aeaf25] SciMLOperators v0.3.7 [505e40e9] SciPyDiffEq v0.2.1 [6c6a2e73] Scratch v1.2.1 -⌃ [91c51154] SentinelArrays v1.4.0 + [91c51154] SentinelArrays v1.4.1 [efcf1570] Setfield v1.1.1 [1277b4bf] ShiftedArrays v2.0.0 [992d4aef] Showoff v1.0.3 [777ac1f9] SimpleBufferStream v1.1.0 - [727e6d20] SimpleNonlinearSolve v0.1.23 + [727e6d20] SimpleNonlinearSolve v0.1.25 [699a6c99] SimpleTraits v0.9.4 [ce78b400] SimpleUnPack v1.1.0 [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 [b85f4697] SoftGlobalScope v1.1.0 [a2af1166] SortingAlgorithms v1.2.0 -⌃ [47a9eef4] SparseDiffTools v2.9.2 +⌃ [47a9eef4] SparseDiffTools v2.11.0 [e56a9233] Sparspak v0.3.9 [276daf66] SpecialFunctions v2.3.1 [928aab9d] SpecialMatrices v3.0.0 @@ -557,7 +657,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2913bbd2] StatsBase v0.34.2 [4c63d2b9] StatsFuns v1.3.0 [3eaba693] StatsModels v0.7.3 -⌅ [7792a7ef] StrideArraysCore v0.4.17 + [7792a7ef] StrideArraysCore v0.5.1 [69024149] StringEncodings v0.3.7 [892a3eda] StringManipulation v0.3.4 [09ab397b] StructArrays v0.6.16 @@ -567,14 +667,14 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [0c5d862f] Symbolics v5.10.0 [3783bdb8] TableTraits v1.0.1 [bd369af6] Tables v1.11.1 - [92b13dbe] TaylorIntegration v0.14.3 + [92b13dbe] TaylorIntegration v0.14.4 [6aa5eb33] TaylorSeries v0.15.2 [62fd8b95] TensorCore v0.1.1 [5d786b92] TerminalLoggers v0.1.7 [8290d209] ThreadingUtilities v0.5.2 [a759f4b9] TimerOutputs v0.5.23 [c751599d] ToeplitzMatrices v0.8.2 - [0796e94c] Tokenize v0.5.25 + [0796e94c] Tokenize v0.5.26 [3bb67fe8] TranscodingStreams v0.10.2 [a2a6695c] TreeViews v0.3.0 [d5829a12] TriangularSolve v0.1.20 @@ -583,7 +683,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [5c2747f8] URIs v1.5.1 [3a884ed6] UnPack v1.0.2 [1cfade01] UnicodeFun v0.4.1 - [1986cc42] Unitful v1.17.0 + [1986cc42] Unitful v1.18.0 [45397f5d] UnitfulLatexify v1.6.3 [a7c27f48] Unityper v0.1.5 [41fe7b60] Unzip v0.2.0 @@ -599,7 +699,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [83423d85] Cairo_jll v1.16.1+1 [2702e6a9] EpollShim_jll v0.0.20230411+0 [2e619515] Expat_jll v2.5.0+0 -⌃ [b22a6f82] FFMPEG_jll v4.4.2+2 + [b22a6f82] FFMPEG_jll v4.4.4+1 [f5851436] FFTW_jll v3.3.10+0 [a3f928ae] Fontconfig_jll v2.13.93+0 [d7e528f0] FreeType2_jll v2.13.1+0 @@ -628,11 +728,11 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [856f044c] MKL_jll v2023.2.0+0 [c771fb93] ODEInterface_jll v0.0.1+0 [e7412a2a] Ogg_jll v1.3.5+1 -⌅ [458c3c95] OpenSSL_jll v1.1.23+0 + [458c3c95] OpenSSL_jll v3.0.12+0 [efe28fd5] OpenSpecFun_jll v0.5.5+0 [91d4177d] Opus_jll v1.3.2+0 [30392449] Pixman_jll v0.42.2+0 -⌃ [c0090381] Qt6Base_jll v6.5.2+2 + [c0090381] Qt6Base_jll v6.5.3+1 [f50d1b31] Rmath_jll v0.4.0+0 ⌅ [fb77eaff] Sundials_jll v5.2.1+0 [a44049a8] Vulkan_Loader_jll v1.3.243+0 @@ -640,7 +740,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2381bf8a] Wayland_protocols_jll v1.25.0+0 [02c8fc9c] XML2_jll v2.11.5+0 [aed1982a] XSLT_jll v1.1.34+0 - [ffd25f8a] XZ_jll v5.4.4+0 + [ffd25f8a] XZ_jll v5.4.5+0 [f67eecfb] Xorg_libICE_jll v1.0.10+1 [c834827a] Xorg_libSM_jll v1.2.3+0 [4f6342f7] Xorg_libX11_jll v1.8.6+0 @@ -668,7 +768,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [8f1865be] ZeroMQ_jll v4.3.4+0 [3161d3a3] Zstd_jll v1.5.5+0 [35ca27e7] eudev_jll v3.2.9+0 - [214eeab7] fzf_jll v0.35.1+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 [1a1c6b14] gperf_jll v3.1.1+0 [a4ae2306] libaom_jll v3.4.0+0 [0ac62f75] libass_jll v0.15.1+0 @@ -692,7 +792,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [9fa8497b] Future [b77e0a4c] InteractiveUtils [4af54fe1] LazyArtifacts - [b27032c2] LibCURL v0.6.3 + [b27032c2] LibCURL v0.6.4 [76f85450] LibGit2 [8f399da3] Libdl [37e2e46d] LinearAlgebra @@ -718,8 +818,8 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [cf7118a7] UUIDs [4ec0a83e] Unicode [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 - [deac9b47] LibCURL_jll v7.84.0+0 - [29816b5a] LibSSH2_jll v1.10.2+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 [c8ffd9c3] MbedTLS_jll v2.28.2+0 [14a3606d] MozillaCACerts_jll v2022.10.11 [4536629a] OpenBLAS_jll v0.3.21+4 @@ -728,14 +828,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bea87d4a] SuiteSparse_jll v5.10.1+6 [83775a58] Zlib_jll v1.2.13+0 [8e850b90] libblastrampoline_jll v5.8.0+0 - [8e850ede] nghttp2_jll v1.48.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 [3f19e933] p7zip_jll v17.4.0+0 -Info Packages marked with ⌃ and ⌅ have new versions available, but those wi -th ⌅ are restricted by compatibility constraints from upgrading. To see why - use `status --outdated -m` -Warning The project dependencies or compat requirements have changed since -the manifest was last resolved. It is recommended to `Pkg.resolve()` or con -sider `Pkg.update()` if necessary. +Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m` ``` +```@raw html +
+``` diff --git a/docs/src/benchmarks/lotkavolterra.md b/docs/src/benchmarks/lotkavolterra.md index 3b5cdddcc..a04c32fa9 100644 --- a/docs/src/benchmarks/lotkavolterra.md +++ b/docs/src/benchmarks/lotkavolterra.md @@ -1,27 +1,57 @@ # Lotka-Volterra benchmark -Adapted from + +!!! note "Summary" + Lotka-Volterra is a simple, low-dimensional, non-stiff ODE. We see that: + - [**`EK0` and `EK1` have a very similar runtime**.](@ref lv_ek0_vs_ek1) + But note that Lotka-Volterra is a non-stiff low-dimensional problem: + if it were stiff, [`EK1`](@ref) would be better; + if it were high-dimensional, [`EK0`](@ref) would be faster. + - [**Orders behave as in classic solvers: Use low order for low accuracy, medium order for medium accuracy, high order for high accuracy**](@ref lv_ek1_comparison). + - [**_Do not use `EK0` with order > 5_**](@ref lv_ek0_comparison): + The adaptive step size selection apparently does not work well for high orders right now. + - [**Use `diffusionmodel=DynamicDiffusion`**](@ref lv_diffusion): + Error-wise, the performance of the diffusion models is similar, but _the calibration of `FixedDiffusion` and `FixedMVDiffusion` with adaptive steps is currently broken_. + - [**Initialization schemes are all similar, but `initialization=TaylorModeInit` performs best.**](@ref lv_initialization) + - **If you only need to solve for the last time point, set `smooth=false`, `dense=false`, and `save_everystep=false`.** + This greatly reduces the run time of the solver. + + +Benchmark adapted from [SciMLBenchmarks.jl](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/NonStiffODE/LotkaVolterra_wpd/). +```@raw html +
Code: +``` ```julia -using LinearAlgebra, Statistics +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Plots using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), ) -``` - - +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` +```@raw html +
+``` -### Lotka-Volterra problem definition +```@raw html +
Code: +``` ```julia f = @ode_def LotkaVolterra begin dx = a*x - b*x*y @@ -32,16 +62,22 @@ tspan = (0.0, 10.0) u0 = [1.0, 1.0] prob = ODEProblem{true, SciMLBase.FullSpecialize}(f, u0, tspan, p) -test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14, dense=false) -plot(test_sol, title="Lotka-Volterra Solution", legend=false) +test_sol = solve(prob, Vern7(), abstol=1/10^14, reltol=1/10^14) +plot(test_sol, title="Lotka-Volterra Solution", legend=false, xticks=:auto) +``` +```@raw html +
``` ![](figures/lotkavolterra_2_1.svg) -## EK0 across orders +## [[`EK0`](@ref) Benchmark Across Orders](@id lv_ek0_comparison) +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -54,31 +90,124 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:13) -reltols = 1.0 ./ 10.0 .^ (1:10) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + +_ref_setups = [ + "Tsit5" => Dict(:alg => Tsit5()) + "Vern7" => Dict(:alg => Vern7()) + "RadauIIA5" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp_final = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = false, + save_everystep = false, + maxiters = Int(1e7), +) +ref_wp_dense = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = true, + save_everystep = true, + maxiters = Int(1e7), +) + +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` ![](figures/lotkavolterra_3_1.svg) -## EK1 across orders +```@raw html +
Discrete time-series errors (l2): +``` +```@raw html +
Code: +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; +_setups = [ + "EK0(order=$order)" => Dict(:alg => EK0(order=order, smooth=DENSE)) + for order in 2:7 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) + +plot(wp, x=:l2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:l2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_4_1.svg) + + +```@raw html +
+``` + +```@raw html +
Interoplation errors (L2): +``` +```@raw html +
Code: +``` +```julia +plot(wp, x=:L2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_5_1.svg) + + +```@raw html +
+``` + +## [[`EK1`](@ref) Benchmark Across Orders](@id lv_ek1_comparison) + +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -91,31 +220,99 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:13) -reltols = 1.0 ./ 10.0 .^ (1:10) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` -![](figures/lotkavolterra_4_1.svg) +![](figures/lotkavolterra_6_1.svg) + + + +```@raw html +
Discrete time-series errors (l2): +``` +```@raw html +
Code: +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; + +_setups = [ + "EK1(order=$order)" => Dict(:alg => EK1(order=order, smooth=DENSE)) + for order in 2:7 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) +plot(wp, x=:l2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:l2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` +![](figures/lotkavolterra_7_1.svg) -## EK0 vs. EK1 +```@raw html +
+``` + +```@raw html +
Interoplation errors (L2): +``` +```@raw html +
Code: +``` +```julia +plot(wp, x=:L2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_8_1.svg) + + +```@raw html +
+``` + +## [[`EK0`](@ref) vs. [`EK1`](@ref): Work-Precision](@id lv_ek0_vs_ek1) + +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -134,78 +331,224 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:14) -reltols = 1.0 ./ 10.0 .^ (1:11) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, color=[1 1 1 1 2 2 2 2], xticks = 10.0 .^ (-16:1:5)) +plot(wp, color=[1 1 1 1 2 2 2 2]) +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` -![](figures/lotkavolterra_5_1.svg) +![](figures/lotkavolterra_9_1.svg) -## DynamicDiffusion vs FixedDiffusion +```@raw html +
Interoplation errors (L2): +``` +```@raw html +
Code: +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; + +_setups = [ + "EK0(order=2)" => Dict(:alg => EK0(order=2, smooth=DENSE)) + "EK0(order=3)" => Dict(:alg => EK0(order=3, smooth=DENSE)) + "EK0(order=4)" => Dict(:alg => EK0(order=4, smooth=DENSE)) + "EK0(order=5)" => Dict(:alg => EK0(order=5, smooth=DENSE)) + "EK1(order=2)" => Dict(:alg => EK1(order=2, smooth=DENSE)) + "EK1(order=3)" => Dict(:alg => EK1(order=3, smooth=DENSE)) + "EK1(order=4)" => Dict(:alg => EK1(order=4, smooth=DENSE)) + "EK1(order=5)" => Dict(:alg => EK1(order=5, smooth=DENSE)) +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) +plot(wp, x=:L2, color=[1 1 1 1 2 2 2 2]) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_10_1.svg) + + +```@raw html +
+``` + +## [`EK0`](@ref) vs. [`EK1`](@ref): Calibration +```@raw html +
Code: +``` +```julia +plot(wp, x=:final, y=:chi2_final, color=[1 1 1 1 2 2 2 2], yguide="Chi-squared (final)") +plot_chisq_interval!(2) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_11_1.svg) + + + +## [Diffusion model comparison](@id lv_diffusion) + +### [`EK0`](@ref) with different diffusions + +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; _setups = [ - "EK1(2) dynamic" => Dict(:alg => EK1(order=2, smooth=DENSE, diffusionmodel=DynamicDiffusion())) - "EK1(3) dynamic" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=DynamicDiffusion())) - "EK1(5) dynamic" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=DynamicDiffusion())) - "EK1(2) fixed" => Dict(:alg => EK1(order=2, smooth=DENSE, diffusionmodel=FixedDiffusion())) - "EK1(3) fixed" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=FixedDiffusion())) - "EK1(5) fixed" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK0(3) Dynamic" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK0(5) Dynamic" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK0(3) Fixed" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK0(5) Fixed" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK0(3) DynamicMV" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=DynamicMVDiffusion())) + "EK0(5) DynamicMV" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=DynamicMVDiffusion())) + "EK0(3) FixedMV" => Dict(:alg => EK0(order=3, smooth=DENSE, diffusionmodel=FixedMVDiffusion())) + "EK0(5) FixedMV" => Dict(:alg => EK0(order=5, smooth=DENSE, diffusionmodel=FixedMVDiffusion())) ] labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:14) -reltols = 1.0 ./ 10.0 .^ (1:11) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, color=[2 2 2 3 3 3], xticks = 10.0 .^ (-16:1:5)) +color = [2 2 3 3 4 4 5 5] +linestyle = [:solid :dash :solid :dash :solid :dash :solid :dash] +plot(wp; color, linestyle) +``` +```@raw html +
``` -![](figures/lotkavolterra_6_1.svg) +![](figures/lotkavolterra_12_1.svg) + +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, color, linestyle, yguide="Chi-squared (final)") +plot_chisq_interval!(2) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_13_1.svg) + +### [`EK1`](@ref) with different diffusions + +```@raw html +
Code: +``` +```julia +DENSE = false; +SAVE_EVERYSTEP = false; + +_setups = [ + "EK1(3) Dynamic" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK1(5) Dynamic" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=DynamicDiffusion())) + "EK1(3) Fixed" => Dict(:alg => EK1(order=3, smooth=DENSE, diffusionmodel=FixedDiffusion())) + "EK1(5) Fixed" => Dict(:alg => EK1(order=5, smooth=DENSE, diffusionmodel=FixedDiffusion())) +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) + +color = [2 2 3 3] +linestyle = [:solid :dash :solid :dash] +plot(wp; color, linestyle) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_14_1.svg) + +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, color, linestyle, yguide="Chi-squared (final)") +plot_chisq_interval!(2) +``` +```@raw html +
+``` + +![](figures/lotkavolterra_15_1.svg) -## Comparison of the different initialization schemes + +## [Initialization scheme comparison](@id lv_initialization) + +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; -abstols = 1.0 ./ 10.0 .^ (4:14) -reltols = 1.0 ./ 10.0 .^ (1:11) +abstols = 1.0 ./ 10.0 .^ (4:12) +reltols = 1.0 ./ 10.0 .^ (1:9) orders = (2, 3, 5, 8) ps = [] @@ -223,52 +566,45 @@ for o in orders wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) - p = plot(wp, color=[2 4 5 6], xticks = 10.0 .^ (-16:1:5)) + p = plot(wp, color=[2 4 5 6], xticks = 10.0 .^ (-16:1:5), title = "Order $o") push!(ps, p) end plot( ps..., layout=(length(orders), 1), - size = (1000, length(orders)*300), - xlabel=["" "" "" "Error"], + size = (800, length(orders)*300), + xlabel=["" "" "" "Error (final)"], ) ``` +```@raw html +
+``` -![](figures/lotkavolterra_7_1.svg) - - - +![](figures/lotkavolterra_16_1.svg) -## Conclusion -- For such a low-dimensional problem the EK0 and EK1 have a very similar runtime. - Though note that by using ParameterizedFunctions.jl, the Jacobian of the vector field is available analytically. -- Orders behave as in classic solvers: - Use low order for low accuracy, medium order for medium accuracy, high order for high accuracy. -- Most likely, the default choice of `diffusionmodel=DynamicDiffusion` and `initialization=TaylorModeInit` are fine. ## Appendix -Computer information: +```@raw html +
Computer information: +``` + ```julia using InteractiveUtils InteractiveUtils.versioninfo() ``` ``` -Julia Version 1.9.3 -Commit bed2cd540a1 (2023-08-24 14:43 UTC) +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) Build Info: Official https://julialang.org/ release Platform Info: @@ -283,11 +619,14 @@ Environment: JULIA_STACKTRACE_MINIMAL = true ``` +```@raw html +
+``` +```@raw html +
Package information: +``` - - -Package Information: ```julia using Pkg Pkg.status() @@ -295,48 +634,55 @@ Pkg.status() ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 [7073ff75] IJulia v1.24.2 [7f56f5a3] LSODA v0.7.5 [e6f89c97] LoggingExtras v1.0.3 [e2752cbe] MATLABDiffEq v1.2.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 - [1dea7af3] OrdinaryDiffEq v6.58.1 + [1dea7af3] OrdinaryDiffEq v6.59.1 [65888b18] ParameterizedFunctions v5.16.0 [91a5bcdd] Plots v1.39.0 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` - [0bca4576] SciMLBase v2.7.3 + [0bca4576] SciMLBase v2.8.1 [505e40e9] SciPyDiffEq v0.2.1 + [ce78b400] SimpleUnPack v1.1.0 [90137ffa] StaticArrays v1.6.5 [c3572dad] Sundials v4.20.1 [44d3d7a6] Weave v0.10.12 [0518478a] deSolveDiffEq v0.1.1 +Info Packages marked with ⌃ have new versions available and may be upgradable. ``` +```@raw html +
+``` +```@raw html +
Full manifest: +``` - - -And the full manifest: ```julia Pkg.status(mode=Pkg.PKGMODE_MANIFEST) ``` ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` - [47edcb42] ADTypes v0.2.4 + [47edcb42] ADTypes v0.2.5 ⌅ [c3fe647b] AbstractAlgebra v0.32.5 [621f4979] AbstractFFTs v1.5.0 [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 [79e6a3ab] Adapt v3.7.1 [ec485272] ArnoldiMethod v0.2.0 [c9d4266f] ArrayAllocators v0.3.0 [4fba245c] ArrayInterface v7.5.1 [6e4b80f9] BenchmarkTools v1.3.2 [e2ed5e7c] Bijections v0.1.6 - [d1d4a3ce] BitFlags v0.1.7 + [d1d4a3ce] BitFlags v0.1.8 [62783981] BitTwiddlingConvenienceFunctions v0.1.5 [fa961155] CEnum v0.5.0 [2a0fbf3d] CPUSummary v0.2.4 @@ -356,9 +702,10 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bbf7d656] CommonSubexpressions v0.3.0 [34da2185] Compat v4.10.0 [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 [2569d6c7] ConcreteStructs v0.2.3 [f0e56b4a] ConcurrentUtilities v2.3.0 - [8f4d0f93] Conda v1.9.1 +⌃ [8f4d0f93] Conda v1.9.1 [187b0558] ConstructionBase v1.5.4 [d38c429a] Contour v0.6.2 [587fd27a] CovarianceEstimation v0.2.9 @@ -370,9 +717,9 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [864edb3b] DataStructures v0.18.15 [e2d170a0] DataValueInterfaces v1.0.0 [8bb1440f] DelimitedFiles v1.9.1 - [2b5f629d] DiffEqBase v6.138.0 + [2b5f629d] DiffEqBase v6.139.0 [459566f4] DiffEqCallbacks v2.33.1 - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 [77a26b50] DiffEqNoiseProcess v5.19.0 [163ba53b] DiffResults v1.1.0 [b552c78f] DiffRules v1.15.1 @@ -391,7 +738,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [e2ba6199] ExprTools v0.1.10 [c87230d0] FFMPEG v0.4.1 [7a1cc6ca] FFTW v1.7.1 - [7034ab61] FastBroadcast v0.2.7 + [7034ab61] FastBroadcast v0.2.8 [9aa1b823] FastClosures v0.3.2 [442a2c76] FastGaussQuadrature v1.0.0 [29a986be] FastLapackInterface v2.0.0 @@ -422,6 +769,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [842dd82b] InlineStrings v1.4.0 [18e54dd8] IntegerMathUtils v0.1.2 [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 [41ab1584] InvertedIndices v1.3.0 [92d709cd] IrrationalConstants v0.2.2 [c8e1da08] IterTools v1.8.0 @@ -439,33 +787,33 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2ee39098] LabelledArrays v1.14.0 [984bce1d] LambertW v0.4.6 [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 [10f19ff3] LayoutPointers v0.1.15 [50d2b5c4] Lazy v0.15.1 [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 [d3d80556] LineSearches v7.2.0 - [7ed4a6bd] LinearSolve v2.15.0 + [7ed4a6bd] LinearSolve v2.20.0 [2ab3a3ac] LogExpFunctions v0.3.26 [e6f89c97] LoggingExtras v1.0.3 [bdcacae8] LoopVectorization v0.12.166 [10e44e05] MATLAB v0.8.4 [e2752cbe] MATLABDiffEq v1.2.0 - [33e6dc65] MKL v0.6.1 [d8e11817] MLStyle v0.4.17 [1914dd2f] MacroTools v0.5.11 [d125e4d3] ManualMemory v0.1.8 - [739be429] MbedTLS v1.1.7 + [739be429] MbedTLS v1.1.8 [442fdcdd] Measures v0.3.2 [e1d29d7a] Missings v1.1.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [46d2c3a1] MuladdMacro v0.2.4 [102ac46a] MultivariatePolynomials v0.5.2 - [ffc61752] Mustache v1.0.18 + [ffc61752] Mustache v1.0.19 [d8a4904e] MutableArithmetics v1.3.3 [d41bc354] NLSolversBase v7.8.3 [2774e3e8] NLsolve v4.5.1 [77ba4419] NaNMath v1.0.2 ⌅ [356022a1] NamedDims v0.2.50 - [8913a72c] NonlinearSolve v2.6.1 + [8913a72c] NonlinearSolve v2.8.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 [6fd5a793] Octavian v0.3.27 @@ -473,20 +821,20 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [4d8831e6] OpenSSL v1.4.1 [429524aa] Optim v1.7.8 [bac558e1] OrderedCollections v1.6.2 - [1dea7af3] OrdinaryDiffEq v6.58.1 - [90014a1f] PDMats v0.11.28 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 [fe68d972] PSDMatrices v0.4.6 [65ce6f38] PackageExtensionCompat v1.0.2 [65888b18] ParameterizedFunctions v5.16.0 [d96e819e] Parameters v0.12.3 - [69de0a69] Parsers v2.7.2 + [69de0a69] Parsers v2.8.0 [b98c9c47] Pipe v1.3.0 [32113eaa] PkgBenchmark v0.2.12 [ccf2f8ad] PlotThemes v3.1.0 [995b91a9] PlotUtils v1.3.5 [91a5bcdd] Plots v1.39.0 [e409e4f3] PoissonRandom v0.4.4 - [f517fe37] Polyester v0.7.8 + [f517fe37] Polyester v0.7.9 [1d0040c9] PolyesterWeave v0.2.1 ⌅ [f27b6e38] Polynomials v3.2.13 [2dfb63ee] PooledArrays v1.4.3 @@ -494,12 +842,13 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [d236fae5] PreallocationTools v0.4.12 [aea7be01] PrecompileTools v1.2.0 [21216c6a] Preferences v1.4.1 - [08abe8d2] PrettyTables v2.2.8 - [27ebfcd6] Primes v0.5.4 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` [33c8b6b6] ProgressLogging v0.1.4 - [438e738f] PyCall v1.96.1 + [438e738f] PyCall v1.96.2 [1fd47b50] QuadGK v2.9.1 +⌃ [8a4e6c94] QuasiMonteCarlo v0.3.2 [6f49c342] RCall v0.13.18 [74087812] Random123 v1.6.1 [fb686558] RandomExtensions v0.4.4 @@ -507,7 +856,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [3cdcf5f2] RecipesBase v1.3.4 [01d81517] RecipesPipeline v0.6.12 [731186ca] RecursiveArrayTools v2.38.10 - [f2c3362d] RecursiveFactorization v0.2.20 + [f2c3362d] RecursiveFactorization v0.2.21 [189a3867] Reexport v1.2.2 [05181044] RelocatableFolders v1.0.1 [ae029012] Requires v1.3.0 @@ -515,26 +864,27 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [79098fc4] Rmath v0.7.1 [47965b36] RootedTrees v2.19.2 [7e49a35a] RuntimeGeneratedFunctions v0.5.12 - [fdea26ae] SIMD v3.4.5 + [fdea26ae] SIMD v3.4.6 [94e857df] SIMDTypes v0.1.0 [476501e8] SLEEFPirates v0.6.42 - [0bca4576] SciMLBase v2.7.3 + [0bca4576] SciMLBase v2.8.1 [e9a6253c] SciMLNLSolve v0.1.9 - [c0aeaf25] SciMLOperators v0.3.6 + [c0aeaf25] SciMLOperators v0.3.7 [505e40e9] SciPyDiffEq v0.2.1 [6c6a2e73] Scratch v1.2.1 - [91c51154] SentinelArrays v1.4.0 + [91c51154] SentinelArrays v1.4.1 [efcf1570] Setfield v1.1.1 [1277b4bf] ShiftedArrays v2.0.0 [992d4aef] Showoff v1.0.3 [777ac1f9] SimpleBufferStream v1.1.0 - [727e6d20] SimpleNonlinearSolve v0.1.23 + [727e6d20] SimpleNonlinearSolve v0.1.25 [699a6c99] SimpleTraits v0.9.4 [ce78b400] SimpleUnPack v1.1.0 [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 [b85f4697] SoftGlobalScope v1.1.0 [a2af1166] SortingAlgorithms v1.2.0 - [47a9eef4] SparseDiffTools v2.9.2 +⌃ [47a9eef4] SparseDiffTools v2.11.0 [e56a9233] Sparspak v0.3.9 [276daf66] SpecialFunctions v2.3.1 [928aab9d] SpecialMatrices v3.0.0 @@ -546,7 +896,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2913bbd2] StatsBase v0.34.2 [4c63d2b9] StatsFuns v1.3.0 [3eaba693] StatsModels v0.7.3 -⌅ [7792a7ef] StrideArraysCore v0.4.17 + [7792a7ef] StrideArraysCore v0.5.1 [69024149] StringEncodings v0.3.7 [892a3eda] StringManipulation v0.3.4 [09ab397b] StructArrays v0.6.16 @@ -556,14 +906,14 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [0c5d862f] Symbolics v5.10.0 [3783bdb8] TableTraits v1.0.1 [bd369af6] Tables v1.11.1 - [92b13dbe] TaylorIntegration v0.14.3 + [92b13dbe] TaylorIntegration v0.14.4 [6aa5eb33] TaylorSeries v0.15.2 [62fd8b95] TensorCore v0.1.1 [5d786b92] TerminalLoggers v0.1.7 [8290d209] ThreadingUtilities v0.5.2 [a759f4b9] TimerOutputs v0.5.23 [c751599d] ToeplitzMatrices v0.8.2 - [0796e94c] Tokenize v0.5.25 + [0796e94c] Tokenize v0.5.26 [3bb67fe8] TranscodingStreams v0.10.2 [a2a6695c] TreeViews v0.3.0 [d5829a12] TriangularSolve v0.1.20 @@ -572,7 +922,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [5c2747f8] URIs v1.5.1 [3a884ed6] UnPack v1.0.2 [1cfade01] UnicodeFun v0.4.1 - [1986cc42] Unitful v1.17.0 + [1986cc42] Unitful v1.18.0 [45397f5d] UnitfulLatexify v1.6.3 [a7c27f48] Unityper v0.1.5 [41fe7b60] Unzip v0.2.0 @@ -588,7 +938,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [83423d85] Cairo_jll v1.16.1+1 [2702e6a9] EpollShim_jll v0.0.20230411+0 [2e619515] Expat_jll v2.5.0+0 -⌃ [b22a6f82] FFMPEG_jll v4.4.2+2 + [b22a6f82] FFMPEG_jll v4.4.4+1 [f5851436] FFTW_jll v3.3.10+0 [a3f928ae] Fontconfig_jll v2.13.93+0 [d7e528f0] FreeType2_jll v2.13.1+0 @@ -617,11 +967,11 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [856f044c] MKL_jll v2023.2.0+0 [c771fb93] ODEInterface_jll v0.0.1+0 [e7412a2a] Ogg_jll v1.3.5+1 -⌅ [458c3c95] OpenSSL_jll v1.1.23+0 + [458c3c95] OpenSSL_jll v3.0.12+0 [efe28fd5] OpenSpecFun_jll v0.5.5+0 [91d4177d] Opus_jll v1.3.2+0 [30392449] Pixman_jll v0.42.2+0 - [c0090381] Qt6Base_jll v6.5.2+2 + [c0090381] Qt6Base_jll v6.5.3+1 [f50d1b31] Rmath_jll v0.4.0+0 ⌅ [fb77eaff] Sundials_jll v5.2.1+0 [a44049a8] Vulkan_Loader_jll v1.3.243+0 @@ -629,7 +979,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2381bf8a] Wayland_protocols_jll v1.25.0+0 [02c8fc9c] XML2_jll v2.11.5+0 [aed1982a] XSLT_jll v1.1.34+0 - [ffd25f8a] XZ_jll v5.4.4+0 + [ffd25f8a] XZ_jll v5.4.5+0 [f67eecfb] Xorg_libICE_jll v1.0.10+1 [c834827a] Xorg_libSM_jll v1.2.3+0 [4f6342f7] Xorg_libX11_jll v1.8.6+0 @@ -657,7 +1007,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [8f1865be] ZeroMQ_jll v4.3.4+0 [3161d3a3] Zstd_jll v1.5.5+0 [35ca27e7] eudev_jll v3.2.9+0 - [214eeab7] fzf_jll v0.35.1+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 [1a1c6b14] gperf_jll v3.1.1+0 [a4ae2306] libaom_jll v3.4.0+0 [0ac62f75] libass_jll v0.15.1+0 @@ -681,7 +1031,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [9fa8497b] Future [b77e0a4c] InteractiveUtils [4af54fe1] LazyArtifacts - [b27032c2] LibCURL v0.6.3 + [b27032c2] LibCURL v0.6.4 [76f85450] LibGit2 [8f399da3] Libdl [37e2e46d] LinearAlgebra @@ -707,8 +1057,8 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [cf7118a7] UUIDs [4ec0a83e] Unicode [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 - [deac9b47] LibCURL_jll v7.84.0+0 - [29816b5a] LibSSH2_jll v1.10.2+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 [c8ffd9c3] MbedTLS_jll v2.28.2+0 [14a3606d] MozillaCACerts_jll v2022.10.11 [4536629a] OpenBLAS_jll v0.3.21+4 @@ -717,9 +1067,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bea87d4a] SuiteSparse_jll v5.10.1+6 [83775a58] Zlib_jll v1.2.13+0 [8e850b90] libblastrampoline_jll v5.8.0+0 - [8e850ede] nghttp2_jll v1.48.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 [3f19e933] p7zip_jll v17.4.0+0 -Info Packages marked with ⌃ and ⌅ have new versions available, but those wi -th ⌅ are restricted by compatibility constraints from upgrading. To see why - use `status --outdated -m` +Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m` ``` + +```@raw html +
+``` + diff --git a/docs/src/benchmarks/multi-language-wrappers.md b/docs/src/benchmarks/multi-language-wrappers.md index 553667ba3..13fcf6ba7 100644 --- a/docs/src/benchmarks/multi-language-wrappers.md +++ b/docs/src/benchmarks/multi-language-wrappers.md @@ -3,6 +3,9 @@ Adapted from [SciMLBenchmarks.jl multi-language wrapper benchmark](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/MultiLanguage/ode_wrapper_packages/). +```@raw html +
Code: +``` ```julia # Imports using LinearAlgebra, Statistics @@ -11,28 +14,21 @@ using ODEInterface, ODEInterfaceDiffEq, Sundials, SciPyDiffEq, deSolveDiffEq, MA using LoggingExtras using ProbNumDiffEq -``` - -```julia -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), + yticks=10.0 .^ (-6:1:5), ) -``` - -```julia -# Constants used throughout this benchmark +# Constants used throughout this benchmark as we only consider final values const DENSE = false # used to decide if we smooth or not const SAVE_EVERYSTEP = false; -``` - -```julia +# COLORS and a realted utility COLORS = Dict( "Julia" => :LightGreen, "Julia (static)" => :DarkGreen, @@ -50,24 +46,23 @@ tocolor(n) = if split(n, '(')[1] in keys(COLORS) else COLORS[split(n, ':')[1]] end -``` - -``` -tocolor (generic function with 1 method) -``` - - -```julia +# Do not show "deprecated warnings" deprecated_filter(log_args) = !contains(log_args.message, "deprecated") filtered_logger = ActiveFilteredLogger(deprecated_filter, global_logger()); ``` +```@raw html +
+``` ## Non-Stiff Problem 1: Lotka-Volterra +```@raw html +
Code: +``` ```julia f = @ode_def LotkaVolterra begin dx = a*x - b*x*y @@ -81,11 +76,17 @@ staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(f,SVector{2}(u0),tspan sol = solve(prob,Vern7(),abstol=1/10^14,reltol=1/10^14,dense=false) test_sol = sol -plot(sol, title="Lotka-Volterra Solution", legend=false) +plot(sol, title="Lotka-Volterra Solution", legend=false, xticks=:auto, yticks=:auto) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_6_1.svg) +![](figures/multi-language-wrappers_2_1.svg) +```@raw html +
Code: +``` ```julia _setups = [ "Julia: DP5" => Dict(:alg=>DP5()) @@ -118,7 +119,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob, staticprob], abstols, reltols, setups; names = labels, - #print_names = true, appxsol = [test_sol, test_sol], dense = DENSE, save_everystep = SAVE_EVERYSTEP, @@ -129,21 +129,21 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Non-stiff 1: Lotka-Volterra", - color = colors, - xticks = 10.0 .^ (-16:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Non-stiff 1: Lotka-Volterra", color = colors) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_7_1.svg) +![](figures/multi-language-wrappers_3_1.svg) ## Non-Stiff Problem 2: Rigid Body +```@raw html +
Code: +``` ```julia f = @ode_def RigidBodyBench begin dy1 = -2*y2*y3 @@ -156,11 +156,17 @@ prob = ODEProblem{true,SciMLBase.FullSpecialize()}(f,u0,tspan) staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(f,SVector{3}(u0),tspan) sol = solve(prob,Vern7(),abstol=1/10^14,reltol=1/10^14,dense=false) test_sol = sol -plot(sol, title="Rigid Body Solution", legend=false) +plot(sol, title="Rigid Body Solution", legend=false, xticks=:auto, yticks=:auto) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_8_1.svg) +![](figures/multi-language-wrappers_4_1.svg) +```@raw html +
Code: +``` ```julia _setups = [ "Julia: DP5" => Dict(:alg=>DP5()) @@ -193,7 +199,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob,staticprob], abstols, reltols, setups; names = labels, - #print_names = true, appxsol = [test_sol, test_sol], dense = DENSE, save_everystep = SAVE_EVERYSTEP, @@ -204,21 +209,21 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Non-stiff 2: Rigid-Body", - color = colors, - xticks = 10.0 .^ (-12:1:5), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Non-stiff 2: Rigid-Body", color = colors) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_9_1.svg) +![](figures/multi-language-wrappers_5_1.svg) ## Stiff Problem 1: ROBER +```@raw html +
Code: +``` ```julia rober = @ode_def begin dy₁ = -k₁*y₁+k₃*y₂*y₃ @@ -231,11 +236,17 @@ prob = ODEProblem{true,SciMLBase.FullSpecialize()}(rober,u0,(0.0,1e5),p) staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(rober,SVector{3}(u0),(0.0,1e5),SVector{3}(p)) sol = solve(prob,CVODE_BDF(),abstol=1/10^14,reltol=1/10^14,dense=false) test_sol = sol -plot(sol, title="ROBER Solution", legend=false, xlims=(1e0, 1e5)) +plot(sol, title="ROBER Solution", legend=false, xlims=(1e0, 1e5), xticks=:auto, yticks=:auto) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_10_1.svg) +![](figures/multi-language-wrappers_6_1.svg) +```@raw html +
Code: +``` ```julia _setups = [ "Julia: Rosenbrock23" => Dict(:alg=>Rosenbrock23()) @@ -265,7 +276,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob, staticprob], abstols, reltols, setups; names = labels, - #print_names = true, dense = DENSE, verbose = false, save_everystep = SAVE_EVERYSTEP, @@ -274,21 +284,21 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Stiff 1: ROBER", - color = colors, - xticks = 10.0 .^ (-16:1:4), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Stiff 1: ROBER", color = colors) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_11_1.svg) +![](figures/multi-language-wrappers_7_1.svg) ## Stiff Problem 2: HIRES +```@raw html +
Code: +``` ```julia f = @ode_def Hires begin dy1 = -1.71*y1 + 0.43*y2 + 8.32*y3 + 0.0007 @@ -310,11 +320,17 @@ staticprob = ODEProblem{false,SciMLBase.FullSpecialize()}(f,SVector{8}(u0),(0.0, sol = solve(prob,Rodas5(),abstol=1/10^14,reltol=1/10^14, dense=false) test_sol = sol -plot(sol, title="HIRES Solution", legend=false) +plot(sol, title="HIRES Solution", legend=false, xticks=:auto, yticks=:auto) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_12_1.svg) +![](figures/multi-language-wrappers_8_1.svg) +```@raw html +
Code: +``` ```julia _setups = [ "Julia: Rosenbrock23" => Dict(:alg=>Rosenbrock23()) @@ -345,7 +361,6 @@ wp = with_logger(filtered_logger) do WorkPrecisionSet( [prob, staticprob], abstols, reltols, setups; names = labels, - #print_names = true, dense = false, verbose = false, save_everystep = false, @@ -355,31 +370,31 @@ wp = with_logger(filtered_logger) do ) end -plot( - wp, - title = "Stiff 2: Hires", - color=colors, - xticks = 10.0 .^ (-16:1:4), - yticks = 10.0 .^ (-6:1:5), -) +plot(wp, title = "Stiff 2: Hires", color=colors) +``` +```@raw html +
``` -![](figures/multi-language-wrappers_13_1.svg) +![](figures/multi-language-wrappers_9_1.svg) ## Appendix -Computer information: +```@raw html +
Computer information: +``` + ```julia using InteractiveUtils InteractiveUtils.versioninfo() ``` ``` -Julia Version 1.9.3 -Commit bed2cd540a1 (2023-08-24 14:43 UTC) +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) Build Info: Official https://julialang.org/ release Platform Info: @@ -392,14 +407,16 @@ Platform Info: Environment: JULIA_NUM_THREADS = auto JULIA_STACKTRACE_MINIMAL = true - JULIA_IMAGE_THREADS = 1 ``` +```@raw html +
+``` +```@raw html +
Package information: +``` - - -Package Information: ```julia using Pkg Pkg.status() @@ -407,49 +424,54 @@ Pkg.status() ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 [7073ff75] IJulia v1.24.2 [7f56f5a3] LSODA v0.7.5 [e6f89c97] LoggingExtras v1.0.3 [e2752cbe] MATLABDiffEq v1.2.0 - [961ee093] ModelingToolkit v8.72.2 + [961ee093] ModelingToolkit v8.73.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 - [1dea7af3] OrdinaryDiffEq v6.58.1 + [1dea7af3] OrdinaryDiffEq v6.59.1 [65888b18] ParameterizedFunctions v5.16.0 [91a5bcdd] Plots v1.39.0 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` - [0bca4576] SciMLBase v2.6.0 + [0bca4576] SciMLBase v2.8.1 [505e40e9] SciPyDiffEq v0.2.1 + [ce78b400] SimpleUnPack v1.1.0 [90137ffa] StaticArrays v1.6.5 [c3572dad] Sundials v4.20.1 [44d3d7a6] Weave v0.10.12 [0518478a] deSolveDiffEq v0.1.1 ``` +```@raw html +
+``` +```@raw html +
Full manifest: +``` - - -And the full manifest: ```julia Pkg.status(mode=Pkg.PKGMODE_MANIFEST) ``` ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` - [47edcb42] ADTypes v0.2.4 + [47edcb42] ADTypes v0.2.5 ⌅ [c3fe647b] AbstractAlgebra v0.32.5 [621f4979] AbstractFFTs v1.5.0 [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 [79e6a3ab] Adapt v3.7.1 [ec485272] ArnoldiMethod v0.2.0 [c9d4266f] ArrayAllocators v0.3.0 [4fba245c] ArrayInterface v7.5.1 - [30b0a656] ArrayInterfaceCore v0.1.29 [6e4b80f9] BenchmarkTools v1.3.2 [e2ed5e7c] Bijections v0.1.6 - [d1d4a3ce] BitFlags v0.1.7 + [d1d4a3ce] BitFlags v0.1.8 [62783981] BitTwiddlingConvenienceFunctions v0.1.5 [fa961155] CEnum v0.5.0 [2a0fbf3d] CPUSummary v0.2.4 @@ -469,6 +491,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bbf7d656] CommonSubexpressions v0.3.0 [34da2185] Compat v4.10.0 [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 [2569d6c7] ConcreteStructs v0.2.3 [f0e56b4a] ConcurrentUtilities v2.3.0 [8f4d0f93] Conda v1.9.1 @@ -483,14 +506,14 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [864edb3b] DataStructures v0.18.15 [e2d170a0] DataValueInterfaces v1.0.0 [8bb1440f] DelimitedFiles v1.9.1 - [2b5f629d] DiffEqBase v6.136.0 + [2b5f629d] DiffEqBase v6.139.0 [459566f4] DiffEqCallbacks v2.33.1 - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 [77a26b50] DiffEqNoiseProcess v5.19.0 [163ba53b] DiffResults v1.1.0 [b552c78f] DiffRules v1.15.1 [b4f34e82] Distances v0.10.10 - [31c24e10] Distributions v0.25.102 + [31c24e10] Distributions v0.25.103 [ffbed154] DocStringExtensions v0.9.3 ⌅ [5b8099bc] DomainSets v0.6.7 [fa6b7ba4] DualNumbers v0.6.8 @@ -504,7 +527,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [e2ba6199] ExprTools v0.1.10 [c87230d0] FFMPEG v0.4.1 [7a1cc6ca] FFTW v1.7.1 - [7034ab61] FastBroadcast v0.2.7 + [7034ab61] FastBroadcast v0.2.8 [9aa1b823] FastClosures v0.3.2 [442a2c76] FastGaussQuadrature v1.0.0 [29a986be] FastLapackInterface v2.0.0 @@ -535,6 +558,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [842dd82b] InlineStrings v1.4.0 [18e54dd8] IntegerMathUtils v0.1.2 [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 [41ab1584] InvertedIndices v1.3.0 [92d709cd] IrrationalConstants v0.2.2 [c8e1da08] IterTools v1.8.0 @@ -552,33 +576,33 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2ee39098] LabelledArrays v1.14.0 [984bce1d] LambertW v0.4.6 [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 [10f19ff3] LayoutPointers v0.1.15 [50d2b5c4] Lazy v0.15.1 [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 [d3d80556] LineSearches v7.2.0 - [7ed4a6bd] LinearSolve v2.15.0 + [7ed4a6bd] LinearSolve v2.20.0 [2ab3a3ac] LogExpFunctions v0.3.26 [e6f89c97] LoggingExtras v1.0.3 - [bdcacae8] LoopVectorization v0.12.165 + [bdcacae8] LoopVectorization v0.12.166 [10e44e05] MATLAB v0.8.4 [e2752cbe] MATLABDiffEq v1.2.0 - [33e6dc65] MKL v0.6.1 [d8e11817] MLStyle v0.4.17 [1914dd2f] MacroTools v0.5.11 [d125e4d3] ManualMemory v0.1.8 - [739be429] MbedTLS v1.1.7 + [739be429] MbedTLS v1.1.8 [442fdcdd] Measures v0.3.2 [e1d29d7a] Missings v1.1.0 - [961ee093] ModelingToolkit v8.72.2 + [961ee093] ModelingToolkit v8.73.0 [46d2c3a1] MuladdMacro v0.2.4 [102ac46a] MultivariatePolynomials v0.5.2 - [ffc61752] Mustache v1.0.18 + [ffc61752] Mustache v1.0.19 [d8a4904e] MutableArithmetics v1.3.3 [d41bc354] NLSolversBase v7.8.3 [2774e3e8] NLsolve v4.5.1 [77ba4419] NaNMath v1.0.2 ⌅ [356022a1] NamedDims v0.2.50 - [8913a72c] NonlinearSolve v2.6.0 + [8913a72c] NonlinearSolve v2.8.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 [6fd5a793] Octavian v0.3.27 @@ -586,20 +610,20 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [4d8831e6] OpenSSL v1.4.1 [429524aa] Optim v1.7.8 [bac558e1] OrderedCollections v1.6.2 - [1dea7af3] OrdinaryDiffEq v6.58.1 - [90014a1f] PDMats v0.11.28 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 [fe68d972] PSDMatrices v0.4.6 [65ce6f38] PackageExtensionCompat v1.0.2 [65888b18] ParameterizedFunctions v5.16.0 [d96e819e] Parameters v0.12.3 - [69de0a69] Parsers v2.7.2 + [69de0a69] Parsers v2.8.0 [b98c9c47] Pipe v1.3.0 [32113eaa] PkgBenchmark v0.2.12 [ccf2f8ad] PlotThemes v3.1.0 [995b91a9] PlotUtils v1.3.5 [91a5bcdd] Plots v1.39.0 [e409e4f3] PoissonRandom v0.4.4 - [f517fe37] Polyester v0.7.8 + [f517fe37] Polyester v0.7.9 [1d0040c9] PolyesterWeave v0.2.1 ⌅ [f27b6e38] Polynomials v3.2.13 [2dfb63ee] PooledArrays v1.4.3 @@ -607,12 +631,13 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [d236fae5] PreallocationTools v0.4.12 [aea7be01] PrecompileTools v1.2.0 [21216c6a] Preferences v1.4.1 - [08abe8d2] PrettyTables v2.2.8 - [27ebfcd6] Primes v0.5.4 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` [33c8b6b6] ProgressLogging v0.1.4 - [438e738f] PyCall v1.96.1 + [438e738f] PyCall v1.96.2 [1fd47b50] QuadGK v2.9.1 + [8a4e6c94] QuasiMonteCarlo v0.3.2 [6f49c342] RCall v0.13.18 [74087812] Random123 v1.6.1 [fb686558] RandomExtensions v0.4.4 @@ -620,7 +645,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [3cdcf5f2] RecipesBase v1.3.4 [01d81517] RecipesPipeline v0.6.12 [731186ca] RecursiveArrayTools v2.38.10 - [f2c3362d] RecursiveFactorization v0.2.20 + [f2c3362d] RecursiveFactorization v0.2.21 [189a3867] Reexport v1.2.2 [05181044] RelocatableFolders v1.0.1 [ae029012] Requires v1.3.0 @@ -628,26 +653,27 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [79098fc4] Rmath v0.7.1 [47965b36] RootedTrees v2.19.2 [7e49a35a] RuntimeGeneratedFunctions v0.5.12 - [fdea26ae] SIMD v3.4.5 + [fdea26ae] SIMD v3.4.6 [94e857df] SIMDTypes v0.1.0 [476501e8] SLEEFPirates v0.6.42 - [0bca4576] SciMLBase v2.6.0 + [0bca4576] SciMLBase v2.8.1 [e9a6253c] SciMLNLSolve v0.1.9 - [c0aeaf25] SciMLOperators v0.3.6 + [c0aeaf25] SciMLOperators v0.3.7 [505e40e9] SciPyDiffEq v0.2.1 - [6c6a2e73] Scratch v1.2.0 - [91c51154] SentinelArrays v1.4.0 + [6c6a2e73] Scratch v1.2.1 + [91c51154] SentinelArrays v1.4.1 [efcf1570] Setfield v1.1.1 [1277b4bf] ShiftedArrays v2.0.0 [992d4aef] Showoff v1.0.3 [777ac1f9] SimpleBufferStream v1.1.0 - [727e6d20] SimpleNonlinearSolve v0.1.23 + [727e6d20] SimpleNonlinearSolve v0.1.25 [699a6c99] SimpleTraits v0.9.4 [ce78b400] SimpleUnPack v1.1.0 [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 [b85f4697] SoftGlobalScope v1.1.0 [a2af1166] SortingAlgorithms v1.2.0 - [47a9eef4] SparseDiffTools v2.9.2 + [47a9eef4] SparseDiffTools v2.11.0 [e56a9233] Sparspak v0.3.9 [276daf66] SpecialFunctions v2.3.1 [928aab9d] SpecialMatrices v3.0.0 @@ -659,7 +685,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2913bbd2] StatsBase v0.34.2 [4c63d2b9] StatsFuns v1.3.0 [3eaba693] StatsModels v0.7.3 -⌅ [7792a7ef] StrideArraysCore v0.4.17 + [7792a7ef] StrideArraysCore v0.5.1 [69024149] StringEncodings v0.3.7 [892a3eda] StringManipulation v0.3.4 [09ab397b] StructArrays v0.6.16 @@ -669,15 +695,15 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [0c5d862f] Symbolics v5.10.0 [3783bdb8] TableTraits v1.0.1 [bd369af6] Tables v1.11.1 - [92b13dbe] TaylorIntegration v0.14.3 + [92b13dbe] TaylorIntegration v0.14.4 [6aa5eb33] TaylorSeries v0.15.2 [62fd8b95] TensorCore v0.1.1 [5d786b92] TerminalLoggers v0.1.7 [8290d209] ThreadingUtilities v0.5.2 [a759f4b9] TimerOutputs v0.5.23 [c751599d] ToeplitzMatrices v0.8.2 - [0796e94c] Tokenize v0.5.25 - [3bb67fe8] TranscodingStreams v0.10.1 + [0796e94c] Tokenize v0.5.26 + [3bb67fe8] TranscodingStreams v0.10.2 [a2a6695c] TreeViews v0.3.0 [d5829a12] TriangularSolve v0.1.20 [410a4b4d] Tricks v0.1.8 @@ -685,7 +711,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [5c2747f8] URIs v1.5.1 [3a884ed6] UnPack v1.0.2 [1cfade01] UnicodeFun v0.4.1 - [1986cc42] Unitful v1.17.0 + [1986cc42] Unitful v1.18.0 [45397f5d] UnitfulLatexify v1.6.3 [a7c27f48] Unityper v0.1.5 [41fe7b60] Unzip v0.2.0 @@ -696,13 +722,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [1b915085] WinReg v1.0.0 [ddb6d928] YAML v0.4.9 [c2297ded] ZMQ v1.2.2 - [700de1a5] ZygoteRules v0.2.4 [0518478a] deSolveDiffEq v0.1.1 [6e34b625] Bzip2_jll v1.0.8+0 [83423d85] Cairo_jll v1.16.1+1 [2702e6a9] EpollShim_jll v0.0.20230411+0 [2e619515] Expat_jll v2.5.0+0 -⌃ [b22a6f82] FFMPEG_jll v4.4.2+2 + [b22a6f82] FFMPEG_jll v4.4.4+1 [f5851436] FFTW_jll v3.3.10+0 [a3f928ae] Fontconfig_jll v2.13.93+0 [d7e528f0] FreeType2_jll v2.13.1+0 @@ -731,11 +756,11 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [856f044c] MKL_jll v2023.2.0+0 [c771fb93] ODEInterface_jll v0.0.1+0 [e7412a2a] Ogg_jll v1.3.5+1 -⌅ [458c3c95] OpenSSL_jll v1.1.23+0 + [458c3c95] OpenSSL_jll v3.0.12+0 [efe28fd5] OpenSpecFun_jll v0.5.5+0 [91d4177d] Opus_jll v1.3.2+0 [30392449] Pixman_jll v0.42.2+0 - [c0090381] Qt6Base_jll v6.5.2+2 + [c0090381] Qt6Base_jll v6.5.3+1 [f50d1b31] Rmath_jll v0.4.0+0 ⌅ [fb77eaff] Sundials_jll v5.2.1+0 [a44049a8] Vulkan_Loader_jll v1.3.243+0 @@ -743,7 +768,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2381bf8a] Wayland_protocols_jll v1.25.0+0 [02c8fc9c] XML2_jll v2.11.5+0 [aed1982a] XSLT_jll v1.1.34+0 - [ffd25f8a] XZ_jll v5.4.4+0 + [ffd25f8a] XZ_jll v5.4.5+0 [f67eecfb] Xorg_libICE_jll v1.0.10+1 [c834827a] Xorg_libSM_jll v1.2.3+0 [4f6342f7] Xorg_libX11_jll v1.8.6+0 @@ -771,7 +796,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [8f1865be] ZeroMQ_jll v4.3.4+0 [3161d3a3] Zstd_jll v1.5.5+0 [35ca27e7] eudev_jll v3.2.9+0 - [214eeab7] fzf_jll v0.35.1+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 [1a1c6b14] gperf_jll v3.1.1+0 [a4ae2306] libaom_jll v3.4.0+0 [0ac62f75] libass_jll v0.15.1+0 @@ -795,7 +820,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [9fa8497b] Future [b77e0a4c] InteractiveUtils [4af54fe1] LazyArtifacts - [b27032c2] LibCURL v0.6.3 + [b27032c2] LibCURL v0.6.4 [76f85450] LibGit2 [8f399da3] Libdl [37e2e46d] LinearAlgebra @@ -821,8 +846,8 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [cf7118a7] UUIDs [4ec0a83e] Unicode [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 - [deac9b47] LibCURL_jll v7.84.0+0 - [29816b5a] LibSSH2_jll v1.10.2+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 [c8ffd9c3] MbedTLS_jll v2.28.2+0 [14a3606d] MozillaCACerts_jll v2022.10.11 [4536629a] OpenBLAS_jll v0.3.21+4 @@ -831,11 +856,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bea87d4a] SuiteSparse_jll v5.10.1+6 [83775a58] Zlib_jll v1.2.13+0 [8e850b90] libblastrampoline_jll v5.8.0+0 - [8e850ede] nghttp2_jll v1.48.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 [3f19e933] p7zip_jll v17.4.0+0 -Info Packages marked with ⌃ and ⌅ have new versions available, but those wi -th ⌅ are restricted by compatibility constraints from upgrading. To see why - use `status --outdated -m` +Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m` ``` +```@raw html +
+``` diff --git a/docs/src/benchmarks/orego.md b/docs/src/benchmarks/orego.md new file mode 100644 index 000000000..56cc9b871 --- /dev/null +++ b/docs/src/benchmarks/orego.md @@ -0,0 +1,635 @@ +# OREGO benchmark + + +!!! note "Summary" + - [**The `EK1` is able to solve mass-matrix DAEs.** To achieve low error, use order 4 or higher.](@ref orego_results) + - The order-to-error-tolerance heuristic holds: lower tolerance level ``\rightarrow`` higher order. + + +Adapted from +[SciMLBenchmarks.jl](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/DAE/OregoDAE/). + +```@raw html +
Code: +``` +```julia +using LinearAlgebra, Statistics, Distributions +using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots +using ModelingToolkit +using ProbNumDiffEq + +Plots.theme( + :dao; + markerstrokewidth=0.5, + legend=:outertopright, + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), +) + +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` +```@raw html +
+``` + + +```@raw html +
Code: +``` +```julia +@variables t y1(t)=1.0 y2(t)=2.0 y3(t)=3.0 +@parameters p1=77.27 p2=8.375e-6 p3=0.161 +D = Differential(t) +eqs = [ + D(y1) ~ p1*(y2+y1*(1-p2*y1-y2)) + D(y2) ~ (y3-(1+y1)*y2)/p1 + D(y3) ~ p3*(y1-y3) +] +@named sys = ODESystem(eqs) +simpsys = structural_simplify(sys) +mmprob = ODEProblem(sys,[],(0.0,30.0)) +daeprob = DAEProblem(sys,[D(y1)=>77.26935286375, + D(y2)=>-0.012941633234114146, + D(y3)=>-0.322],[],(0.0,30.0)) +odaeprob = ODAEProblem(simpsys,[],(0.0,30.0)) + +ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14) + +plot(ref_sol, title="OREGO Solution", legend=false, xticks=:auto) +``` +```@raw html +
+``` + +![](figures/orego_2_1.svg) + + + +## [`EK1` across orders](@id orego_results) + +```@raw html +
Code: +``` +```julia +DENSE = false; +SAVE_EVERYSTEP = false; + +_setups = [ + "EK1($order)" => Dict(:alg => EK1(order=order, smooth=DENSE)) + for order in 2:6 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (6:10) +reltols = 1.0 ./ 10.0 .^ (3:7) + +wp = WorkPrecisionSet( + mmprob, abstols, reltols, setups; + names = labels, + appxsol = ref_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + numruns = 10, + maxiters = Int(1e7), +) + +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + + +_ref_setups = [ + "Rosenbrock23" => Dict(:alg => Rosenbrock23()) + "Rodas4P" => Dict(:alg => Rodas4P()) + "RadauIIA" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp = WorkPrecisionSet( + mmprob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = ref_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) +plot!(ref_wp, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/orego_3_1.svg) + + + +### Calibration + +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", + palette=Plots.palette([:blue, :red], length(_setups))) +plot_chisq_interval!(3) +``` +```@raw html +
+``` + +![](figures/orego_4_1.svg) + + + + +## Appendix + +```@raw html +
Computer information: +``` + +```julia +using InteractiveUtils +InteractiveUtils.versioninfo() +``` + +``` +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) +Build Info: + Official https://julialang.org/ release +Platform Info: + OS: Linux (x86_64-linux-gnu) + CPU: 12 × Intel(R) Core(TM) i7-6800K CPU @ 3.40GHz + WORD_SIZE: 64 + LIBM: libopenlibm + LLVM: libLLVM-14.0.6 (ORCJIT, broadwell) + Threads: 12 on 12 virtual cores +Environment: + JULIA_NUM_THREADS = auto + JULIA_STACKTRACE_MINIMAL = true +``` + +```@raw html +
+``` + +```@raw html +
Package information: +``` + +```julia +using Pkg +Pkg.status() +``` + +``` +Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 + [7073ff75] IJulia v1.24.2 + [7f56f5a3] LSODA v0.7.5 + [e6f89c97] LoggingExtras v1.0.3 + [e2752cbe] MATLABDiffEq v1.2.0 +⌃ [961ee093] ModelingToolkit v8.73.0 + [54ca160b] ODEInterface v0.5.0 + [09606e27] ODEInterfaceDiffEq v3.13.3 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [65888b18] ParameterizedFunctions v5.16.0 + [91a5bcdd] Plots v1.39.0 + [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` + [0bca4576] SciMLBase v2.8.1 + [505e40e9] SciPyDiffEq v0.2.1 + [ce78b400] SimpleUnPack v1.1.0 + [90137ffa] StaticArrays v1.6.5 + [c3572dad] Sundials v4.20.1 + [44d3d7a6] Weave v0.10.12 + [0518478a] deSolveDiffEq v0.1.1 +Info Packages marked with ⌃ have new versions available and may be upgradable. +``` + +```@raw html +
+``` + +```@raw html +
Full manifest: +``` + +```julia +Pkg.status(mode=Pkg.PKGMODE_MANIFEST) +``` + +``` +Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` + [47edcb42] ADTypes v0.2.5 +⌅ [c3fe647b] AbstractAlgebra v0.32.5 + [621f4979] AbstractFFTs v1.5.0 + [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 + [79e6a3ab] Adapt v3.7.1 + [ec485272] ArnoldiMethod v0.2.0 + [c9d4266f] ArrayAllocators v0.3.0 + [4fba245c] ArrayInterface v7.5.1 + [6e4b80f9] BenchmarkTools v1.3.2 + [e2ed5e7c] Bijections v0.1.6 + [d1d4a3ce] BitFlags v0.1.8 + [62783981] BitTwiddlingConvenienceFunctions v0.1.5 + [fa961155] CEnum v0.5.0 + [2a0fbf3d] CPUSummary v0.2.4 + [00ebfdb7] CSTParser v3.3.6 + [49dc2e85] Calculus v0.5.1 + [324d7699] CategoricalArrays v0.10.8 + [d360d2e6] ChainRulesCore v1.18.0 + [fb6a15b2] CloseOpenIntervals v0.1.12 + [944b1d66] CodecZlib v0.7.3 + [35d6a980] ColorSchemes v3.24.0 + [3da002f7] ColorTypes v0.11.4 + [c3611d14] ColorVectorSpace v0.10.0 + [5ae59095] Colors v0.12.10 + [861a8166] Combinatorics v1.0.2 + [a80b9123] CommonMark v0.8.12 + [38540f10] CommonSolve v0.2.4 + [bbf7d656] CommonSubexpressions v0.3.0 + [34da2185] Compat v4.10.0 + [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 + [2569d6c7] ConcreteStructs v0.2.3 + [f0e56b4a] ConcurrentUtilities v2.3.0 +⌃ [8f4d0f93] Conda v1.9.1 + [187b0558] ConstructionBase v1.5.4 + [d38c429a] Contour v0.6.2 + [587fd27a] CovarianceEstimation v0.2.9 + [adafc99b] CpuId v0.3.1 + [a8cc5b0e] Crayons v4.1.1 + [717857b8] DSP v0.7.9 + [9a962f9c] DataAPI v1.15.0 + [a93c6f00] DataFrames v1.6.1 + [864edb3b] DataStructures v0.18.15 + [e2d170a0] DataValueInterfaces v1.0.0 + [8bb1440f] DelimitedFiles v1.9.1 + [2b5f629d] DiffEqBase v6.139.0 + [459566f4] DiffEqCallbacks v2.33.1 + [f3b72e0c] DiffEqDevTools v2.42.0 + [77a26b50] DiffEqNoiseProcess v5.19.0 + [163ba53b] DiffResults v1.1.0 + [b552c78f] DiffRules v1.15.1 + [b4f34e82] Distances v0.10.10 + [31c24e10] Distributions v0.25.103 + [ffbed154] DocStringExtensions v0.9.3 +⌅ [5b8099bc] DomainSets v0.6.7 + [fa6b7ba4] DualNumbers v0.6.8 + [7c1d4256] DynamicPolynomials v0.5.3 + [b305315f] Elliptic v1.0.1 + [4e289a0a] EnumX v1.0.4 + [f151be2c] EnzymeCore v0.6.3 + [6912e4f1] Espresso v0.6.1 + [460bff9d] ExceptionUnwrapping v0.1.9 + [d4d017d3] ExponentialUtilities v1.25.0 + [e2ba6199] ExprTools v0.1.10 + [c87230d0] FFMPEG v0.4.1 + [7a1cc6ca] FFTW v1.7.1 + [7034ab61] FastBroadcast v0.2.8 + [9aa1b823] FastClosures v0.3.2 + [442a2c76] FastGaussQuadrature v1.0.0 + [29a986be] FastLapackInterface v2.0.0 + [1a297f60] FillArrays v1.7.0 + [6a86dc24] FiniteDiff v2.21.1 + [53c48c17] FixedPointNumbers v0.8.4 + [59287772] Formatting v0.4.2 + [f6369f11] ForwardDiff v0.10.36 + [069b7b12] FunctionWrappers v1.1.3 + [77dc65aa] FunctionWrappersWrappers v0.1.3 + [d9f16b24] Functors v0.4.5 + [46192b85] GPUArraysCore v0.1.5 + [28b8d3ca] GR v0.72.10 + [43dcc890] GaussianDistributions v0.5.2 + [c145ed77] GenericSchur v0.5.3 + [c27321d9] Glob v1.3.1 + [86223c79] Graphs v1.9.0 + [42e2da0e] Grisu v1.0.2 +⌅ [0b43b601] Groebner v0.4.4 + [d5909c97] GroupsCore v0.4.0 + [cd3eb016] HTTP v1.10.0 + [eafb193a] Highlights v0.5.2 + [3e5b6fbb] HostCPUFeatures v0.1.16 + [34004b35] HypergeometricFunctions v0.3.23 + [7073ff75] IJulia v1.24.2 + [615f187c] IfElse v0.1.1 + [d25df0c9] Inflate v0.1.4 + [842dd82b] InlineStrings v1.4.0 + [18e54dd8] IntegerMathUtils v0.1.2 + [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 + [41ab1584] InvertedIndices v1.3.0 + [92d709cd] IrrationalConstants v0.2.2 + [c8e1da08] IterTools v1.8.0 + [82899510] IteratorInterfaceExtensions v1.0.0 + [1019f520] JLFzf v0.1.6 + [692b3bcd] JLLWrappers v1.5.0 + [682c06a0] JSON v0.21.4 + [98e50ef6] JuliaFormatter v1.0.42 + [ccbc3e58] JumpProcesses v9.8.0 + [ef3ab10e] KLU v0.4.1 + [2c470bb0] Kronecker v0.5.4 + [ba0b0d4f] Krylov v0.9.4 + [7f56f5a3] LSODA v0.7.5 + [b964fa9f] LaTeXStrings v1.3.1 + [2ee39098] LabelledArrays v1.14.0 + [984bce1d] LambertW v0.4.6 + [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 + [10f19ff3] LayoutPointers v0.1.15 + [50d2b5c4] Lazy v0.15.1 + [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 + [d3d80556] LineSearches v7.2.0 + [7ed4a6bd] LinearSolve v2.20.0 + [2ab3a3ac] LogExpFunctions v0.3.26 + [e6f89c97] LoggingExtras v1.0.3 + [bdcacae8] LoopVectorization v0.12.166 + [10e44e05] MATLAB v0.8.4 + [e2752cbe] MATLABDiffEq v1.2.0 + [d8e11817] MLStyle v0.4.17 + [1914dd2f] MacroTools v0.5.11 + [d125e4d3] ManualMemory v0.1.8 + [739be429] MbedTLS v1.1.8 + [442fdcdd] Measures v0.3.2 + [e1d29d7a] Missings v1.1.0 +⌃ [961ee093] ModelingToolkit v8.73.0 + [46d2c3a1] MuladdMacro v0.2.4 + [102ac46a] MultivariatePolynomials v0.5.2 + [ffc61752] Mustache v1.0.19 + [d8a4904e] MutableArithmetics v1.3.3 + [d41bc354] NLSolversBase v7.8.3 + [2774e3e8] NLsolve v4.5.1 + [77ba4419] NaNMath v1.0.2 +⌅ [356022a1] NamedDims v0.2.50 + [8913a72c] NonlinearSolve v2.8.0 + [54ca160b] ODEInterface v0.5.0 + [09606e27] ODEInterfaceDiffEq v3.13.3 + [6fd5a793] Octavian v0.3.27 + [6fe1bfb0] OffsetArrays v1.12.10 + [4d8831e6] OpenSSL v1.4.1 + [429524aa] Optim v1.7.8 + [bac558e1] OrderedCollections v1.6.2 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 + [fe68d972] PSDMatrices v0.4.6 + [65ce6f38] PackageExtensionCompat v1.0.2 + [65888b18] ParameterizedFunctions v5.16.0 + [d96e819e] Parameters v0.12.3 + [69de0a69] Parsers v2.8.0 + [b98c9c47] Pipe v1.3.0 + [32113eaa] PkgBenchmark v0.2.12 + [ccf2f8ad] PlotThemes v3.1.0 + [995b91a9] PlotUtils v1.3.5 + [91a5bcdd] Plots v1.39.0 + [e409e4f3] PoissonRandom v0.4.4 + [f517fe37] Polyester v0.7.9 + [1d0040c9] PolyesterWeave v0.2.1 +⌅ [f27b6e38] Polynomials v3.2.13 + [2dfb63ee] PooledArrays v1.4.3 + [85a6dd25] PositiveFactorizations v0.2.4 + [d236fae5] PreallocationTools v0.4.12 + [aea7be01] PrecompileTools v1.2.0 + [21216c6a] Preferences v1.4.1 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 + [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` + [33c8b6b6] ProgressLogging v0.1.4 + [438e738f] PyCall v1.96.2 + [1fd47b50] QuadGK v2.9.1 +⌃ [8a4e6c94] QuasiMonteCarlo v0.3.2 + [6f49c342] RCall v0.13.18 + [74087812] Random123 v1.6.1 + [fb686558] RandomExtensions v0.4.4 + [e6cf234a] RandomNumbers v1.5.3 + [3cdcf5f2] RecipesBase v1.3.4 + [01d81517] RecipesPipeline v0.6.12 + [731186ca] RecursiveArrayTools v2.38.10 + [f2c3362d] RecursiveFactorization v0.2.21 + [189a3867] Reexport v1.2.2 + [05181044] RelocatableFolders v1.0.1 + [ae029012] Requires v1.3.0 + [ae5879a3] ResettableStacks v1.1.1 + [79098fc4] Rmath v0.7.1 + [47965b36] RootedTrees v2.19.2 + [7e49a35a] RuntimeGeneratedFunctions v0.5.12 + [fdea26ae] SIMD v3.4.6 + [94e857df] SIMDTypes v0.1.0 + [476501e8] SLEEFPirates v0.6.42 + [0bca4576] SciMLBase v2.8.1 + [e9a6253c] SciMLNLSolve v0.1.9 + [c0aeaf25] SciMLOperators v0.3.7 + [505e40e9] SciPyDiffEq v0.2.1 + [6c6a2e73] Scratch v1.2.1 + [91c51154] SentinelArrays v1.4.1 + [efcf1570] Setfield v1.1.1 + [1277b4bf] ShiftedArrays v2.0.0 + [992d4aef] Showoff v1.0.3 + [777ac1f9] SimpleBufferStream v1.1.0 + [727e6d20] SimpleNonlinearSolve v0.1.25 + [699a6c99] SimpleTraits v0.9.4 + [ce78b400] SimpleUnPack v1.1.0 + [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 + [b85f4697] SoftGlobalScope v1.1.0 + [a2af1166] SortingAlgorithms v1.2.0 +⌃ [47a9eef4] SparseDiffTools v2.11.0 + [e56a9233] Sparspak v0.3.9 + [276daf66] SpecialFunctions v2.3.1 + [928aab9d] SpecialMatrices v3.0.0 + [aedffcd0] Static v0.8.8 + [0d7ed370] StaticArrayInterface v1.4.1 + [90137ffa] StaticArrays v1.6.5 + [1e83bf80] StaticArraysCore v1.4.2 + [82ae8749] StatsAPI v1.7.0 + [2913bbd2] StatsBase v0.34.2 + [4c63d2b9] StatsFuns v1.3.0 + [3eaba693] StatsModels v0.7.3 + [7792a7ef] StrideArraysCore v0.5.1 + [69024149] StringEncodings v0.3.7 + [892a3eda] StringManipulation v0.3.4 + [09ab397b] StructArrays v0.6.16 + [c3572dad] Sundials v4.20.1 + [2efcf032] SymbolicIndexingInterface v0.2.2 + [d1185830] SymbolicUtils v1.4.0 + [0c5d862f] Symbolics v5.10.0 + [3783bdb8] TableTraits v1.0.1 + [bd369af6] Tables v1.11.1 + [92b13dbe] TaylorIntegration v0.14.4 + [6aa5eb33] TaylorSeries v0.15.2 + [62fd8b95] TensorCore v0.1.1 + [5d786b92] TerminalLoggers v0.1.7 + [8290d209] ThreadingUtilities v0.5.2 + [a759f4b9] TimerOutputs v0.5.23 + [c751599d] ToeplitzMatrices v0.8.2 + [0796e94c] Tokenize v0.5.26 + [3bb67fe8] TranscodingStreams v0.10.2 + [a2a6695c] TreeViews v0.3.0 + [d5829a12] TriangularSolve v0.1.20 + [410a4b4d] Tricks v0.1.8 + [781d530d] TruncatedStacktraces v1.4.0 + [5c2747f8] URIs v1.5.1 + [3a884ed6] UnPack v1.0.2 + [1cfade01] UnicodeFun v0.4.1 + [1986cc42] Unitful v1.18.0 + [45397f5d] UnitfulLatexify v1.6.3 + [a7c27f48] Unityper v0.1.5 + [41fe7b60] Unzip v0.2.0 + [3d5dd08c] VectorizationBase v0.21.64 + [81def892] VersionParsing v1.3.0 + [19fa3120] VertexSafeGraphs v0.2.0 + [44d3d7a6] Weave v0.10.12 + [1b915085] WinReg v1.0.0 + [ddb6d928] YAML v0.4.9 + [c2297ded] ZMQ v1.2.2 + [0518478a] deSolveDiffEq v0.1.1 + [6e34b625] Bzip2_jll v1.0.8+0 + [83423d85] Cairo_jll v1.16.1+1 + [2702e6a9] EpollShim_jll v0.0.20230411+0 + [2e619515] Expat_jll v2.5.0+0 + [b22a6f82] FFMPEG_jll v4.4.4+1 + [f5851436] FFTW_jll v3.3.10+0 + [a3f928ae] Fontconfig_jll v2.13.93+0 + [d7e528f0] FreeType2_jll v2.13.1+0 + [559328eb] FriBidi_jll v1.0.10+0 + [0656b61e] GLFW_jll v3.3.8+0 + [d2c73de3] GR_jll v0.72.10+0 + [78b55507] Gettext_jll v0.21.0+0 + [7746bdde] Glib_jll v2.76.5+0 + [3b182d85] Graphite2_jll v1.3.14+0 + [2e76f6c2] HarfBuzz_jll v2.8.1+1 + [1d5cc7b8] IntelOpenMP_jll v2023.2.0+0 + [aacddb02] JpegTurbo_jll v2.1.91+0 + [c1c5ebd0] LAME_jll v3.100.1+0 + [88015f11] LERC_jll v3.0.0+1 + [1d63c593] LLVMOpenMP_jll v15.0.4+0 + [aae0fff6] LSODA_jll v0.1.2+0 + [dd4b983a] LZO_jll v2.10.1+0 +⌅ [e9f186c6] Libffi_jll v3.2.2+1 + [d4300ac3] Libgcrypt_jll v1.8.7+0 + [7e76a0d4] Libglvnd_jll v1.6.0+0 + [7add5ba3] Libgpg_error_jll v1.42.0+0 + [94ce4f54] Libiconv_jll v1.17.0+0 + [4b2f31a3] Libmount_jll v2.35.0+0 + [89763e89] Libtiff_jll v4.5.1+1 + [38a345b3] Libuuid_jll v2.36.0+0 + [856f044c] MKL_jll v2023.2.0+0 + [c771fb93] ODEInterface_jll v0.0.1+0 + [e7412a2a] Ogg_jll v1.3.5+1 + [458c3c95] OpenSSL_jll v3.0.12+0 + [efe28fd5] OpenSpecFun_jll v0.5.5+0 + [91d4177d] Opus_jll v1.3.2+0 + [30392449] Pixman_jll v0.42.2+0 + [c0090381] Qt6Base_jll v6.5.3+1 + [f50d1b31] Rmath_jll v0.4.0+0 +⌅ [fb77eaff] Sundials_jll v5.2.1+0 + [a44049a8] Vulkan_Loader_jll v1.3.243+0 + [a2964d1f] Wayland_jll v1.21.0+1 + [2381bf8a] Wayland_protocols_jll v1.25.0+0 + [02c8fc9c] XML2_jll v2.11.5+0 + [aed1982a] XSLT_jll v1.1.34+0 + [ffd25f8a] XZ_jll v5.4.5+0 + [f67eecfb] Xorg_libICE_jll v1.0.10+1 + [c834827a] Xorg_libSM_jll v1.2.3+0 + [4f6342f7] Xorg_libX11_jll v1.8.6+0 + [0c0b7dd1] Xorg_libXau_jll v1.0.11+0 + [935fb764] Xorg_libXcursor_jll v1.2.0+4 + [a3789734] Xorg_libXdmcp_jll v1.1.4+0 + [1082639a] Xorg_libXext_jll v1.3.4+4 + [d091e8ba] Xorg_libXfixes_jll v5.0.3+4 + [a51aa0fd] Xorg_libXi_jll v1.7.10+4 + [d1454406] Xorg_libXinerama_jll v1.1.4+4 + [ec84b674] Xorg_libXrandr_jll v1.5.2+4 + [ea2f1a96] Xorg_libXrender_jll v0.9.10+4 + [14d82f49] Xorg_libpthread_stubs_jll v0.1.1+0 + [c7cfdc94] Xorg_libxcb_jll v1.15.0+0 + [cc61e674] Xorg_libxkbfile_jll v1.1.2+0 + [e920d4aa] Xorg_xcb_util_cursor_jll v0.1.4+0 + [12413925] Xorg_xcb_util_image_jll v0.4.0+1 + [2def613f] Xorg_xcb_util_jll v0.4.0+1 + [975044d2] Xorg_xcb_util_keysyms_jll v0.4.0+1 + [0d47668e] Xorg_xcb_util_renderutil_jll v0.3.9+1 + [c22f9ab0] Xorg_xcb_util_wm_jll v0.4.1+1 + [35661453] Xorg_xkbcomp_jll v1.4.6+0 + [33bec58e] Xorg_xkeyboard_config_jll v2.39.0+0 + [c5fb5394] Xorg_xtrans_jll v1.5.0+0 + [8f1865be] ZeroMQ_jll v4.3.4+0 + [3161d3a3] Zstd_jll v1.5.5+0 + [35ca27e7] eudev_jll v3.2.9+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 + [1a1c6b14] gperf_jll v3.1.1+0 + [a4ae2306] libaom_jll v3.4.0+0 + [0ac62f75] libass_jll v0.15.1+0 + [2db6ffa8] libevdev_jll v1.11.0+0 + [f638f0a6] libfdk_aac_jll v2.0.2+0 + [36db933b] libinput_jll v1.18.0+0 + [b53b4c65] libpng_jll v1.6.38+0 + [a9144af2] libsodium_jll v1.0.20+0 + [f27f6e37] libvorbis_jll v1.3.7+1 + [009596ad] mtdev_jll v1.1.6+0 + [1270edf5] x264_jll v2021.5.5+0 + [dfaa095f] x265_jll v3.5.0+0 + [d8fb68d0] xkbcommon_jll v1.4.1+1 + [0dad84c5] ArgTools v1.1.1 + [56f22d72] Artifacts + [2a0f44e3] Base64 + [ade2ca70] Dates + [8ba89e20] Distributed + [f43a241f] Downloads v1.6.0 + [7b1f6079] FileWatching + [9fa8497b] Future + [b77e0a4c] InteractiveUtils + [4af54fe1] LazyArtifacts + [b27032c2] LibCURL v0.6.4 + [76f85450] LibGit2 + [8f399da3] Libdl + [37e2e46d] LinearAlgebra + [56ddb016] Logging + [d6f4376e] Markdown + [a63ad114] Mmap + [ca575930] NetworkOptions v1.2.0 + [44cfe95a] Pkg v1.9.2 + [de0858da] Printf + [9abbd945] Profile + [3fa0cd96] REPL + [9a3f8284] Random + [ea8e919c] SHA v0.7.0 + [9e88b42a] Serialization + [1a1011a3] SharedArrays + [6462fe0b] Sockets + [2f01184e] SparseArrays + [10745b16] Statistics v1.9.0 + [4607b0f0] SuiteSparse + [fa267f1f] TOML v1.0.3 + [a4e569a6] Tar v1.10.0 + [8dfed614] Test + [cf7118a7] UUIDs + [4ec0a83e] Unicode + [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 + [c8ffd9c3] MbedTLS_jll v2.28.2+0 + [14a3606d] MozillaCACerts_jll v2022.10.11 + [4536629a] OpenBLAS_jll v0.3.21+4 + [05823500] OpenLibm_jll v0.8.1+0 + [efcefdf7] PCRE2_jll v10.42.0+0 + [bea87d4a] SuiteSparse_jll v5.10.1+6 + [83775a58] Zlib_jll v1.2.13+0 + [8e850b90] libblastrampoline_jll v5.8.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 + [3f19e933] p7zip_jll v17.4.0+0 +Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m` +``` + +```@raw html +
+``` + diff --git a/docs/src/benchmarks/pleiades.md b/docs/src/benchmarks/pleiades.md index 48a2ec475..1a10ebd50 100644 --- a/docs/src/benchmarks/pleiades.md +++ b/docs/src/benchmarks/pleiades.md @@ -1,25 +1,45 @@ # Pleiades benchmark + +!!! note "Summary" + Pleiades is a medium-dimensional, non-stiff, second-order ODE. We see that: + - [**The `EK0` is _much_ faster than the `EK1` as it scales linearly with the ODE dimension.**](@ref pleiades_results) + - [**If the problem is a second-order ODE, _implement it as a second-order ODE_!**](@ref pleiades_results) + + +```@raw html +
Code: +``` ```julia -using LinearAlgebra, Statistics -using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots +using LinearAlgebra, Statistics, Distributions +using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots, ODEInterfaceDiffEq using ModelingToolkit using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), ) -``` - - +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` +```@raw html +
+``` -### Pleiades problem definition +```@raw html +
Code: +``` ```julia # first-order ODE @fastmath function pleiades(du, u, p, t) @@ -70,19 +90,26 @@ du0 = [dx0; dy0] prob2 = SecondOrderODEProblem(pleiades2, du0, u0, tspan) probs = [prob1, prob2] -ref_sol1 = solve(prob1, Vern9(), abstol=1/10^14, reltol=1/10^14, dense=false) -ref_sol2 = solve(prob2, Vern9(), abstol=1/10^14, reltol=1/10^14, dense=false) +ref_sol1 = solve(prob1, Vern9(), abstol=1/10^14, reltol=1/10^14) +ref_sol2 = solve(prob2, Vern9(), abstol=1/10^14, reltol=1/10^14) ref_sols = [ref_sol1, ref_sol2] -plot(ref_sol1, idxs=[(14+i,21+i) for i in 1:7], title="Pleiades Solution", legend=false) +plot(ref_sol1, idxs=[(14+i,21+i) for i in 1:7], title="Pleiades Solution", legend=false, + xticks=:auto, yticks=:auto) scatter!(ref_sol1.u[end][15:21], ref_sol1.u[end][22:end], color=1:7) ``` +```@raw html +
+``` ![](figures/pleiades_2_1.svg) -## First-order ODE vs. second-order ODE +## [`EK0` vs `EK1` & first-order vs. second-order](@id pleiades_results) +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -90,10 +117,10 @@ SAVE_EVERYSTEP = false; _setups = [ "EK0(3) (1st order ODE)" => Dict(:alg => EK0(order=3, smooth=DENSE), :prob_choice => 1) "EK0(5) (1st order ODE)" => Dict(:alg => EK0(order=5, smooth=DENSE), :prob_choice => 1) - "EK1(3) (1st order ODE)" => Dict(:alg => EK1(order=3, smooth=DENSE), :prob_choice => 1) - "EK1(5) (1st order ODE)" => Dict(:alg => EK1(order=5, smooth=DENSE), :prob_choice => 1) "EK0(4) (2nd order ODE)" => Dict(:alg => EK0(order=4, smooth=DENSE), :prob_choice => 2) "EK0(6) (2nd order ODE)" => Dict(:alg => EK0(order=6, smooth=DENSE), :prob_choice => 2) + "EK1(3) (1st order ODE)" => Dict(:alg => EK1(order=3, smooth=DENSE), :prob_choice => 1) + "EK1(5) (1st order ODE)" => Dict(:alg => EK1(order=5, smooth=DENSE), :prob_choice => 1) "EK1(4) (2nd order ODE)" => Dict(:alg => EK1(order=4, smooth=DENSE), :prob_choice => 2) "EK1(6) (2nd order ODE)" => Dict(:alg => EK1(order=6, smooth=DENSE), :prob_choice => 2) ] @@ -107,43 +134,74 @@ reltols = 1.0 ./ 10.0 .^ (3:8) wp = WorkPrecisionSet( probs, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = ref_sols, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, + numruns = 5, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, color=[1 1 2 2 3 3 4 4], - # xticks = 10.0 .^ (-16:1:5) +color = [1 1 1 1 2 2 2 2] +linestyle = [:solid :solid :dash :dash :solid :solid :dash :dash] +plot(wp; color, linestyle) + +_ref_setups = [ + "Classic: Tsit5" => Dict(:alg => Tsit5(), :prob_choice => 1) + "Classic: RadauIIA5" => Dict(:alg => RadauIIA5(), :prob_choice => 1) + "Classic: DPRKN6" => Dict(:alg => DPRKN6(), :prob_choice => 2) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp = WorkPrecisionSet( + probs, abstols ./ 1000, reltols ./ 1000, ref_setups; + names = ref_labels, + appxsol = ref_sols, + dense = false, + save_everystep = false, + maxiters = Int(1e7), ) +plot!(ref_wp, x=:final, color=:gray, alpha=0.7, linestyle=[:solid :solid :dash]) +``` +```@raw html +
``` ![](figures/pleiades_3_1.svg) +### Calibration + +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, color, linestyle) +plot_chisq_interval!(length(u0)*2) +``` +```@raw html +
+``` + +![](figures/pleiades_4_1.svg) -## Conclusion -- If the problem is a second-order ODE, _implement it as a second-order ODE_! -- For best runtimes runtimes, use the `EK0`! ## Appendix -Computer information: +```@raw html +
Computer information: +``` + ```julia using InteractiveUtils InteractiveUtils.versioninfo() ``` ``` -Julia Version 1.9.3 -Commit bed2cd540a1 (2023-08-24 14:43 UTC) +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) Build Info: Official https://julialang.org/ release Platform Info: @@ -156,14 +214,16 @@ Platform Info: Environment: JULIA_NUM_THREADS = auto JULIA_STACKTRACE_MINIMAL = true - JULIA_IMAGE_THREADS = 1 ``` +```@raw html +
+``` +```@raw html +
Package information: +``` - - -Package Information: ```julia using Pkg Pkg.status() @@ -171,49 +231,55 @@ Pkg.status() ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 [7073ff75] IJulia v1.24.2 [7f56f5a3] LSODA v0.7.5 [e6f89c97] LoggingExtras v1.0.3 [e2752cbe] MATLABDiffEq v1.2.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 - [1dea7af3] OrdinaryDiffEq v6.58.1 + [1dea7af3] OrdinaryDiffEq v6.59.1 [65888b18] ParameterizedFunctions v5.16.0 [91a5bcdd] Plots v1.39.0 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` - [0bca4576] SciMLBase v2.6.0 + [0bca4576] SciMLBase v2.8.1 [505e40e9] SciPyDiffEq v0.2.1 + [ce78b400] SimpleUnPack v1.1.0 [90137ffa] StaticArrays v1.6.5 [c3572dad] Sundials v4.20.1 [44d3d7a6] Weave v0.10.12 [0518478a] deSolveDiffEq v0.1.1 +Info Packages marked with ⌃ have new versions available and may be upgradable. ``` +```@raw html +
+``` +```@raw html +
Full manifest: +``` - - -And the full manifest: ```julia Pkg.status(mode=Pkg.PKGMODE_MANIFEST) ``` ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` - [47edcb42] ADTypes v0.2.4 + [47edcb42] ADTypes v0.2.5 ⌅ [c3fe647b] AbstractAlgebra v0.32.5 [621f4979] AbstractFFTs v1.5.0 [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 [79e6a3ab] Adapt v3.7.1 [ec485272] ArnoldiMethod v0.2.0 [c9d4266f] ArrayAllocators v0.3.0 [4fba245c] ArrayInterface v7.5.1 - [30b0a656] ArrayInterfaceCore v0.1.29 [6e4b80f9] BenchmarkTools v1.3.2 [e2ed5e7c] Bijections v0.1.6 - [d1d4a3ce] BitFlags v0.1.7 + [d1d4a3ce] BitFlags v0.1.8 [62783981] BitTwiddlingConvenienceFunctions v0.1.5 [fa961155] CEnum v0.5.0 [2a0fbf3d] CPUSummary v0.2.4 @@ -233,9 +299,10 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bbf7d656] CommonSubexpressions v0.3.0 [34da2185] Compat v4.10.0 [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 [2569d6c7] ConcreteStructs v0.2.3 [f0e56b4a] ConcurrentUtilities v2.3.0 - [8f4d0f93] Conda v1.9.1 +⌃ [8f4d0f93] Conda v1.9.1 [187b0558] ConstructionBase v1.5.4 [d38c429a] Contour v0.6.2 [587fd27a] CovarianceEstimation v0.2.9 @@ -247,14 +314,14 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [864edb3b] DataStructures v0.18.15 [e2d170a0] DataValueInterfaces v1.0.0 [8bb1440f] DelimitedFiles v1.9.1 - [2b5f629d] DiffEqBase v6.136.0 + [2b5f629d] DiffEqBase v6.139.0 [459566f4] DiffEqCallbacks v2.33.1 - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 [77a26b50] DiffEqNoiseProcess v5.19.0 [163ba53b] DiffResults v1.1.0 [b552c78f] DiffRules v1.15.1 [b4f34e82] Distances v0.10.10 - [31c24e10] Distributions v0.25.102 + [31c24e10] Distributions v0.25.103 [ffbed154] DocStringExtensions v0.9.3 ⌅ [5b8099bc] DomainSets v0.6.7 [fa6b7ba4] DualNumbers v0.6.8 @@ -268,7 +335,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [e2ba6199] ExprTools v0.1.10 [c87230d0] FFMPEG v0.4.1 [7a1cc6ca] FFTW v1.7.1 - [7034ab61] FastBroadcast v0.2.7 + [7034ab61] FastBroadcast v0.2.8 [9aa1b823] FastClosures v0.3.2 [442a2c76] FastGaussQuadrature v1.0.0 [29a986be] FastLapackInterface v2.0.0 @@ -299,6 +366,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [842dd82b] InlineStrings v1.4.0 [18e54dd8] IntegerMathUtils v0.1.2 [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 [41ab1584] InvertedIndices v1.3.0 [92d709cd] IrrationalConstants v0.2.2 [c8e1da08] IterTools v1.8.0 @@ -316,33 +384,33 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2ee39098] LabelledArrays v1.14.0 [984bce1d] LambertW v0.4.6 [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 [10f19ff3] LayoutPointers v0.1.15 [50d2b5c4] Lazy v0.15.1 [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 [d3d80556] LineSearches v7.2.0 - [7ed4a6bd] LinearSolve v2.15.0 + [7ed4a6bd] LinearSolve v2.20.0 [2ab3a3ac] LogExpFunctions v0.3.26 [e6f89c97] LoggingExtras v1.0.3 - [bdcacae8] LoopVectorization v0.12.165 + [bdcacae8] LoopVectorization v0.12.166 [10e44e05] MATLAB v0.8.4 [e2752cbe] MATLABDiffEq v1.2.0 - [33e6dc65] MKL v0.6.1 [d8e11817] MLStyle v0.4.17 [1914dd2f] MacroTools v0.5.11 [d125e4d3] ManualMemory v0.1.8 - [739be429] MbedTLS v1.1.7 + [739be429] MbedTLS v1.1.8 [442fdcdd] Measures v0.3.2 [e1d29d7a] Missings v1.1.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [46d2c3a1] MuladdMacro v0.2.4 [102ac46a] MultivariatePolynomials v0.5.2 - [ffc61752] Mustache v1.0.18 + [ffc61752] Mustache v1.0.19 [d8a4904e] MutableArithmetics v1.3.3 [d41bc354] NLSolversBase v7.8.3 [2774e3e8] NLsolve v4.5.1 [77ba4419] NaNMath v1.0.2 ⌅ [356022a1] NamedDims v0.2.50 - [8913a72c] NonlinearSolve v2.6.0 + [8913a72c] NonlinearSolve v2.8.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 [6fd5a793] Octavian v0.3.27 @@ -350,20 +418,20 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [4d8831e6] OpenSSL v1.4.1 [429524aa] Optim v1.7.8 [bac558e1] OrderedCollections v1.6.2 - [1dea7af3] OrdinaryDiffEq v6.58.1 - [90014a1f] PDMats v0.11.28 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 [fe68d972] PSDMatrices v0.4.6 [65ce6f38] PackageExtensionCompat v1.0.2 [65888b18] ParameterizedFunctions v5.16.0 [d96e819e] Parameters v0.12.3 - [69de0a69] Parsers v2.7.2 + [69de0a69] Parsers v2.8.0 [b98c9c47] Pipe v1.3.0 [32113eaa] PkgBenchmark v0.2.12 [ccf2f8ad] PlotThemes v3.1.0 [995b91a9] PlotUtils v1.3.5 [91a5bcdd] Plots v1.39.0 [e409e4f3] PoissonRandom v0.4.4 - [f517fe37] Polyester v0.7.8 + [f517fe37] Polyester v0.7.9 [1d0040c9] PolyesterWeave v0.2.1 ⌅ [f27b6e38] Polynomials v3.2.13 [2dfb63ee] PooledArrays v1.4.3 @@ -371,12 +439,13 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [d236fae5] PreallocationTools v0.4.12 [aea7be01] PrecompileTools v1.2.0 [21216c6a] Preferences v1.4.1 - [08abe8d2] PrettyTables v2.2.8 - [27ebfcd6] Primes v0.5.4 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` [33c8b6b6] ProgressLogging v0.1.4 - [438e738f] PyCall v1.96.1 + [438e738f] PyCall v1.96.2 [1fd47b50] QuadGK v2.9.1 +⌃ [8a4e6c94] QuasiMonteCarlo v0.3.2 [6f49c342] RCall v0.13.18 [74087812] Random123 v1.6.1 [fb686558] RandomExtensions v0.4.4 @@ -384,7 +453,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [3cdcf5f2] RecipesBase v1.3.4 [01d81517] RecipesPipeline v0.6.12 [731186ca] RecursiveArrayTools v2.38.10 - [f2c3362d] RecursiveFactorization v0.2.20 + [f2c3362d] RecursiveFactorization v0.2.21 [189a3867] Reexport v1.2.2 [05181044] RelocatableFolders v1.0.1 [ae029012] Requires v1.3.0 @@ -392,26 +461,27 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [79098fc4] Rmath v0.7.1 [47965b36] RootedTrees v2.19.2 [7e49a35a] RuntimeGeneratedFunctions v0.5.12 - [fdea26ae] SIMD v3.4.5 + [fdea26ae] SIMD v3.4.6 [94e857df] SIMDTypes v0.1.0 [476501e8] SLEEFPirates v0.6.42 - [0bca4576] SciMLBase v2.6.0 + [0bca4576] SciMLBase v2.8.1 [e9a6253c] SciMLNLSolve v0.1.9 - [c0aeaf25] SciMLOperators v0.3.6 + [c0aeaf25] SciMLOperators v0.3.7 [505e40e9] SciPyDiffEq v0.2.1 - [6c6a2e73] Scratch v1.2.0 - [91c51154] SentinelArrays v1.4.0 + [6c6a2e73] Scratch v1.2.1 + [91c51154] SentinelArrays v1.4.1 [efcf1570] Setfield v1.1.1 [1277b4bf] ShiftedArrays v2.0.0 [992d4aef] Showoff v1.0.3 [777ac1f9] SimpleBufferStream v1.1.0 - [727e6d20] SimpleNonlinearSolve v0.1.23 + [727e6d20] SimpleNonlinearSolve v0.1.25 [699a6c99] SimpleTraits v0.9.4 [ce78b400] SimpleUnPack v1.1.0 [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 [b85f4697] SoftGlobalScope v1.1.0 [a2af1166] SortingAlgorithms v1.2.0 - [47a9eef4] SparseDiffTools v2.9.2 +⌃ [47a9eef4] SparseDiffTools v2.11.0 [e56a9233] Sparspak v0.3.9 [276daf66] SpecialFunctions v2.3.1 [928aab9d] SpecialMatrices v3.0.0 @@ -423,7 +493,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2913bbd2] StatsBase v0.34.2 [4c63d2b9] StatsFuns v1.3.0 [3eaba693] StatsModels v0.7.3 -⌅ [7792a7ef] StrideArraysCore v0.4.17 + [7792a7ef] StrideArraysCore v0.5.1 [69024149] StringEncodings v0.3.7 [892a3eda] StringManipulation v0.3.4 [09ab397b] StructArrays v0.6.16 @@ -433,15 +503,15 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [0c5d862f] Symbolics v5.10.0 [3783bdb8] TableTraits v1.0.1 [bd369af6] Tables v1.11.1 - [92b13dbe] TaylorIntegration v0.14.3 + [92b13dbe] TaylorIntegration v0.14.4 [6aa5eb33] TaylorSeries v0.15.2 [62fd8b95] TensorCore v0.1.1 [5d786b92] TerminalLoggers v0.1.7 [8290d209] ThreadingUtilities v0.5.2 [a759f4b9] TimerOutputs v0.5.23 [c751599d] ToeplitzMatrices v0.8.2 - [0796e94c] Tokenize v0.5.25 - [3bb67fe8] TranscodingStreams v0.10.1 + [0796e94c] Tokenize v0.5.26 + [3bb67fe8] TranscodingStreams v0.10.2 [a2a6695c] TreeViews v0.3.0 [d5829a12] TriangularSolve v0.1.20 [410a4b4d] Tricks v0.1.8 @@ -449,7 +519,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [5c2747f8] URIs v1.5.1 [3a884ed6] UnPack v1.0.2 [1cfade01] UnicodeFun v0.4.1 - [1986cc42] Unitful v1.17.0 + [1986cc42] Unitful v1.18.0 [45397f5d] UnitfulLatexify v1.6.3 [a7c27f48] Unityper v0.1.5 [41fe7b60] Unzip v0.2.0 @@ -460,13 +530,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [1b915085] WinReg v1.0.0 [ddb6d928] YAML v0.4.9 [c2297ded] ZMQ v1.2.2 - [700de1a5] ZygoteRules v0.2.4 [0518478a] deSolveDiffEq v0.1.1 [6e34b625] Bzip2_jll v1.0.8+0 [83423d85] Cairo_jll v1.16.1+1 [2702e6a9] EpollShim_jll v0.0.20230411+0 [2e619515] Expat_jll v2.5.0+0 -⌃ [b22a6f82] FFMPEG_jll v4.4.2+2 + [b22a6f82] FFMPEG_jll v4.4.4+1 [f5851436] FFTW_jll v3.3.10+0 [a3f928ae] Fontconfig_jll v2.13.93+0 [d7e528f0] FreeType2_jll v2.13.1+0 @@ -495,11 +564,11 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [856f044c] MKL_jll v2023.2.0+0 [c771fb93] ODEInterface_jll v0.0.1+0 [e7412a2a] Ogg_jll v1.3.5+1 -⌅ [458c3c95] OpenSSL_jll v1.1.23+0 + [458c3c95] OpenSSL_jll v3.0.12+0 [efe28fd5] OpenSpecFun_jll v0.5.5+0 [91d4177d] Opus_jll v1.3.2+0 [30392449] Pixman_jll v0.42.2+0 - [c0090381] Qt6Base_jll v6.5.2+2 + [c0090381] Qt6Base_jll v6.5.3+1 [f50d1b31] Rmath_jll v0.4.0+0 ⌅ [fb77eaff] Sundials_jll v5.2.1+0 [a44049a8] Vulkan_Loader_jll v1.3.243+0 @@ -507,7 +576,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2381bf8a] Wayland_protocols_jll v1.25.0+0 [02c8fc9c] XML2_jll v2.11.5+0 [aed1982a] XSLT_jll v1.1.34+0 - [ffd25f8a] XZ_jll v5.4.4+0 + [ffd25f8a] XZ_jll v5.4.5+0 [f67eecfb] Xorg_libICE_jll v1.0.10+1 [c834827a] Xorg_libSM_jll v1.2.3+0 [4f6342f7] Xorg_libX11_jll v1.8.6+0 @@ -535,7 +604,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [8f1865be] ZeroMQ_jll v4.3.4+0 [3161d3a3] Zstd_jll v1.5.5+0 [35ca27e7] eudev_jll v3.2.9+0 - [214eeab7] fzf_jll v0.35.1+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 [1a1c6b14] gperf_jll v3.1.1+0 [a4ae2306] libaom_jll v3.4.0+0 [0ac62f75] libass_jll v0.15.1+0 @@ -559,7 +628,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [9fa8497b] Future [b77e0a4c] InteractiveUtils [4af54fe1] LazyArtifacts - [b27032c2] LibCURL v0.6.3 + [b27032c2] LibCURL v0.6.4 [76f85450] LibGit2 [8f399da3] Libdl [37e2e46d] LinearAlgebra @@ -585,8 +654,8 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [cf7118a7] UUIDs [4ec0a83e] Unicode [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 - [deac9b47] LibCURL_jll v7.84.0+0 - [29816b5a] LibSSH2_jll v1.10.2+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 [c8ffd9c3] MbedTLS_jll v2.28.2+0 [14a3606d] MozillaCACerts_jll v2022.10.11 [4536629a] OpenBLAS_jll v0.3.21+4 @@ -595,11 +664,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bea87d4a] SuiteSparse_jll v5.10.1+6 [83775a58] Zlib_jll v1.2.13+0 [8e850b90] libblastrampoline_jll v5.8.0+0 - [8e850ede] nghttp2_jll v1.48.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 [3f19e933] p7zip_jll v17.4.0+0 -Info Packages marked with ⌃ and ⌅ have new versions available, but those wi -th ⌅ are restricted by compatibility constraints from upgrading. To see why - use `status --outdated -m` +Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m` ``` +```@raw html +
+``` diff --git a/docs/src/benchmarks/rober.md b/docs/src/benchmarks/rober.md index f39f51419..97f454674 100644 --- a/docs/src/benchmarks/rober.md +++ b/docs/src/benchmarks/rober.md @@ -1,28 +1,47 @@ # ROBER benchmark + +!!! note "Summary" + - [**The `EK1` can solve mass-matrix DAEs.** But for this problem, it only works well for low tolerances.](@ref rober_results) + - For this problem it only works well for low tolerances, but the order-to-error-tolerance heuristic should in principle still hold: lower tolerance level ``\rightarrow`` higher order. + + Adapted from [SciMLBenchmarks.jl](https://docs.sciml.ai/SciMLBenchmarksOutput/stable/DAE/ROBERDAE/). +```@raw html +
Code: +``` ```julia -using LinearAlgebra, Statistics +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Sundials, Plots using ModelingToolkit using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks=10.0 .^ (-16:1:16), ) -``` - - +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` +```@raw html +
+``` -### ROBER problem definition +```@raw html +
Code: +``` ```julia @variables t y₁(t)=1.0 y₂(t)=0.0 y₃(t)=0.0 @parameters k₁=0.04 k₂=3e7 k₃=1e4 @@ -37,16 +56,22 @@ mmprob = ODEProblem(sys,[],(0.0,1e5)) daeprob = DAEProblem(sys,[D(y₁)=>-0.04, D(y₂)=>0.04, D(y₃)=>0.0],[],(0.0,1e5)) # can't handle this yet odaeprob = ODAEProblem(structural_simplify(sys),[],(0.0,1e5)) # can't handle this yet -ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14,dense=false) -plot(ref_sol, idxs=[y₁,y₂,y₃], title="ROBER Solution", legend=false, ylims=(0, 1)) +ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14) +plot(ref_sol, idxs=[y₁,y₂,y₃], title="ROBER Solution", legend=false, ylims=(0, 1), xticks=:auto) +``` +```@raw html +
``` ![](figures/rober_2_1.svg) -## EK1 across orders +## [`EK1` across orders](@id rober_results) +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -59,47 +84,80 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (4:8) -reltols = 1.0 ./ 10.0 .^ (1:5) +abstols = 1.0 ./ 10.0 .^ (4:7) +reltols = 1.0 ./ 10.0 .^ (1:4) wp = WorkPrecisionSet( mmprob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = ref_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + + +_ref_setups = [ + "Rosenbrock23" => Dict(:alg => Rosenbrock23()) + "Rodas4P" => Dict(:alg => Rodas4P()) + "RadauIIA" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp = WorkPrecisionSet( + mmprob, abstols ./ 10000, reltols ./ 10000, ref_setups; + names = ref_labels, + appxsol = ref_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), +) +plot!(ref_wp, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` ![](figures/rober_3_1.svg) +### Calibration + +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", + palette=Plots.palette([:blue, :red], length(_setups))) +plot_chisq_interval!(3) +``` +```@raw html +
+``` + +![](figures/rober_4_1.svg) -## Conclusion -- The `EK1` can solve mass-matrix DAEs! But it only really works well for low errors. -- Order 3 seems to work well here. But the order-to-error-tolerance heuristic should in principle still hold: lower tolerance level ``\rightarrow`` higher order. ## Appendix -Computer information: +```@raw html +
Computer information: +``` + ```julia using InteractiveUtils InteractiveUtils.versioninfo() ``` ``` -Julia Version 1.9.3 -Commit bed2cd540a1 (2023-08-24 14:43 UTC) +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) Build Info: Official https://julialang.org/ release Platform Info: @@ -112,14 +170,16 @@ Platform Info: Environment: JULIA_NUM_THREADS = auto JULIA_STACKTRACE_MINIMAL = true - JULIA_IMAGE_THREADS = 1 ``` +```@raw html +
+``` +```@raw html +
Package information: +``` - - -Package Information: ```julia using Pkg Pkg.status() @@ -127,49 +187,55 @@ Pkg.status() ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 [7073ff75] IJulia v1.24.2 [7f56f5a3] LSODA v0.7.5 [e6f89c97] LoggingExtras v1.0.3 [e2752cbe] MATLABDiffEq v1.2.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 - [1dea7af3] OrdinaryDiffEq v6.58.1 + [1dea7af3] OrdinaryDiffEq v6.59.1 [65888b18] ParameterizedFunctions v5.16.0 [91a5bcdd] Plots v1.39.0 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` - [0bca4576] SciMLBase v2.6.0 + [0bca4576] SciMLBase v2.8.1 [505e40e9] SciPyDiffEq v0.2.1 + [ce78b400] SimpleUnPack v1.1.0 [90137ffa] StaticArrays v1.6.5 [c3572dad] Sundials v4.20.1 [44d3d7a6] Weave v0.10.12 [0518478a] deSolveDiffEq v0.1.1 +Info Packages marked with ⌃ have new versions available and may be upgradable. ``` +```@raw html +
+``` +```@raw html +
Full manifest: +``` - - -And the full manifest: ```julia Pkg.status(mode=Pkg.PKGMODE_MANIFEST) ``` ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` - [47edcb42] ADTypes v0.2.4 + [47edcb42] ADTypes v0.2.5 ⌅ [c3fe647b] AbstractAlgebra v0.32.5 [621f4979] AbstractFFTs v1.5.0 [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 [79e6a3ab] Adapt v3.7.1 [ec485272] ArnoldiMethod v0.2.0 [c9d4266f] ArrayAllocators v0.3.0 [4fba245c] ArrayInterface v7.5.1 - [30b0a656] ArrayInterfaceCore v0.1.29 [6e4b80f9] BenchmarkTools v1.3.2 [e2ed5e7c] Bijections v0.1.6 - [d1d4a3ce] BitFlags v0.1.7 + [d1d4a3ce] BitFlags v0.1.8 [62783981] BitTwiddlingConvenienceFunctions v0.1.5 [fa961155] CEnum v0.5.0 [2a0fbf3d] CPUSummary v0.2.4 @@ -189,9 +255,10 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bbf7d656] CommonSubexpressions v0.3.0 [34da2185] Compat v4.10.0 [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 [2569d6c7] ConcreteStructs v0.2.3 [f0e56b4a] ConcurrentUtilities v2.3.0 - [8f4d0f93] Conda v1.9.1 +⌃ [8f4d0f93] Conda v1.9.1 [187b0558] ConstructionBase v1.5.4 [d38c429a] Contour v0.6.2 [587fd27a] CovarianceEstimation v0.2.9 @@ -203,14 +270,14 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [864edb3b] DataStructures v0.18.15 [e2d170a0] DataValueInterfaces v1.0.0 [8bb1440f] DelimitedFiles v1.9.1 - [2b5f629d] DiffEqBase v6.136.0 + [2b5f629d] DiffEqBase v6.139.0 [459566f4] DiffEqCallbacks v2.33.1 - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 [77a26b50] DiffEqNoiseProcess v5.19.0 [163ba53b] DiffResults v1.1.0 [b552c78f] DiffRules v1.15.1 [b4f34e82] Distances v0.10.10 - [31c24e10] Distributions v0.25.102 + [31c24e10] Distributions v0.25.103 [ffbed154] DocStringExtensions v0.9.3 ⌅ [5b8099bc] DomainSets v0.6.7 [fa6b7ba4] DualNumbers v0.6.8 @@ -224,7 +291,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [e2ba6199] ExprTools v0.1.10 [c87230d0] FFMPEG v0.4.1 [7a1cc6ca] FFTW v1.7.1 - [7034ab61] FastBroadcast v0.2.7 + [7034ab61] FastBroadcast v0.2.8 [9aa1b823] FastClosures v0.3.2 [442a2c76] FastGaussQuadrature v1.0.0 [29a986be] FastLapackInterface v2.0.0 @@ -255,6 +322,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [842dd82b] InlineStrings v1.4.0 [18e54dd8] IntegerMathUtils v0.1.2 [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 [41ab1584] InvertedIndices v1.3.0 [92d709cd] IrrationalConstants v0.2.2 [c8e1da08] IterTools v1.8.0 @@ -272,33 +340,33 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2ee39098] LabelledArrays v1.14.0 [984bce1d] LambertW v0.4.6 [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 [10f19ff3] LayoutPointers v0.1.15 [50d2b5c4] Lazy v0.15.1 [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 [d3d80556] LineSearches v7.2.0 - [7ed4a6bd] LinearSolve v2.15.0 + [7ed4a6bd] LinearSolve v2.20.0 [2ab3a3ac] LogExpFunctions v0.3.26 [e6f89c97] LoggingExtras v1.0.3 - [bdcacae8] LoopVectorization v0.12.165 + [bdcacae8] LoopVectorization v0.12.166 [10e44e05] MATLAB v0.8.4 [e2752cbe] MATLABDiffEq v1.2.0 - [33e6dc65] MKL v0.6.1 [d8e11817] MLStyle v0.4.17 [1914dd2f] MacroTools v0.5.11 [d125e4d3] ManualMemory v0.1.8 - [739be429] MbedTLS v1.1.7 + [739be429] MbedTLS v1.1.8 [442fdcdd] Measures v0.3.2 [e1d29d7a] Missings v1.1.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [46d2c3a1] MuladdMacro v0.2.4 [102ac46a] MultivariatePolynomials v0.5.2 - [ffc61752] Mustache v1.0.18 + [ffc61752] Mustache v1.0.19 [d8a4904e] MutableArithmetics v1.3.3 [d41bc354] NLSolversBase v7.8.3 [2774e3e8] NLsolve v4.5.1 [77ba4419] NaNMath v1.0.2 ⌅ [356022a1] NamedDims v0.2.50 - [8913a72c] NonlinearSolve v2.6.0 + [8913a72c] NonlinearSolve v2.8.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 [6fd5a793] Octavian v0.3.27 @@ -306,20 +374,20 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [4d8831e6] OpenSSL v1.4.1 [429524aa] Optim v1.7.8 [bac558e1] OrderedCollections v1.6.2 - [1dea7af3] OrdinaryDiffEq v6.58.1 - [90014a1f] PDMats v0.11.28 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 [fe68d972] PSDMatrices v0.4.6 [65ce6f38] PackageExtensionCompat v1.0.2 [65888b18] ParameterizedFunctions v5.16.0 [d96e819e] Parameters v0.12.3 - [69de0a69] Parsers v2.7.2 + [69de0a69] Parsers v2.8.0 [b98c9c47] Pipe v1.3.0 [32113eaa] PkgBenchmark v0.2.12 [ccf2f8ad] PlotThemes v3.1.0 [995b91a9] PlotUtils v1.3.5 [91a5bcdd] Plots v1.39.0 [e409e4f3] PoissonRandom v0.4.4 - [f517fe37] Polyester v0.7.8 + [f517fe37] Polyester v0.7.9 [1d0040c9] PolyesterWeave v0.2.1 ⌅ [f27b6e38] Polynomials v3.2.13 [2dfb63ee] PooledArrays v1.4.3 @@ -327,12 +395,13 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [d236fae5] PreallocationTools v0.4.12 [aea7be01] PrecompileTools v1.2.0 [21216c6a] Preferences v1.4.1 - [08abe8d2] PrettyTables v2.2.8 - [27ebfcd6] Primes v0.5.4 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` [33c8b6b6] ProgressLogging v0.1.4 - [438e738f] PyCall v1.96.1 + [438e738f] PyCall v1.96.2 [1fd47b50] QuadGK v2.9.1 +⌃ [8a4e6c94] QuasiMonteCarlo v0.3.2 [6f49c342] RCall v0.13.18 [74087812] Random123 v1.6.1 [fb686558] RandomExtensions v0.4.4 @@ -340,7 +409,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [3cdcf5f2] RecipesBase v1.3.4 [01d81517] RecipesPipeline v0.6.12 [731186ca] RecursiveArrayTools v2.38.10 - [f2c3362d] RecursiveFactorization v0.2.20 + [f2c3362d] RecursiveFactorization v0.2.21 [189a3867] Reexport v1.2.2 [05181044] RelocatableFolders v1.0.1 [ae029012] Requires v1.3.0 @@ -348,26 +417,27 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [79098fc4] Rmath v0.7.1 [47965b36] RootedTrees v2.19.2 [7e49a35a] RuntimeGeneratedFunctions v0.5.12 - [fdea26ae] SIMD v3.4.5 + [fdea26ae] SIMD v3.4.6 [94e857df] SIMDTypes v0.1.0 [476501e8] SLEEFPirates v0.6.42 - [0bca4576] SciMLBase v2.6.0 + [0bca4576] SciMLBase v2.8.1 [e9a6253c] SciMLNLSolve v0.1.9 - [c0aeaf25] SciMLOperators v0.3.6 + [c0aeaf25] SciMLOperators v0.3.7 [505e40e9] SciPyDiffEq v0.2.1 - [6c6a2e73] Scratch v1.2.0 - [91c51154] SentinelArrays v1.4.0 + [6c6a2e73] Scratch v1.2.1 + [91c51154] SentinelArrays v1.4.1 [efcf1570] Setfield v1.1.1 [1277b4bf] ShiftedArrays v2.0.0 [992d4aef] Showoff v1.0.3 [777ac1f9] SimpleBufferStream v1.1.0 - [727e6d20] SimpleNonlinearSolve v0.1.23 + [727e6d20] SimpleNonlinearSolve v0.1.25 [699a6c99] SimpleTraits v0.9.4 [ce78b400] SimpleUnPack v1.1.0 [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 [b85f4697] SoftGlobalScope v1.1.0 [a2af1166] SortingAlgorithms v1.2.0 - [47a9eef4] SparseDiffTools v2.9.2 +⌃ [47a9eef4] SparseDiffTools v2.11.0 [e56a9233] Sparspak v0.3.9 [276daf66] SpecialFunctions v2.3.1 [928aab9d] SpecialMatrices v3.0.0 @@ -379,7 +449,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2913bbd2] StatsBase v0.34.2 [4c63d2b9] StatsFuns v1.3.0 [3eaba693] StatsModels v0.7.3 -⌅ [7792a7ef] StrideArraysCore v0.4.17 + [7792a7ef] StrideArraysCore v0.5.1 [69024149] StringEncodings v0.3.7 [892a3eda] StringManipulation v0.3.4 [09ab397b] StructArrays v0.6.16 @@ -389,15 +459,15 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [0c5d862f] Symbolics v5.10.0 [3783bdb8] TableTraits v1.0.1 [bd369af6] Tables v1.11.1 - [92b13dbe] TaylorIntegration v0.14.3 + [92b13dbe] TaylorIntegration v0.14.4 [6aa5eb33] TaylorSeries v0.15.2 [62fd8b95] TensorCore v0.1.1 [5d786b92] TerminalLoggers v0.1.7 [8290d209] ThreadingUtilities v0.5.2 [a759f4b9] TimerOutputs v0.5.23 [c751599d] ToeplitzMatrices v0.8.2 - [0796e94c] Tokenize v0.5.25 - [3bb67fe8] TranscodingStreams v0.10.1 + [0796e94c] Tokenize v0.5.26 + [3bb67fe8] TranscodingStreams v0.10.2 [a2a6695c] TreeViews v0.3.0 [d5829a12] TriangularSolve v0.1.20 [410a4b4d] Tricks v0.1.8 @@ -405,7 +475,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [5c2747f8] URIs v1.5.1 [3a884ed6] UnPack v1.0.2 [1cfade01] UnicodeFun v0.4.1 - [1986cc42] Unitful v1.17.0 + [1986cc42] Unitful v1.18.0 [45397f5d] UnitfulLatexify v1.6.3 [a7c27f48] Unityper v0.1.5 [41fe7b60] Unzip v0.2.0 @@ -416,13 +486,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [1b915085] WinReg v1.0.0 [ddb6d928] YAML v0.4.9 [c2297ded] ZMQ v1.2.2 - [700de1a5] ZygoteRules v0.2.4 [0518478a] deSolveDiffEq v0.1.1 [6e34b625] Bzip2_jll v1.0.8+0 [83423d85] Cairo_jll v1.16.1+1 [2702e6a9] EpollShim_jll v0.0.20230411+0 [2e619515] Expat_jll v2.5.0+0 -⌃ [b22a6f82] FFMPEG_jll v4.4.2+2 + [b22a6f82] FFMPEG_jll v4.4.4+1 [f5851436] FFTW_jll v3.3.10+0 [a3f928ae] Fontconfig_jll v2.13.93+0 [d7e528f0] FreeType2_jll v2.13.1+0 @@ -451,11 +520,11 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [856f044c] MKL_jll v2023.2.0+0 [c771fb93] ODEInterface_jll v0.0.1+0 [e7412a2a] Ogg_jll v1.3.5+1 -⌅ [458c3c95] OpenSSL_jll v1.1.23+0 + [458c3c95] OpenSSL_jll v3.0.12+0 [efe28fd5] OpenSpecFun_jll v0.5.5+0 [91d4177d] Opus_jll v1.3.2+0 [30392449] Pixman_jll v0.42.2+0 - [c0090381] Qt6Base_jll v6.5.2+2 + [c0090381] Qt6Base_jll v6.5.3+1 [f50d1b31] Rmath_jll v0.4.0+0 ⌅ [fb77eaff] Sundials_jll v5.2.1+0 [a44049a8] Vulkan_Loader_jll v1.3.243+0 @@ -463,7 +532,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2381bf8a] Wayland_protocols_jll v1.25.0+0 [02c8fc9c] XML2_jll v2.11.5+0 [aed1982a] XSLT_jll v1.1.34+0 - [ffd25f8a] XZ_jll v5.4.4+0 + [ffd25f8a] XZ_jll v5.4.5+0 [f67eecfb] Xorg_libICE_jll v1.0.10+1 [c834827a] Xorg_libSM_jll v1.2.3+0 [4f6342f7] Xorg_libX11_jll v1.8.6+0 @@ -491,7 +560,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [8f1865be] ZeroMQ_jll v4.3.4+0 [3161d3a3] Zstd_jll v1.5.5+0 [35ca27e7] eudev_jll v3.2.9+0 - [214eeab7] fzf_jll v0.35.1+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 [1a1c6b14] gperf_jll v3.1.1+0 [a4ae2306] libaom_jll v3.4.0+0 [0ac62f75] libass_jll v0.15.1+0 @@ -515,7 +584,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [9fa8497b] Future [b77e0a4c] InteractiveUtils [4af54fe1] LazyArtifacts - [b27032c2] LibCURL v0.6.3 + [b27032c2] LibCURL v0.6.4 [76f85450] LibGit2 [8f399da3] Libdl [37e2e46d] LinearAlgebra @@ -541,8 +610,8 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [cf7118a7] UUIDs [4ec0a83e] Unicode [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 - [deac9b47] LibCURL_jll v7.84.0+0 - [29816b5a] LibSSH2_jll v1.10.2+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 [c8ffd9c3] MbedTLS_jll v2.28.2+0 [14a3606d] MozillaCACerts_jll v2022.10.11 [4536629a] OpenBLAS_jll v0.3.21+4 @@ -551,9 +620,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bea87d4a] SuiteSparse_jll v5.10.1+6 [83775a58] Zlib_jll v1.2.13+0 [8e850b90] libblastrampoline_jll v5.8.0+0 - [8e850ede] nghttp2_jll v1.48.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 [3f19e933] p7zip_jll v17.4.0+0 -Info Packages marked with ⌃ and ⌅ have new versions available, but those wi -th ⌅ are restricted by compatibility constraints from upgrading. To see why - use `status --outdated -m` +Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m` ``` + +```@raw html +
+``` + diff --git a/docs/src/benchmarks/vanderpol.md b/docs/src/benchmarks/vanderpol.md index 7123947f6..16cae70bd 100644 --- a/docs/src/benchmarks/vanderpol.md +++ b/docs/src/benchmarks/vanderpol.md @@ -1,45 +1,72 @@ # Van der Pol benchmark +!!! note "Summary" + Van der Pol is a low-dimensional, stiff, second-order ODE. We see that: + - [**The `EK1` is very well able to solve stiff problems.**](@ref vdp_main_results) + - [**Since Van der Pol is actually a second-order ODE, _do solve it as a second-order ODE_.**](@ref vdp_second_order) + - [**Use the `TaylorInit` or `ForwardDiffInit` initialization.**](@ref vdp_initialization) + While `SimpleInit` works well for lower orders, it fails for higher orders. And since Taylor-mode initialization is fast and works well, there is no reason not to use it. + + +```@raw html +
Code: +``` ```julia -using LinearAlgebra, Statistics +using LinearAlgebra, Statistics, Distributions using DiffEqDevTools, ParameterizedFunctions, SciMLBase, OrdinaryDiffEq, Plots using ProbNumDiffEq -# Plotting theme -theme(:dao; +Plots.theme( + :dao; markerstrokewidth=0.5, legend=:outertopright, - bottom_margin=5Plots.mm, - size = (1000, 400), + margin=5Plots.mm, + xticks = 10.0 .^ (-16:1:16) ) -``` - - +function plot_chisq_interval!(df, q=0.01) + dist = Chisq(df) + low, high, mid = quantile(dist, [q, 1-q])..., mean(dist) + hline!([low, high], linestyle=:dash, color=:black, label="", + fill_between=[high nothing], fillcolor=:green, fillalpha=0.15) + hline!([mid], linestyle=:solid, color=:black, label="") +end +``` +```@raw html +
+``` -### Van der Pol problem definition +```@raw html +
Code: +``` ```julia function vanderpol!(du, u, p, t) du[1] = u[2] du[2] = p[1] * ((1 - u[1]^2) * u[2] - u[1]) end p = [1e5] -tspan = (0.0, 6.3) +tspan = (0.0, 2.0) u0 = [2.0, 0.0] prob = ODEProblem(vanderpol!, u0, tspan, p) -test_sol = solve(prob, RadauIIA5(), abstol=1/10^14, reltol=1/10^14, dense=false) -plot(test_sol, title="Van der Pol Solution", legend=false, ylims=(-2.5, 2.5)) +test_sol = solve(prob, RadauIIA5(), abstol=1/10^14, reltol=1/10^14) +plot(test_sol, title="Van der Pol Solution", legend=false, ylims=(-5, 5), xticks=:auto) +``` +```@raw html +
``` ![](figures/vanderpol_2_1.svg) -## EK1 across orders +## [`EK1` across orders](@id vdp_main_results) +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -52,31 +79,143 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (6:13) -reltols = 1.0 ./ 10.0 .^ (3:10) +abstols = 1.0 ./ 10.0 .^ (6:11) +reltols = 1.0 ./ 10.0 .^ (3:8) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) +plot(wp, palette=Plots.palette([:blue, :red], length(_setups))) + +_ref_setups = [ + "Rosenbrock23" => Dict(:alg => Rosenbrock23()) + "Rodas4P" => Dict(:alg => Rodas4P()) + "RadauIIA5" => Dict(:alg => RadauIIA5()) +] +ref_labels = first.(_ref_setups) +ref_setups = last.(_ref_setups) +ref_wp_final = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = false, + save_everystep = false, + maxiters = Int(1e7), +) +ref_wp_dense = WorkPrecisionSet( + prob, abstols, reltols, ref_setups; + names = ref_labels, + appxsol = test_sol, + dense = true, + save_everystep = true, + maxiters = Int(1e7), +) + +plot!(ref_wp_final, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` ![](figures/vanderpol_3_1.svg) -## Comparison of the different initialization schemes +```@raw html +
Discrete time-series errors (l2): +``` +```@raw html +
Code: +``` +```julia +DENSE = true; +SAVE_EVERYSTEP = true; +_setups = [ + "EK1($order)" => Dict(:alg => EK1(order=order, smooth=DENSE)) + for order in 3:7 +] + +labels = first.(_setups) +setups = last.(_setups) + +abstols = 1.0 ./ 10.0 .^ (6:11) +reltols = 1.0 ./ 10.0 .^ (3:8) + +wp = WorkPrecisionSet( + prob, abstols, reltols, setups; + names = labels, + appxsol = test_sol, + dense = DENSE, + save_everystep = SAVE_EVERYSTEP, + maxiters = Int(1e7), + numruns = 5, +) + +plot(wp, x=:l2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:l2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/vanderpol_4_1.svg) + + +```@raw html +
+``` + +```@raw html +
Interpolation errors (L2): +``` +```@raw html +
Code: +``` +```julia +plot(wp, x=:L2, palette=Plots.palette([:blue, :red], length(_setups))) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/vanderpol_5_1.svg) + + +```@raw html +
+``` + +## Calibration +```@raw html +
Code: +``` +```julia +plot(wp, x=:final, y=:chi2_final, yguide="Chi-squared (final)", + palette=Plots.palette([:blue, :red], length(_setups))) +plot_chisq_interval!(2) +``` +```@raw html +
+``` + +![](figures/vanderpol_6_1.svg) + + + +## [Comparison of the different initialization schemes](@id vdp_initialization) + +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -100,14 +239,11 @@ for o in orders wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) p = plot(wp, color=[2 4 5 6], xticks = 10.0 .^ (-16:1:5)) @@ -120,9 +256,15 @@ plot( xlabel=["" "" "" "Error"], ) ``` +```@raw html +
+``` -![](figures/vanderpol_4_1.svg) +![](figures/vanderpol_7_1.svg) +```@raw html +
Code: +``` ```julia DENSE = false; SAVE_EVERYSTEP = false; @@ -147,45 +289,54 @@ setups = last.(_setups) wp = WorkPrecisionSet( prob, abstols, reltols, setups; names = labels, - #print_names = true, appxsol = test_sol, dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) plot(wp, palette=Plots.palette([:blue, :red], length(_setups)), xticks = 10.0 .^ (-16:1:5)) ``` +```@raw html +
+``` -![](figures/vanderpol_5_1.svg) +![](figures/vanderpol_8_1.svg) -## Solving the first- vs second-order ODE +## [Solving the first- vs second-order ODE](@id vdp_second_order) +```@raw html +
Code: +``` ```julia function vanderpol2!(ddu, du, u, p, t) ddu[1] = p[1] * ((1 - u[1]^2) * du[1] - u[1]) end p = [1e5] -tspan = (0.0, 6.3) +tspan = (0.0, 2.0) u0 = [2.0] du0 = [0.0] prob2 = SecondOrderODEProblem(vanderpol2!, du0, u0, tspan, p) -test_sol2 = solve(prob2, RadauIIA5(), abstol=1/10^14, reltol=1/10^14, dense=false) -plot(test_sol2, title="Van der Pol Solution (2nd order)", legend=false, ylims=(-2.5, 2.5)) +test_sol2 = solve(prob2, RadauIIA5(), abstol=1/10^14, reltol=1/10^14) +# plot(test_sol2, title="Van der Pol Solution (2nd order)", legend=false, ylims=(-5, 5), xticks=:auto) +nothing +``` +```@raw html +
``` -![](figures/vanderpol_6_1.svg) +```@raw html +
Code: +``` ```julia -DENSE = false; -SAVE_EVERYSTEP = false; +DENSE = true; +SAVE_EVERYSTEP = true; _setups = [ "EK1(3) 1st order" => Dict(:alg => EK1(order=3, smooth=DENSE)) @@ -201,47 +352,84 @@ _setups = [ labels = first.(_setups) setups = last.(_setups) -abstols = 1.0 ./ 10.0 .^ (6:12) -reltols = 1.0 ./ 10.0 .^ (3:9) +abstols = 1.0 ./ 10.0 .^ (6:11) +reltols = 1.0 ./ 10.0 .^ (3:8) wp = WorkPrecisionSet( [prob, prob2], abstols, reltols, setups; names = labels, - #print_names = true, appxsol = [test_sol, test_sol2], dense = DENSE, save_everystep = SAVE_EVERYSTEP, - numruns = 10, maxiters = Int(1e7), - timeseries_errors = false, - verbose = false, + numruns = 5, ) -plot(wp, color=[1 1 1 1 2 2 2 2], xticks = 10.0 .^ (-16:1:5)) +color = [1 1 1 1 2 2 2 2] +plot(wp; x=:final, color) +plot!(ref_wp_dense, x=:final, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
``` -![](figures/vanderpol_7_1.svg) +![](figures/vanderpol_10_1.svg) +```@raw html +
Interpolation errors (L2): +``` +```@raw html +
Code: +``` +```julia +plot(wp; x=:L2, color) +plot!(ref_wp_dense, x=:L2, color=:gray, alpha=0.7, linestyle=:dash) +``` +```@raw html +
+``` + +![](figures/vanderpol_11_1.svg) + + +```@raw html +
+``` + +### Calibration + +```@raw html +
Code: +``` +```julia +plot(wp; x=:final, y=:chi2_final, yguide="Chi-squared (final)", color) +plot_chisq_interval!(2) +``` +```@raw html +
+``` + +![](figures/vanderpol_12_1.svg) -## Conclusion -- Use the `EK1` to solve stiff problems, with orders $\leq 6$ depending on the error tolerance. -- When the problem is actually a second-order ODE, as is the case for the Van der Pol system here, _solve it as a second-order ODE_. ## Appendix -Computer information: +```@raw html +
Computer information: +``` + ```julia using InteractiveUtils InteractiveUtils.versioninfo() ``` ``` -Julia Version 1.9.3 -Commit bed2cd540a1 (2023-08-24 14:43 UTC) +Julia Version 1.9.4 +Commit 8e5136fa297 (2023-11-14 08:46 UTC) Build Info: Official https://julialang.org/ release Platform Info: @@ -256,11 +444,14 @@ Environment: JULIA_STACKTRACE_MINIMAL = true ``` +```@raw html +
+``` +```@raw html +
Package information: +``` - - -Package Information: ```julia using Pkg Pkg.status() @@ -268,48 +459,55 @@ Pkg.status() ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Project.toml` - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 + [31c24e10] Distributions v0.25.103 [7073ff75] IJulia v1.24.2 [7f56f5a3] LSODA v0.7.5 [e6f89c97] LoggingExtras v1.0.3 [e2752cbe] MATLABDiffEq v1.2.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 - [1dea7af3] OrdinaryDiffEq v6.58.1 + [1dea7af3] OrdinaryDiffEq v6.59.1 [65888b18] ParameterizedFunctions v5.16.0 [91a5bcdd] Plots v1.39.0 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` - [0bca4576] SciMLBase v2.7.3 + [0bca4576] SciMLBase v2.8.1 [505e40e9] SciPyDiffEq v0.2.1 + [ce78b400] SimpleUnPack v1.1.0 [90137ffa] StaticArrays v1.6.5 [c3572dad] Sundials v4.20.1 [44d3d7a6] Weave v0.10.12 [0518478a] deSolveDiffEq v0.1.1 +Info Packages marked with ⌃ have new versions available and may be upgradable. ``` +```@raw html +
+``` +```@raw html +
Full manifest: +``` - - -And the full manifest: ```julia Pkg.status(mode=Pkg.PKGMODE_MANIFEST) ``` ``` Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` - [47edcb42] ADTypes v0.2.4 + [47edcb42] ADTypes v0.2.5 ⌅ [c3fe647b] AbstractAlgebra v0.32.5 [621f4979] AbstractFFTs v1.5.0 [1520ce14] AbstractTrees v0.4.4 + [7d9f7c33] Accessors v0.1.33 [79e6a3ab] Adapt v3.7.1 [ec485272] ArnoldiMethod v0.2.0 [c9d4266f] ArrayAllocators v0.3.0 [4fba245c] ArrayInterface v7.5.1 [6e4b80f9] BenchmarkTools v1.3.2 [e2ed5e7c] Bijections v0.1.6 - [d1d4a3ce] BitFlags v0.1.7 + [d1d4a3ce] BitFlags v0.1.8 [62783981] BitTwiddlingConvenienceFunctions v0.1.5 [fa961155] CEnum v0.5.0 [2a0fbf3d] CPUSummary v0.2.4 @@ -329,9 +527,10 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bbf7d656] CommonSubexpressions v0.3.0 [34da2185] Compat v4.10.0 [b152e2b5] CompositeTypes v0.1.3 + [a33af91c] CompositionsBase v0.1.2 [2569d6c7] ConcreteStructs v0.2.3 [f0e56b4a] ConcurrentUtilities v2.3.0 - [8f4d0f93] Conda v1.9.1 +⌃ [8f4d0f93] Conda v1.9.1 [187b0558] ConstructionBase v1.5.4 [d38c429a] Contour v0.6.2 [587fd27a] CovarianceEstimation v0.2.9 @@ -343,9 +542,9 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [864edb3b] DataStructures v0.18.15 [e2d170a0] DataValueInterfaces v1.0.0 [8bb1440f] DelimitedFiles v1.9.1 -⌃ [2b5f629d] DiffEqBase v6.138.0 + [2b5f629d] DiffEqBase v6.139.0 [459566f4] DiffEqCallbacks v2.33.1 - [f3b72e0c] DiffEqDevTools v2.39.0 + [f3b72e0c] DiffEqDevTools v2.42.0 [77a26b50] DiffEqNoiseProcess v5.19.0 [163ba53b] DiffResults v1.1.0 [b552c78f] DiffRules v1.15.1 @@ -364,7 +563,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [e2ba6199] ExprTools v0.1.10 [c87230d0] FFMPEG v0.4.1 [7a1cc6ca] FFTW v1.7.1 - [7034ab61] FastBroadcast v0.2.7 + [7034ab61] FastBroadcast v0.2.8 [9aa1b823] FastClosures v0.3.2 [442a2c76] FastGaussQuadrature v1.0.0 [29a986be] FastLapackInterface v2.0.0 @@ -395,6 +594,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [842dd82b] InlineStrings v1.4.0 [18e54dd8] IntegerMathUtils v0.1.2 [8197267c] IntervalSets v0.7.8 + [3587e190] InverseFunctions v0.1.12 [41ab1584] InvertedIndices v1.3.0 [92d709cd] IrrationalConstants v0.2.2 [c8e1da08] IterTools v1.8.0 @@ -412,33 +612,33 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2ee39098] LabelledArrays v1.14.0 [984bce1d] LambertW v0.4.6 [23fbe1c1] Latexify v0.16.1 + [73f95e8e] LatticeRules v0.0.1 [10f19ff3] LayoutPointers v0.1.15 [50d2b5c4] Lazy v0.15.1 [1d6d02ad] LeftChildRightSiblingTrees v0.2.0 [d3d80556] LineSearches v7.2.0 -⌃ [7ed4a6bd] LinearSolve v2.15.0 + [7ed4a6bd] LinearSolve v2.20.0 [2ab3a3ac] LogExpFunctions v0.3.26 [e6f89c97] LoggingExtras v1.0.3 [bdcacae8] LoopVectorization v0.12.166 [10e44e05] MATLAB v0.8.4 [e2752cbe] MATLABDiffEq v1.2.0 - [33e6dc65] MKL v0.6.1 [d8e11817] MLStyle v0.4.17 [1914dd2f] MacroTools v0.5.11 [d125e4d3] ManualMemory v0.1.8 - [739be429] MbedTLS v1.1.7 + [739be429] MbedTLS v1.1.8 [442fdcdd] Measures v0.3.2 [e1d29d7a] Missings v1.1.0 - [961ee093] ModelingToolkit v8.72.2 +⌃ [961ee093] ModelingToolkit v8.73.0 [46d2c3a1] MuladdMacro v0.2.4 [102ac46a] MultivariatePolynomials v0.5.2 - [ffc61752] Mustache v1.0.18 + [ffc61752] Mustache v1.0.19 [d8a4904e] MutableArithmetics v1.3.3 [d41bc354] NLSolversBase v7.8.3 [2774e3e8] NLsolve v4.5.1 [77ba4419] NaNMath v1.0.2 ⌅ [356022a1] NamedDims v0.2.50 -⌃ [8913a72c] NonlinearSolve v2.6.1 + [8913a72c] NonlinearSolve v2.8.0 [54ca160b] ODEInterface v0.5.0 [09606e27] ODEInterfaceDiffEq v3.13.3 [6fd5a793] Octavian v0.3.27 @@ -446,20 +646,20 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [4d8831e6] OpenSSL v1.4.1 [429524aa] Optim v1.7.8 [bac558e1] OrderedCollections v1.6.2 - [1dea7af3] OrdinaryDiffEq v6.58.1 - [90014a1f] PDMats v0.11.28 + [1dea7af3] OrdinaryDiffEq v6.59.1 + [90014a1f] PDMats v0.11.29 [fe68d972] PSDMatrices v0.4.6 [65ce6f38] PackageExtensionCompat v1.0.2 [65888b18] ParameterizedFunctions v5.16.0 [d96e819e] Parameters v0.12.3 - [69de0a69] Parsers v2.7.2 + [69de0a69] Parsers v2.8.0 [b98c9c47] Pipe v1.3.0 [32113eaa] PkgBenchmark v0.2.12 [ccf2f8ad] PlotThemes v3.1.0 [995b91a9] PlotUtils v1.3.5 [91a5bcdd] Plots v1.39.0 [e409e4f3] PoissonRandom v0.4.4 -⌃ [f517fe37] Polyester v0.7.8 + [f517fe37] Polyester v0.7.9 [1d0040c9] PolyesterWeave v0.2.1 ⌅ [f27b6e38] Polynomials v3.2.13 [2dfb63ee] PooledArrays v1.4.3 @@ -467,12 +667,13 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [d236fae5] PreallocationTools v0.4.12 [aea7be01] PrecompileTools v1.2.0 [21216c6a] Preferences v1.4.1 - [08abe8d2] PrettyTables v2.2.8 - [27ebfcd6] Primes v0.5.4 + [08abe8d2] PrettyTables v2.3.0 + [27ebfcd6] Primes v0.5.5 [bf3e78b0] ProbNumDiffEq v0.13.0 `~/.julia/dev/ProbNumDiffEq` [33c8b6b6] ProgressLogging v0.1.4 - [438e738f] PyCall v1.96.1 + [438e738f] PyCall v1.96.2 [1fd47b50] QuadGK v2.9.1 +⌃ [8a4e6c94] QuasiMonteCarlo v0.3.2 [6f49c342] RCall v0.13.18 [74087812] Random123 v1.6.1 [fb686558] RandomExtensions v0.4.4 @@ -480,7 +681,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [3cdcf5f2] RecipesBase v1.3.4 [01d81517] RecipesPipeline v0.6.12 [731186ca] RecursiveArrayTools v2.38.10 - [f2c3362d] RecursiveFactorization v0.2.20 + [f2c3362d] RecursiveFactorization v0.2.21 [189a3867] Reexport v1.2.2 [05181044] RelocatableFolders v1.0.1 [ae029012] Requires v1.3.0 @@ -488,26 +689,27 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [79098fc4] Rmath v0.7.1 [47965b36] RootedTrees v2.19.2 [7e49a35a] RuntimeGeneratedFunctions v0.5.12 - [fdea26ae] SIMD v3.4.5 + [fdea26ae] SIMD v3.4.6 [94e857df] SIMDTypes v0.1.0 [476501e8] SLEEFPirates v0.6.42 - [0bca4576] SciMLBase v2.7.3 + [0bca4576] SciMLBase v2.8.1 [e9a6253c] SciMLNLSolve v0.1.9 -⌃ [c0aeaf25] SciMLOperators v0.3.6 + [c0aeaf25] SciMLOperators v0.3.7 [505e40e9] SciPyDiffEq v0.2.1 [6c6a2e73] Scratch v1.2.1 -⌃ [91c51154] SentinelArrays v1.4.0 + [91c51154] SentinelArrays v1.4.1 [efcf1570] Setfield v1.1.1 [1277b4bf] ShiftedArrays v2.0.0 [992d4aef] Showoff v1.0.3 [777ac1f9] SimpleBufferStream v1.1.0 -⌃ [727e6d20] SimpleNonlinearSolve v0.1.23 + [727e6d20] SimpleNonlinearSolve v0.1.25 [699a6c99] SimpleTraits v0.9.4 [ce78b400] SimpleUnPack v1.1.0 [66db9d55] SnoopPrecompile v1.0.3 + [ed01d8cd] Sobol v1.5.0 [b85f4697] SoftGlobalScope v1.1.0 [a2af1166] SortingAlgorithms v1.2.0 -⌃ [47a9eef4] SparseDiffTools v2.9.2 +⌃ [47a9eef4] SparseDiffTools v2.11.0 [e56a9233] Sparspak v0.3.9 [276daf66] SpecialFunctions v2.3.1 [928aab9d] SpecialMatrices v3.0.0 @@ -519,7 +721,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2913bbd2] StatsBase v0.34.2 [4c63d2b9] StatsFuns v1.3.0 [3eaba693] StatsModels v0.7.3 -⌅ [7792a7ef] StrideArraysCore v0.4.17 + [7792a7ef] StrideArraysCore v0.5.1 [69024149] StringEncodings v0.3.7 [892a3eda] StringManipulation v0.3.4 [09ab397b] StructArrays v0.6.16 @@ -529,14 +731,14 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [0c5d862f] Symbolics v5.10.0 [3783bdb8] TableTraits v1.0.1 [bd369af6] Tables v1.11.1 - [92b13dbe] TaylorIntegration v0.14.3 + [92b13dbe] TaylorIntegration v0.14.4 [6aa5eb33] TaylorSeries v0.15.2 [62fd8b95] TensorCore v0.1.1 [5d786b92] TerminalLoggers v0.1.7 [8290d209] ThreadingUtilities v0.5.2 [a759f4b9] TimerOutputs v0.5.23 [c751599d] ToeplitzMatrices v0.8.2 - [0796e94c] Tokenize v0.5.25 + [0796e94c] Tokenize v0.5.26 [3bb67fe8] TranscodingStreams v0.10.2 [a2a6695c] TreeViews v0.3.0 [d5829a12] TriangularSolve v0.1.20 @@ -545,7 +747,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [5c2747f8] URIs v1.5.1 [3a884ed6] UnPack v1.0.2 [1cfade01] UnicodeFun v0.4.1 - [1986cc42] Unitful v1.17.0 + [1986cc42] Unitful v1.18.0 [45397f5d] UnitfulLatexify v1.6.3 [a7c27f48] Unityper v0.1.5 [41fe7b60] Unzip v0.2.0 @@ -561,7 +763,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [83423d85] Cairo_jll v1.16.1+1 [2702e6a9] EpollShim_jll v0.0.20230411+0 [2e619515] Expat_jll v2.5.0+0 -⌃ [b22a6f82] FFMPEG_jll v4.4.2+2 + [b22a6f82] FFMPEG_jll v4.4.4+1 [f5851436] FFTW_jll v3.3.10+0 [a3f928ae] Fontconfig_jll v2.13.93+0 [d7e528f0] FreeType2_jll v2.13.1+0 @@ -590,11 +792,11 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [856f044c] MKL_jll v2023.2.0+0 [c771fb93] ODEInterface_jll v0.0.1+0 [e7412a2a] Ogg_jll v1.3.5+1 -⌅ [458c3c95] OpenSSL_jll v1.1.23+0 + [458c3c95] OpenSSL_jll v3.0.12+0 [efe28fd5] OpenSpecFun_jll v0.5.5+0 [91d4177d] Opus_jll v1.3.2+0 [30392449] Pixman_jll v0.42.2+0 -⌃ [c0090381] Qt6Base_jll v6.5.2+2 + [c0090381] Qt6Base_jll v6.5.3+1 [f50d1b31] Rmath_jll v0.4.0+0 ⌅ [fb77eaff] Sundials_jll v5.2.1+0 [a44049a8] Vulkan_Loader_jll v1.3.243+0 @@ -602,7 +804,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [2381bf8a] Wayland_protocols_jll v1.25.0+0 [02c8fc9c] XML2_jll v2.11.5+0 [aed1982a] XSLT_jll v1.1.34+0 - [ffd25f8a] XZ_jll v5.4.4+0 + [ffd25f8a] XZ_jll v5.4.5+0 [f67eecfb] Xorg_libICE_jll v1.0.10+1 [c834827a] Xorg_libSM_jll v1.2.3+0 [4f6342f7] Xorg_libX11_jll v1.8.6+0 @@ -630,7 +832,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [8f1865be] ZeroMQ_jll v4.3.4+0 [3161d3a3] Zstd_jll v1.5.5+0 [35ca27e7] eudev_jll v3.2.9+0 - [214eeab7] fzf_jll v0.35.1+0 +⌅ [214eeab7] fzf_jll v0.35.1+0 [1a1c6b14] gperf_jll v3.1.1+0 [a4ae2306] libaom_jll v3.4.0+0 [0ac62f75] libass_jll v0.15.1+0 @@ -654,7 +856,7 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [9fa8497b] Future [b77e0a4c] InteractiveUtils [4af54fe1] LazyArtifacts - [b27032c2] LibCURL v0.6.3 + [b27032c2] LibCURL v0.6.4 [76f85450] LibGit2 [8f399da3] Libdl [37e2e46d] LinearAlgebra @@ -680,8 +882,8 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [cf7118a7] UUIDs [4ec0a83e] Unicode [e66e0078] CompilerSupportLibraries_jll v1.0.5+0 - [deac9b47] LibCURL_jll v7.84.0+0 - [29816b5a] LibSSH2_jll v1.10.2+0 + [deac9b47] LibCURL_jll v8.4.0+0 + [29816b5a] LibSSH2_jll v1.11.0+1 [c8ffd9c3] MbedTLS_jll v2.28.2+0 [14a3606d] MozillaCACerts_jll v2022.10.11 [4536629a] OpenBLAS_jll v0.3.21+4 @@ -690,9 +892,12 @@ Status `~/.julia/dev/ProbNumDiffEq/benchmarks/Manifest.toml` [bea87d4a] SuiteSparse_jll v5.10.1+6 [83775a58] Zlib_jll v1.2.13+0 [8e850b90] libblastrampoline_jll v5.8.0+0 - [8e850ede] nghttp2_jll v1.48.0+0 + [8e850ede] nghttp2_jll v1.52.0+1 [3f19e933] p7zip_jll v17.4.0+0 -Info Packages marked with ⌃ and ⌅ have new versions available, but those wi -th ⌅ are restricted by compatibility constraints from upgrading. To see why - use `status --outdated -m` +Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m` ``` + +```@raw html +
+``` + diff --git a/docs/src/refs.bib b/docs/src/refs.bib index 136453adc..cac8d1955 100644 --- a/docs/src/refs.bib +++ b/docs/src/refs.bib @@ -1,10 +1,10 @@ -@misc{bosch23expint, +@inProceedings{bosch23expint, title = {Probabilistic Exponential Integrators}, author = {Nathanael Bosch and Philipp Hennig and Filip Tronarp}, + booktitle = {Thirty-seventh Conference on Neural Information Processing + Systems}, year = 2023, - eprint = {2305.14978}, - archivePrefix ={arXiv}, - primaryClass = {math.NA} + url = {https://openreview.net/forum?id=2dx5MNs2Ip} } @InProceedings{krämer21highdim, diff --git a/ext/DiffEqDevToolsExt.jl b/ext/DiffEqDevToolsExt.jl new file mode 100644 index 000000000..c9bd8c80a --- /dev/null +++ b/ext/DiffEqDevToolsExt.jl @@ -0,0 +1,54 @@ +module DiffEqDevToolsExt + +using ProbNumDiffEq +using DiffEqDevTools +using SciMLBase +using Statistics +using LinearAlgebra + +function chi2(gaussian_estimate, actual_value) + μ, Σ = gaussian_estimate + d = length(μ) + diff = μ - actual_value + if iszero(Σ) + if iszero(diff) + return one(eltype(actual_value)) + else + @warn "Singular covariance matrix leads to bad (infinite) chi2 estimate" + return convert(eltype(actual_value), Inf) + end + end + @static if VERSION < v"1.7" + return diff' * (Matrix(Σ) \ diff) + else + return diff' * (Σ \ diff) + end +end + +function DiffEqDevTools.appxtrue( + sol::ProbNumDiffEq.ProbODESolution, + ref::TestSolution; + kwargs..., +) + ref.dense = sol.dense + out = DiffEqDevTools.appxtrue(mean(sol), ref; kwargs...) + out = _add_prob_errors!(out, sol, ref.interp) + return out +end + +function DiffEqDevTools.appxtrue( + sol::ProbNumDiffEq.ProbODESolution, + ref::SciMLBase.AbstractODESolution; + kwargs..., +) + out = DiffEqDevTools.appxtrue(mean(sol), ref; dense_errors=sol.dense, kwargs...) + out = _add_prob_errors!(out, sol, ref) + return out +end + +function _add_prob_errors!(out, sol, ref) + out.errors[:chi2_final] = chi2(sol.pu[end], ref.u[end])[1] + return out +end + +end diff --git a/justfile b/justfile index 7504c2300..9f86f303b 100644 --- a/justfile +++ b/justfile @@ -17,4 +17,4 @@ benchmark: julia --project=benchmarks -e 'include("benchmarks/runall.jl")' vale: - vale . \ No newline at end of file + git ls-files | xargs vale \ No newline at end of file diff --git a/src/ProbNumDiffEq.jl b/src/ProbNumDiffEq.jl index 7cb7b99a0..b782372b4 100644 --- a/src/ProbNumDiffEq.jl +++ b/src/ProbNumDiffEq.jl @@ -13,7 +13,6 @@ using Reexport import SciMLBase import SciMLBase: interpret_vars, getsyms using OrdinaryDiffEq -using DiffEqDevTools using SpecialMatrices, ToeplitzMatrices using FastBroadcast using StaticArrayInterface @@ -90,7 +89,10 @@ include("solve.jl") include("preconditioning.jl") -include("devtools.jl") +if !isdefined(Base, :get_extension) + include("../ext/DiffEqDevToolsExt.jl") +end + include("callbacks.jl") export ManifoldUpdate diff --git a/src/devtools.jl b/src/devtools.jl deleted file mode 100644 index 3c42dbf00..000000000 --- a/src/devtools.jl +++ /dev/null @@ -1,4 +0,0 @@ -# Copied from DiffEqDevTools.jl and modified -# See also: https://devdocs.sciml.ai/dev/alg_dev/test_problems/ -DiffEqDevTools.appxtrue(sol::ProbODESolution, sol2::TestSolution) = - DiffEqDevTools.appxtrue(mean(sol), sol2) diff --git a/src/kronecker.jl b/src/kronecker.jl index 421ea2d73..c04d88cb5 100644 --- a/src/kronecker.jl +++ b/src/kronecker.jl @@ -30,6 +30,7 @@ IsometricKroneckerProduct(ldim::Integer, B::AbstractVector) = const IKP = IsometricKroneckerProduct Kronecker.getmatrices(K::IKP) = (I(K.ldim), K.B) +Kronecker.getallfactors(K::IKP) = (I(K.ldim), K.B) Base.zero(A::IKP) = IsometricKroneckerProduct(A.ldim, zero(A.B)) Base.one(A::IKP) = IsometricKroneckerProduct(A.ldim, one(A.B)) @@ -161,7 +162,7 @@ function mul_vectrick!(x::AbstractVecOrMat, A::IKP, v::AbstractVecOrMat) V = reshape_no_alloc(v, (d, length(v) ÷ d)) X = reshape_no_alloc(x, (c, length(x) ÷ c)) - _matmul!(X, N, V) + mul!(X, N, V) return x end function mul_vectrick!( @@ -169,6 +170,26 @@ function mul_vectrick!( N = A.B c, d = size(N) + V = reshape_no_alloc(v, (d, length(v) ÷ d)) + X = reshape_no_alloc(x, (c, length(x) ÷ c)) + mul!(X, N, V, alpha, beta) + return x +end + +function _matmul_vectrick!(x::AbstractVecOrMat, A::IKP, v::AbstractVecOrMat) + N = A.B + c, d = size(N) + + V = reshape_no_alloc(v, (d, length(v) ÷ d)) + X = reshape_no_alloc(x, (c, length(x) ÷ c)) + _matmul!(X, N, V) + return x +end +function _matmul_vectrick!( + x::AbstractVecOrMat, A::IKP, v::AbstractVecOrMat, alpha::Number, beta::Number) + N = A.B + c, d = size(N) + V = reshape_no_alloc(v, (d, length(v) ÷ d)) X = reshape_no_alloc(x, (c, length(x) ÷ c)) _matmul!(X, N, V, alpha, beta) @@ -185,12 +206,12 @@ end # fast_linalg.jl for TC in [:AbstractVector, :AbstractMatrix] - @eval _matmul!(C::$TC, A::IKP, B::$TC) = mul_vectrick!(C, A, B) + @eval _matmul!(C::$TC, A::IKP, B::$TC) = _matmul_vectrick!(C, A, B) @eval _matmul!( C::$TC{T}, A::IKP{T}, B::$TC{T}, - ) where {T<:LinearAlgebra.BlasFloat} = mul_vectrick!(C, A, B) + ) where {T<:LinearAlgebra.BlasFloat} = _matmul_vectrick!(C, A, B) @eval _matmul!(C::$TC, A::$TC, B::IKP) = _matmul!(C', B', A')' @eval _matmul!( C::$TC{T}, @@ -199,21 +220,21 @@ for TC in [:AbstractVector, :AbstractMatrix] ) where {T<:LinearAlgebra.BlasFloat} = _matmul!(C', B', A')' @eval _matmul!(C::$TC, A::IKP, B::$TC, alpha::Number, beta::Number) = - mul_vectrick!(C, A, B, alpha, beta) + _matmul_vectrick!(C, A, B, alpha, beta) @eval _matmul!( C::$TC{T}, A::IKP{T}, B::$TC{T}, alpha::Number, beta::Number, - ) where {T<:LinearAlgebra.BlasFloat} = mul_vectrick!(C, A, B, alpha, beta) + ) where {T<:LinearAlgebra.BlasFloat} = _matmul_vectrick!(C, A, B, alpha, beta) @eval _matmul!(C::$TC, A::$TC, B::IKP, alpha::Number, beta::Number) = - mul_vectrick!(C', B', A', alpha, beta)' + _matmul_vectrick!(C', B', A', alpha, beta)' @eval _matmul!( C::$TC{T}, A::$TC{T}, B::IKP{T}, alpha::Number, beta::Number, - ) where {T<:LinearAlgebra.BlasFloat} = mul_vectrick!(C', B', A', alpha, beta)' + ) where {T<:LinearAlgebra.BlasFloat} = _matmul_vectrick!(C', B', A', alpha, beta)' end diff --git a/test/Project.toml b/test/Project.toml index 1ab664b31..2af565072 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -20,4 +20,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" [compat] -Aqua = "0.7" +Aqua = "0.8.2" diff --git a/test/diffeqdevtools.jl b/test/diffeqdevtools.jl index 8f688b2d3..76b37d1ac 100644 --- a/test/diffeqdevtools.jl +++ b/test/diffeqdevtools.jl @@ -5,35 +5,37 @@ using DiffEqDevTools using Plots import ODEProblemLibrary: prob_ode_fitzhughnagumo -const prob = prob_ode_fitzhughnagumo +prob = prob_ode_fitzhughnagumo -const appxsol = solve(prob, Vern7(), abstol=1 / 10^14, reltol=1 / 10^14) -const test_sol = TestSolution(appxsol) -const appxsol_nondense = +ref = solve(prob, Vern7(), abstol=1 / 10^14, reltol=1 / 10^14) +test_sol = TestSolution(ref) +appxsol_nondense = solve(prob, Vern7(), abstol=1 / 10^14, reltol=1 / 10^14, dense=false) -const test_sol_nondense = TestSolution(appxsol_nondense) +test_sol_nondense = TestSolution(appxsol_nondense) @testset "appxtrue" begin - appxsol = appxtrue(solve(prob, EK1()), test_sol) - @test appxsol.errors isa Dict - @test :final in keys(appxsol.errors) - @test :l2 in keys(appxsol.errors) - @test :L2 in keys(appxsol.errors) - @test :l∞ in keys(appxsol.errors) - @test :L∞ in keys(appxsol.errors) + @testset "$S" for (S, _sol) in (("TestSolution", test_sol), ("ODESolution", ref)) + appxsol = appxtrue(solve(prob, EK1()), _sol) + @test appxsol.errors isa Dict + @test :final in keys(appxsol.errors) + @test :l2 in keys(appxsol.errors) + @test :L2 in keys(appxsol.errors) + @test :l∞ in keys(appxsol.errors) + @test :L∞ in keys(appxsol.errors) - sol = solve(prob, EK1(smooth=false), dense=false) - appxsol = appxtrue(sol, test_sol) - @test appxsol.errors isa Dict - @test :final in keys(appxsol.errors) - @test :l2 in keys(appxsol.errors) - @test :l∞ in keys(appxsol.errors) + sol = solve(prob, EK1(smooth=false), dense=false) + appxsol = appxtrue(sol, _sol) + @test appxsol.errors isa Dict + @test :final in keys(appxsol.errors) + @test :l2 in keys(appxsol.errors) + @test :l∞ in keys(appxsol.errors) - appxsol = appxtrue(sol, test_sol_nondense) - @test appxsol.errors isa Dict - @test :final in keys(appxsol.errors) - @test :l2 in keys(appxsol.errors) - @test :l∞ in keys(appxsol.errors) + appxsol = appxtrue(sol, test_sol_nondense) + @test appxsol.errors isa Dict + @test :final in keys(appxsol.errors) + @test :l2 in keys(appxsol.errors) + @test :l∞ in keys(appxsol.errors) + end end @testset "WorkPrecision" begin @@ -83,8 +85,6 @@ end ] @test_broken wp = WorkPrecisionSet( prob, abstols, reltols, setups; - # names=labels, - #print_names = true, appxsol=test_sol, dense=false, save_everystep=false, @@ -95,8 +95,6 @@ end ) @test_nowarn WorkPrecisionSet( prob, abstols, reltols, setups; - # names=labels, - #print_names = true, appxsol=appxsol_nondense, dense=false, save_everystep=false, diff --git a/test/runtests.jl b/test/runtests.jl index ca6ec412b..cd3573f8e 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -125,7 +125,7 @@ const GROUP = get(ENV, "GROUP", "All") Aqua.test_all( ProbNumDiffEq, ambiguities=false, - piracy=false, + piracies=false, ) end end