@@ -19,6 +19,7 @@ mutable struct R2NSolver{
1919 s:: V
2020 s1:: V
2121 v0:: V
22+ v1:: V
2223 has_bnds:: Bool
2324 l_bound:: V
2425 u_bound:: V
@@ -50,6 +51,7 @@ function R2NSolver(
5051
5152 v0 = [(- 1.0 )^ i for i = 0 : (reg_nlp. model. meta. nvar - 1 )]
5253 v0 ./= sqrt (reg_nlp. model. meta. nvar)
54+ v1 = similar (v0)
5355
5456 has_bnds = any (l_bound .!= T (- Inf )) || any (u_bound .!= T (Inf ))
5557 if has_bnds
@@ -68,7 +70,7 @@ function R2NSolver(
6870 shifted (reg_nlp. h, xk)
6971
7072 Bk = hess_op (reg_nlp, xk)
71- sub_nlp = R2NModel (Bk, ∇fk, T (1 ), x0)
73+ sub_nlp = QuadraticModel ( ∇fk, Bk, σ = T (1 ), x0 = x0)
7274 subpb = RegularizedNLPModel (sub_nlp, ψ)
7375 substats = RegularizedExecutionStats (subpb)
7476 subsolver = subsolver (subpb)
@@ -84,6 +86,7 @@ function R2NSolver(
8486 s,
8587 s1,
8688 v0,
89+ v1,
8790 has_bnds,
8891 l_bound,
8992 u_bound,
98101
99102function SolverCore. reset! (solver:: R2NSolver )
100103 _reset_power_method! (solver. v0)
101- B = solver. subpb. model. B
104+ B = solver. subpb. model. data . H
102105 isa (B, AbstractLinearOperator) && LinearOperators. reset! (B)
103106end
104107
@@ -306,9 +309,9 @@ function SolverCore.solve!(
306309 found_λ = true
307310
308311 if opnorm_maxiter ≤ 0
309- λmax, found_λ = opnorm (solver. subpb. model. B )
312+ λmax, found_λ = opnorm (solver. subpb. model. data . H )
310313 else
311- λmax = power_method! (solver. subpb. model. B , solver. v0, solver. subpb . model . v , opnorm_maxiter)
314+ λmax = power_method! (solver. subpb. model. data . H , solver. v0, solver. v1 , opnorm_maxiter)
312315 end
313316 found_λ || error (" operator norm computation failed" )
314317
@@ -337,8 +340,14 @@ function SolverCore.solve!(
337340 d -> φ1 (d) + ψ (d):: T
338341 end
339342
340- mk = let ψ = ψ, solver = solver
341- d -> obj (solver. subpb. model, d, skip_sigma = true ) + ψ (d):: T
343+ mk = let ψ = ψ, model = solver. subpb. model
344+ d -> begin
345+ temp_σ = model. data. σ
346+ model. data. σ = zero (T)
347+ _obj = obj (model, d) + ψ (d)
348+ model. data. σ = temp_σ
349+ return _obj
350+ end
342351 end
343352
344353 prox! (s1, ψ, mν∇fk, ν₁)
@@ -372,7 +381,7 @@ function SolverCore.solve!(
372381 while ! done
373382 sub_atol = stats. iter == 0 ? 1.0e-3 : min (sqrt_ξ1_νInv ^ (1.5 ), sqrt_ξ1_νInv * 1e-3 )
374383
375- solver. subpb. model. σ = σk
384+ solver. subpb. model. data . σ = σk
376385 isa (solver. subsolver, R2DHSolver) && (solver. subsolver. D. d[1 ] = 1 / ν₁)
377386 if isa (solver. subsolver, R2Solver) # FIXME
378387 solve! (
@@ -458,9 +467,9 @@ function SolverCore.solve!(
458467 end
459468
460469 if opnorm_maxiter ≤ 0
461- λmax, found_λ = opnorm (solver. subpb. model. B )
470+ λmax, found_λ = opnorm (solver. subpb. model. data . H )
462471 else
463- λmax = power_method! (solver. subpb. model. B , solver. v0, solver. subpb . model . v , opnorm_maxiter)
472+ λmax = power_method! (solver. subpb. model. data . H , solver. v0, solver. v1 , opnorm_maxiter)
464473 end
465474 found_λ || error (" operator norm computation failed" )
466475 set_step_status! (stats, :accepted )
0 commit comments