@@ -17,6 +17,8 @@ mutable struct LMSolver{
1717 mν∇fk:: V
1818 Fk:: V
1919 Fkn:: V
20+ Jv:: V
21+ Jtv:: V
2022 ψ:: G
2123 xkn:: V
2224 s:: V
@@ -43,6 +45,8 @@ function LMSolver(
4345 mν∇fk = similar (x0)
4446 Fk = similar (x0, reg_nls. model. nls_meta. nequ)
4547 Fkn = similar (Fk)
48+ Jv = similar (Fk)
49+ Jtv = similar (x0)
4650 xkn = similar (x0)
4751 s = similar (x0)
4852 has_bnds = any (l_bound .!= T (- Inf )) || any (u_bound .!= T (Inf )) || subsolver == TRDHSolver
@@ -78,6 +82,8 @@ function LMSolver(
7882 mν∇fk,
7983 Fk,
8084 Fkn,
85+ Jv,
86+ Jtv,
8187 ψ,
8288 xkn,
8389 s,
@@ -171,7 +177,7 @@ function LM(
171177 x0 = pop! (kwargs_dict, :x0 , nls. meta. x0)
172178 reg_nls = RegularizedNLPModel (nls, h, selected)
173179 return LM (
174- reg_nls,
180+ reg_nls;
175181 x = x0,
176182 atol = options. ϵa,
177183 rtol = options. ϵr,
@@ -188,11 +194,11 @@ function LM(
188194 )
189195end
190196
191- function LM (reg_nls:: AbstractRegularizedNLPModel , kwargs... )
197+ function LM (reg_nls:: AbstractRegularizedNLPModel ; kwargs... )
192198 kwargs_dict = Dict (kwargs... )
193199 subsolver = pop! (kwargs_dict, :subsolver , R2Solver)
194200 solver = LMSolver (reg_nls, subsolver = subsolver)
195- stats = RegularizedExecutionStats (reg_nls. model )
201+ stats = RegularizedExecutionStats (reg_nls)
196202 solve! (solver, reg_nls, stats; kwargs_dict... )
197203 return stats
198204end
@@ -232,6 +238,8 @@ function SolverCore.solve!(
232238
233239 Fk = solver. Fk
234240 Fkn = solver. Fkn
241+ Jv = solver. Jv
242+ Jtv = solver. Jtv
235243 ∇fk = solver.∇fk
236244 mν∇fk = solver. mν∇fk
237245 ψ = solver. ψ
@@ -284,7 +292,7 @@ function SolverCore.solve!(
284292 jtprod_residual! (nls, xk, Fk, ∇fk)
285293 fk = dot (Fk, Fk) / 2
286294
287- σmax, found_σ = opnorm (solver . subpb . model . J )
295+ σmax, found_σ = opnorm (jac_op_residual! (nls, xk, Jv, Jtv) )
288296 found_σ || error (" operator norm computation failed" )
289297 ν = θ / (σmax^ 2 + σk) # ‖J'J + σₖ I‖ = ‖J‖² + σₖ
290298 sqrt_ξ1_νInv = one (T)
@@ -417,7 +425,7 @@ function SolverCore.solve!(
417425
418426 # update opnorm if not linear least squares
419427 if nonlinear == true
420- σmax, found_σ = opnorm (solver . subpb . model . J )
428+ σmax, found_σ = opnorm (jac_op_residual! (nls, xk, Jv, Jtv) )
421429 found_σ || error (" operator norm computation failed" )
422430 end
423431 end
0 commit comments