@@ -24,6 +24,20 @@ Compute the second derivative of the function `f` at point `x`, overwriting `der
2424"""
2525function second_derivative! end
2626
27+ """
28+ value_derivative_and_second_derivative(f, backend, x, [extras]) -> (y, der, der2)
29+
30+ Compute the value, first derivative and second derivative of the function `f` at point `x`.
31+ """
32+ function value_derivative_and_second_derivative end
33+
34+ """
35+ value_derivative_and_second_derivative!(f, der, der2, backend, x, [extras]) -> (y, der, der2)
36+
37+ Compute the value, first derivative and second derivative of the function `f` at point `x`, overwriting `der` and `der2`.
38+ """
39+ function value_derivative_and_second_derivative! end
40+
2741# # Preparation
2842
2943"""
@@ -74,6 +88,31 @@ function second_derivative(
7488 return derivative (inner_derivative_closure, outer (backend), x, outer_derivative_extras)
7589end
7690
91+ function value_derivative_and_second_derivative (
92+ f:: F ,
93+ backend:: AbstractADType ,
94+ x,
95+ extras:: SecondDerivativeExtras = prepare_second_derivative (f, backend, x),
96+ ) where {F}
97+ return value_derivative_and_second_derivative (
98+ f, SecondOrder (backend, backend), x, extras
99+ )
100+ end
101+
102+ function value_derivative_and_second_derivative (
103+ f:: F ,
104+ backend:: SecondOrder ,
105+ x,
106+ extras:: ClosureSecondDerivativeExtras = prepare_second_derivative (f, backend, x),
107+ ) where {F}
108+ @compat (; inner_derivative_closure, outer_derivative_extras) = extras
109+ y = f (x)
110+ der, der2 = value_and_derivative (
111+ inner_derivative_closure, outer (backend), x, outer_derivative_extras
112+ )
113+ return y, der, der2
114+ end
115+
77116function second_derivative! (
78117 f:: F ,
79118 der2,
@@ -96,3 +135,32 @@ function second_derivative!(
96135 inner_derivative_closure, der2, outer (backend), x, outer_derivative_extras
97136 )
98137end
138+
139+ function value_derivative_and_second_derivative! (
140+ f:: F ,
141+ der,
142+ der2,
143+ backend:: AbstractADType ,
144+ x,
145+ extras:: SecondDerivativeExtras = prepare_second_derivative (f, backend, x),
146+ ) where {F}
147+ return value_derivative_and_second_derivative! (
148+ f, der, der2, SecondOrder (backend, backend), x, extras
149+ )
150+ end
151+
152+ function value_derivative_and_second_derivative! (
153+ f:: F ,
154+ der,
155+ der2,
156+ backend:: SecondOrder ,
157+ x,
158+ extras:: SecondDerivativeExtras = prepare_second_derivative (f, backend, x),
159+ ) where {F}
160+ @compat (; inner_derivative_closure, outer_derivative_extras) = extras
161+ y = f (x)
162+ new_der, _ = value_and_derivative! (
163+ inner_derivative_closure, der2, outer (backend), x, outer_derivative_extras
164+ )
165+ return y, copyto! (der, new_der), der2
166+ end
0 commit comments