@@ -61,20 +61,38 @@ function AD.hessian(ba::AD.ForwardDiffBackend, f, x::AbstractArray)
61
61
return (ForwardDiff. hessian (f, x, cfg),)
62
62
end
63
63
64
+ function AD. value_and_derivative (:: AD.ForwardDiffBackend , f, x:: Real )
65
+ T = typeof (ForwardDiff. Tag (f, typeof (x)))
66
+ ydual = f (ForwardDiff. Dual {T} (x, one (x)))
67
+ return ForwardDiff. value (T, ydual), (ForwardDiff. extract_derivative (T, ydual),)
68
+ end
69
+
64
70
function AD. value_and_gradient (ba:: AD.ForwardDiffBackend , f, x:: AbstractArray )
65
71
result = DiffResults. GradientResult (x)
66
72
cfg = ForwardDiff. GradientConfig (f, x, chunk (ba, x))
67
73
ForwardDiff. gradient! (result, f, x, cfg)
68
74
return DiffResults. value (result), (DiffResults. derivative (result),)
69
75
end
70
76
77
+ function AD. value_and_second_derivative (ba:: AD.ForwardDiffBackend , f, x:: Real )
78
+ T = typeof (ForwardDiff. Tag (f, typeof (x)))
79
+ ydual, ddual = AD. value_and_derivative (ba, f, ForwardDiff. Dual {T} (x, one (x)))
80
+ return value (T, ydual), (extract_derivative (T, ddual[1 ]),)
81
+ end
82
+
71
83
function AD. value_and_hessian (ba:: AD.ForwardDiffBackend , f, x)
72
84
result = DiffResults. HessianResult (x)
73
85
cfg = ForwardDiff. HessianConfig (f, result, x, chunk (ba, x))
74
86
ForwardDiff. hessian! (result, f, x, cfg)
75
87
return DiffResults. value (result), (DiffResults. hessian (result),)
76
88
end
77
89
90
+ function AD. value_and_derivatives (ba:: AD.ForwardDiffBackend , f, x:: Real )
91
+ T = typeof (ForwardDiff. Tag (f, typeof (x)))
92
+ ydual, ddual = AD. value_and_derivative (ba, f, ForwardDiff. Dual {T} (x, one (x)))
93
+ return ForwardDiff. value (T, ydual), (ForwardDiff. value (T, ddual[1 ]),), (ForwardDiff. extract_derivative (T, ddual[1 ]),)
94
+ end
95
+
78
96
@inline step_toward (x:: Number , v:: Number , h) = x + h * v
79
97
# support arrays and tuples
80
98
@noinline step_toward (x, v, h) = x .+ h .* v
0 commit comments