@@ -16,10 +16,9 @@ where `J` is the Jacobian of `F` at `xk`, represented via matrix-free operations
1616
1717`σ > 0` is a regularization parameter and `v` is a vector of the same size as `F(xk)` used for intermediary computations.
1818"""
19- mutable struct LMModel{T <: Real , V <: AbstractVector{T} , J <: Function , Jt <: Function } < :
19+ mutable struct LMModel{T <: Real , V <: AbstractVector{T} , Jac <: Union{AbstractMatrix, AbstractLinearOperator} } < :
2020 AbstractNLPModel{T, V}
21- j_prod!:: J
22- jt_prod!:: Jt
21+ J:: Jac
2322 F:: V
2423 v:: V
2524 xk:: V
@@ -28,19 +27,19 @@ mutable struct LMModel{T <: Real, V <: AbstractVector{T}, J <: Function, Jt <: F
2827 counters:: Counters
2928end
3029
31- function LMModel (j_prod! :: J , jt_prod! :: Jt , F:: V , σ:: T , xk:: V ) where {T, V, J, Jt }
30+ function LMModel (J :: Jac , F:: V , σ:: T , xk:: V ) where {T, V, Jac }
3231 meta = NLPModelMeta (
3332 length (xk),
3433 x0 = xk, # Perhaps we should add lvar and uvar as well here.
3534 )
3635 v = similar (F)
37- return LMModel (j_prod!, jt_prod! , F, v, xk, σ, meta, Counters ())
36+ return LMModel (J , F, v, xk, σ, meta, Counters ())
3837end
3938
4039function NLPModels. obj (nlp:: LMModel , x:: AbstractVector{T} ) where {T}
4140 @lencheck nlp. meta. nvar x
4241 increment! (nlp, :neval_obj )
43- nlp . j_prod ! (nlp. xk, x, nlp. v) # v = J(xk)x
42+ mul ! (nlp. v, nlp. J, x)
4443 nlp. v .+ = nlp. F
4544 return (dot (nlp. v, nlp. v) + nlp. σ * dot (x, x)) / 2
4645end
@@ -49,9 +48,9 @@ function NLPModels.grad!(nlp::LMModel, x::AbstractVector{T}, g::AbstractVector{T
4948 @lencheck nlp. meta. nvar x
5049 @lencheck nlp. meta. nvar g
5150 increment! (nlp, :neval_grad )
52- nlp . j_prod ! (nlp. xk, x, nlp. v) # v = J(xk)x + F
51+ mul ! (nlp. v, nlp. J, x)
5352 nlp. v .+ = nlp. F
54- nlp . jt_prod! ( nlp. xk , nlp. v, g) # g = J^T(xk) v
53+ mul! (g, nlp. J ' , nlp. v)
5554 @. g += nlp. σ .* x
5655 return g
5756end
0 commit comments