@@ -6,6 +6,7 @@ Random.seed!(1234)
66fder (x, y) = exp (y) * x + y * log (x)
77dfderdx (x, y) = exp (y) + y * 1 / x
88dfderdy (x, y) = exp (y) * x + log (x)
9+ dfderdxdx (x, y) = - y * 1 / x^ 2
910
1011fgrad (x, y) = prod (x) + sum (y ./ (1 : length (y)))
1112dfgraddx (x, y) = prod (x) ./ x
@@ -143,6 +144,49 @@ function test_jacobians(backend; multiple_inputs=true, test_types=true)
143144 @test yvec == yvec2
144145end
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+
146190function test_hessians (backend; multiple_inputs= false , test_types= true )
147191 if multiple_inputs
148192 # ... but
0 commit comments