Skip to content

Commit fa2adfc

Browse files
author
rjbaral
committed
stopping criteria update
1 parent 95e3c5a commit fa2adfc

File tree

5 files changed

+51
-48
lines changed

5 files changed

+51
-48
lines changed

src/LMTR_alg.jl

+10-9
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ function LMTR(
112112
Complex_hist = zeros(Int, maxIter)
113113
if verbose > 0
114114
#! format: off
115-
@info @sprintf "%6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" "outer" "inner" "f(x)" "h(x)" "ξ1" "ξ" "ρ" "Δ" "‖x‖" "‖s‖" "1/ν" "TR"
115+
@info @sprintf "%6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" "outer" "inner" "f(x)" "h(x)" "(ξ1/ν)" "(ξ/ν)" "ρ" "Δ" "‖x‖" "‖s‖" "1/ν" "TR"
116116
#! format: on
117117
end
118118

119-
local ξ1
119+
local ξ1, ξ
120120
k = 0
121121

122122
Fk = residual(nls, xk)
@@ -129,6 +129,7 @@ function LMTR(
129129

130130
σmax = opnorm(Jk)
131131
νInv = (1 + θ) * σmax^2 # ‖J'J‖ = ‖J‖²
132+
ν = 1 / νInv
132133

133134
mν∇fk = -∇fk / νInv
134135

@@ -174,18 +175,18 @@ function LMTR(
174175
ξ1 > 0 || error("LMTR: first prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
175176

176177
if ξ1 0 && k == 1
177-
ϵ_increment = ϵr * sqrt(ξ1)
178+
ϵ_increment = ϵr * sqrt(ξ1/ν)
178179
ϵ += ϵ_increment # make stopping test absolute and relative
179180
ϵ_subsolver += ϵ_increment
180181
end
181182

182-
if sqrt(ξ1) < ϵ
183+
if sqrt(ξ1/ν) < ϵ
183184
# the current xk is approximately first-order stationary
184185
optimal = true
185186
continue
186187
end
187188

188-
subsolver_options.ϵa = k == 1 ? 1.0e-5 : max(ϵ_subsolver, min(1.0e-1, ξ1 / 10))
189+
subsolver_options.ϵa = k == 1 ? 1.0e-5 : max(ϵ_subsolver, min(1.0e-1, ξ1 / ν / 10))
189190
∆_effective = min* χ(s), Δk)
190191
treats_bounds ?
191192
set_bounds!(ψ, max.(-∆_effective, l_bound - xk), min.(∆_effective, u_bound - xk)) :
@@ -225,7 +226,7 @@ function LMTR(
225226

226227
if (verbose > 0) && (k % ptf == 0)
227228
#! format: off
228-
@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
229+
@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
229230
#! format: on
230231
end
231232

@@ -265,9 +266,9 @@ function LMTR(
265266
@info @sprintf "%6d %8s %8.1e %8.1e" k "" fk hk
266267
elseif optimal
267268
#! format: off
268-
@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
269+
@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(ξ/ν) "" Δk χ(xk) χ(s) νInv
269270
#! format: on
270-
@info "LMTR: terminating with √ξ1 = $(sqrt(ξ1))"
271+
@info "LMTR: terminating with √(ξ1/ν) = $(sqrt(ξ1/ν))"
271272
end
272273
end
273274

@@ -285,7 +286,7 @@ function LMTR(
285286
set_status!(stats, status)
286287
set_solution!(stats, xk)
287288
set_objective!(stats, fk + hk)
288-
set_residuals!(stats, zero(eltype(xk)), ξ1 0 ? sqrt(ξ1) : ξ1)
289+
set_residuals!(stats, zero(eltype(xk)), ξ1 0 ? sqrt(ξ1/ν) : ξ1)
289290
set_iter!(stats, k)
290291
set_time!(stats, elapsed_time)
291292
set_solver_specific!(stats, :Fhist, Fobj_hist[1:k])

src/LM_alg.jl

+10-9
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,14 @@ function LM(
100100

101101
xkn = similar(xk)
102102

103-
local ξ1
103+
local ξ1, ξ
104104
k = 0
105105
Fobj_hist = zeros(maxIter)
106106
Hobj_hist = zeros(maxIter)
107107
Complex_hist = zeros(Int, maxIter)
108108
if verbose > 0
109109
#! format: off
110-
@info @sprintf "%6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" "outer" "inner" "f(x)" "h(x)" "√ξ1" "ξ" "ρ" "σ" "‖x‖" "‖s‖" "‖Jₖ‖²" "reg"
110+
@info @sprintf "%6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" "outer" "inner" "f(x)" "h(x)" "√(ξ1/ν)" "(ξ/ν)" "ρ" "σ" "‖x‖" "‖s‖" "‖Jₖ‖²" "reg"
111111
#! format: on
112112
end
113113

@@ -122,6 +122,7 @@ function LM(
122122

123123
σmax = opnorm(Jk)
124124
νInv = (1 + θ) * (σmax^2 + σk) # ‖J'J + σₖ I‖ = ‖J‖² + σₖ
125+
ν = 1 / νInv
125126

126127
s = zero(xk)
127128

@@ -173,18 +174,18 @@ function LM(
173174
ξ1 > 0 || error("LM: first prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
174175

175176
if ξ1 0 && k == 1
176-
ϵ_increment = ϵr * sqrt(ξ1)
177+
ϵ_increment = ϵr * sqrt(ξ1/ν)
177178
ϵ += ϵ_increment # make stopping test absolute and relative
178179
ϵ_subsolver += ϵ_increment
179180
end
180181

181-
if sqrt(ξ1) < ϵ
182+
if sqrt(ξ1/ν) < ϵ
182183
# the current xk is approximately first-order stationary
183184
optimal = true
184185
continue
185186
end
186187

187-
subsolver_options.ϵa = k == 1 ? 1.0e-1 : max(ϵ_subsolver, min(1.0e-2, ξ1 / 10))
188+
subsolver_options.ϵa = k == 1 ? 1.0e-1 : max(ϵ_subsolver, min(1.0e-2, ξ1 / ν / 10))
188189
subsolver_options.ν = ν
189190
@debug "setting inner stopping tolerance to" subsolver_options.optTol
190191
s, iter, _ = with_logger(subsolver_logger) do
@@ -215,7 +216,7 @@ function LM(
215216

216217
if (verbose > 0) && (k % ptf == 0)
217218
#! format: off
218-
@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 σk norm(xk) norm(s) νInv σ_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/ν) sqrt/ν) ρk σk norm(xk) norm(s) νInv σ_stat
219220
#! format: off
220221
end
221222

@@ -255,9 +256,9 @@ function LM(
255256
@info @sprintf "%6d %8s %8.1e %8.1e" k "" fk hk
256257
elseif optimal
257258
#! format: off
258-
@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 norm(xk) norm(s) νInv
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(ξ/ν) "" σk norm(xk) norm(s) νInv
259260
#! format: on
260-
@info "LM: terminating with √ξ1 = $(sqrt(ξ1))"
261+
@info "LM: terminating with √(ξ1/ν) = $(sqrt(ξ1/ν))"
261262
end
262263
end
263264
status = if optimal
@@ -274,7 +275,7 @@ function LM(
274275
set_status!(stats, status)
275276
set_solution!(stats, xk)
276277
set_objective!(stats, fk + hk)
277-
set_residuals!(stats, zero(eltype(xk)), ξ1 0 ? sqrt(ξ1) : ξ1)
278+
set_residuals!(stats, zero(eltype(xk)), ξ1 0 ? sqrt(ξ1/ν) : ξ1)
278279
set_iter!(stats, k)
279280
set_time!(stats, elapsed_time)
280281
set_solver_specific!(stats, :Fhist, Fobj_hist[1:k])

src/R2_alg.jl

+7-7
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ function R2!(
258258

259259
if verbose > 0
260260
#! format: off
261-
@info @sprintf "%6s %8s %8s %7s %8s %7s %7s %7s %1s" "iter" "f(x)" "h(x)" "ξ" "ρ" "σ" "‖x‖" "‖s‖" ""
261+
@info @sprintf "%6s %8s %8s %7s %8s %7s %7s %7s %1s" "iter" "f(x)" "h(x)" "(ξ/ν)" "ρ" "σ" "‖x‖" "‖s‖" ""
262262
#! format: off
263263
end
264264

@@ -290,10 +290,10 @@ function R2!(
290290
ξ = hk - mks + max(1, abs(hk)) * 10 * eps()
291291

292292
if ξ 0 && k == 1
293-
ϵ += ϵr * sqrt(ξ) # make stopping test absolute and relative
293+
ϵ += ϵr * sqrt/ν) # make stopping test absolute and relative
294294
end
295-
296-
if< 0 && sqrt(-ξ) neg_tol) || 0 && sqrt(ξ) ϵ)
295+
296+
if< 0 && sqrt(-ξ/ν) neg_tol) || 0 && sqrt/ν) ϵ)
297297
optimal = true
298298
continue
299299
end
@@ -310,7 +310,7 @@ function R2!(
310310
if (verbose > 0) && (k % ptf == 0)
311311
#! format: off
312312
σ_stat = (η2 ρk < Inf) ? "" : (ρk < η1 ? "" : "=")
313-
@info @sprintf "%6d %8.1e %8.1e %7.1e %8.1e %7.1e %7.1e %7.1e %1s" k fk hk sqrt(ξ) ρk σk norm(xk) norm(s) σ_stat
313+
@info @sprintf "%6d %8.1e %8.1e %7.1e %8.1e %7.1e %7.1e %7.1e %1s" k fk hk sqrt/ν) ρk σk norm(xk) norm(s) σ_stat
314314
#! format: on
315315
end
316316

@@ -347,9 +347,9 @@ function R2!(
347347
@info @sprintf "%6d %8.1e %8.1e" k fk hk
348348
elseif optimal
349349
#! format: off
350-
@info @sprintf "%6d %8.1e %8.1e %7.1e %8s %7.1e %7.1e %7.1e" k fk hk sqrt(ξ) "" σk norm(xk) norm(s)
350+
@info @sprintf "%6d %8.1e %8.1e %7.1e %8s %7.1e %7.1e %7.1e" k fk hk sqrt/ν) "" σk norm(xk) norm(s)
351351
#! format: on
352-
@info "R2: terminating with √ξ = $(sqrt(ξ))"
352+
@info "R2: terminating with √(ξ/ν) = $(sqrt/ν))"
353353
end
354354
end
355355

src/TRDH_alg.jl

+14-14
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,9 @@ function TRDH(
188188
if verbose > 0
189189
#! format: off
190190
if reduce_TR
191-
@info @sprintf "%6s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" "outer" "f(x)" "h(x)" "ξ1" "ξ" "ρ" "Δ" "‖x‖" "‖s‖" "‖Dₖ‖" "TRDH"
191+
@info @sprintf "%6s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" "outer" "f(x)" "h(x)" "(ξ1/ν)" "(ξ/ν)" "ρ" "Δ" "‖x‖" "‖s‖" "‖Dₖ‖" "TRDH"
192192
else
193-
@info @sprintf "%6s %8s %8s %7s %8s %7s %7s %7s %7s %1s" "outer" "f(x)" "h(x)" "ξ" "ρ" "Δ" "‖x‖" "‖s‖" "‖Dₖ‖" "TRDH"
193+
@info @sprintf "%6s %8s %8s %7s %8s %7s %7s %7s %7s %1s" "outer" "f(x)" "h(x)" "(ξ/ν)" "ρ" "Δ" "‖x‖" "‖s‖" "‖Dₖ‖" "TRDH"
194194
end
195195
#! format: off
196196
end
@@ -228,11 +228,11 @@ function TRDH(
228228
Complex_hist[k] += 1
229229
ξ1 = hk - mk1(s) + max(1, abs(hk)) * 10 * eps()
230230

231-
if ξ1 0 && k == 1
232-
ϵ += ϵr * sqrt(ξ1) # make stopping test absolute and relative
231+
if ξ1/ν 0 && k == 1
232+
ϵ += ϵr * sqrt(ξ1/ν) # make stopping test absolute and relative
233233
end
234234

235-
if (ξ1 < 0 && sqrt(-ξ1) neg_tol) || (ξ1 0 && sqrt(ξ1) < ϵ)
235+
if (ξ1 < 0 && sqrt(-ξ1/ν) neg_tol) || (ξ1 0 && sqrt(ξ1/ν) < ϵ)
236236
# the current xk is approximately first-order stationary
237237
optimal = true
238238
continue
@@ -250,7 +250,7 @@ function TRDH(
250250
set_radius!(ψ, Δ_effective)
251251
end
252252

253-
# model with diagonal hessian
253+
# model with diagonal hessian
254254
φ(d) = ∇fk' * d + (d' * (Dk.d .* d)) / 2
255255
mk(d) = φ(d) + ψ(d)
256256

@@ -268,10 +268,10 @@ function TRDH(
268268

269269
if !reduce_TR
270270
if ξ 0 && k == 1
271-
ϵ += ϵr * sqrt(ξ) # make stopping test absolute and relative
271+
ϵ += ϵr * sqrt/ν) # make stopping test absolute and relative
272272
end
273273

274-
if< 0 && sqrt(-ξ) neg_tol) || 0 && sqrt(ξ) < ϵ)
274+
if< 0 && sqrt(-ξ/ν) neg_tol) || 0 && sqrt/ν) < ϵ)
275275
# the current xk is approximately first-order stationary
276276
optimal = true
277277
continue
@@ -289,9 +289,9 @@ function TRDH(
289289
if (verbose > 0) && (k % ptf == 0)
290290
#! format: off
291291
if reduce_TR
292-
@info @sprintf "%6d %8.1e %8.1e %7.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k fk hk sqrt(ξ1) sqrt(ξ) ρk Δk χ(xk) sNorm norm(Dk.d) TR_stat
292+
@info @sprintf "%6d %8.1e %8.1e %7.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k fk hk sqrt(ξ1/ν) sqrt/ν) ρk Δk χ(xk) sNorm norm(Dk.d) TR_stat
293293
else
294-
@info @sprintf "%6d %8.1e %8.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k fk hk sqrt(ξ) ρk Δk χ(xk) sNorm norm(Dk.d) TR_stat
294+
@info @sprintf "%6d %8.1e %8.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k fk hk sqrt/ν) ρk Δk χ(xk) sNorm norm(Dk.d) TR_stat
295295
end
296296
#! format: on
297297
end
@@ -334,14 +334,14 @@ function TRDH(
334334
elseif optimal
335335
#! format: off
336336
if reduce_TR
337-
@info @sprintf "%6d %8.1e %8.1e %7.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k fk hk sqrt(ξ1) sqrt(ξ1) "" Δk χ(xk) χ(s) norm(Dk.d)
337+
@info @sprintf "%6d %8.1e %8.1e %7.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k fk hk sqrt(ξ1/ν) sqrt(ξ1/ν) "" Δk χ(xk) χ(s) norm(Dk.d)
338338
#! format: on
339-
@info "TRDH: terminating with √ξ1 = $(sqrt(ξ1))"
339+
@info "TRDH: terminating with √(ξ1/ν) = $(sqrt(ξ1/ν))"
340340
else
341-
@info @sprintf "%6d %8.1e %8.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k fk hk sqrt(ξ) "" Δk χ(
341+
@info @sprintf "%6d %8.1e %8.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k fk hk sqrt/ν) "" Δk χ(
342342
xk,
343343
) χ(s) norm(Dk.d)
344-
@info "TRDH: terminating with √ξ = $(sqrt(ξ))"
344+
@info "TRDH: terminating with √(ξ/ν) = $(sqrt/ν))"
345345
end
346346
end
347347
end

src/TR_alg.jl

+10-9
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,11 @@ 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

124-
local ξ1
124+
local ξ1, ξ
125125
k = 0
126126

127127
fk = obj(f, xk)
@@ -133,6 +133,7 @@ function TR(
133133

134134
λmax = opnorm(Bk)
135135
νInv = (1 + θ) * λmax
136+
ν = 1/νInv
136137

137138
optimal = false
138139
tired = k maxIter || elapsed_time > maxTime
@@ -166,18 +167,18 @@ function TR(
166167
ξ1 > 0 || error("TR: first prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
167168

168169
if ξ1 0 && k == 1
169-
ϵ_increment = ϵr * sqrt(ξ1)
170+
ϵ_increment = ϵr * sqrt(ξ1)/sqrt(ν)
170171
ϵ += ϵ_increment # make stopping test absolute and relative
171172
ϵ_subsolver += ϵ_increment
172173
end
173174

174-
if sqrt(ξ1) < ϵ
175+
if sqrt(ξ1)/sqrt(ν) < ϵ
175176
# the current xk is approximately first-order stationary
176177
optimal = true
177178
continue
178179
end
179180

180-
subsolver_options.ϵa = k == 1 ? 1.0e-5 : max(ϵ_subsolver, min(1e-2, sqrt(ξ1)) * ξ1)
181+
subsolver_options.ϵa = k == 1 ? 1.0e-5 : max(ϵ_subsolver, min(1e-2, sqrt(ξ1 / ν)) * ξ1)
181182
∆_effective = min* χ(s), Δk)
182183
(has_bounds(f) || subsolver == TRDH) ?
183184
set_bounds!(ψ, max.(-∆_effective, l_bound - xk), min.(∆_effective, u_bound - xk)) :
@@ -214,7 +215,7 @@ function TR(
214215

215216
if (verbose > 0) && (k % ptf == 0)
216217
#! 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
218+
@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
218219
#! format: on
219220
end
220221

@@ -256,9 +257,9 @@ function TR(
256257
@info @sprintf "%6d %8s %8.1e %8.1e" k "" fk hk
257258
elseif optimal
258259
#! 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
260+
@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(ξ/ν) "" Δk χ(xk) χ(s) νInv
260261
#! format: on
261-
@info "TR: terminating with √ξ1 = $(sqrt(ξ1))"
262+
@info "TR: terminating with √(ξ1/ν) = $(sqrt(ξ1/ν))"
262263
end
263264
end
264265

@@ -276,7 +277,7 @@ function TR(
276277
set_status!(stats, status)
277278
set_solution!(stats, xk)
278279
set_objective!(stats, fk + hk)
279-
set_residuals!(stats, zero(eltype(xk)), ξ1 0 ? sqrt(ξ1) : ξ1)
280+
set_residuals!(stats, zero(eltype(xk)), ξ1 0 ? sqrt(ξ1/ν) : ξ1)
280281
set_iter!(stats, k)
281282
set_time!(stats, elapsed_time)
282283
set_solver_specific!(stats, :Fhist, Fobj_hist[1:k])

0 commit comments

Comments
 (0)