CommonSolve.jl: The Common Solve Definition and Interface

This holds the common solve, init, solve!, and step! commands. By using the same definition, solver libraries from entirely different ecosystems can extend the functions and thus not clash with SciML if both ecosystems export the solve command. The rules are that you must dispatch on one of your own types. That's it. No pirates.

Installation

To install CommonSolve.jl, use the Julia package manager:

using Pkg
Pkg.add("CommonSolve")

General recommendation

solve function has the default definition

solve(args...; kwargs...) = solve!(init(args...; kwargs...))

So, we recommend defining

init(::ProblemType, args...; kwargs...)::SolverType
solve!(::SolverType)::SolutionType

where ProblemType, SolverType, and SolutionType are the types defined in your package.

In many cases, the SolverType is an object that is iteratively progressed to achieve the solution. In such cases, the step! function can be used:

step!(::SolverType, args...; kwargs...)

To avoid type piracy and method ambiguity, the first argument of solve, solve!, step!, and initmust be dispatched on a type defined in your package. For example, do not define a method such as

init(::AbstractVector, ::AlgorithmType)

where AlgorithmType is your type but AbstractVector is not. The first argument must be your problem or iterator type; placing an owned algorithm type in a later argument is not sufficient.

API

CommonSolve.CommonSolveModule
module CommonSolve

Defines the shared solver interface functions used by solver packages that need common names without exporting them into downstream user namespaces. The public API is the set of generic functions CommonSolve.solve, CommonSolve.solve!, CommonSolve.init, and CommonSolve.step!.

Interface

Downstream packages extend these functions on problem, algorithm, iterator, or cache types that they own. This keeps independent solver ecosystems compatible without introducing type piracy or method ambiguities.

Example

using CommonSolve

struct MyProblem end
struct MyAlg end

CommonSolve.solve(::MyProblem, ::MyAlg) = :solution

CommonSolve.solve(MyProblem(), MyAlg())
source
CommonSolve.initFunction
CommonSolve.init(args...; kwargs...) -> iter

Create an iterator or cache object that can be passed to CommonSolve.solve! or CommonSolve.step!. Generally, downstream packages extend:

iter = CommonSolve.init(prob::ProblemType, alg::SolverType; kwargs...)::IterType
CommonSolve.solve!(iter)::SolutionType

Arguments

  • args...: Problem, algorithm, and implementation-specific positional arguments. The first positional argument must have a type owned by the package extending init.

Keywords

  • kwargs...: Implementation-specific solver options.

Returns

An implementation-defined iterator or cache object that stores solver state.

Examples

struct MyProblem end
struct MyAlg end
struct MyIterator end

CommonSolve.init(::MyProblem, ::MyAlg; kwargs...) = MyIterator()

iter = CommonSolve.init(MyProblem(), MyAlg())
source
CommonSolve.solveFunction
CommonSolve.solve(args...; kwargs...) -> solution

Solve an equation or other mathematical problem using the algorithm specified in the arguments. Generally, downstream packages extend:

CommonSolve.solve(prob::ProblemType, alg::SolverType; kwargs...)::SolutionType

If a package only defines the iterator interface, solve falls back to:

solve(args...; kwargs...) = solve!(init(args...; kwargs...))

Arguments

  • args...: Problem, algorithm, and implementation-specific positional arguments.

Keywords

  • kwargs...: Implementation-specific solver options.

Interface

Extensions must dispatch the first positional argument on a type that they own. This prevents type piracy and ambiguities between independently developed solver packages.

Returns

The solution object defined by the downstream solver implementation.

Examples

struct MyProblem end
struct MyAlg end

CommonSolve.solve(::MyProblem, ::MyAlg; kwargs...) = :solution

CommonSolve.solve(MyProblem(), MyAlg())
source
CommonSolve.solve!Function
CommonSolve.solve!(iter) -> solution

Complete the solve using an iterator or cache object created by CommonSolve.init. Generally, downstream packages extend:

iter = CommonSolve.init(prob::ProblemType, alg::SolverType; kwargs...)::IterType
CommonSolve.solve!(iter)::SolutionType

Arguments

  • iter: Solver state returned by CommonSolve.init. Its type must be owned by the package extending solve!.

Returns

The solution object defined by the downstream solver implementation.

Examples

struct MyIterator end

CommonSolve.solve!(::MyIterator) = :solution

CommonSolve.solve!(MyIterator())
source
CommonSolve.step!Function
CommonSolve.step!(iter, args...; kwargs...) -> step_result

