Skip to content

Commit c241361

Browse files
authored
Only jacobian and hessian for sparse backends (#179)
* Only jacobian and hessian for sparse backends * Put sparse scenarios with the other scenarios
1 parent 6e9b50d commit c241361

31 files changed

Lines changed: 345 additions & 365 deletions

File tree

DifferentiationInterface/docs/src/backends.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ AutoZygote
6363

6464
### Sparse
6565

66+
!!! warning
67+
For sparse backends, only the Jacobian and Hessian operators are implemented.
68+
6669
```@docs
6770
AutoSparseFastDifferentiation
6871
AutoSparseFiniteDiff

DifferentiationInterface/ext/DifferentiationInterfaceChainRulesCoreExt/DifferentiationInterfaceChainRulesCoreExt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ ruleconfig(backend::AutoChainRules) = backend.ruleconfig
1111
const AutoForwardChainRules = AutoChainRules{<:RuleConfig{>:HasForwardsMode}}
1212
const AutoReverseChainRules = AutoChainRules{<:RuleConfig{>:HasReverseMode}}
1313

14+
DI.check_available(::AutoChainRules) = true
1415
DI.supports_mutation(::AutoChainRules) = DI.MutationNotSupported()
1516
DI.mode(::AutoForwardChainRules) = ADTypes.AbstractForwardMode
1617
DI.mode(::AutoReverseChainRules) = ADTypes.AbstractReverseMode

DifferentiationInterface/ext/DifferentiationInterfaceDiffractorExt/DifferentiationInterfaceDiffractorExt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import DifferentiationInterface as DI
55
using DifferentiationInterface: NoPushforwardExtras
66
using Diffractor: DiffractorRuleConfig, TaylorTangentIndex, ZeroBundle, bundle, ∂☆
77

8+
DI.check_available(::AutoDiffractor) = true
89
DI.supports_mutation(::AutoDiffractor) = DI.MutationNotSupported()
910
DI.mode(::AutoDiffractor) = ADTypes.AbstractForwardMode
1011
DI.mode(::AutoChainRules{<:DiffractorRuleConfig}) = ADTypes.AbstractForwardMode

DifferentiationInterface/ext/DifferentiationInterfaceEnzymeExt/DifferentiationInterfaceEnzymeExt.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ AutoEnzyme
3838
const AutoForwardEnzyme = AutoEnzyme{<:ForwardMode}
3939
const AutoReverseEnzyme = AutoEnzyme{<:ReverseMode}
4040

41+
DI.check_available(::AutoEnzyme) = true
42+
4143
function DI.mode(::AutoEnzyme)
4244
return error(
4345
"You need to specify the Enzyme mode with `AutoEnzyme(Enzyme.Forward)` or `AutoEnzyme(Enzyme.Reverse)`",

DifferentiationInterface/ext/DifferentiationInterfaceFastDifferentiationExt/DifferentiationInterfaceFastDifferentiationExt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const AnyAutoFastDifferentiation = Union{
3131
AutoFastDifferentiation,AutoSparseFastDifferentiation
3232
}
3333

34+
DI.check_available(::AutoFastDifferentiation) = true
3435
DI.mode(::AnyAutoFastDifferentiation) = ADTypes.AbstractSymbolicDifferentiationMode
3536
DI.pushforward_performance(::AnyAutoFastDifferentiation) = DI.PushforwardFast()
3637
DI.pullback_performance(::AnyAutoFastDifferentiation) = DI.PullbackSlow()

DifferentiationInterface/ext/DifferentiationInterfaceFiniteDiffExt/DifferentiationInterfaceFiniteDiffExt.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ using FiniteDiff:
2323
finite_difference_jacobian!
2424
using LinearAlgebra: dot, mul!
2525

26-
const AnyAutoFiniteDiff = Union{AutoFiniteDiff,AutoSparseFiniteDiff}
26+
DI.check_available(::AutoFiniteDiff) = true
2727

2828
# see https://github.com/SciML/ADTypes.jl/issues/33
2929

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
## Pushforward
22

3-
DI.prepare_pushforward(f, ::AnyAutoFiniteDiff, x) = NoPushforwardExtras()
3+
DI.prepare_pushforward(f, ::AutoFiniteDiff, x) = NoPushforwardExtras()
44

5-
function DI.pushforward(f, backend::AnyAutoFiniteDiff, x, dx, ::NoPushforwardExtras)
5+
function DI.pushforward(f, backend::AutoFiniteDiff, x, dx, ::NoPushforwardExtras)
66
step(t::Number) = f(x .+ t .* dx)
77
new_dy = finite_difference_derivative(step, zero(eltype(x)), fdtype(backend))
88
return new_dy
99
end
1010

11-
function DI.value_and_pushforward(
12-
f, backend::AnyAutoFiniteDiff, x, dx, ::NoPushforwardExtras
13-
)
11+
function DI.value_and_pushforward(f, backend::AutoFiniteDiff, x, dx, ::NoPushforwardExtras)
1412
y = f(x)
1513
step(t::Number) = f(x .+ t .* dx)
1614
new_dy = finite_difference_derivative(
@@ -25,7 +23,7 @@ struct FiniteDiffOneArgDerivativeExtras{C}
2523
cache::C
2624
end
2725

28-
function DI.prepare_derivative(f, backend::AnyAutoFiniteDiff, x)
26+
function DI.prepare_derivative(f, backend::AutoFiniteDiff, x)
2927
y = f(x)
3028
cache = if y isa Number
3129
nothing
@@ -39,26 +37,26 @@ end
3937
### Scalar to scalar
4038

4139
function DI.derivative(
42-
f, backend::AnyAutoFiniteDiff, x, ::FiniteDiffOneArgDerivativeExtras{Nothing}
40+
f, backend::AutoFiniteDiff, x, ::FiniteDiffOneArgDerivativeExtras{Nothing}
4341
)
4442
return finite_difference_derivative(f, x, fdtype(backend))
4543
end
4644

4745
function DI.derivative!(
48-
f, der, backend::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{Nothing}
46+
f, der, backend::AutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{Nothing}
4947
)
5048
return copyto!(der, DI.derivative(f, backend, x, extras))
5149
end
5250

5351
function DI.value_and_derivative(
54-
f, backend::AnyAutoFiniteDiff, x, ::FiniteDiffOneArgDerivativeExtras{Nothing}
52+
f, backend::AutoFiniteDiff, x, ::FiniteDiffOneArgDerivativeExtras{Nothing}
5553
)
5654
y = f(x)
5755
return y, finite_difference_derivative(f, x, fdtype(backend), eltype(y), y)
5856
end
5957

6058
function DI.value_and_derivative!(
61-
f, der, backend::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{Nothing}
59+
f, der, backend::AutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{Nothing}
6260
)
6361
y, new_der = DI.value_and_derivative(f, backend, x, extras)
6462
return y, copyto!(der, new_der)
@@ -67,34 +65,26 @@ end
6765
### Scalar to array
6866

6967
function DI.derivative(
70-
f, ::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache}
68+
f, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache}
7169
)
7270
return finite_difference_gradient(f, x, extras.cache)
7371
end
7472

7573
function DI.derivative!(
76-
f,
77-
der,
78-
::AnyAutoFiniteDiff,
79-
x,
80-
extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache},
74+
f, der, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache}
8175
)
8276
return finite_difference_gradient!(der, f, x, extras.cache)
8377
end
8478

8579
function DI.value_and_derivative(
86-
f, ::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache}
80+
f, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache}
8781
)
8882
y = f(x)
8983
return y, finite_difference_gradient(f, x, extras.cache)
9084
end
9185

9286
function DI.value_and_derivative!(
93-
f,
94-
der,
95-
::AnyAutoFiniteDiff,
96-
x,
97-
extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache},
87+
f, der, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgDerivativeExtras{<:GradientCache}
9888
)
9989
return f(x), finite_difference_gradient!(der, f, x, extras.cache)
10090
end
@@ -105,33 +95,33 @@ struct FiniteDiffGradientExtras{C}
10595
cache::C
10696
end
10797

108-
function DI.prepare_gradient(f, backend::AnyAutoFiniteDiff, x)
98+
function DI.prepare_gradient(f, backend::AutoFiniteDiff, x)
10999
y = f(x)
110100
df = zero(y) .* x
111101
cache = GradientCache(df, x, fdtype(backend))
112102
return FiniteDiffGradientExtras(cache)
113103
end
114104

115105
function DI.gradient(
116-
f, ::AnyAutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
106+
f, ::AutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
117107
)
118108
return finite_difference_gradient(f, x, extras.cache)
119109
end
120110

121111
function DI.value_and_gradient(
122-
f, ::AnyAutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
112+
f, ::AutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
123113
)
124114
return f(x), finite_difference_gradient(f, x, extras.cache)
125115
end
126116

127117
function DI.gradient!(
128-
f, grad, ::AnyAutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
118+
f, grad, ::AutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
129119
)
130120
return finite_difference_gradient!(grad, f, x, extras.cache)
131121
end
132122

133123
function DI.value_and_gradient!(
134-
f, grad, ::AnyAutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
124+
f, grad, ::AutoFiniteDiff, x::AbstractArray, extras::FiniteDiffGradientExtras
135125
)
136126
return f(x), finite_difference_gradient!(grad, f, x, extras.cache)
137127
end
@@ -142,7 +132,7 @@ struct FiniteDiffOneArgJacobianExtras{C}
142132
cache::C
143133
end
144134

145-
function DI.prepare_jacobian(f, backend::AnyAutoFiniteDiff, x)
135+
function DI.prepare_jacobian(f, backend::AutoFiniteDiff, x)
146136
y = f(x)
147137
x1 = similar(x)
148138
fx = similar(y)
@@ -151,25 +141,23 @@ function DI.prepare_jacobian(f, backend::AnyAutoFiniteDiff, x)
151141
return FiniteDiffOneArgJacobianExtras(cache)
152142
end
153143

154-
function DI.jacobian(f, ::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras)
144+
function DI.jacobian(f, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras)
155145
return finite_difference_jacobian(f, x, extras.cache)
156146
end
157147

158148
function DI.value_and_jacobian(
159-
f, ::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras
149+
f, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras
160150
)
161151
y = f(x)
162152
return y, finite_difference_jacobian(f, x, extras.cache, y)
163153
end
164154

165-
function DI.jacobian!(
166-
f, jac, ::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras
167-
)
155+
function DI.jacobian!(f, jac, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras)
168156
return copyto!(jac, finite_difference_jacobian(f, x, extras.cache; jac_prototype=jac))
169157
end
170158

171159
function DI.value_and_jacobian!(
172-
f, jac, ::AnyAutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras
160+
f, jac, ::AutoFiniteDiff, x, extras::FiniteDiffOneArgJacobianExtras
173161
)
174162
y = f(x)
175163
return y,
@@ -182,15 +170,15 @@ struct FiniteDiffHessianExtras{C}
182170
cache::C
183171
end
184172

185-
function DI.prepare_hessian(f, backend::AnyAutoFiniteDiff, x)
173+
function DI.prepare_hessian(f, backend::AutoFiniteDiff, x)
186174
cache = HessianCache(x, fdhtype(backend))
187175
return FiniteDiffHessianExtras(cache)
188176
end
189177

190-
function DI.hessian(f, ::AnyAutoFiniteDiff, x, extras::FiniteDiffHessianExtras)
178+
function DI.hessian(f, ::AutoFiniteDiff, x, extras::FiniteDiffHessianExtras)
191179
return finite_difference_hessian(f, x, extras.cache)
192180
end
193181

194-
function DI.hessian!(f, hess, ::AnyAutoFiniteDiff, x, extras::FiniteDiffHessianExtras)
182+
function DI.hessian!(f, hess, ::AutoFiniteDiff, x, extras::FiniteDiffHessianExtras)
195183
return finite_difference_hessian!(hess, f, x, extras.cache)
196184
end

DifferentiationInterface/ext/DifferentiationInterfaceFiniteDiffExt/twoarg.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
## Pushforward
22

3-
DI.prepare_pushforward(f!, y, ::AnyAutoFiniteDiff, x) = NoPushforwardExtras()
3+
DI.prepare_pushforward(f!, y, ::AutoFiniteDiff, x) = NoPushforwardExtras()
44

55
function DI.value_and_pushforward(
6-
f!, y, backend::AnyAutoFiniteDiff, x, dx, ::NoPushforwardExtras
6+
f!, y, backend::AutoFiniteDiff, x, dx, ::NoPushforwardExtras
77
)
88
function step(t::Number)::AbstractArray
99
new_y = similar(y)
@@ -23,37 +23,37 @@ struct FiniteDiffTwoArgDerivativeExtras{C}
2323
cache::C
2424
end
2525

26-
function DI.prepare_derivative(f!, y, ::AnyAutoFiniteDiff, x)
26+
function DI.prepare_derivative(f!, y, ::AutoFiniteDiff, x)
2727
cache = nothing
2828
return FiniteDiffTwoArgDerivativeExtras(cache)
2929
end
3030

3131
function DI.value_and_derivative(
32-
f!, y, backend::AnyAutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
32+
f!, y, backend::AutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
3333
)
3434
f!(y, x)
3535
der = finite_difference_gradient(f!, x, fdtype(backend), eltype(y), FUNCTION_INPLACE, y)
3636
return y, der
3737
end
3838

3939
function DI.value_and_derivative!(
40-
f!, y, der, backend::AnyAutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
40+
f!, y, der, backend::AutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
4141
)
4242
f!(y, x)
4343
finite_difference_gradient!(der, f!, x, fdtype(backend), eltype(y), FUNCTION_INPLACE, y)
4444
return y, der
4545
end
4646

4747
function DI.derivative(
48-
f!, y, backend::AnyAutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
48+
f!, y, backend::AutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
4949
)
5050
f!(y, x)
5151
der = finite_difference_gradient(f!, x, fdtype(backend), eltype(y), FUNCTION_INPLACE, y)
5252
return der
5353
end
5454

5555
function DI.derivative!(
56-
f!, y, der, backend::AnyAutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
56+
f!, y, der, backend::AutoFiniteDiff, x, ::FiniteDiffTwoArgDerivativeExtras
5757
)
5858
finite_difference_gradient!(der, f!, x, fdtype(backend), eltype(y), FUNCTION_INPLACE)
5959
return der
@@ -65,7 +65,7 @@ struct FiniteDiffTwoArgJacobianExtras{C}
6565
cache::C
6666
end
6767

68-
function DI.prepare_jacobian(f!, y, backend::AnyAutoFiniteDiff, x)
68+
function DI.prepare_jacobian(f!, y, backend::AutoFiniteDiff, x)
6969
x1 = similar(x)
7070
fx = similar(y)
7171
fx1 = similar(y)
@@ -74,7 +74,7 @@ function DI.prepare_jacobian(f!, y, backend::AnyAutoFiniteDiff, x)
7474
end
7575

7676
function DI.value_and_jacobian(
77-
f!, y, ::AnyAutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras
77+
f!, y, ::AutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras
7878
)
7979
jac = similar(y, length(y), length(x))
8080
finite_difference_jacobian!(jac, f!, x, extras.cache)
@@ -83,21 +83,21 @@ function DI.value_and_jacobian(
8383
end
8484

8585
function DI.value_and_jacobian!(
86-
f!, y, jac, ::AnyAutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras
86+
f!, y, jac, ::AutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras
8787
)
8888
finite_difference_jacobian!(jac, f!, x, extras.cache)
8989
f!(y, x)
9090
return y, jac
9191
end
9292

93-
function DI.jacobian(f!, y, ::AnyAutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras)
93+
function DI.jacobian(f!, y, ::AutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras)
9494
jac = similar(y, length(y), length(x))
9595
finite_difference_jacobian!(jac, f!, x, extras.cache)
9696
return jac
9797
end
9898

9999
function DI.jacobian!(
100-
f!, y, jac, ::AnyAutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras
100+
f!, y, jac, ::AutoFiniteDiff, x, extras::FiniteDiffTwoArgJacobianExtras
101101
)
102102
finite_difference_jacobian!(jac, f!, x, extras.cache)
103103
return jac

DifferentiationInterface/ext/DifferentiationInterfaceFiniteDifferencesExt/DifferentiationInterfaceFiniteDifferencesExt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ using FillArrays: OneElement
88
using FiniteDifferences: FiniteDifferences, grad, jacobian, jvp, j′vp
99
using LinearAlgebra: dot
1010

11+
DI.check_available(::AutoFiniteDifferences) = true
1112
DI.supports_mutation(::AutoFiniteDifferences) = DI.MutationNotSupported()
1213

1314
function FiniteDifferences.to_vec(a::OneElement) # TODO: remove type piracy (https://github.com/JuliaDiff/FiniteDifferences.jl/issues/141)

DifferentiationInterface/ext/DifferentiationInterfaceForwardDiffExt/DifferentiationInterfaceForwardDiffExt.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ using ForwardDiff:
3232
value
3333
using LinearAlgebra: dot, mul!
3434

35-
const AnyAutoForwardDiff{C,T} = Union{AutoForwardDiff{C,T},AutoSparseForwardDiff{C,T}}
35+
DI.check_available(::AutoForwardDiff) = true
3636

3737
include("utils.jl")
3838
include("onearg.jl")

0 commit comments

Comments
 (0)