@@ -21,7 +21,7 @@ using DiffResults: DiffResult, ImmutableDiffResult, MutableDiffResult
21
21
end
22
22
end
23
23
24
- @inline static_dual_eval (:: Type{T} , f, x:: StaticArray ) where T = f (dualize (T, x))
24
+ @inline static_dual_eval (:: Type{T} , f:: F , x:: StaticArray ) where {T,F} = f (dualize (T, x))
25
25
26
26
# To fix method ambiguity issues:
27
27
function LinearAlgebra. eigvals (A:: Symmetric{<:Dual{Tg,T,N}, <:StaticArrays.StaticMatrix} ) where {Tg,T<: Real ,N}
35
35
ForwardDiff. _lyap_div!! (A:: StaticArrays.MMatrix , λ:: AbstractVector ) = ForwardDiff. _lyap_div! (A, λ)
36
36
37
37
# Gradient
38
- @inline ForwardDiff. gradient (f, x:: StaticArray ) = vector_mode_gradient (f, x)
39
- @inline ForwardDiff. gradient (f, x:: StaticArray , cfg:: GradientConfig ) = gradient (f, x)
40
- @inline ForwardDiff. gradient (f, x:: StaticArray , cfg:: GradientConfig , :: Val ) = gradient (f, x)
38
+ @inline ForwardDiff. gradient (f:: F , x:: StaticArray ) where {F} = vector_mode_gradient (f, x)
39
+ @inline ForwardDiff. gradient (f:: F , x:: StaticArray , cfg:: GradientConfig ) where {F} = gradient (f, x)
40
+ @inline ForwardDiff. gradient (f:: F , x:: StaticArray , cfg:: GradientConfig , :: Val ) where {F} = gradient (f, x)
41
41
42
- @inline ForwardDiff. gradient! (result:: Union{AbstractArray,DiffResult} , f, x:: StaticArray ) = vector_mode_gradient! (result, f, x)
43
- @inline ForwardDiff. gradient! (result:: Union{AbstractArray,DiffResult} , f, x:: StaticArray , cfg:: GradientConfig ) = gradient! (result, f, x)
44
- @inline ForwardDiff. gradient! (result:: Union{AbstractArray,DiffResult} , f, x:: StaticArray , cfg:: GradientConfig , :: Val ) = gradient! (result, f, x)
42
+ @inline ForwardDiff. gradient! (result:: Union{AbstractArray,DiffResult} , f:: F , x:: StaticArray ) where {F} = vector_mode_gradient! (result, f, x)
43
+ @inline ForwardDiff. gradient! (result:: Union{AbstractArray,DiffResult} , f:: F , x:: StaticArray , cfg:: GradientConfig ) where {F} = gradient! (result, f, x)
44
+ @inline ForwardDiff. gradient! (result:: Union{AbstractArray,DiffResult} , f:: F , x:: StaticArray , cfg:: GradientConfig , :: Val ) where {F} = gradient! (result, f, x)
45
45
46
46
@generated function extract_gradient (:: Type{T} , y:: Real , x:: S ) where {T,S<: StaticArray }
47
47
result = Expr (:tuple , [:(partials (T, y, $ i)) for i in 1 : length (x)]. .. )
@@ -52,24 +52,24 @@ ForwardDiff._lyap_div!!(A::StaticArrays.MMatrix, λ::AbstractVector) = ForwardDi
52
52
end
53
53
end
54
54
55
- @inline function ForwardDiff. vector_mode_gradient (f, x:: StaticArray )
55
+ @inline function ForwardDiff. vector_mode_gradient (f:: F , x:: StaticArray ) where {F}
56
56
T = typeof (Tag (f, eltype (x)))
57
57
return extract_gradient (T, static_dual_eval (T, f, x), x)
58
58
end
59
59
60
- @inline function ForwardDiff. vector_mode_gradient! (result, f, x:: StaticArray )
60
+ @inline function ForwardDiff. vector_mode_gradient! (result, f:: F , x:: StaticArray ) where {F}
61
61
T = typeof (Tag (f, eltype (x)))
62
62
return extract_gradient! (T, result, static_dual_eval (T, f, x))
63
63
end
64
64
65
65
# Jacobian
66
- @inline ForwardDiff. jacobian (f, x:: StaticArray ) = vector_mode_jacobian (f, x)
67
- @inline ForwardDiff. jacobian (f, x:: StaticArray , cfg:: JacobianConfig ) = jacobian (f, x)
68
- @inline ForwardDiff. jacobian (f, x:: StaticArray , cfg:: JacobianConfig , :: Val ) = jacobian (f, x)
66
+ @inline ForwardDiff. jacobian (f:: F , x:: StaticArray ) where {F} = vector_mode_jacobian (f, x)
67
+ @inline ForwardDiff. jacobian (f:: F , x:: StaticArray , cfg:: JacobianConfig ) where {F} = jacobian (f, x)
68
+ @inline ForwardDiff. jacobian (f:: F , x:: StaticArray , cfg:: JacobianConfig , :: Val ) where {F} = jacobian (f, x)
69
69
70
- @inline ForwardDiff. jacobian! (result:: Union{AbstractArray,DiffResult} , f, x:: StaticArray ) = vector_mode_jacobian! (result, f, x)
71
- @inline ForwardDiff. jacobian! (result:: Union{AbstractArray,DiffResult} , f, x:: StaticArray , cfg:: JacobianConfig ) = jacobian! (result, f, x)
72
- @inline ForwardDiff. jacobian! (result:: Union{AbstractArray,DiffResult} , f, x:: StaticArray , cfg:: JacobianConfig , :: Val ) = jacobian! (result, f, x)
70
+ @inline ForwardDiff. jacobian! (result:: Union{AbstractArray,DiffResult} , f:: F , x:: StaticArray ) where {F} = vector_mode_jacobian! (result, f, x)
71
+ @inline ForwardDiff. jacobian! (result:: Union{AbstractArray,DiffResult} , f:: F , x:: StaticArray , cfg:: JacobianConfig ) where {F} = jacobian! (result, f, x)
72
+ @inline ForwardDiff. jacobian! (result:: Union{AbstractArray,DiffResult} , f:: F , x:: StaticArray , cfg:: JacobianConfig , :: Val ) where {F} = jacobian! (result, f, x)
73
73
74
74
@generated function extract_jacobian (:: Type{T} , ydual:: StaticArray , x:: S ) where {T,S<: StaticArray }
75
75
M, N = length (ydual), length (x)
81
81
end
82
82
end
83
83
84
- @inline function ForwardDiff. vector_mode_jacobian (f, x:: StaticArray )
84
+ @inline function ForwardDiff. vector_mode_jacobian (f:: F , x:: StaticArray ) where {F}
85
85
T = typeof (Tag (f, eltype (x)))
86
86
return extract_jacobian (T, static_dual_eval (T, f, x), x)
87
87
end
@@ -91,15 +91,15 @@ function extract_jacobian(::Type{T}, ydual::AbstractArray, x::StaticArray) where
91
91
return extract_jacobian! (T, result, ydual, length (x))
92
92
end
93
93
94
- @inline function ForwardDiff. vector_mode_jacobian! (result, f, x:: StaticArray )
94
+ @inline function ForwardDiff. vector_mode_jacobian! (result, f:: F , x:: StaticArray ) where {F}
95
95
T = typeof (Tag (f, eltype (x)))
96
96
ydual = static_dual_eval (T, f, x)
97
97
result = extract_jacobian! (T, result, ydual, length (x))
98
98
result = extract_value! (T, result, ydual)
99
99
return result
100
100
end
101
101
102
- @inline function ForwardDiff. vector_mode_jacobian! (result:: ImmutableDiffResult , f, x:: StaticArray )
102
+ @inline function ForwardDiff. vector_mode_jacobian! (result:: ImmutableDiffResult , f:: F , x:: StaticArray ) where {F}
103
103
T = typeof (Tag (f, eltype (x)))
104
104
ydual = static_dual_eval (T, f, x)
105
105
result = DiffResults. jacobian! (result, extract_jacobian (T, ydual, x))
@@ -108,18 +108,18 @@ end
108
108
end
109
109
110
110
# Hessian
111
- ForwardDiff. hessian (f, x:: StaticArray ) = jacobian (y -> gradient (f, y), x)
112
- ForwardDiff. hessian (f, x:: StaticArray , cfg:: HessianConfig ) = hessian (f, x)
113
- ForwardDiff. hessian (f, x:: StaticArray , cfg:: HessianConfig , :: Val ) = hessian (f, x)
111
+ ForwardDiff. hessian (f:: F , x:: StaticArray ) where {F} = jacobian (y -> gradient (f, y), x)
112
+ ForwardDiff. hessian (f:: F , x:: StaticArray , cfg:: HessianConfig ) where {F} = hessian (f, x)
113
+ ForwardDiff. hessian (f:: F , x:: StaticArray , cfg:: HessianConfig , :: Val ) where {F} = hessian (f, x)
114
114
115
- ForwardDiff. hessian! (result:: AbstractArray , f, x:: StaticArray ) = jacobian! (result, y -> gradient (f, y), x)
115
+ ForwardDiff. hessian! (result:: AbstractArray , f:: F , x:: StaticArray ) where {F} = jacobian! (result, y -> gradient (f, y), x)
116
116
117
- ForwardDiff. hessian! (result:: MutableDiffResult , f, x:: StaticArray ) = hessian! (result, f, x, HessianConfig (f, result, x))
117
+ ForwardDiff. hessian! (result:: MutableDiffResult , f:: F , x:: StaticArray ) where {F} = hessian! (result, f, x, HessianConfig (f, result, x))
118
118
119
- ForwardDiff. hessian! (result:: ImmutableDiffResult , f, x:: StaticArray , cfg:: HessianConfig ) = hessian! (result, f, x)
120
- ForwardDiff. hessian! (result:: ImmutableDiffResult , f, x:: StaticArray , cfg:: HessianConfig , :: Val ) = hessian! (result, f, x)
119
+ ForwardDiff. hessian! (result:: ImmutableDiffResult , f:: F , x:: StaticArray , cfg:: HessianConfig ) where {F} = hessian! (result, f, x)
120
+ ForwardDiff. hessian! (result:: ImmutableDiffResult , f:: F , x:: StaticArray , cfg:: HessianConfig , :: Val ) where {F} = hessian! (result, f, x)
121
121
122
- function ForwardDiff. hessian! (result:: ImmutableDiffResult , f, x:: StaticArray )
122
+ function ForwardDiff. hessian! (result:: ImmutableDiffResult , f:: F , x:: StaticArray ) where {F}
123
123
T = typeof (Tag (f, eltype (x)))
124
124
d1 = dualize (T, x)
125
125
d2 = dualize (T, d1)
0 commit comments