@@ -6,6 +6,7 @@ Random.seed!(1234)
6
6
fder (x, y) = exp (y) * x + y * log (x)
7
7
dfderdx (x, y) = exp (y) + y * 1 / x
8
8
dfderdy (x, y) = exp (y) * x + log (x)
9
+ dfderdxdx (x, y) = - y * 1 / x^ 2
9
10
10
11
fgrad (x, y) = prod (x) + sum (y ./ (1 : length (y)))
11
12
dfgraddx (x, y) = prod (x) ./ x
@@ -143,6 +144,49 @@ function test_jacobians(backend; multiple_inputs=true, test_types=true)
143
144
@test yvec == yvec2
144
145
end
145
146
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
+
146
190
function test_hessians (backend; multiple_inputs= false , test_types= true )
147
191
if multiple_inputs
148
192
# ... but
0 commit comments