Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 97 additions & 20 deletions src/feasibility-form-nls.jl
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ function FeasibilityFormNLS(
y0 = y0,
lin = meta.lin .+ nequ, # [nls.nls_meta.lin; meta.lin .+ nequ] linear API for residual not (yet) implemented
nnzj = meta.nnzj + nls.nls_meta.nnzj + nequ,
nln_nnzj = meta.nln_nnzj + nls.nls_meta.nnzj + nequ,
lin_nnzj = meta.lin_nnzj,
nnzh = nnzh,
name = name,
)
Expand Down Expand Up @@ -117,76 +119,116 @@ function NLPModels.objgrad!(nlp::FeasibilityFormNLS, x::Array{Float64}, g::Array
return f, g
end

function NLPModels.cons!(nlp::FeasibilityFormNLS, xr::AbstractVector, c::AbstractVector)
function NLPModels.cons_nln!(nlp::FeasibilityFormNLS, xr::AbstractVector, c::AbstractVector)
@lencheck nlp.meta.nvar xr
@lencheck nlp.meta.ncon c
increment!(nlp, :neval_cons)
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.ncon, nlp.internal.nls_meta.nequ
@lencheck nlp.meta.nnln c
increment!(nlp, :neval_cons_nln)
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.nnln, nlp.internal.nls_meta.nequ
x = @view xr[1:n]
r = @view xr[(n + 1):end]
residual!(nlp.internal, x, @view c[1:ne])
c[1:ne] .-= r
if m > 0
cons!(nlp.internal, x, @view c[(ne + 1):end])
cons_nln!(nlp.internal, x, @view c[(ne + 1):end])
end
return c
end

function NLPModels.jac_structure!(
function NLPModels.cons_lin!(nlp::FeasibilityFormNLS, xr::AbstractVector, c::AbstractVector)
@lencheck nlp.meta.nvar xr
@lencheck nlp.meta.nlin c
increment!(nlp, :neval_cons_lin)
x = @view xr[1:nlp.internal.meta.nvar]
return cons_lin!(nlp.internal, x, c)
end

function NLPModels.jac_nln_structure!(
nlp::FeasibilityFormNLS,
rows::AbstractVector{<:Integer},
cols::AbstractVector{<:Integer},
)
@lencheck nlp.meta.nnzj rows cols
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.ncon, nlp.internal.nls_meta.nequ
@lencheck nlp.meta.nln_nnzj rows cols
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.nnln, nlp.internal.nls_meta.nequ
nnzjF = nlp.internal.nls_meta.nnzj
@views jac_structure_residual!(nlp.internal, rows[1:nnzjF], cols[1:nnzjF])
if m > 0
idx = nnzjF .+ (1:(nlp.internal.meta.nnzj))
@views jac_structure!(nlp.internal, rows[idx], cols[idx])
idx = nnzjF .+ (1:nlp.internal.meta.nln_nnzj)
@views jac_nln_structure!(nlp.internal, rows[idx], cols[idx])
rows[idx] .+= ne
end
rows[(end - ne + 1):end] .= 1:ne
cols[(end - ne + 1):end] .= n .+ (1:ne)
return rows, cols
end

function NLPModels.jac_coord!(nlp::FeasibilityFormNLS, xr::AbstractVector, vals::AbstractVector)
function NLPModels.jac_lin_structure!(
nlp::FeasibilityFormNLS,
rows::AbstractVector{<:Integer},
cols::AbstractVector{<:Integer},
)
@lencheck nlp.meta.lin_nnzj rows cols
return jac_lin_structure!(nlp.internal, rows, cols)
end

function NLPModels.jac_nln_coord!(nlp::FeasibilityFormNLS, xr::AbstractVector, vals::AbstractVector)
@lencheck nlp.meta.nvar xr
@lencheck nlp.meta.nnzj vals
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.ncon, nlp.internal.nls_meta.nequ
@lencheck nlp.meta.nln_nnzj vals
increment!(nlp, :neval_jac_nln)
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.nnln, nlp.internal.nls_meta.nequ
x = @view xr[1:n]
nnzjF = nlp.internal.nls_meta.nnzj
nnzjc = m > 0 ? nlp.internal.meta.nnzj : 0
nnzjc = m > 0 ? nlp.internal.meta.nln_nnzj : 0
I = 1:nnzjF
@views jac_coord_residual!(nlp.internal, x, vals[I])
if m > 0
I = (nnzjF + 1):(nnzjF + nnzjc)
@views jac_coord!(nlp.internal, x, vals[I])
@views jac_nln_coord!(nlp.internal, x, vals[I])
end
vals[(nnzjF + nnzjc + 1):(nnzjF + nnzjc + ne)] .= -1
return vals
end

function NLPModels.jprod!(
function NLPModels.jac_lin_coord!(nlp::FeasibilityFormNLS, xr::AbstractVector, vals::AbstractVector)
@lencheck nlp.meta.nvar xr
@lencheck nlp.meta.lin_nnzj vals
increment!(nlp, :neval_jac_lin)
x = @view xr[1:nlp.internal.meta.nvar]
return jac_lin_coord!(nlp.internal, x, vals)
end

function NLPModels.jprod_nln!(
nlp::FeasibilityFormNLS,
xr::AbstractVector,
v::AbstractVector,
jv::AbstractVector,
)
@lencheck nlp.meta.nvar xr v
@lencheck nlp.meta.ncon jv
increment!(nlp, :neval_jprod)
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.ncon, nlp.internal.nls_meta.nequ
@lencheck nlp.meta.nnln jv
increment!(nlp, :neval_jprod_nln)
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.nnln, nlp.internal.nls_meta.nequ
x = @view xr[1:n]
@views jprod_residual!(nlp.internal, x, v[1:n], jv[1:ne])
@views jv[1:ne] .-= v[(n + 1):end]
if m > 0
@views jprod!(nlp.internal, x, v[1:n], jv[(ne + 1):end])
@views jprod_nln!(nlp.internal, x, v[1:n], jv[(ne + 1):end])
end
return jv
end

function NLPModels.jprod_lin!(
nlp::FeasibilityFormNLS,
xr::AbstractVector,
vr::AbstractVector,
jv::AbstractVector,
)
@lencheck nlp.meta.nvar xr vr
@lencheck nlp.meta.nlin jv
increment!(nlp, :neval_jprod_lin)
x = @view xr[1:nlp.internal.meta.nvar]
v = @view vr[1:nlp.internal.meta.nvar]
return jprod_lin!(nlp.internal, x, v, jv)
end

function NLPModels.jtprod!(
nlp::FeasibilityFormNLS,
xr::AbstractVector,
Expand All @@ -206,6 +248,41 @@ function NLPModels.jtprod!(
return jtv
end

function NLPModels.jtprod_nln!(
nlp::FeasibilityFormNLS,
xr::AbstractVector,
v::AbstractVector,
jtv::AbstractVector,
)
@lencheck nlp.meta.nvar xr jtv
@lencheck nlp.meta.nnln v
increment!(nlp, :neval_jtprod_nln)
n, m, ne = nlp.internal.meta.nvar, nlp.internal.meta.nnln, nlp.internal.nls_meta.nequ
x = @view xr[1:n]
@views jtprod_residual!(nlp.internal, x, v[1:ne], jtv[1:n])
if m > 0
@views jtv[1:n] .+= jtprod_nln(nlp.internal, x, v[(ne + 1):end])
end
@views jtv[(n + 1):end] .= -v[1:ne]
return jtv
end

function NLPModels.jtprod_lin!(
nlp::FeasibilityFormNLS,
xr::AbstractVector{T},
v::AbstractVector,
jtvr::AbstractVector,
) where {T}
@lencheck nlp.meta.nvar xr jtvr
@lencheck nlp.meta.nlin v
increment!(nlp, :neval_jtprod_lin)
x = @view xr[1:nlp.internal.meta.nvar]
jtv = @view jtvr[1:nlp.internal.meta.nvar]
jtprod_lin!(nlp.internal, x, v, jtv)
@views jtvr[(nlp.internal.meta.nvar + 1):end] .= zero(T)
return jtvr
end

function NLPModels.hess_structure!(
nlp::FeasibilityFormNLS,
rows::AbstractVector{<:Integer},
Expand Down
19 changes: 11 additions & 8 deletions test/nls/feasibility-form-nls.jl
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@
x[1] + x[2]^2
x[1]^2 + x[2]
x[1]^2 + x[2]^2 - 1
x[1] + x[2]
]
J(x) = T[-1 0 -1 0; -20x[1] 10 0 -1; 1 2x[2] 0 0; 2x[1] 1 0 0; 2x[1] 2x[2] 0 0]
J(x) = T[-1 0 -1 0; -20x[1] 10 0 -1; 1 2x[2] 0 0; 2x[1] 1 0 0; 2x[1] 2x[2] 0 0; 1 1 0 0]
H(x, y) = H(x) + diagm(0 => T[-20y[2] + 2y[4] + 2y[5]; 2y[3] + 2y[5]; 0; 0])

nls = FeasibilityFormNLS(SimpleNLSModel(T))
Expand All @@ -92,6 +93,8 @@
@test jac(nls, x) ≈ J(x)
@test jprod(nls, x, v) ≈ J(x) * v
@test jtprod(nls, x, w) ≈ J(x)' * w
@test jtprod_lin(nls, x, w[6:6]) ≈ J(x)[6:6,:]' * w[6:6]
@test jtprod_nln(nls, x, w[1:5]) ≈ J(x)[1:5,:]' * w[1:5]
@test hess(nls, x, y) ≈ H(x, y)
@test hprod(nls, x, y, v) ≈ H(x, y) * v
fx, cx = objcons(nls, x)
Expand Down Expand Up @@ -144,16 +147,16 @@
showed = String(take!(io))
expected = """FeasibilityFormNLS - Nonlinear least-squares moving the residual to constraints
Problem name: Simple NLS Model-ffnls
All variables: ████████████████████ 4 All constraints: ████████████████████ 5 All residuals: ████████████████████ 2
All variables: ████████████████████ 4 All constraints: ████████████████████ 6 All residuals: ████████████████████ 2
free: ██████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 linear: ████████████████████ 2
lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 lower: ███████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 nonlinear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nnzj: ( 75.00% sparsity) 2
lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 lower: ███████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 nonlinear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 upper: ████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 1 nnzj: ( 75.00% sparsity) 2
low/upp: ██████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nnzh: (100.00% sparsity) 0
fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 fixed: ████████████⋅⋅⋅⋅⋅⋅⋅⋅ 3
fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 fixed: ██████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 3
infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
nnzh: ( 40.00% sparsity) 6 linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
nonlinear: ████████████████████ 5
nnzj: ( 45.00% sparsity) 11
nnzh: ( 40.00% sparsity) 6 linear: ████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 1
nonlinear: █████████████████⋅⋅⋅ 5
nnzj: ( 45.83% sparsity) 13

Counters:
obj: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 grad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 cons: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
Expand Down
12 changes: 6 additions & 6 deletions test/nls/feasibility-residual.jl
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,14 @@
showed = String(take!(io))
expected = """FeasibilityResidual - Nonlinear least-squares defined from constraints of another problem
Problem name: Simple NLS Model-feasres
All variables: ████████████████████ 4 All constraints: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 All residuals: ████████████████████ 3
free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
lower: ██████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nonlinear: ████████████████████ 3
upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nnzj: ( 33.33% sparsity) 8
low/upp: ██████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nnzh: ( 70.00% sparsity) 3
All variables: ████████████████████ 5 All constraints: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 All residuals: ████████████████████ 4
free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 linear: █████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 1
lower: ████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nonlinear: ███████████████⋅⋅⋅⋅⋅ 3
upper: ████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 1 upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nnzj: ( 45.00% sparsity) 11
low/upp: ████████⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 2 low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 nnzh: ( 80.00% sparsity) 3
fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0 infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
nnzh: ( 0.00% sparsity) 10 linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
nnzh: ( 0.00% sparsity) 15 linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
nonlinear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
nnzj: (------% sparsity)

Expand Down
Loading