Progress an iterator or cache object returned by CommonSolve.init. The additional arguments typically describe how far to advance the solve and are implementation-specific.

Arguments

  • iter: Solver state returned by CommonSolve.init. Its type must be owned by the package extending step!.
  • args...: Implementation-specific step controls.

Keywords

  • kwargs...: Implementation-specific step options.

Returns

An implementation-defined value, commonly the updated iterator, a step result, or nothing.

Examples

mutable struct MyIterator
    steps::Int
end

function CommonSolve.step!(iter::MyIterator)
    iter.steps += 1
    return iter
end

iter = CommonSolve.step!(MyIterator(0))
source

Contributing

Reproducibility

The documentation of this SciML package was built using these direct dependencies,
Status `~/work/CommonSolve.jl/CommonSolve.jl/docs/Project.toml`
  [38540f10] CommonSolve v0.2.14 `~/work/CommonSolve.jl/CommonSolve.jl`
  [e30172f5] Documenter v1.19.0
and using this machine and Julia version.
Julia Version 1.13.0
Commit d1c37793dd2 (2026-09-09 19:00 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-20.1.8 (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/CommonSolve.jl/CommonSolve.jl/docs/Manifest.toml`
  [a4c015fc] ANSIColoredPrinters v0.0.1
  [1520ce14] AbstractTrees v0.4.5
  [944b1d66] CodecZlib v0.7.9
  [38540f10] CommonSolve v0.2.14 `~/work/CommonSolve.jl/CommonSolve.jl`
  [ffbed154] DocStringExtensions v0.9.5
  [e30172f5] Documenter v1.19.0
  [d7ba0133] Git v1.5.0
  [b5f81e59] IOCapture v1.0.0
  [692b3bcd] JLLWrappers v1.8.0
  [682c06a0] JSON v1.8.1
  [0e77f7df] LazilyInitializedFields v1.3.0
  [d0879d2d] MarkdownAST v0.1.3
  [69de0a69] Parsers v3.0.0
  [aea7be01] PrecompileTools v1.3.4
  [21216c6a] Preferences v1.6.0
  [2792f1a3] RegistryInstances v0.1.0
  [ec057cc2] StructUtils v2.9.1
  [3bb67fe8] TranscodingStreams v0.11.3
  [2e619515] Expat_jll v2.8.4+0
  [020c3dae] Git_LFS_jll v3.7.1+0
  [f8c6e375] Git_jll v2.55.0+0
  [94ce4f54] Libiconv_jll v1.18.0+0
  [9bd350c2] OpenSSH_jll v10.5.1+0
  [0dad84c5] ArgTools v1.1.2
  [56f22d72] Artifacts v1.11.0
  [2a0f44e3] Base64 v1.11.0
  [ade2ca70] Dates v1.11.0
  [f43a241f] Downloads v1.7.0
  [7b1f6079] FileWatching v1.11.0
  [b77e0a4c] InteractiveUtils v1.11.0
  [ac6e5ff7] JuliaSyntaxHighlighting v1.12.0
  [b27032c2] LibCURL v1.0.0
  [76f85450] LibGit2 v1.11.0
  [8f399da3] Libdl v1.11.0
  [56ddb016] Logging v1.11.0
  [d6f4376e] Markdown v1.11.0
  [ca575930] NetworkOptions v1.3.0
  [44cfe95a] Pkg v1.13.0
  [de0858da] Printf v1.11.0
  [3fa0cd96] REPL v1.11.0
  [9a3f8284] Random v1.11.0
  [ea8e919c] SHA v1.0.0
  [9e88b42a] Serialization v1.11.0
  [6462fe0b] Sockets v1.11.0
  [f489334b] StyledStrings v1.11.0
  [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.5.5+2
  [deac9b47] LibCURL_jll v8.18.0+1
  [e37daf67] LibGit2_jll v1.9.1+0
  [29816b5a] LibSSH2_jll v1.11.103+0
  [14a3606d] MozillaCACerts_jll v2026.8.13
  [458c3c95] OpenSSL_jll v3.5.6+0
  [efcefdf7] PCRE2_jll v10.46.0+0
  [83775a58] Zlib_jll v1.3.1+2
  [3161d3a3] Zstd_jll v1.5.7+1
  [8e850ede] nghttp2_jll v1.67.1+0
  [3f19e933] p7zip_jll v17.8.2+0

You can also download the manifest file and the project file.