@@ -113,16 +113,37 @@ end
113113
114114function 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
124126end
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+
126147function 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
156178end
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+
158209function 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
194245end
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+
196285function NLPModels. jprod_lin! (
197286 nlp:: MathOptNLPModel ,
198287 x:: AbstractVector ,
0 commit comments