From 33a583d65ee97ede16df71513790cf1495dbea26 Mon Sep 17 00:00:00 2001 From: Maxence Gollier Date: Fri, 13 Feb 2026 13:28:49 -0500 Subject: [PATCH 1/3] add sparse hessian --- src/R2N.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/R2N.jl b/src/R2N.jl index acb05d94..ca117cf9 100644 --- a/src/R2N.jl +++ b/src/R2N.jl @@ -35,6 +35,7 @@ function R2NSolver( reg_nlp::AbstractRegularizedNLPModel{T, V}; subsolver = R2Solver, m_monotone::Int = 1, + sparse = false ) where {T, V} x0 = reg_nlp.model.meta.x0 l_bound = reg_nlp.model.meta.lvar @@ -69,7 +70,7 @@ function R2NSolver( has_bnds ? shifted(reg_nlp.h, xk, l_bound_m_x, u_bound_m_x, reg_nlp.selected) : shifted(reg_nlp.h, xk) - Bk = hess_op(reg_nlp, xk) + Bk = sparse ? hess(reg_nlp, xk) : hess_op(reg_nlp, xk) sub_nlp = QuadraticModel(∇fk, Bk, σ = T(1), x0 = x0) subpb = RegularizedNLPModel(sub_nlp, ψ) substats = RegularizedExecutionStats(subpb) From af57c368f8a4e3b10b0eeb5ac379db135f771dc4 Mon Sep 17 00:00:00 2001 From: MaxenceGollier Date: Wed, 11 Mar 2026 14:28:26 -0400 Subject: [PATCH 2/3] add sparse matrix option --- src/R2N.jl | 3 +++ src/TR_alg.jl | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/R2N.jl b/src/R2N.jl index ca117cf9..2250547f 100644 --- a/src/R2N.jl +++ b/src/R2N.jl @@ -70,6 +70,7 @@ function R2NSolver( has_bnds ? shifted(reg_nlp.h, xk, l_bound_m_x, u_bound_m_x, reg_nlp.selected) : shifted(reg_nlp.h, xk) + sparse = isa(reg_nlp.model, QuasiNewtonModel) ? false : sparse Bk = sparse ? hess(reg_nlp, xk) : hess_op(reg_nlp, xk) sub_nlp = QuadraticModel(∇fk, Bk, σ = T(1), x0 = x0) subpb = RegularizedNLPModel(sub_nlp, ψ) @@ -465,6 +466,8 @@ function SolverCore.solve!( qn_update_y!(nlp, solver, stats) push!(nlp, s, solver.y) qn_copy!(nlp, solver, stats) + elseif isa(solver.subpb.model.data.H, AbstractMatrix) + hess_coord!(reg_nlp, xk, solver.subpb.model.data.H.nzval) end if opnorm_maxiter ≤ 0 diff --git a/src/TR_alg.jl b/src/TR_alg.jl index 7ebec003..509bb44c 100644 --- a/src/TR_alg.jl +++ b/src/TR_alg.jl @@ -36,6 +36,7 @@ function TRSolver( χ::X = NormLinf(one(T)), subsolver = R2Solver, m_monotone::Int = 1, + sparse::Bool = false, ) where {T, V, X} x0 = reg_nlp.model.meta.x0 l_bound = reg_nlp.model.meta.lvar @@ -69,8 +70,9 @@ function TRSolver( shifted(reg_nlp.h, xk, l_bound_m_x, u_bound_m_x, reg_nlp.selected) : shifted(reg_nlp.h, xk, T(1), χ) - Bk = hess_op(reg_nlp, xk) - sub_nlp = QuadraticModel(∇fk, Bk, x0 = x0) + sparse = isa(reg_nlp.model, QuasiNewtonModel) ? false : sparse + Bk = sparse ? hess(reg_nlp, xk) : hess_op(reg_nlp, xk) + sub_nlp = QuadraticModel(∇fk, Bk, σ = T(1), x0 = x0) subpb = RegularizedNLPModel(sub_nlp, ψ) substats = RegularizedExecutionStats(subpb) subsolver = subsolver(subpb) @@ -468,6 +470,8 @@ function SolverCore.solve!( if quasiNewtTest @. ∇fk⁻ = ∇fk - ∇fk⁻ push!(nlp, s, ∇fk⁻) # update QN operator + elseif isa(solver.subpb.model.data.H, AbstractMatrix) + hess_coord!(reg_nlp, xk, solver.subpb.model.data.H.nzval) end if opnorm_maxiter ≤ 0 From 53aa80f58197bfbaa674538bdc8f6b03ee5868e7 Mon Sep 17 00:00:00 2001 From: MaxenceGollier Date: Wed, 11 Mar 2026 14:42:32 -0400 Subject: [PATCH 3/3] fix ci --- src/TR_alg.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TR_alg.jl b/src/TR_alg.jl index 509bb44c..20347f3b 100644 --- a/src/TR_alg.jl +++ b/src/TR_alg.jl @@ -72,7 +72,7 @@ function TRSolver( sparse = isa(reg_nlp.model, QuasiNewtonModel) ? false : sparse Bk = sparse ? hess(reg_nlp, xk) : hess_op(reg_nlp, xk) - sub_nlp = QuadraticModel(∇fk, Bk, σ = T(1), x0 = x0) + sub_nlp = QuadraticModel(∇fk, Bk, x0 = x0) subpb = RegularizedNLPModel(sub_nlp, ψ) substats = RegularizedExecutionStats(subpb) subsolver = subsolver(subpb)