Skip to content

Commit ae3cb15

Browse files
authored
improve type stability in jacobian for a certain case (#558)
1 parent d033d2a commit ae3cb15

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

src/config.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Base.copy(cfg::AbstractConfig) = deepcopy(cfg)
5353

5454
Base.eltype(cfg::AbstractConfig) = eltype(typeof(cfg))
5555

56-
@inline chunksize(::AbstractConfig{N}) where {N} = N
56+
@inline (chunksize(::AbstractConfig{N})::Int) where {N} = N
5757

5858
####################
5959
# DerivativeConfig #

src/jacobian.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ reshape_jacobian(result::DiffResult, ydual, xdual) = reshape_jacobian(DiffResult
143143
# vector mode #
144144
###############
145145

146-
function vector_mode_jacobian(f::F, x, cfg::JacobianConfig{T,V,N}) where {F,T,V,N}
146+
function vector_mode_jacobian(f::F, x, cfg::JacobianConfig{T}) where {F,T}
147+
N = chunksize(cfg)
147148
ydual = vector_mode_dual_eval!(f, cfg, x)
148149
ydual isa AbstractArray || throw(JACOBIAN_ERROR)
149150
result = similar(ydual, valtype(eltype(ydual)), length(ydual), N)
@@ -152,7 +153,8 @@ function vector_mode_jacobian(f::F, x, cfg::JacobianConfig{T,V,N}) where {F,T,V,
152153
return result
153154
end
154155

155-
function vector_mode_jacobian(f!::F, y, x, cfg::JacobianConfig{T,V,N}) where {F,T,V,N}
156+
function vector_mode_jacobian(f!::F, y, x, cfg::JacobianConfig{T}) where {F,T}
157+
N = chunksize(cfg)
156158
ydual = vector_mode_dual_eval!(f!, cfg, y, x)
157159
map!(d -> value(T,d), y, ydual)
158160
result = similar(y, length(y), N)
@@ -161,14 +163,16 @@ function vector_mode_jacobian(f!::F, y, x, cfg::JacobianConfig{T,V,N}) where {F,
161163
return result
162164
end
163165

164-
function vector_mode_jacobian!(result, f::F, x, cfg::JacobianConfig{T,V,N}) where {F,T,V,N}
166+
function vector_mode_jacobian!(result, f::F, x, cfg::JacobianConfig{T}) where {F,T}
167+
N = chunksize(cfg)
165168
ydual = vector_mode_dual_eval!(f, cfg, x)
166169
extract_jacobian!(T, result, ydual, N)
167170
extract_value!(T, result, ydual)
168171
return result
169172
end
170173

171-
function vector_mode_jacobian!(result, f!::F, y, x, cfg::JacobianConfig{T,V,N}) where {F,T,V,N}
174+
function vector_mode_jacobian!(result, f!::F, y, x, cfg::JacobianConfig{T}) where {F,T}
175+
N = chunksize(cfg)
172176
ydual = vector_mode_dual_eval!(f!, cfg, y, x)
173177
map!(d -> value(T,d), y, ydual)
174178
extract_jacobian!(T, result, ydual, N)

test/JacobianTest.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,9 @@ end
237237
@test ForwardDiff.jacobian(x -> eigvals(Symmetric(x*x')), [1.,2.]) [0 0; 2 4]
238238
end
239239

240+
@testset "type stability" begin
241+
g!(dy, y) = dy[1] = y[1]
242+
@inferred ForwardDiff.jacobian(g!, [1.0], [0.0])
243+
end
244+
240245
end # module

0 commit comments

Comments
 (0)