Skip to content

Commit ea14c4e

Browse files
committed
Add tests for second derivatives
1 parent 5ffb97c commit ea14c4e

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

test/finitedifferences.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ using FiniteDifferences
2121
@testset "Jacobian" begin
2222
test_jacobians(backend)
2323
end
24+
@testset "Second derivative" begin
25+
test_second_derivatives(backend)
26+
end
2427
@testset "Hessian" begin
2528
test_hessians(backend)
2629
end

test/forwarddiff.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ using ForwardDiff
1919
@testset "Jacobian" begin
2020
test_jacobians(backend)
2121
end
22+
@testset "Second derivative" begin
23+
test_second_derivatives(backend)
24+
end
2225
@testset "Hessian" begin
2326
test_hessians(backend)
2427
end

test/reversediff.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ using ReverseDiff
1414
@testset "Jacobian" begin
1515
test_jacobians(backend)
1616
end
17+
@testset "Second derivative" begin
18+
test_second_derivatives(backend)
19+
end
1720
@testset "Hessian" begin
1821
test_hessians(backend)
1922
end

test/test_utils.jl

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Random.seed!(1234)
66
fder(x, y) = exp(y) * x + y * log(x)
77
dfderdx(x, y) = exp(y) + y * 1 / x
88
dfderdy(x, y) = exp(y) * x + log(x)
9+
dfderdxdx(x, y) = -y * 1 / x^2
910

1011
fgrad(x, y) = prod(x) + sum(y ./ (1:length(y)))
1112
dfgraddx(x, y) = prod(x) ./ x
@@ -143,6 +144,49 @@ function test_jacobians(backend; multiple_inputs=true, test_types=true)
143144
@test yvec == yvec2
144145
end
145146

147+
function test_second_derivatives(backend; multiple_inputs=false, test_types=true)
148+
if multiple_inputs
149+
# ... but
150+
error("multiple_inputs=true is not supported.")
151+
else
152+
# explicit test that AbstractDifferentiation throws an error
153+
# don't support tuple of second derivatives
154+
@test_throws ArgumentError AD.second_derivative(
155+
backend, x -> fder(x, yscalar), (xscalar, yscalar)
156+
)
157+
@test_throws MethodError AD.second_derivative(
158+
backend, x -> fder(x, yscalar), xscalar, yscalar
159+
)
160+
end
161+
162+
# test if single input (no tuple works)
163+
dder1 = AD.second_derivative(backend, x -> fder(x, yscalar), xscalar)
164+
if test_types
165+
@test dder1[1] isa Float64
166+
end
167+
@test dfderdxdx(xscalar, yscalar) dder1[1] atol = 1e-8
168+
valscalar, dder2 = AD.value_and_second_derivative(
169+
backend, x -> fder(x, yscalar), xscalar
170+
)
171+
if test_types
172+
@test valscalar isa Float64
173+
@test dder2[1] isa Float64
174+
end
175+
@test valscalar == fder(xscalar, yscalar)
176+
@test norm.(dder2 .- dder1) == (0,)
177+
valscalar, der, dder3 = AD.value_and_derivatives(
178+
backend, x -> fder(x, yscalar), xscalar
179+
)
180+
if test_types
181+
@test valscalar isa Float64
182+
@test der[1] isa Float64
183+
@test dder3[1] isa Float64
184+
end
185+
@test valscalar == fder(xscalar, yscalar)
186+
@test norm.(der .- AD.derivative(backend, x -> fder(x, yscalar), xscalar)) == (0,)
187+
@test norm.(dder3 .- dder1) == (0,)
188+
end
189+
146190
function test_hessians(backend; multiple_inputs=false, test_types=true)
147191
if multiple_inputs
148192
# ... but

0 commit comments

Comments
 (0)