ADTypes.jl
Documentation for ADTypes.jl.
ADTypes.ADTypes
— ModuleADTypes.jl
ADTypes.jl is a multi-valued logic system to choose an automatic differentiation (AD) package and specify its parameters.
ADTypes.AbstractADType
— TypeAbstractADType
Abstract supertype for all AD choices.
Dense AD
Forward mode
Algorithmic differentiation:
ADTypes.AutoForwardDiff
— TypeAutoForwardDiff{chunksize,T}
Struct used to select the ForwardDiff.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoForwardDiff(; chunksize=nothing, tag=nothing)
Type parameters
chunksize
: the preferred chunk size to evaluate several derivatives at once
Fields
tag::T
: a custom tag to handle nested differentiation calls (usually not necessary)
ADTypes.AutoPolyesterForwardDiff
— TypeAutoPolyesterForwardDiff{chunksize,T}
Struct used to select the PolyesterForwardDiff.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoPolyesterForwardDiff(; chunksize=nothing, tag=nothing)
Type parameters
chunksize
: the preferred chunk size to evaluate several derivatives at once
Fields
tag::T
: a custom tag to handle nested differentiation calls (usually not necessary)
Finite differences:
ADTypes.AutoFiniteDiff
— TypeAutoFiniteDiff{T1,T2,T3}
Struct used to select the FiniteDiff.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoFiniteDiff(; fdtype=Val(:forward), fdjtype=fdtype, fdhtype=Val(:hcentral))
Fields
fdtype::T1
: finite difference typefdjtype::T2
: finite difference type for the Jacobianfdhtype::T3
: finite difference type for the Hessian
ADTypes.AutoFiniteDifferences
— TypeAutoFiniteDifferences{T}
Struct used to select the FiniteDifferences.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoFiniteDifferences(; fdm)
Fields
fdm::T
: aFiniteDifferenceMethod
Reverse mode
ADTypes.AutoReverseDiff
— TypeAutoReverseDiff{compile}
Struct used to select the ReverseDiff.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoReverseDiff(; compile::Union{Val, Bool} = Val(false))
Fields
compile::Union{Val, Bool}
: whether to compile the tape prior to differentiation (the boolean version is also the type parameter)
ADTypes.AutoTapir
— TypeAutoTapir
Struct used to select the Tapir.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoTapir(; safe_mode=true)
Fields
safe_mode::Bool
: whether to run additional checks to catch errors early. While this is on by default to ensure that users are aware of this option, you should generally turn it off for actual use, as it has substantial performance implications. If you encounter a problem with using Tapir (it fails to differentiate a function, or something truly nasty like a segfault occurs), then you should try switchingsafe_mode
on and look at what happens. Often errors are caught earlier and the error messages are more useful.
ADTypes.AutoTracker
— TypeAutoTracker
Struct used to select the Tracker.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoTracker()
ADTypes.AutoZygote
— TypeAutoZygote
Struct used to select the Zygote.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoZygote()
Forward or reverse mode
ADTypes.AutoEnzyme
— TypeAutoEnzyme{M,constant_function}
Struct used to select the Enzyme.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoEnzyme(; mode=nothing, constant_function::Bool=false)
The constant_function
keyword argument (and type parameter) determines whether the function object itself should be considered constant or not during differentiation with Enzyme.jl. For simple functions, constant_function
should usually be set to true
, which leads to increased performance. However, in the case of closures or callable structs which contain differentiated data, constant_function
should be set to false
to ensure correctness (more details below).
Fields
mode::M
: can be either- an object subtyping
EnzymeCore.Mode
(likeEnzymeCore.Forward
orEnzymeCore.Reverse
) if a specific mode is required nothing
to choose the best mode automatically
- an object subtyping
Notes
We now give several examples of functions. For each one, we explain how constant_function
should be set in order to compute the correct derivative with respect to the input x
.
function f1(x)
return x[1]
end
The function f1
is not a closure, it does not contain any data. Thus f1
can be differentiated with AutoEnzyme(constant_function=true)
(although here setting constant_function=false
would change neither correctness nor performance).
parameter = [0.0]
function f2(x)
return parameter[1] + x[1]
end
The function f2
is a closure over parameter
, but parameter
is never modified based on the input x
. Thus, f2
can be differentiated with AutoEnzyme(constant_function=true)
(setting constant_function=false
would not change correctness but would hinder performance).
cache = [0.0]
function f3(x)
cache[1] = x[1]
return cache[1] + x[1]
end
The function f3
is a closure over cache
, and cache
is modified based on the input x
. That means cache
cannot be treated as constant, since derivative values must be propagated through it. Thus f3
must be differentiated with AutoEnzyme(constant_function=false)
(setting constant_function=true
would make the result incorrect).
ADTypes.AutoChainRules
— TypeAutoChainRules{RC}
Struct used to select an automatic differentiation backend based on ChainRulesCore.jl (see the list here).
Defined by ADTypes.jl.
Constructors
AutoChainRules(; ruleconfig)
Fields
ruleconfig::RC
: aChainRulesCore.RuleConfig
object.
ADTypes.AutoDiffractor
— TypeAutoDiffractor
Struct used to select the Diffractor.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoDiffractor()
Symbolic mode
ADTypes.AutoFastDifferentiation
— TypeAutoFastDifferentiation
Struct used to select the FastDifferentiation.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoFastDifferentiation()
ADTypes.AutoSymbolics
— TypeAutoSymbolics
Struct used to select the Symbolics.jl backend for automatic differentiation.
Defined by ADTypes.jl.
Constructors
AutoSymbolics()
Sparse AD
ADTypes.AutoSparse
— TypeAutoSparse{D,S,C}
Wraps an ADTypes.jl object to deal with sparse Jacobians and Hessians.
Fields
dense_ad::D
: the underlying AD package, subtypingAbstractADType
sparsity_detector::S
: the sparsity pattern detector, subtypingAbstractSparsityDetector
coloring_algorithm::C
: the coloring algorithm, subtypingAbstractColoringAlgorithm
Constructors
AutoSparse(
dense_ad;
sparsity_detector=ADTypes.NoSparsityDetector(),
coloring_algorithm=ADTypes.NoColoringAlgorithm()
)
ADTypes.dense_ad
— Functiondense_ad(ad::AutoSparse)::AbstractADType
Return the underlying AD package for a sparse AD choice.
See also
Sparsity detector
ADTypes.sparsity_detector
— Functionsparsity_detector(ad::AutoSparse)::AbstractSparsityDetector
Return the sparsity pattern detector for a sparse AD choice.
See also
ADTypes.AbstractSparsityDetector
— TypeAbstractSparsityDetector
Abstract supertype for sparsity pattern detectors.
Required methods
ADTypes.jacobian_sparsity
— Functionjacobian_sparsity(f, x, sd::AbstractSparsityDetector)::AbstractMatrix{Bool}
jacobian_sparsity(f!, y, x, sd::AbstractSparsityDetector)::AbstractMatrix{Bool}
Use detector sd
to construct a (typically sparse) matrix S
describing the pattern of nonzeroes in the Jacobian of f
(resp. f!
) applied at x
(resp. (y, x)
).
ADTypes.hessian_sparsity
— Functionhessian_sparsity(f, x, sd::AbstractSparsityDetector)::AbstractMatrix{Bool}
Use detector sd
to construct a (typically sparse) matrix S
describing the pattern of nonzeroes in the Hessian of f
applied at x
.
ADTypes.NoSparsityDetector
— TypeNoSparsityDetector <: AbstractSparsityDetector
Trivial sparsity detector, which always returns a full sparsity pattern (only ones, no zeroes).
See also
Coloring algorithm
ADTypes.coloring_algorithm
— Functioncoloring_algorithm(ad::AutoSparse)::AbstractColoringAlgorithm
Return the coloring algorithm for a sparse AD choice.
See also
ADTypes.AbstractColoringAlgorithm
— TypeAbstractColoringAlgorithm
Abstract supertype for Jacobian/Hessian coloring algorithms, defined for example in SparseDiffTools.jl.
Required methods
Note
The terminology and definitions are taken from the following paper:
"What Color Is Your Jacobian? Graph Coloring for Computing Derivatives"
Assefaw Hadish Gebremedhin, Fredrik Manne, and Alex Pothen (2005)
https://epubs.siam.org/doi/10.1137/S0036144504444711
ADTypes.column_coloring
— Functioncolumn_coloring(M::AbstractMatrix, ca::ColoringAlgorithm)::AbstractVector{<:Integer}
Use algorithm ca
to construct a structurally orthogonal partition of the columns of M
.
The result is a coloring vector c
of length size(M, 2)
such that for every non-zero coefficient M[i, j]
, column j
is the only column of its color c[j]
with a non-zero coefficient in row i
.
ADTypes.row_coloring
— Functionrow_coloring(M::AbstractMatrix, ca::ColoringAlgorithm)::AbstractVector{<:Integer}
Use algorithm ca
to construct a structurally orthogonal partition of the rows of M
.
The result is a coloring vector c
of length size(M, 1)
such that for every non-zero coefficient M[i, j]
, row i
is the only row of its color c[i]
with a non-zero coefficient in column j
.
ADTypes.symmetric_coloring
— Functionsymmetric_coloring(M::AbstractMatrix, ca::ColoringAlgorithm)::AbstractVector{<:Integer}
Use algorithm ca
to construct a symmetrically structurally orthogonal partition of the columns (or rows) of the symmetric matrix M
.
The result is a coloring vector c
of length size(M, 1) == size(M, 2)
such that for every non-zero coefficient M[i, j]
, at least one of the following conditions holds:
- column
j
is the only column of its colorc[j]
with a non-zero coefficient in rowi
; - column
i
is the only column of its colorc[i]
with a non-zero coefficient in rowj
.
ADTypes.NoColoringAlgorithm
— TypeNoColoringAlgorithm <: AbstractColoringAlgorithm
Trivial coloring algorithm, which always returns a different color for each matrix column/row.
See also
Modes
ADTypes.mode
— Functionmode(ad::AbstractADType)
Return the differentiation mode of ad
, as a subtype of AbstractMode
.
ADTypes.AbstractMode
— TypeAbstractMode
Abstract supertype for the traits identifying differentiation modes.
Subtypes
ADTypes.ForwardMode
— TypeForwardMode
Trait for AD choices that rely on forward mode algorithmic differentiation or finite differences.
These two paradigms are classified together because they can both efficiently compute Jacobian-vector products.
ADTypes.ForwardOrReverseMode
— TypeForwardOrReverseMode
Trait for AD choices that can work either in ForwardMode
or ReverseMode
, depending on their configuration.
This trait should rarely be used, because more precise dispatches to ForwardMode
or ReverseMode
should be defined.
ADTypes.ReverseMode
— TypeReverseMode
Trait for AD choices that rely on reverse mode algorithmic differentiation.
ADTypes.SymbolicMode
— TypeSymbolicMode
Trait for AD choices that rely on symbolic differentiation.
Miscellaneous
ADTypes.Auto
— FunctionADTypes.Auto(package::Symbol)
A shortcut that converts an AD package name into an instance of AbstractADType
, with all parameters set to their default values.
This function is type-unstable by design and might lead to suboptimal performance. In most cases, you should never need it: use the individual backend types directly.
Example
import ADTypes
backend = ADTypes.Auto(:Zygote)
# output
ADTypes.AutoZygote()