SciML Scientific Machine Learning Developer Documentation
This is the developer documentation and Contributor's Guide for the SciML ecosystem. It explains the common interface and some the package internals to help developers contribute.
If you have any questions, or just want to chat about solvers/using the package, please feel free to use the Gitter channel. For bug reports, feature requests, etc., please submit an issue.
Overview
The SciML ecosystem is built around the common interface. The common interface is a type-based interface where users define problems as a type, and solvers plug into the ecosystem by defining an algorithm to give a new dispatch to
__solve(prob, alg; kwargs...)
__init(prob, alg; kwargs...)There is a top level solve and init function which is in DiffEqBase.jl that handles distribution and function input (along with extra warnings) before sending the problems to the packages.
There is then an ecosystem of add-on components which use the common solver interface to add analysis tools for differential equations.
Contributing to the Ecosystem
There are many ways to help the ecosystem. One way you can contribute is to give pull requests (PRs) to existing packages. Another way to contribute is to add your own package to the ecosystem. Adding your own package to the ecosystem allows you to keep executive control and licensing over your methods, but allows users of DifferentialEquations.jl to use your methods via the common interface, and makes your package compatible with the add-on tools (sensitivity analysis, parameter estimation, etc). Note that, in order for the method to be used as a default, one is required to move their package to the SciML organization so that way common maintenance (such as fixing deprecation warnings, updating tests to newer versions, and emergency fixes / disabling) can be allowed by SciML members. However, the lead developer of the package maintains administrative control, and thus any change to the core algorithms by other SciML members will only be given through PRs.
Even if you don't have the time to contribute new solver algorithms or add-on tools, there's always ways to help! Improved plot recipes and new series recipes are always nice to add more default plots. It is always helpful to have benchmarks between different algorithms to see "which is best". Adding examples IJulia notebooks to DiffEqTutorials.jl is a good way to share knowledge about DifferentialEquations.jl. Also, please feel free to comb through the solvers and look for ways to make them more efficient. Lastly, the documentation could always use improvements. If you have any questions on how to help, just ask them in the Gitter!
Code of Conduct
All contributors must adhere to the NumFOCUS Code of Conduct. Treat everyone with respect. Failure to comply will result in individuals being banned from the community.
Contributor Guide
- Ecosystem Overview
- Adding a new package to the common interface
- Adding Algorithms
- Developing A New Problem
- The DiffEq Internals
- Type Traits
Algorithm Development Tools
The following algorithm development tools are provided by DiffEqDevTools.jl
Internal Documentation
Reproducibility
The documentation of this SciML package was built using these direct dependencies,
Status `~/work/OrdinaryDiffEq.jl/OrdinaryDiffEq.jl/docs/Project.toml`
[f3b72e0c] DiffEqDevTools v3.0.0 `../lib/DiffEqDevTools`
[e30172f5] Documenter v1.17.0
[1dea7af3] OrdinaryDiffEq v7.0.0 `~/work/OrdinaryDiffEq.jl/OrdinaryDiffEq.jl`
[08082164] OrdinaryDiffEqAMF v2.0.0 `../lib/OrdinaryDiffEqAMF`
[89bda076] OrdinaryDiffEqAdamsBashforthMoulton v2.0.0 `../lib/OrdinaryDiffEqAdamsBashforthMoulton`
[6ad6398a] OrdinaryDiffEqBDF v2.0.0 `../lib/OrdinaryDiffEqBDF`
[50262376] OrdinaryDiffEqDefault v2.0.0 `../lib/OrdinaryDiffEqDefault`
[9286f039] OrdinaryDiffEqExplicitRK v2.0.0 `../lib/OrdinaryDiffEqExplicitRK`
[e0540318] OrdinaryDiffEqExponentialRK v2.0.0 `../lib/OrdinaryDiffEqExponentialRK`
[becaefa8] OrdinaryDiffEqExtrapolation v2.0.0 `../lib/OrdinaryDiffEqExtrapolation`
[5960d6e9] OrdinaryDiffEqFIRK v2.0.0 `../lib/OrdinaryDiffEqFIRK`
[101fe9f7] OrdinaryDiffEqFeagin v2.0.0 `../lib/OrdinaryDiffEqFeagin`
[d28bc4f8] OrdinaryDiffEqHighOrderRK v2.0.0 `../lib/OrdinaryDiffEqHighOrderRK`
[9f002381] OrdinaryDiffEqIMEXMultistep v2.0.0 `../lib/OrdinaryDiffEqIMEXMultistep`
[521117fe] OrdinaryDiffEqLinear v2.0.0 `../lib/OrdinaryDiffEqLinear`
[1344f307] OrdinaryDiffEqLowOrderRK v2.0.0 `../lib/OrdinaryDiffEqLowOrderRK`
[b0944070] OrdinaryDiffEqLowStorageRK v2.0.0 `../lib/OrdinaryDiffEqLowStorageRK`
[c9986a66] OrdinaryDiffEqNordsieck v2.0.0 `../lib/OrdinaryDiffEqNordsieck`
[5dd0a6cf] OrdinaryDiffEqPDIRK v2.0.0 `../lib/OrdinaryDiffEqPDIRK`
[5b33eab2] OrdinaryDiffEqPRK v2.0.0 `../lib/OrdinaryDiffEqPRK`
[04162be5] OrdinaryDiffEqQPRK v2.0.0 `../lib/OrdinaryDiffEqQPRK`
[af6ede74] OrdinaryDiffEqRKN v2.0.0 `../lib/OrdinaryDiffEqRKN`
[43230ef6] OrdinaryDiffEqRosenbrock v2.0.0 `../lib/OrdinaryDiffEqRosenbrock`
[2d112036] OrdinaryDiffEqSDIRK v2.0.0 `../lib/OrdinaryDiffEqSDIRK`
[669c94d9] OrdinaryDiffEqSSPRK v2.0.0 `../lib/OrdinaryDiffEqSSPRK`
[e3e12d00] OrdinaryDiffEqStabilizedIRK v2.0.0 `../lib/OrdinaryDiffEqStabilizedIRK`
[358294b1] OrdinaryDiffEqStabilizedRK v2.0.0 `../lib/OrdinaryDiffEqStabilizedRK`
[fa646aed] OrdinaryDiffEqSymplecticRK v2.0.0 `../lib/OrdinaryDiffEqSymplecticRK`
[b1df2697] OrdinaryDiffEqTsit5 v2.0.0 `../lib/OrdinaryDiffEqTsit5`
[79d7bb75] OrdinaryDiffEqVerner v2.0.0 `../lib/OrdinaryDiffEqVerner`and using this machine and Julia version.
Julia Version 1.12.6
Commit 15346901f00 (2026-04-09 19:20 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 4 × AMD EPYC 7763 64-Core Processor
WORD_SIZE: 64
LLVM: libLLVM-18.1.7 (ORCJIT, znver3)
GC: Built with stock GC
Threads: 1 default, 1 interactive, 1 GC (on 4 virtual cores)A more complete overview of all dependencies and their versions is also provided.
Status `~/work/OrdinaryDiffEq.jl/OrdinaryDiffEq.jl/docs/Manifest.toml`
[47edcb42] ADTypes v1.22.0
[a4c015fc] ANSIColoredPrinters v0.0.1
[1520ce14] AbstractTrees v0.4.5
[7d9f7c33] Accessors v0.1.44
[79e6a3ab] Adapt v4.5.2
[66dad0bd] AliasTables v1.1.3
[4fba245c] ArrayInterface v7.24.0
[70df07ce] BracketingNonlinearSolve v1.12.1
[944b1d66] CodecZlib v0.7.8
[38540f10] CommonSolve v0.2.6
[bbf7d656] CommonSubexpressions v0.3.1
[34da2185] Compat v4.18.1
[a33af91c] CompositionsBase v0.1.2
[2569d6c7] ConcreteStructs v0.2.3
[187b0558] ConstructionBase v1.6.0
[9a962f9c] DataAPI v1.16.0
[864edb3b] DataStructures v0.19.4
[e2d170a0] DataValueInterfaces v1.0.0
[2b5f629d] DiffEqBase v7.0.0 `../lib/DiffEqBase`
[f3b72e0c] DiffEqDevTools v3.0.0 `../lib/DiffEqDevTools`
[77a26b50] DiffEqNoiseProcess v5.30.0
[163ba53b] DiffResults v1.1.0
[b552c78f] DiffRules v1.15.1
[a0c0ee7d] DifferentiationInterface v0.7.16
[b4f34e82] Distances v0.10.12
[31c24e10] Distributions v0.25.125
[ffbed154] DocStringExtensions v0.9.5
[e30172f5] Documenter v1.17.0
[4e289a0a] EnumX v1.0.7
[f151be2c] EnzymeCore v0.8.19
[d4d017d3] ExponentialUtilities v1.30.0
[e2ba6199] ExprTools v0.1.10
[7034ab61] FastBroadcast v1.3.2
[9aa1b823] FastClosures v0.3.2
[442a2c76] FastGaussQuadrature v1.1.0
[a4df4552] FastPower v1.3.1
[1a297f60] FillArrays v1.16.0
[6a86dc24] FiniteDiff v2.30.0
[1fa38f19] Format v1.3.7
[f6369f11] ForwardDiff v1.3.3
[069b7b12] FunctionWrappers v1.1.3
[77dc65aa] FunctionWrappersWrappers v1.8.0
[46192b85] GPUArraysCore v0.2.0
[c145ed77] GenericSchur v0.5.6
[d7ba0133] Git v1.5.0
[34004b35] HypergeometricFunctions v0.3.28
[b5f81e59] IOCapture v1.0.0
[3587e190] InverseFunctions v0.1.17
[92d709cd] IrrationalConstants v0.2.6
[82899510] IteratorInterfaceExtensions v1.0.0
[692b3bcd] JLLWrappers v1.7.1
[682c06a0] JSON v1.5.0
[ba0b0d4f] Krylov v0.10.6
[b964fa9f] LaTeXStrings v1.4.0
[23fbe1c1] Latexify v0.16.10
[0e77f7df] LazilyInitializedFields v1.3.0
[87fe0de2] LineSearch v0.1.8
⌃ [d3d80556] LineSearches v7.5.1
[7ed4a6bd] LinearSolve v3.75.0
[2ab3a3ac] LogExpFunctions v0.3.29
[e6f89c97] LoggingExtras v1.2.0
[1914dd2f] MacroTools v0.5.16
[d0879d2d] MarkdownAST v0.1.3
[bb5d69b7] MaybeInplace v0.1.4
[e1d29d7a] Missings v1.2.0
[46d2c3a1] MuladdMacro v0.2.4
⌅ [d41bc354] NLSolversBase v7.10.0
[2774e3e8] NLsolve v4.5.1
[77ba4419] NaNMath v1.1.3
[8913a72c] NonlinearSolve v4.19.0
[be0214bd] NonlinearSolveBase v2.25.0
[5959db7a] NonlinearSolveFirstOrder v2.1.1
[9a2c21bd] NonlinearSolveQuasiNewton v1.13.1
[26075421] NonlinearSolveSpectralMethods v1.7.1
[bac558e1] OrderedCollections v1.8.1
[1dea7af3] OrdinaryDiffEq v7.0.0 `~/work/OrdinaryDiffEq.jl/OrdinaryDiffEq.jl`
[08082164] OrdinaryDiffEqAMF v2.0.0 `../lib/OrdinaryDiffEqAMF`
[89bda076] OrdinaryDiffEqAdamsBashforthMoulton v2.0.0 `../lib/OrdinaryDiffEqAdamsBashforthMoulton`
[6ad6398a] OrdinaryDiffEqBDF v2.0.0 `../lib/OrdinaryDiffEqBDF`
[bbf590c4] OrdinaryDiffEqCore v4.0.1 `../lib/OrdinaryDiffEqCore`
[50262376] OrdinaryDiffEqDefault v2.0.0 `../lib/OrdinaryDiffEqDefault`
[4302a76b] OrdinaryDiffEqDifferentiation v3.0.0 `../lib/OrdinaryDiffEqDifferentiation`
[9286f039] OrdinaryDiffEqExplicitRK v2.0.0 `../lib/OrdinaryDiffEqExplicitRK`
[e0540318] OrdinaryDiffEqExponentialRK v2.0.0 `../lib/OrdinaryDiffEqExponentialRK`
[becaefa8] OrdinaryDiffEqExtrapolation v2.0.0 `../lib/OrdinaryDiffEqExtrapolation`
[5960d6e9] OrdinaryDiffEqFIRK v2.0.0 `../lib/OrdinaryDiffEqFIRK`
[101fe9f7] OrdinaryDiffEqFeagin v2.0.0 `../lib/OrdinaryDiffEqFeagin`
[d28bc4f8] OrdinaryDiffEqHighOrderRK v2.0.0 `../lib/OrdinaryDiffEqHighOrderRK`
[9f002381] OrdinaryDiffEqIMEXMultistep v2.0.0 `../lib/OrdinaryDiffEqIMEXMultistep`
[521117fe] OrdinaryDiffEqLinear v2.0.0 `../lib/OrdinaryDiffEqLinear`
[1344f307] OrdinaryDiffEqLowOrderRK v2.0.0 `../lib/OrdinaryDiffEqLowOrderRK`
[b0944070] OrdinaryDiffEqLowStorageRK v2.0.0 `../lib/OrdinaryDiffEqLowStorageRK`
[127b3ac7] OrdinaryDiffEqNonlinearSolve v2.0.0 `../lib/OrdinaryDiffEqNonlinearSolve`
[c9986a66] OrdinaryDiffEqNordsieck v2.0.0 `../lib/OrdinaryDiffEqNordsieck`
[5dd0a6cf] OrdinaryDiffEqPDIRK v2.0.0 `../lib/OrdinaryDiffEqPDIRK`
[5b33eab2] OrdinaryDiffEqPRK v2.0.0 `../lib/OrdinaryDiffEqPRK`
[04162be5] OrdinaryDiffEqQPRK v2.0.0 `../lib/OrdinaryDiffEqQPRK`
[af6ede74] OrdinaryDiffEqRKN v2.0.0 `../lib/OrdinaryDiffEqRKN`
[43230ef6] OrdinaryDiffEqRosenbrock v2.0.0 `../lib/OrdinaryDiffEqRosenbrock`
[b4bd8bb3] OrdinaryDiffEqRosenbrockTableaus v2.0.0 `../lib/OrdinaryDiffEqRosenbrockTableaus`
[2d112036] OrdinaryDiffEqSDIRK v2.0.0 `../lib/OrdinaryDiffEqSDIRK`
[669c94d9] OrdinaryDiffEqSSPRK v2.0.0 `../lib/OrdinaryDiffEqSSPRK`
[e3e12d00] OrdinaryDiffEqStabilizedIRK v2.0.0 `../lib/OrdinaryDiffEqStabilizedIRK`
[358294b1] OrdinaryDiffEqStabilizedRK v2.0.0 `../lib/OrdinaryDiffEqStabilizedRK`
[fa646aed] OrdinaryDiffEqSymplecticRK v2.0.0 `../lib/OrdinaryDiffEqSymplecticRK`
[b1df2697] OrdinaryDiffEqTsit5 v2.0.0 `../lib/OrdinaryDiffEqTsit5`
[79d7bb75] OrdinaryDiffEqVerner v2.0.0 `../lib/OrdinaryDiffEqVerner`
[90014a1f] PDMats v0.11.37
[69de0a69] Parsers v2.8.3
[e409e4f3] PoissonRandom v0.4.7
[d236fae5] PreallocationTools v1.2.0
[aea7be01] PrecompileTools v1.3.3
[21216c6a] Preferences v1.5.2
[43287f4e] PtrArrays v1.4.0
[1fd47b50] QuadGK v2.11.3
[3cdcf5f2] RecipesBase v1.3.4
[731186ca] RecursiveArrayTools v4.2.0
[189a3867] Reexport v1.2.2
[2792f1a3] RegistryInstances v0.1.0
[ae029012] Requires v1.3.1
[ae5879a3] ResettableStacks v1.2.0
[79098fc4] Rmath v0.9.0
[47965b36] RootedTrees v2.25.0
[7e49a35a] RuntimeGeneratedFunctions v0.5.18
[0bca4576] SciMLBase v3.6.0
[19f34311] SciMLJacobianOperators v0.1.13
[a6db7da4] SciMLLogging v1.9.1
[c0aeaf25] SciMLOperators v1.17.0
[431bcebd] SciMLPublic v1.0.1
[53ae85a6] SciMLStructures v1.10.0
[efcf1570] Setfield v1.1.2
[727e6d20] SimpleNonlinearSolve v2.11.1
[a2af1166] SortingAlgorithms v1.2.2
[0a514795] SparseMatrixColorings v0.4.27
[276daf66] SpecialFunctions v2.7.2
[90137ffa] StaticArrays v1.9.18
[1e83bf80] StaticArraysCore v1.4.4
[10745b16] Statistics v1.11.1
[82ae8749] StatsAPI v1.8.0
[2913bbd2] StatsBase v0.34.10
[4c63d2b9] StatsFuns v1.5.2
[09ab397b] StructArrays v0.7.3
[ec057cc2] StructUtils v2.8.0
[2efcf032] SymbolicIndexingInterface v0.3.46
[3783bdb8] TableTraits v1.0.1
[bd369af6] Tables v1.12.1
[a759f4b9] TimerOutputs v0.5.29
[3bb67fe8] TranscodingStreams v0.11.3
[781d530d] TruncatedStacktraces v1.4.0
[2e619515] Expat_jll v2.7.5+0
[61579ee1] Ghostscript_jll v9.55.1+0
[020c3dae] Git_LFS_jll v3.7.0+0
[f8c6e375] Git_jll v2.54.0+0
[1d5cc7b8] IntelOpenMP_jll v2025.2.0+0
[aacddb02] JpegTurbo_jll v3.1.5+0
[94ce4f54] Libiconv_jll v1.18.0+0
[856f044c] MKL_jll v2025.2.0+0
[9bd350c2] OpenSSH_jll v10.3.1+0
[efe28fd5] OpenSpecFun_jll v0.5.6+0
[f50d1b31] Rmath_jll v0.5.1+0
[1317d2d5] oneTBB_jll v2022.0.0+1
[0dad84c5] ArgTools v1.1.2
[56f22d72] Artifacts v1.11.0
[2a0f44e3] Base64 v1.11.0
[ade2ca70] Dates v1.11.0
[8ba89e20] Distributed v1.11.0
[f43a241f] Downloads v1.7.0
[7b1f6079] FileWatching v1.11.0
[9fa8497b] Future v1.11.0
[b77e0a4c] InteractiveUtils v1.11.0
[ac6e5ff7] JuliaSyntaxHighlighting v1.12.0
[4af54fe1] LazyArtifacts v1.11.0
[b27032c2] LibCURL v0.6.4
[76f85450] LibGit2 v1.11.0
[8f399da3] Libdl v1.11.0
[37e2e46d] LinearAlgebra v1.12.0
[56ddb016] Logging v1.11.0
[d6f4376e] Markdown v1.11.0
[ca575930] NetworkOptions v1.3.0
[44cfe95a] Pkg v1.12.1
[de0858da] Printf v1.11.0
[3fa0cd96] REPL v1.11.0
[9a3f8284] Random v1.11.0
[ea8e919c] SHA v0.7.0
[9e88b42a] Serialization v1.11.0
[6462fe0b] Sockets v1.11.0
[2f01184e] SparseArrays v1.12.0
[f489334b] StyledStrings v1.11.0
[4607b0f0] SuiteSparse
[fa267f1f] TOML v1.0.3
[a4e569a6] Tar v1.10.0
[8dfed614] Test v1.11.0
[cf7118a7] UUIDs v1.11.0
[4ec0a83e] Unicode v1.11.0
[e66e0078] CompilerSupportLibraries_jll v1.3.0+1
[deac9b47] LibCURL_jll v8.15.0+0
[e37daf67] LibGit2_jll v1.9.0+0
[29816b5a] LibSSH2_jll v1.11.3+1
[14a3606d] MozillaCACerts_jll v2025.11.4
[4536629a] OpenBLAS_jll v0.3.29+0
[05823500] OpenLibm_jll v0.8.7+0
[458c3c95] OpenSSL_jll v3.5.4+0
[efcefdf7] PCRE2_jll v10.44.0+1
[bea87d4a] SuiteSparse_jll v7.8.3+2
[83775a58] Zlib_jll v1.3.1+2
[8e850b90] libblastrampoline_jll v5.15.0+0
[8e850ede] nghttp2_jll v1.64.0+1
[3f19e933] p7zip_jll v17.7.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`