# SciMLAlgorithms

## Definition of the SciMLAlgorithm Interface

SciMLAlgorithms are defined as types which have dispatches to the function signature:

CommonSolve.solve(prob::SciMLProblem,alg::SciMLAlgorithm;kwargs...)

### Algorithm-Specific Arguments

Note that because the keyword arguments of solve are designed to be common across the whole problem type, algorithms should have the algorithm-specific keyword arguments defined as part of the algorithm constructor. For example, Rodas5 has a choice of autodiff::Bool which is not common across all ODE solvers, and thus autodiff is a algorithm-specific keyword argument handled via Rodas5(autodiff=true).

### Remake

Note that remake is applicable to SciMLAlgorithm types, but this is not used in the public API. It's used for solvers to swap out components like ForwardDiff chunk sizes.

## Common Algorithm Keyword Arguments

Commonly used algorithm keyword arguments are:

## Traits

SciMLBase.isautodifferentiableFunction

isautodifferentiable(alg::DEAlgorithm)

Trait declaration for whether an algorithm is compatible with direct automatic differentiation, i.e. can have algorithms like ForwardDiff or ReverseDiff attempt to differentiate directly through the solver.

Defaults to false as only pure-Julia algorithms can have this be true.

SciMLBase.allows_arbitrary_number_typesFunction

allowsarbitrarynumber_types(alg::DEAlgorithm)

Trait declaration for whether an algorithm is compatible with direct automatic differentiation, i.e. can have algorithms like ForwardDiff or ReverseDiff attempt to differentiate directly through the solver.

Defaults to false as only pure-Julia algorithms can have this be true.

SciMLBase.allowscomplexFunction

allowscomplex(alg::DEAlgorithm)

Trait declaration for whether an algorithm is compatible with having complex numbers as the state variables.

Defaults to false.

SciMLBase.isadaptiveFunction

Trait declaration for whether an algorithm uses adaptivity, i.e. has a non-quasi-static compute graph.

Defaults to true.

is_integrator_adaptive(i::DEIntegrator)

Checks if the integrator is adaptive

SciMLBase.isdiscreteFunction

isdiscrete(alg::DEAlgorithm)

Trait declaration for whether an algorithm allows for discrete state values, such as integers.

Defaults to false.