@@ -48,13 +48,13 @@ function TR(
4848 f:: AbstractNLPModel ,
4949 h:: H ,
5050 χ:: X ,
51- options:: ROSolverOptions ;
52- x0:: AbstractVector = f. meta. x0,
51+ options:: ROSolverOptions{R} ;
52+ x0:: AbstractVector{R} = f. meta. x0,
5353 subsolver_logger:: Logging.AbstractLogger = Logging. NullLogger (),
5454 subsolver = R2,
5555 subsolver_options = ROSolverOptions (ϵa = options. ϵa),
5656 selected:: AbstractVector{<:Integer} = 1 : (f. meta. nvar),
57- ) where {H, X}
57+ ) where {H, X, R }
5858 start_time = time ()
5959 elapsed_time = 0.0
6060 # initialize passed options
@@ -117,7 +117,7 @@ function TR(
117117 Complex_hist = zeros (Int, maxIter)
118118 if verbose > 0
119119 # ! format: off
120- @info @sprintf " %6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" " outer" " inner" " f(x)" " h(x)" " √ξ1 " " √ξ" " ρ" " Δ" " ‖x‖" " ‖s‖" " ‖Bₖ‖" " TR"
120+ @info @sprintf " %6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" " outer" " inner" " f(x)" " h(x)" " √(ξ1/ν) " " √ξ" " ρ" " Δ" " ‖x‖" " ‖s‖" " ‖Bₖ‖" " TR"
121121 # ! format: on
122122 end
123123
@@ -133,6 +133,8 @@ function TR(
133133
134134 λmax = opnorm (Bk)
135135 νInv = (1 + θ) * λmax
136+ ν = 1 / (νInv + 1 / (Δk * α))
137+ sqrt_ξ1_νInv = one (R)
136138
137139 optimal = false
138140 tired = k ≥ maxIter || elapsed_time > maxTime
@@ -160,24 +162,24 @@ function TR(
160162
161163 # Take first proximal gradient step s1 and see if current xk is nearly stationary.
162164 # s1 minimizes φ1(s) + ‖s‖² / 2 / ν + ψ(s) ⟺ s1 ∈ prox{νψ}(-ν∇φ1(0)).
163- ν = 1 / (νInv + 1 / (Δk * α))
164165 prox! (s, ψ, - ν * ∇fk, ν)
165166 ξ1 = hk - mk1 (s) + max (1 , abs (hk)) * 10 * eps ()
166167 ξ1 > 0 || error (" TR: first prox-gradient step should produce a decrease but ξ1 = $(ξ1) " )
168+ sqrt_ξ1_νInv = sqrt (ξ1 / ν)
167169
168170 if ξ1 ≥ 0 && k == 1
169- ϵ_increment = ϵr * sqrt (ξ1)
171+ ϵ_increment = ϵr * sqrt_ξ1_νInv
170172 ϵ += ϵ_increment # make stopping test absolute and relative
171173 ϵ_subsolver += ϵ_increment
172174 end
173175
174- if sqrt (ξ1) < ϵ
176+ if sqrt_ξ1_νInv < ϵ
175177 # the current xk is approximately first-order stationary
176178 optimal = true
177179 continue
178180 end
179181
180- subsolver_options. ϵa = k == 1 ? 1.0e-5 : max (ϵ_subsolver, min (1e-2 , sqrt (ξ1)) * ξ1 )
182+ subsolver_options. ϵa = k == 1 ? 1.0e-5 : max (ϵ_subsolver, min (1e-2 , sqrt_ξ1_νInv) )
181183 ∆_effective = min (β * χ (s), Δk)
182184 (has_bounds (f) || subsolver == TRDH) ?
183185 set_bounds! (ψ, max .(- ∆_effective, l_bound - xk), min .(∆_effective, u_bound - xk)) :
@@ -214,7 +216,7 @@ function TR(
214216
215217 if (verbose > 0 ) && (k % ptf == 0 )
216218 # ! format: off
217- @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k iter fk hk sqrt (ξ1) sqrt (ξ) ρk ∆_effective χ (xk) sNorm νInv TR_stat
219+ @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k iter fk hk sqrt_ξ1_νInv sqrt (ξ) ρk ∆_effective χ (xk) sNorm νInv TR_stat
218220 # ! format: on
219221 end
220222
@@ -248,6 +250,7 @@ function TR(
248250 (has_bounds (f) || subsolver == TRDH) ?
249251 set_bounds! (ψ, max .(- Δk, l_bound - xk), min .(Δk, u_bound - xk)) : set_radius! (ψ, Δk)
250252 end
253+ ν = 1 / (νInv + 1 / (Δk * α))
251254 tired = k ≥ maxIter || elapsed_time > maxTime
252255 end
253256
@@ -256,9 +259,9 @@ function TR(
256259 @info @sprintf " %6d %8s %8.1e %8.1e" k " " fk hk
257260 elseif optimal
258261 # ! format: off
259- @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k 1 fk hk sqrt (ξ1) sqrt (ξ1) " " Δk χ (xk) χ (s) νInv
262+ @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k 1 fk hk sqrt_ξ1_νInv sqrt (ξ1) " " Δk χ (xk) χ (s) νInv
260263 # ! format: on
261- @info " TR: terminating with √ξ1 = $(sqrt (ξ1) ) "
264+ @info " TR: terminating with √(ξ1/ν) = $(sqrt_ξ1_νInv ) "
262265 end
263266 end
264267
@@ -276,7 +279,7 @@ function TR(
276279 set_status! (stats, status)
277280 set_solution! (stats, xk)
278281 set_objective! (stats, fk + hk)
279- set_residuals! (stats, zero (eltype (xk)), ξ1 ≥ 0 ? sqrt (ξ1) : ξ1 )
282+ set_residuals! (stats, zero (eltype (xk)), sqrt_ξ1_νInv )
280283 set_iter! (stats, k)
281284 set_time! (stats, elapsed_time)
282285 set_solver_specific! (stats, :Fhist , Fobj_hist[1 : k])
0 commit comments