@@ -145,7 +145,7 @@ function SparseEnzymeADJacobian(
145145 )
146146end
147147
148- struct SparseEnzymeADHessian{R, C, S} <: ADNLPModels.ADBackend
148+ struct SparseEnzymeADHessian{R, C, S, L } <: ADNLPModels.ADBackend
149149 nvar:: Int
150150 rowval:: Vector{Int}
151151 colptr:: Vector{Int}
@@ -156,6 +156,8 @@ struct SparseEnzymeADHessian{R, C, S} <: ADNLPModels.ADBackend
156156 v:: Vector{R}
157157 y:: Vector{R}
158158 grad:: Vector{R}
159+ buffer:: Vector{R}
160+ ℓ:: L
159161end
160162
161163function SparseEnzymeADHessian(
@@ -200,7 +202,9 @@ function SparseEnzymeADHessian(
200202 end
201203 v = similar(x0)
202204 y = similar(x0, ncon)
205+ buffer = similar(x0, ncon)
203206 grad = similar(x0)
207+ ℓ(x, y, obj_weight, buffer) = obj_weight * nlp. f(x) + dot(c!(buffer, x), y)
204208
205209 return SparseEnzymeADHessian(
206210 nvar,
@@ -213,6 +217,8 @@ function SparseEnzymeADHessian(
213217 v,
214218 y,
215219 grad,
220+ buffer,
221+ ℓ,
216222 )
217223end
218224
@@ -423,18 +429,17 @@ end
423429 compressed_hessian_icol =
424430 (b. coloring_mode == :direct) ? b. compressed_hessian : view(b. compressed_hessian, :, icol)
425431
426- # Lagrangian
427- ℓ = get_lag(nlp, b, obj_weight, y)
428-
429432 # AD with Enzyme.jl
430433 Enzyme. autodiff(
431434 Enzyme. Forward,
432435 Enzyme. Const(Enzyme. gradient!),
433436 Enzyme. Const(Enzyme. Reverse),
434437 Enzyme. DuplicatedNoNeed(b. grad, compressed_hessian_icol),
435- Enzyme. Const(ℓ),
438+ Enzyme. Const(b . ℓ),
436439 Enzyme. Duplicated(x, b. v),
437440 Enzyme. Const(y),
441+ Enzyme. Const(obj_weight),
442+ Enzyme. Const(buffer),
438443 )
439444
440445 if b. coloring_mode == :direct
0 commit comments