@@ -100,7 +100,7 @@ function LM(
100
100
101
101
xkn = similar (xk)
102
102
103
- local ξ1
103
+ local ξ1, ξ
104
104
k = 0
105
105
Fobj_hist = zeros (maxIter)
106
106
Hobj_hist = zeros (maxIter)
@@ -110,7 +110,7 @@ function LM(
110
110
111
111
if verbose > 0
112
112
# ! format: off
113
- @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"
113
+ @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"
114
114
# ! format: on
115
115
end
116
116
@@ -125,6 +125,7 @@ function LM(
125
125
126
126
σmax = opnorm (Jk)
127
127
νInv = (1 + θ) * (σmax^ 2 + σk) # ‖J'J + σₖ I‖ = ‖J‖² + σₖ
128
+ ν = 1 / νInv
128
129
129
130
s = zero (xk)
130
131
@@ -178,18 +179,18 @@ function LM(
178
179
ξ1 > 0 || error (" LM: first prox-gradient step should produce a decrease but ξ1 = $(ξ1) " )
179
180
180
181
if ξ1 ≥ 0 && k == 1
181
- ϵ_increment = ϵr * sqrt (ξ1)
182
+ ϵ_increment = ϵr * sqrt (ξ1/ ν )
182
183
ϵ += ϵ_increment # make stopping test absolute and relative
183
184
ϵ_subsolver += ϵ_increment
184
185
end
185
186
186
- if sqrt (ξ1) < ϵ
187
+ if sqrt (ξ1/ ν ) < ϵ
187
188
# the current xk is approximately first-order stationary
188
189
optimal = true
189
190
continue
190
191
end
191
192
192
- subsolver_options. ϵa = k == 1 ? 1.0e-1 : max (ϵ_subsolver, min (1.0e-2 , ξ1 / 10 ))
193
+ subsolver_options. ϵa = k == 1 ? 1.0e-1 : max (ϵ_subsolver, min (1.0e-2 , ξ1 / ν / 10 ))
193
194
subsolver_options. ν = ν
194
195
@debug " setting inner stopping tolerance to" subsolver_options. optTol
195
196
s, iter, _ = with_logger (subsolver_logger) do
@@ -220,7 +221,7 @@ function LM(
220
221
221
222
if (verbose > 0 ) && (k % ptf == 0 )
222
223
# ! format: off
223
- @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
224
+ @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
224
225
# ! format: off
225
226
end
226
227
@@ -260,9 +261,9 @@ function LM(
260
261
@info @sprintf " %6d %8s %8.1e %8.1e" k " " fk hk
261
262
elseif optimal
262
263
# ! format: off
263
- @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
264
+ @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
264
265
# ! format: on
265
- @info " LM: terminating with √ξ1 = $(sqrt (ξ1)) "
266
+ @info " LM: terminating with √(ξ1/ν) = $(sqrt (ξ1/ ν )) "
266
267
end
267
268
end
268
269
status = if optimal
@@ -279,7 +280,7 @@ function LM(
279
280
set_status! (stats, status)
280
281
set_solution! (stats, xk)
281
282
set_objective! (stats, fk + hk)
282
- set_residuals! (stats, zero (eltype (xk)), ξ1 ≥ 0 ? sqrt (ξ1) : ξ1)
283
+ set_residuals! (stats, zero (eltype (xk)), ξ1 ≥ 0 ? sqrt (ξ1/ ν ) : ξ1)
283
284
set_iter! (stats, k)
284
285
set_time! (stats, elapsed_time)
285
286
set_solver_specific! (stats, :Fhist , Fobj_hist[1 : k])
0 commit comments