Skip to content

Commit 4dbef95

Browse files
committed
Update API
1 parent b440979 commit 4dbef95

File tree

1 file changed

+94
-5
lines changed

1 file changed

+94
-5
lines changed

src/moi_nlp_model.jl

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,37 @@ end
113113

114114
function NLPModels.cons_nln!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector)
115115
increment!(nlp, :neval_cons_nln)
116-
for i = 1:(nlp.quadcon.nquad)
117-
qcon = nlp.quadcon.constraints[i]
118-
c[i] = 0.5 * coo_sym_dot(qcon.A.rows, qcon.A.cols, qcon.A.vals, x, x) + dot(qcon.b, x)
116+
if nlp.quadcon.nquad > 0
117+
for i = 1:(nlp.quadcon.nquad)
118+
qcon = nlp.quadcon.constraints[i]
119+
c[i] = 0.5 * coo_sym_dot(qcon.A.rows, qcon.A.cols, qcon.A.vals, x, x) + dot(qcon.b, x)
120+
end
119121
end
120122
if nlp.meta.nnln > nlp.quadcon.nquad
121123
MOI.eval_constraint(nlp.eval, view(c, (nlp.quadcon.nquad + 1):(nlp.meta.nnln)), x)
122124
end
123125
return c
124126
end
125127

128+
function NLPModels.cons!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector)
129+
increment!(nlp, :neval_cons)
130+
if nlp.meta.nlin > 0
131+
coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c)
132+
end
133+
if nlp.meta.nnln > 0
134+
if nlp.quadcon.nquad > 0
135+
for i = 1:(nlp.quadcon.nquad)
136+
qcon = nlp.quadcon.constraints[i]
137+
c[nlp.meta.nlin + i] = 0.5 * coo_sym_dot(qcon.A.rows, qcon.A.cols, qcon.A.vals, x, x) + dot(qcon.b, x)
138+
end
139+
end
140+
if nlp.meta.nnln > nlp.quadcon.nquad
141+
MOI.eval_constraint(nlp.eval, view(c, (nlp.meta.nlin + nlp.quadcon.nquad + 1):(nlp.meta.nlin + nlp.meta.nnln)), x)
142+
end
143+
end
144+
return c
145+
end
146+
126147
function NLPModels.jac_lin_structure!(
127148
nlp::MathOptNLPModel,
128149
rows::AbstractVector{<:Integer},
@@ -142,8 +163,9 @@ function NLPModels.jac_nln_structure!(
142163
index = 0
143164
for i = 1:(nlp.quadcon.nquad)
144165
qcon = nlp.quadcon.constraints[i]
145-
view(rows, (index + 1):(index + qcon.nnzg)) .= i
146-
view(cols, (index + 1):(index + qcon.nnzg)) .= qcon.g
166+
ind_quad = (index + 1):(index + qcon.nnzg)
167+
view(rows, ind_quad) .= i
168+
view(cols, ind_quad) .= qcon.g
147169
index += qcon.nnzg
148170
end
149171
end
@@ -155,6 +177,35 @@ function NLPModels.jac_nln_structure!(
155177
return rows, cols
156178
end
157179

180+
function NLPModels.jac_structure!(
181+
nlp::MathOptNLPModel,
182+
rows::AbstractVector{<:Integer},
183+
cols::AbstractVector{<:Integer},
184+
)
185+
if nlp.meta.nlin > 0
186+
view(rows, 1:(nlp.lincon.nnzj)) .= nlp.lincon.jacobian.rows
187+
view(cols, 1:(nlp.lincon.nnzj)) .= nlp.lincon.jacobian.cols
188+
end
189+
if nlp.meta.nnln > 0
190+
if nlp.quadcon.nquad > 0
191+
index = 0
192+
for i = 1:(nlp.quadcon.nquad)
193+
qcon = nlp.quadcon.constraints[i]
194+
ind_quad = (nlp.lincon.nnzj + index + 1):(nlp.lincon.nnzj + index + qcon.nnzg)
195+
view(rows, ind_quad) .= i
196+
view(cols, ind_quad) .= qcon.g
197+
index += qcon.nnzg
198+
end
199+
end
200+
if nlp.meta.nnln > nlp.quadcon.nquad
201+
ind_nnln = (nlp.lincon.nnzj + nlp.quadcon.nnzj + 1):(nlp.lincon.nnzj + nlp.quadcon.nnzj + nlp.nlcon.nnzj)
202+
view(rows, ind_nnln) .= nlp.quadcon.nquad .+ nlp.nlcon.jac_rows
203+
view(cols, ind_nnln) .= nlp.nlcon.jac_cols
204+
end
205+
end
206+
return rows, cols
207+
end
208+
158209
function NLPModels.jac_lin_coord!(nlp::MathOptNLPModel, x::AbstractVector, vals::AbstractVector)
159210
increment!(nlp, :neval_jac_lin)
160211
view(vals, 1:(nlp.lincon.nnzj)) .= nlp.lincon.jacobian.vals
@@ -193,6 +244,44 @@ function NLPModels.jac_nln_coord!(nlp::MathOptNLPModel, x::AbstractVector, vals:
193244
return vals
194245
end
195246

247+
function NLPModels.jac_coord!(nlp::MathOptNLPModel, x::AbstractVector, vals::AbstractVector)
248+
increment!(nlp, :neval_jac)
249+
if nlp.meta.nlin > 0
250+
view(vals, 1:(nlp.lincon.nnzj)) .= nlp.lincon.jacobian.vals
251+
end
252+
if nlp.meta.nnln > 0
253+
if nlp.quadcon.nquad > 0
254+
ind_quad = (nlp.lincon.nnzj + 1):(nlp.lincon.nnzj + nlp.quadcon.nnzj)
255+
view(vals, ind_quad) .= 0.0
256+
index = nlp.lincon.nnzj
257+
for i = 1:(nlp.quadcon.nquad)
258+
qcon = nlp.quadcon.constraints[i]
259+
for (j, ind) in enumerate(qcon.b.nzind)
260+
k = qcon.dg[ind]
261+
vals[index + k] += qcon.b.nzval[j]
262+
end
263+
for j = 1:(qcon.nnzh)
264+
row = qcon.A.rows[j]
265+
col = qcon.A.cols[j]
266+
val = qcon.A.vals[j]
267+
k1 = qcon.dg[row]
268+
vals[index + k1] += val * x[col]
269+
if row != col
270+
k2 = qcon.dg[col]
271+
vals[index + k2] += val * x[row]
272+
end
273+
end
274+
index += qcon.nnzg
275+
end
276+
end
277+
if nlp.meta.nnln > nlp.quadcon.nquad
278+
ind_nnln = (nlp.lincon.nnzj + nlp.quadcon.nnzj + 1):(nlp.lincon.nnzj + nlp.quadcon.nnzj + nlp.nlcon.nnzj)
279+
MOI.eval_constraint_jacobian(nlp.eval, view(vals, ind_nnln), x)
280+
end
281+
end
282+
return vals
283+
end
284+
196285
function NLPModels.jprod_lin!(
197286
nlp::MathOptNLPModel,
198287
x::AbstractVector,

0 commit comments

Comments
 (0)