@@ -4,26 +4,37 @@ using SparseArrays
44using ADNLPModels, NLPModels
55using SparseMatrixColorings
66using Enzyme
7+ using ForwardDiff
78
89function _gradient! (dx, f, x)
910 Enzyme. make_zero! (dx)
1011 Enzyme. autodiff (
1112 Enzyme. set_runtime_activity (Enzyme. Reverse),
12- f ,
13+ Enzyme . Const (f) ,
1314 Enzyme. Active,
1415 Enzyme. Duplicated (x, dx),
1516 )
1617 return nothing
1718end
1819
20+ # Helpers for ForwardDiff-over-Enzyme-reverse HVP.
21+ # Enzyme reverse-differentiates these; the Active return is a Float64 scalar.
22+ _dual_objective (f, x_d) = ForwardDiff. partials (f (x_d), 1 )
23+ _dual_lagrangian (ℓ, x_d, y, obj_weight, cx_d) = ForwardDiff. partials (ℓ (x_d, y, obj_weight, cx_d), 1 )
24+
1925function _hvp! (res, f, x, v)
26+ x_d = ForwardDiff. Dual {Nothing} .(x, v)
27+ dx_d = zero .(x_d)
28+
2029 Enzyme. autodiff (
21- Enzyme. set_runtime_activity (Enzyme. Forward ),
22- _gradient! ,
23- res ,
30+ Enzyme. set_runtime_activity (Enzyme. Reverse ),
31+ Enzyme . Const (_dual_objective) ,
32+ Enzyme . Active ,
2433 Enzyme. Const (f),
25- Enzyme. Duplicated (x, v ),
34+ Enzyme. Duplicated (x_d, dx_d ),
2635 )
36+
37+ res. dval .= ForwardDiff. value .(dx_d)
2738 return nothing
2839end
2940
@@ -32,7 +43,7 @@ function _gradient!(dx, ℓ, x, y, obj_weight, cx)
3243 dcx = Enzyme. make_zero (cx)
3344 Enzyme. autodiff (
3445 Enzyme. set_runtime_activity (Enzyme. Reverse),
35- ℓ ,
46+ Enzyme . Const (ℓ) ,
3647 Enzyme. Active,
3748 Enzyme. Duplicated (x, dx),
3849 Enzyme. Const (y),
@@ -43,17 +54,26 @@ function _gradient!(dx, ℓ, x, y, obj_weight, cx)
4354end
4455
4556function _hvp! (res, ℓ, x, v, y, obj_weight, cx)
46- dcx = Enzyme. make_zero (cx)
57+ D = ForwardDiff. Dual{Nothing, eltype (x), 1 }
58+
59+ x_d = ForwardDiff. Dual {Nothing} .(x, v)
60+ dx_d = zero .(x_d)
61+
62+ cx_d = fill! (similar (cx, D), zero (D))
63+ dcx_d = fill! (similar (cx, D), zero (D))
64+
4765 Enzyme. autodiff (
48- Enzyme. set_runtime_activity (Enzyme. Forward ),
49- _gradient! ,
50- res ,
66+ Enzyme. set_runtime_activity (Enzyme. Reverse ),
67+ Enzyme . Const (_dual_lagrangian) ,
68+ Enzyme . Active ,
5169 Enzyme. Const (ℓ),
52- Enzyme. Duplicated (x, v ),
70+ Enzyme. Duplicated (x_d, dx_d ),
5371 Enzyme. Const (y),
5472 Enzyme. Const (obj_weight),
55- Enzyme. Duplicated (cx, dcx ),
73+ Enzyme. Duplicated (cx_d, dcx_d ),
5674 )
75+
76+ res. dval .= ForwardDiff. value .(dx_d)
5777 return nothing
5878end
5979
7090
7191function ADNLPModels. gradient! (:: ADNLPModels.EnzymeReverseADGradient , g, f, x)
7292 Enzyme. make_zero! (g)
73- Enzyme. autodiff (Enzyme. Reverse, Enzyme. Const (f), Enzyme. Active, Enzyme. Duplicated (x, g))
93+ Enzyme. autodiff (
94+ Enzyme. set_runtime_activity (Enzyme. Reverse),
95+ Enzyme. Const (f),
96+ Enzyme. Active,
97+ Enzyme. Duplicated (x, g),
98+ )
7499 return g
75100end
76101
77102ADNLPModels. jacobian (:: ADNLPModels.EnzymeReverseADJacobian , f, x) =
78- Enzyme. jacobian (Enzyme. Reverse, f, x)
103+ Enzyme. jacobian (
104+ Enzyme. set_runtime_activity (Enzyme. Reverse),
105+ f,
106+ x
107+ )
79108
80109function ADNLPModels. hessian (b:: ADNLPModels.EnzymeReverseADHessian , f, x)
81110 T = eltype (x)
@@ -96,7 +125,7 @@ function ADNLPModels.Jprod!(b::ADNLPModels.EnzymeReverseADJprod, Jv, c!, x, v, :
96125 copyto! (b. xbuf, x)
97126 copyto! (b. vbuf, v)
98127 Enzyme. autodiff (
99- Enzyme. Forward,
128+ Enzyme. set_runtime_activity (Enzyme . Forward) ,
100129 Enzyme. Const (c!),
101130 Enzyme. Duplicated (b. cx, b. jvbuf),
102131 Enzyme. Duplicated (b. xbuf, b. vbuf),
@@ -118,7 +147,7 @@ function ADNLPModels.Jtprod!(b::ADNLPModels.EnzymeReverseADJtprod, Jtv, c!, x, v
118147 copyto! (b. vbuf, v)
119148 Enzyme. make_zero! (b. jtvbuf)
120149 Enzyme. autodiff (
121- Enzyme. Reverse,
150+ Enzyme. set_runtime_activity (Enzyme . Reverse) ,
122151 Enzyme. Const (_void_c!),
123152 Enzyme. Const (c!),
124153 Enzyme. Duplicated (b. cx, b. vbuf),
@@ -261,7 +290,7 @@ function sparse_jac_coord!(
261290 # b.compressed_jacobian is just a vector Jv here
262291 # We don't use the vector mode
263292 Enzyme. autodiff (
264- Enzyme. Forward,
293+ Enzyme. set_runtime_activity (Enzyme . Forward) ,
265294 Enzyme. Const (c!),
266295 Enzyme. Duplicated (b. cx, b. compressed_jacobian),
267296 Enzyme. Duplicated (b. xbuf, b. v),
0 commit comments