Scippy

SCIP

Solving Constraint Integer Programs

scip_nlpi.c
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and library */
4/* SCIP --- Solving Constraint Integer Programs */
5/* */
6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
7/* */
8/* Licensed under the Apache License, Version 2.0 (the "License"); */
9/* you may not use this file except in compliance with the License. */
10/* You may obtain a copy of the License at */
11/* */
12/* http://www.apache.org/licenses/LICENSE-2.0 */
13/* */
14/* Unless required by applicable law or agreed to in writing, software */
15/* distributed under the License is distributed on an "AS IS" BASIS, */
16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17/* See the License for the specific language governing permissions and */
18/* limitations under the License. */
19/* */
20/* You should have received a copy of the Apache-2.0 license */
21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file scip_nlpi.c
26 * @ingroup OTHER_CFILES
27 * @brief public methods for NLP interfaces
28 * @author Stefan Vigerske
29 * @author Thorsten Gellermann
30 *
31 * @todo check SCIP_STAGE_* switches
32 * @todo allow for optional callbacks
33 */
34
35/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
36
37#include "scip/scip_nlp.h"
39#include "scip/scip_expr.h"
40#include "scip/scip_lp.h"
41#include "scip/scip_message.h"
42#include "scip/scip_mem.h"
43#include "scip/scip_nlpi.h"
44#include "scip/scip_numerics.h"
45#include "scip/scip_param.h"
46#include "scip/scip_prob.h"
47#include "scip/pub_expr.h"
48#include "scip/pub_lp.h"
49#include "scip/pub_var.h"
50#include "scip/pub_message.h"
51#include "scip/expr_varidx.h"
52#include "scip/debug.h"
53#include "scip/nlpi.h"
54#include "scip/paramset.h"
55#include "scip/set.h"
56#include "scip/struct_scip.h"
57
58
59/** method to call, when the priority of an NLPI was changed */
60static
61SCIP_DECL_PARAMCHGD(paramChgdNlpiPriority)
62{ /*lint --e{715}*/
63 SCIP_PARAMDATA* paramdata;
64
65 paramdata = SCIPparamGetData(param);
66 assert(paramdata != NULL);
67
68 /* use SCIPsetSetPriorityNlpi() to mark the nlpis unsorted */
70
71 return SCIP_OKAY;
72}
73
74/** create varidx expression for var expression
75 *
76 * called when expr is duplicated for addition to NLPI
77 */
78static
80{
81 SCIP_HASHMAP* var2idx;
82 int varidx;
83
84 assert(sourcescip != NULL);
85 assert(sourcescip == targetscip);
86 assert(sourceexpr != NULL);
87 assert(targetexpr != NULL);
88 assert(*targetexpr == NULL);
89 assert(mapexprdata != NULL);
90
91 /* do not provide map if not variable */
92 if( !SCIPisExprVar(sourcescip, sourceexpr) )
93 return SCIP_OKAY;
94
95 assert(SCIPvarIsActive(SCIPgetVarExprVar(sourceexpr)));
96
97 var2idx = (SCIP_HASHMAP*)mapexprdata;
98 assert(SCIPhashmapExists(var2idx, SCIPgetVarExprVar(sourceexpr)));
99
100 varidx = SCIPhashmapGetImageInt(var2idx, SCIPgetVarExprVar(sourceexpr));
101
102 SCIP_CALL( SCIPcreateExprVaridx(targetscip, targetexpr, varidx, ownercreate, ownercreatedata) );
103
104 return SCIP_OKAY;
105}
106
107/** creates an NLPI and includes it into SCIP
108 *
109 * @pre This method can be called if SCIP is in one of the following stages:
110 * - \ref SCIP_STAGE_INIT
111 * - \ref SCIP_STAGE_PROBLEM
112 */
114 SCIP* scip, /**< SCIP data structure */
115 const char* name, /**< name of NLP interface */
116 const char* description, /**< description of NLP interface */
117 int priority, /**< priority of NLP interface */
118 SCIP_DECL_NLPICOPY ((*nlpicopy)), /**< copying an NLPI, can be NULL */
119 SCIP_DECL_NLPIFREE ((*nlpifree)), /**< free NLPI user data */
120 SCIP_DECL_NLPIGETSOLVERPOINTER ((*nlpigetsolverpointer)), /**< get solver pointer, can be NULL */
121 SCIP_DECL_NLPICREATEPROBLEM ((*nlpicreateproblem)), /**< create a new problem instance */
122 SCIP_DECL_NLPIFREEPROBLEM ((*nlpifreeproblem)), /**< free a problem instance */
123 SCIP_DECL_NLPIGETPROBLEMPOINTER ((*nlpigetproblempointer)), /**< get problem pointer, can be NULL */
124 SCIP_DECL_NLPIADDVARS ((*nlpiaddvars)), /**< add variables */
125 SCIP_DECL_NLPIADDCONSTRAINTS ((*nlpiaddconstraints)), /**< add constraints */
126 SCIP_DECL_NLPISETOBJECTIVE ((*nlpisetobjective)), /**< set objective */
127 SCIP_DECL_NLPICHGVARBOUNDS ((*nlpichgvarbounds)), /**< change variable bounds */
128 SCIP_DECL_NLPICHGCONSSIDES ((*nlpichgconssides)), /**< change constraint sides */
129 SCIP_DECL_NLPIDELVARSET ((*nlpidelvarset)), /**< delete a set of constraints */
130 SCIP_DECL_NLPIDELCONSSET ((*nlpidelconsset)), /**< delete a set of constraints */
131 SCIP_DECL_NLPICHGLINEARCOEFS ((*nlpichglinearcoefs)), /**< change coefficients in linear part of a constraint or objective */
132 SCIP_DECL_NLPICHGEXPR ((*nlpichgexpr)), /**< change nonlinear expression a constraint or objective */
133 SCIP_DECL_NLPICHGOBJCONSTANT ((*nlpichgobjconstant)), /**< change the constant offset in the objective */
134 SCIP_DECL_NLPISETINITIALGUESS ((*nlpisetinitialguess)), /**< set initial guess, can be NULL */
135 SCIP_DECL_NLPISOLVE ((*nlpisolve)), /**< solve NLP */
136 SCIP_DECL_NLPIGETSOLSTAT ((*nlpigetsolstat)), /**< get solution status */
137 SCIP_DECL_NLPIGETTERMSTAT ((*nlpigettermstat)), /**< get termination status */
138 SCIP_DECL_NLPIGETSOLUTION ((*nlpigetsolution)), /**< get solution */
139 SCIP_DECL_NLPIGETSTATISTICS ((*nlpigetstatistics)), /**< get solve statistics */
140 SCIP_NLPIDATA* nlpidata /**< NLP interface local data */
141 )
142{
143 SCIP_NLPI* nlpi = NULL;
145 char paramdesc[SCIP_MAXSTRLEN];
146
147 assert(scip != NULL);
148
150
151 /* check whether NLPI of given name is already present */
152 if( SCIPfindNlpi(scip, name) != NULL )
153 {
154 SCIPerrorMessage("NLPI <%s> already included.\n", name);
155 return SCIP_INVALIDDATA;
156 }
157
158 SCIP_CALL( SCIPnlpiCreate(&nlpi, name, description, priority,
159 nlpicopy, nlpifree, nlpigetsolverpointer,
160 nlpicreateproblem, nlpifreeproblem, nlpigetproblempointer,
161 nlpiaddvars, nlpiaddconstraints, nlpisetobjective, nlpichgvarbounds, nlpichgconssides, nlpidelvarset, nlpidelconsset, nlpichglinearcoefs, nlpichgexpr, nlpichgobjconstant,
162 nlpisetinitialguess, nlpisolve, nlpigetsolstat, nlpigettermstat, nlpigetsolution, nlpigetstatistics,
163 nlpidata) );
164 assert(nlpi != NULL);
165
166 SCIP_CALL( SCIPsetIncludeNlpi(scip->set, nlpi) );
167
168 /* add parameters */
169 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "nlpi/%s/priority", name);
170 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of NLPI <%s>", name);
172 NULL, FALSE, SCIPnlpiGetPriority(nlpi), INT_MIN/4, INT_MAX/4,
173 paramChgdNlpiPriority, (SCIP_PARAMDATA*)nlpi) ); /*lint !e740*/
174
175 return SCIP_OKAY;
176}
177
178/** returns the NLPI of the given name, or NULL if not existing */
180 SCIP* scip, /**< SCIP data structure */
181 const char* name /**< name of NLPI */
182 )
183{
184 assert(scip != NULL);
185 assert(scip->set != NULL);
186 assert(name != NULL);
187
188 return SCIPsetFindNlpi(scip->set, name);
189}
190
191/** returns the array of currently available NLPIs (sorted by priority) */
193 SCIP* scip /**< SCIP data structure */
194 )
195{
196 assert(scip != NULL);
197 assert(scip->set != NULL);
198
200
201 return scip->set->nlpis;
202}
203
204/** returns the number of currently available NLPIs */
206 SCIP* scip /**< SCIP data structure */
207 )
208{
209 assert(scip != NULL);
210 assert(scip->set != NULL);
211
212 return scip->set->nnlpis;
213}
214
215/** sets the priority of an NLPI */
217 SCIP* scip, /**< SCIP data structure */
218 SCIP_NLPI* nlpi, /**< NLPI */
219 int priority /**< new priority of the NLPI */
220 )
221{
222 assert(scip != NULL);
223 assert(scip->set != NULL);
224
225 SCIPsetSetPriorityNlpi(scip->set, nlpi, priority);
226
227 return SCIP_OKAY;
228}
229
230/** gets internal pointer to NLP solver */
231SCIP_DECL_NLPIGETSOLVERPOINTER(SCIPgetNlpiSolverPointer)
232{
233 assert(scip != NULL);
234
235 return SCIPnlpiGetSolverPointer(scip->set, nlpi, problem);
236}
237
238/** creates an empty problem instance */
239SCIP_DECL_NLPICREATEPROBLEM(SCIPcreateNlpiProblem)
240{
241 assert(scip != NULL);
242
243 SCIP_CALL( SCIPnlpiCreateProblem(scip->set, nlpi, problem, name) );
244
245 return SCIP_OKAY;
246}
247
248/** frees a problem instance */
249SCIP_DECL_NLPIFREEPROBLEM(SCIPfreeNlpiProblem)
250{
251 assert(scip != NULL);
252
253 SCIP_CALL( SCIPnlpiFreeProblem(scip->set, nlpi, problem) );
254
255 return SCIP_OKAY;
256}
257
258/** gets internal pointer to solver-internal problem instance */
259SCIP_DECL_NLPIGETPROBLEMPOINTER(SCIPgetNlpiProblemPointer)
260{
261 assert(scip != NULL);
262
263 return SCIPnlpiGetProblemPointer(scip->set, nlpi, problem);
264}
265
266/** add variables to nlpi */
267SCIP_DECL_NLPIADDVARS(SCIPaddNlpiVars)
268{
269 assert(scip != NULL);
270
271 SCIP_CALL( SCIPnlpiAddVars(scip->set, nlpi, problem, nvars, lbs, ubs, varnames) );
272
273 return SCIP_OKAY;
274}
275
276/** add constraints to nlpi */
277SCIP_DECL_NLPIADDCONSTRAINTS(SCIPaddNlpiConstraints)
278{
279 assert(scip != NULL);
280
281 SCIP_CALL( SCIPnlpiAddConstraints(scip->set, nlpi, problem, nconss, lhss, rhss, nlininds, lininds, linvals, exprs, names) );
282
283 return SCIP_OKAY;
284}
285
286/** sets or overwrites objective, a minimization problem is expected */
287SCIP_DECL_NLPISETOBJECTIVE(SCIPsetNlpiObjective)
288{
289 assert(scip != NULL);
290
291 SCIP_CALL( SCIPnlpiSetObjective(scip->set, nlpi, problem, nlins, lininds, linvals, expr, constant) );
292
293 return SCIP_OKAY;
294}
295
296/** change variable bounds */
297SCIP_DECL_NLPICHGVARBOUNDS(SCIPchgNlpiVarBounds)
298{
299 assert(scip != NULL);
300
301 SCIP_CALL( SCIPnlpiChgVarBounds(scip->set, nlpi, problem, nvars, indices, lbs, ubs) );
302
303 return SCIP_OKAY;
304}
305
306/** change constraint sides */
307SCIP_DECL_NLPICHGCONSSIDES(SCIPchgNlpiConsSides)
308{
309 assert(scip != NULL);
310
311 SCIP_CALL( SCIPnlpiChgConsSides(scip->set, nlpi, problem, nconss, indices, lhss, rhss) );
312
313 return SCIP_OKAY;
314}
315
316/** delete a set of variables */
317SCIP_DECL_NLPIDELVARSET(SCIPdelNlpiVarSet)
318{
319 assert(scip != NULL);
320
321 SCIP_CALL( SCIPnlpiDelVarSet(scip->set, nlpi, problem, dstats, dstatssize) );
322
323 return SCIP_OKAY;
324}
325
326/** delete a set of constraints */
327SCIP_DECL_NLPIDELCONSSET(SCIPdelNlpiConsSet)
328{
329 assert(scip != NULL);
330
331 SCIP_CALL( SCIPnlpiDelConsSet(scip->set, nlpi, problem, dstats, dstatssize) );
332
333 return SCIP_OKAY;
334}
335
336/** changes or adds linear coefficients in a constraint or objective */
337SCIP_DECL_NLPICHGLINEARCOEFS(SCIPchgNlpiLinearCoefs)
338{
339 assert(scip != NULL);
340
341 SCIP_CALL( SCIPnlpiChgLinearCoefs(scip->set, nlpi, problem, idx, nvals, varidxs, vals) );
342
343 return SCIP_OKAY;
344}
345
346/** change the expression in the nonlinear part */
347SCIP_DECL_NLPICHGEXPR(SCIPchgNlpiExpr)
348{
349 assert(scip != NULL);
350
351 SCIP_CALL( SCIPnlpiChgExpr(scip->set, nlpi, problem, idxcons, expr) );
352
353 return SCIP_OKAY;
354}
355
356/** change the constant offset in the objective */
357SCIP_DECL_NLPICHGOBJCONSTANT(SCIPchgNlpiObjConstant)
358{
359 assert(scip != NULL);
360
361 SCIP_CALL( SCIPnlpiChgObjConstant(scip->set, nlpi, problem, objconstant) );
362
363 return SCIP_OKAY;
364}
365
366/** sets initial guess */
367SCIP_DECL_NLPISETINITIALGUESS(SCIPsetNlpiInitialGuess)
368{
369 assert(scip != NULL);
370
371 SCIP_CALL( SCIPnlpiSetInitialGuess(scip->set, nlpi, problem, primalvalues, consdualvalues, varlbdualvalues, varubdualvalues) );
372
373 return SCIP_OKAY;
374}
375
376/** try to solve NLP with all parameters given as SCIP_NLPPARAM struct
377 *
378 * Typical use is
379 *
380 * SCIP_NLPPARAM nlparam = { SCIP_NLPPARAM_DEFAULT(scip); }
381 * nlpparam.iterlim = 42;
382 * SCIP_CALL( SCIPsolveNlpiParam(scip, nlpi, nlpiproblem, nlpparam) );
383 *
384 * or, in "one" line:
385 *
386 * SCIP_CALL( SCIPsolveNlpiParam(scip, nlpi, nlpiproblem,
387 * (SCIP_NLPPARAM){ SCIP_NLPPARAM_DEFAULT(scip), .iterlimit = 42 }) );
388 *
389 * To get the latter, also \ref SCIPsolveNlpi can be used.
390 */
391SCIP_DECL_NLPISOLVE(SCIPsolveNlpiParam)
392{
393 assert(scip != NULL);
394
395 SCIP_CALL( SCIPnlpiSolve(scip->set, scip->stat, nlpi, problem, &param) );
396
397 return SCIP_OKAY;
398}
399
400#if defined(_MSC_VER) && _MSC_VER < 1800
401/* warn that SCIPsolveNlpi() macro isn't perfect with ancient MSVC */
402#pragma message ( "Warning: designated initializers not supported by this version of MSVC. Parameters given to NLP solves will be ignored." )
403#endif
404
405/** gives solution status */
406SCIP_DECL_NLPIGETSOLSTAT(SCIPgetNlpiSolstat)
407{
408 assert(scip != NULL);
409
410 return SCIPnlpiGetSolstat(scip->set, nlpi, problem);
411}
412
413/** gives termination reason */
414SCIP_DECL_NLPIGETTERMSTAT(SCIPgetNlpiTermstat)
415{
416 assert(scip != NULL);
417
418 return SCIPnlpiGetTermstat(scip->set, nlpi, problem);
419}
420
421/** gives primal and dual solution
422 * for a ranged constraint, the dual variable is positive if the right hand side is active and negative if the left hand side is active
423 */
424SCIP_DECL_NLPIGETSOLUTION(SCIPgetNlpiSolution)
425{
426 assert(scip != NULL);
427
428 SCIP_CALL( SCIPnlpiGetSolution(scip->set, nlpi, problem, primalvalues, consdualvalues, varlbdualvalues, varubdualvalues, objval) );
429
430 return SCIP_OKAY;
431}
432
433/** gives solve statistics */
434SCIP_DECL_NLPIGETSTATISTICS(SCIPgetNlpiStatistics)
435{
436 assert(scip != NULL);
437
438 SCIP_CALL( SCIPnlpiGetStatistics(scip->set, nlpi, problem, statistics) );
439
440 return SCIP_OKAY;
441}
442
443/** creates a NLPI problem from given nonlinear rows
444 *
445 * The function computes for each variable the number of non-linear occurrences and stores it in the nlscore array.
446 *
447 * @note the first row corresponds always to the cutoff row (even if cutoffbound is SCIPinfinity(scip))
448 **/
450 SCIP* scip, /**< SCIP data structure */
451 SCIP_NLPI* nlpi, /**< interface to NLP solver */
452 SCIP_NLPIPROBLEM** nlpiprob, /**< buffer to store pointer to created nlpi problem */
453 const char* name, /**< name to give to problem */
454 SCIP_NLROW** nlrows, /**< nonlinear rows */
455 int nnlrows, /**< number of nonlinear rows */
456 SCIP_HASHMAP* var2idx, /**< empty hash map to store mapping between variables and indices in nlpiprob */
457 SCIP_HASHMAP* nlrow2idx, /**< empty hash map to store mapping between variables and indices in nlpiprob, can be NULL */
458 SCIP_Real* nlscore, /**< array to store the score of each nonlinear variable (NULL if not needed) */
459 SCIP_Real cutoffbound, /**< cutoff bound */
460 SCIP_Bool setobj, /**< whether the objective function should be set to one of the SCIP problem */
461 SCIP_Bool onlyconvex /**< filter only for convex constraints */
462 )
463{
464 SCIP_EXPR** exprs;
465 SCIP_Real** linvals;
466 int** lininds;
467 int* nlininds;
468 SCIP_Real* lhss;
469 SCIP_Real* rhss;
470 const char** names;
471 SCIP_VAR** vars;
472 int nvars;
473 SCIP_Real* lbs;
474 SCIP_Real* ubs;
475 SCIP_Real* objvals = NULL;
476 int* objinds = NULL;
477 const char** varnames;
478 int nobjinds;
479 int nconss;
480 SCIP_EXPRITER* it = NULL;
481 int i;
482
483 assert(nlpiprob != NULL);
484 assert(name != NULL);
485 assert(var2idx != NULL);
486 assert(nlrows != NULL);
487 assert(nnlrows > 0);
488 assert(nlpi != NULL);
489
490 SCIPdebugMsg(scip, "SCIPcreateNlpiProblemFromNlRows() called with cutoffbound %g\n", cutoffbound);
491
492 SCIP_CALL( SCIPnlpiCreateProblem(scip->set, nlpi, nlpiprob, name) );
493
494 if( nlscore != NULL )
495 {
497 }
498 vars = SCIPgetVars(scip);
499 nvars = SCIPgetNVars(scip);
500 nconss = 0;
501
502 SCIP_CALL( SCIPallocBufferArray(scip, &exprs, nnlrows + 1) );
503 SCIP_CALL( SCIPallocBufferArray(scip, &linvals, nnlrows + 1) );
504 SCIP_CALL( SCIPallocBufferArray(scip, &lininds, nnlrows + 1) );
505 SCIP_CALL( SCIPallocBufferArray(scip, &nlininds, nnlrows + 1) );
506 SCIP_CALL( SCIPallocBufferArray(scip, &names, nnlrows + 1) );
507 SCIP_CALL( SCIPallocBufferArray(scip, &lhss, nnlrows + 1) );
508 SCIP_CALL( SCIPallocBufferArray(scip, &rhss, nnlrows + 1) );
509
510 if( setobj )
511 {
512 SCIP_CALL( SCIPallocBufferArray(scip, &objvals, nvars) );
513 SCIP_CALL( SCIPallocBufferArray(scip, &objinds, nvars) );
514 }
515
516 SCIP_CALL( SCIPallocBufferArray(scip, &lbs, nvars) );
517 SCIP_CALL( SCIPallocBufferArray(scip, &ubs, nvars) );
518 SCIP_CALL( SCIPallocBufferArray(scip, &varnames, nvars) );
519
520 /* create a unique mapping between variables and {0,..,nvars-1} */
521 nobjinds = 0;
522 for( i = 0; i < nvars; ++i )
523 {
524 assert(vars[i] != NULL);
525 SCIP_CALL( SCIPhashmapInsertInt(var2idx, (void*)vars[i], i) );
526
527 lbs[i] = SCIPvarGetLbLocal(vars[i]);
528 ubs[i] = SCIPvarGetUbLocal(vars[i]);
529 varnames[i] = SCIPvarGetName(vars[i]);
530
531 /* collect non-zero objective coefficients */
532 if( setobj && !SCIPisZero(scip, SCIPvarGetObj(vars[i])) )
533 {
534 assert(objvals != NULL);
535 assert(objinds != NULL);
536
537 objvals[nobjinds] = SCIPvarGetObj(vars[i]);
538 objinds[nobjinds] = i;
539 ++nobjinds;
540 }
541 }
542
543 /* add variables */
544 SCIP_CALL( SCIPaddNlpiVars(scip, nlpi, *nlpiprob, nvars, lbs, ubs, varnames) );
545 SCIPfreeBufferArray(scip, &varnames);
548
549 /* set the objective function */
550 if( setobj )
551 {
552 if( nobjinds > 0 )
553 {
554 SCIP_CALL( SCIPsetNlpiObjective(scip, nlpi, *nlpiprob, nobjinds, objinds, objvals, NULL, 0.0) );
555 }
556
557 SCIPfreeBufferArray(scip, &objinds);
558 SCIPfreeBufferArray(scip, &objvals);
559 }
560
561 /* add row for cutoff bound even if cutoffbound == SCIPinfinity() */
562 lhss[nconss] = -SCIPinfinity(scip);
563 rhss[nconss] = cutoffbound;
564 names[nconss] = "objcutoff";
565 lininds[nconss] = NULL;
566 linvals[nconss] = NULL;
567 nlininds[nconss] = 0;
568 exprs[nconss] = NULL;
569
570 SCIP_CALL( SCIPallocBufferArray(scip, &lininds[nconss], nvars) ); /*lint !e866*/
571 SCIP_CALL( SCIPallocBufferArray(scip, &linvals[nconss], nvars) ); /*lint !e866*/
572
573 for( i = 0; i < nvars; ++i )
574 {
575 if( !SCIPisZero(scip, SCIPvarGetObj(vars[i])) )
576 {
577 linvals[nconss][nlininds[nconss]] = SCIPvarGetObj(vars[i]);
578 lininds[nconss][nlininds[nconss]] = i;
579 ++nlininds[nconss];
580 }
581 }
582 ++nconss;
583
584 if( nlscore != NULL )
585 {
587 }
588
589 /* add convex nonlinear rows to NLPI problem */
590 for( i = 0; i < nnlrows; ++i )
591 {
592 SCIP_Bool userhs;
593 SCIP_Bool uselhs;
594 int k;
595 SCIP_NLROW* nlrow;
596
597 nlrow = nlrows[i];
598 assert(nlrow != NULL);
599
600 uselhs = FALSE;
601 userhs = FALSE;
602
603 /* check curvature together with constraint sides of a nonlinear row */
604 if( SCIPnlrowGetExpr(nlrow) == NULL )
605 {
606 uselhs = TRUE;
607 userhs = TRUE;
608 }
609 else
610 {
611 if( (!onlyconvex || SCIPnlrowGetCurvature(nlrow) == SCIP_EXPRCURV_CONVEX)
612 && !SCIPisInfinity(scip, SCIPnlrowGetRhs(nlrow)) )
613 userhs = TRUE;
614 if( (!onlyconvex || SCIPnlrowGetCurvature(nlrow) == SCIP_EXPRCURV_CONCAVE)
615 && !SCIPisInfinity(scip, SCIPnlrowGetLhs(nlrow)) )
616 uselhs = TRUE;
617 }
618
619 if( !uselhs && !userhs )
620 continue;
621
622 lhss[nconss] = uselhs ? SCIPnlrowGetLhs(nlrow) - SCIPnlrowGetConstant(nlrow) : -SCIPinfinity(scip);
623 rhss[nconss] = userhs ? SCIPnlrowGetRhs(nlrow) - SCIPnlrowGetConstant(nlrow) : SCIPinfinity(scip);
624 names[nconss] = SCIPnlrowGetName(nlrow);
625 nlininds[nconss] = 0;
626 lininds[nconss] = NULL;
627 linvals[nconss] = NULL;
628
629 /* copy linear part */
630 if( SCIPnlrowGetNLinearVars(nlrow) > 0 )
631 {
632 SCIP_VAR* var;
633
634 nlininds[nconss] = SCIPnlrowGetNLinearVars(nlrow);
635
636 SCIP_CALL( SCIPallocBufferArray(scip, &lininds[nconss], nlininds[nconss]) ); /*lint !e866*/
637 SCIP_CALL( SCIPallocBufferArray(scip, &linvals[nconss], nlininds[nconss]) ); /*lint !e866*/
638
639 for( k = 0; k < nlininds[nconss]; ++k )
640 {
641 var = SCIPnlrowGetLinearVars(nlrow)[k];
642 assert(var != NULL);
643 assert(SCIPhashmapExists(var2idx, (void*)var));
644
645 lininds[nconss][k] = SCIPhashmapGetImageInt(var2idx, (void*)var);
646 assert(var == vars[lininds[nconss][k]]);
647 linvals[nconss][k] = SCIPnlrowGetLinearCoefs(nlrow)[k];
648 }
649 }
650
651 if( SCIPnlrowGetExpr(nlrow) != NULL )
652 {
653 /* create copy of expr that uses varidx expressions corresponding to variables indices in NLPI */
654 SCIP_CALL( SCIPduplicateExpr(scip, SCIPnlrowGetExpr(nlrow), &exprs[nconss], mapvar2varidx, var2idx, NULL, NULL) );
655 }
656 else
657 {
658 exprs[nconss] = NULL;
659 }
660
661 /* update nlscore */
662 if( nlscore != NULL && exprs[nconss] != NULL )
663 {
664 SCIP_EXPR* expr;
665 int varidx;
666
667 SCIP_CALL( SCIPexpriterInit(it, exprs[nconss], SCIP_EXPRITER_DFS, FALSE) );
668 for( expr = exprs[nconss]; !SCIPexpriterIsEnd(it); expr = SCIPexpriterGetNext(it) ) /*lint !e441*/ /*lint !e440*/
669 {
670 if( !SCIPisExprVaridx(scip, expr) )
671 continue;
672
673 varidx = SCIPgetIndexExprVaridx(expr);
674 assert(varidx >= 0);
675 assert(varidx < nvars);
676
677 /* update nlscore */
678 nlscore[varidx] += 1.0;
679 }
680 }
681
682 /* if the row to index hash map is provided, we need to store the row index */
683 if( nlrow2idx != NULL )
684 {
685 SCIP_CALL( SCIPhashmapInsertInt(nlrow2idx, nlrow, nconss) );
686 }
687
688 ++nconss;
689 }
690 assert(nconss > 0);
691
692 /* pass all constraint information to nlpi */
693 SCIP_CALL( SCIPaddNlpiConstraints(scip, nlpi, *nlpiprob, nconss, lhss, rhss, nlininds, lininds, linvals,
694 exprs, names) );
695
696 if( it != NULL )
697 {
698 SCIPfreeExpriter(&it);
699 }
700
701 /* free memory */
702 for( i = nconss - 1; i > 0; --i )
703 {
704 if( nlininds[i] > 0 )
705 {
706 assert(linvals[i] != NULL);
707 assert(lininds[i] != NULL);
708 SCIPfreeBufferArray(scip, &linvals[i]);
709 SCIPfreeBufferArray(scip, &lininds[i]);
710 }
711 if( exprs[i] != NULL )
712 {
713 SCIP_CALL( SCIPreleaseExpr(scip, &exprs[i]) );
714 }
715 }
716 /* free row for cutoff bound even if objective is 0 */
717 SCIPfreeBufferArray(scip, &linvals[i]);
718 SCIPfreeBufferArray(scip, &lininds[i]);
719
722 SCIPfreeBufferArray(scip, &names);
723 SCIPfreeBufferArray(scip, &nlininds);
724 SCIPfreeBufferArray(scip, &lininds);
725 SCIPfreeBufferArray(scip, &linvals);
726 SCIPfreeBufferArray(scip, &exprs);
727
728 return SCIP_OKAY;
729}
730
731/** updates variable bounds and the cutoff row in a NLPI problem
732 *
733 * The NLPI problem must have been setup by SCIPcreateNlpiProblemFromNlRows().
734 */
736 SCIP* scip, /**< SCIP data structure */
737 SCIP_NLPI* nlpi, /**< interface to NLP solver */
738 SCIP_NLPIPROBLEM* nlpiprob, /**< nlpi problem representing the convex NLP relaxation */
739 SCIP_HASHMAP* var2nlpiidx, /**< mapping between variables and nlpi indices */
740 SCIP_VAR** nlpivars, /**< array containing all variables of the nlpi */
741 int nlpinvars, /**< total number of nlpi variables */
742 SCIP_Real cutoffbound /**< new cutoff bound */
743 )
744{
745 SCIP_Real* lbs;
746 SCIP_Real* ubs;
747 SCIP_Real lhs;
748 SCIP_Real rhs;
749 int* inds;
750 int i;
751
752 SCIPdebugMsg(scip, "SCIPupdateNlpiProblem() called\n");
753
754 /* update variable bounds */
755 SCIP_CALL( SCIPallocBufferArray(scip, &lbs, nlpinvars) );
756 SCIP_CALL( SCIPallocBufferArray(scip, &ubs, nlpinvars) );
757 SCIP_CALL( SCIPallocBufferArray(scip, &inds, nlpinvars) );
758
759 for( i = 0; i < nlpinvars; ++i )
760 {
761 assert(nlpivars[i] != NULL);
762 assert(SCIPhashmapExists(var2nlpiidx, (void*)nlpivars[i]));
763
764 lbs[i] = SCIPvarGetLbLocal(nlpivars[i]);
765 ubs[i] = SCIPvarGetUbLocal(nlpivars[i]);
766 inds[i] = SCIPhashmapGetImageInt(var2nlpiidx, (void*)nlpivars[i]);
767 assert(inds[i] >= 0 && inds[i] < nlpinvars);
768 }
769
770 SCIP_CALL( SCIPchgNlpiVarBounds(scip, nlpi, nlpiprob, nlpinvars, inds, lbs, ubs) );
771
775
776 /* update cutoff row */
777 lhs = -SCIPinfinity(scip);
778 rhs = cutoffbound;
779 i = 0;
780
781 SCIP_CALL( SCIPchgNlpiConsSides(scip, nlpi, nlpiprob, 1, &i, &lhs, &rhs) );
782
783 return SCIP_OKAY;
784}
785
786/** adds SCIP_ROWs to a NLPI problem */
788 SCIP* scip, /**< SCIP data structure */
789 SCIP_NLPI* nlpi, /**< interface to NLP solver */
790 SCIP_NLPIPROBLEM* nlpiprob, /**< nlpi problem */
791 SCIP_HASHMAP* var2idx, /**< empty hash map to store mapping between variables and indices in nlpiprob */
792 SCIP_ROW** rows, /**< rows to add */
793 int nrows /**< number of rows to add */
794 )
795{
796 const char** names;
797 SCIP_Real* lhss;
798 SCIP_Real* rhss;
799 SCIP_Real** linvals;
800 int** lininds;
801 int* nlininds;
802 int i;
803
804 assert(nlpi != NULL);
805 assert(nlpiprob != NULL);
806 assert(var2idx != NULL);
807 assert(nrows == 0 || rows != NULL);
808
809 SCIPdebugMsg(scip, "SCIPaddNlpiProblemRows() called with %d rows\n", nrows);
810
811 if( nrows <= 0 )
812 return SCIP_OKAY;
813
814 SCIP_CALL( SCIPallocBufferArray(scip, &names, nrows) );
815 SCIP_CALL( SCIPallocBufferArray(scip, &lhss, nrows) );
816 SCIP_CALL( SCIPallocBufferArray(scip, &rhss, nrows) );
817 SCIP_CALL( SCIPallocBufferArray(scip, &linvals, nrows) );
818 SCIP_CALL( SCIPallocBufferArray(scip, &lininds, nrows) );
819 SCIP_CALL( SCIPallocBufferArray(scip, &nlininds, nrows) );
820
821 for( i = 0; i < nrows; ++i )
822 {
823 int k;
824
825 assert(rows[i] != NULL);
826 assert(SCIProwGetNNonz(rows[i]) <= SCIPgetNVars(scip));
827
828 names[i] = SCIProwGetName(rows[i]);
829 lhss[i] = SCIProwGetLhs(rows[i]) - SCIProwGetConstant(rows[i]);
830 rhss[i] = SCIProwGetRhs(rows[i]) - SCIProwGetConstant(rows[i]);
831 nlininds[i] = SCIProwGetNNonz(rows[i]);
832 linvals[i] = SCIProwGetVals(rows[i]);
833 lininds[i] = NULL;
834
835 SCIP_CALL( SCIPallocBufferArray(scip, &lininds[i], SCIProwGetNNonz(rows[i])) ); /*lint !e866*/
836
837 for( k = 0; k < SCIProwGetNNonz(rows[i]); ++k )
838 {
839 SCIP_VAR* var;
840
841 var = SCIPcolGetVar(SCIProwGetCols(rows[i])[k]);
842 assert(var != NULL);
843 assert(SCIPhashmapExists(var2idx, (void*)var));
844
845 lininds[i][k] = SCIPhashmapGetImageInt(var2idx, (void*)var);
846 assert(lininds[i][k] >= 0 && lininds[i][k] < SCIPgetNVars(scip));
847 }
848 }
849
850 /* pass all linear rows to the nlpi */
851 SCIP_CALL( SCIPaddNlpiConstraints(scip, nlpi, nlpiprob, nrows, lhss, rhss, nlininds, lininds, linvals,
852 NULL, names) );
853
854 /* free memory */
855 for( i = nrows - 1; i >= 0; --i )
856 {
857 SCIPfreeBufferArray(scip, &lininds[i]);
858 }
859 SCIPfreeBufferArray(scip, &nlininds);
860 SCIPfreeBufferArray(scip, &lininds);
861 SCIPfreeBufferArray(scip, &linvals);
864 SCIPfreeBufferArray(scip, &names);
865
866 return SCIP_OKAY;
867}
868
869/** adds SCIP_NLROWs to a NLPI problem */
871 SCIP* scip, /**< SCIP data structure */
872 SCIP_NLPI* nlpi, /**< interface to NLP solver */
873 SCIP_NLPIPROBLEM* nlpiprob, /**< nlpi problem */
874 SCIP_HASHMAP* var2idx, /**< empty hash map to store mapping between variables and indices in nlpiprob */
875 SCIP_NLROW** nlrows, /**< rows to add */
876 int nnlrows /**< number of rows to add */
877 )
878{
879 const char** names;
880 SCIP_Real* lhss;
881 SCIP_Real* rhss;
882 SCIP_Real** linvals;
883 int** lininds;
884 int* nlininds;
885 SCIP_EXPR** exprs;
886 int i;
887
888 assert(nlpi != NULL);
889 assert(nlpiprob != NULL);
890 assert(var2idx != NULL);
891 assert(nnlrows == 0 || nlrows != NULL);
892
893 SCIPdebugMsg(scip, "SCIPaddNlpiProblemNlRows() called with %d rows\n", nnlrows);
894
895 if( nnlrows <= 0 )
896 return SCIP_OKAY;
897
898 SCIP_CALL( SCIPallocBufferArray(scip, &names, nnlrows) );
899 SCIP_CALL( SCIPallocBufferArray(scip, &lhss, nnlrows) );
900 SCIP_CALL( SCIPallocBufferArray(scip, &rhss, nnlrows) );
901 SCIP_CALL( SCIPallocBufferArray(scip, &linvals, nnlrows) );
902 SCIP_CALL( SCIPallocBufferArray(scip, &lininds, nnlrows) );
903 SCIP_CALL( SCIPallocBufferArray(scip, &nlininds, nnlrows) );
904 SCIP_CALL( SCIPallocBufferArray(scip, &exprs, nnlrows) );
905
906 for( i = 0; i < nnlrows; ++i )
907 {
908 SCIP_NLROW* nlrow;
909
910 nlrow = nlrows[i];
911 assert(nlrow != NULL);
912
915 names[i] = SCIPnlrowGetName(nlrow);
916 nlininds[i] = 0;
917 lininds[i] = NULL;
918 linvals[i] = NULL;
919
920 /* copy linear part */
921 if( SCIPnlrowGetNLinearVars(nlrow) > 0 )
922 {
923 SCIP_VAR* var;
924 int k;
925
926 nlininds[i] = SCIPnlrowGetNLinearVars(nlrow);
927
928 SCIP_CALL( SCIPallocBufferArray(scip, &lininds[i], nlininds[i]) ); /*lint !e866*/
929 SCIP_CALL( SCIPallocBufferArray(scip, &linvals[i], nlininds[i]) ); /*lint !e866*/
930
931 for( k = 0; k < nlininds[i]; ++k )
932 {
933 var = SCIPnlrowGetLinearVars(nlrow)[k];
934 assert(var != NULL);
935 assert(SCIPhashmapExists(var2idx, (void*)var));
936
937 lininds[i][k] = SCIPhashmapGetImageInt(var2idx, (void*)var);
938 linvals[i][k] = SCIPnlrowGetLinearCoefs(nlrow)[k];
939 }
940 }
941
942 if( SCIPnlrowGetExpr(nlrow) != NULL )
943 {
944 /* create copy of expr that uses varidx expressions corresponding to variables indices in NLPI */
945 SCIP_CALL( SCIPduplicateExpr(scip, SCIPnlrowGetExpr(nlrow), &exprs[i], mapvar2varidx, var2idx, NULL, NULL) );
946 }
947 else
948 {
949 exprs[i] = NULL;
950 }
951 }
952
953 /* pass all rows to the nlpi */
954 SCIP_CALL( SCIPaddNlpiConstraints(scip, nlpi, nlpiprob, nnlrows, lhss, rhss, nlininds, lininds, linvals, exprs, names) );
955
956 /* free memory */
957 for( i = nnlrows - 1; i >= 0; --i )
958 {
959 SCIPfreeBufferArrayNull(scip, &linvals[i]);
960 SCIPfreeBufferArrayNull(scip, &lininds[i]);
961 if( exprs[i] != NULL )
962 {
963 SCIP_CALL( SCIPreleaseExpr(scip, &exprs[i]) );
964 }
965 }
966 SCIPfreeBufferArray(scip, &exprs);
967 SCIPfreeBufferArray(scip, &nlininds);
968 SCIPfreeBufferArray(scip, &lininds);
969 SCIPfreeBufferArray(scip, &linvals);
972 SCIPfreeBufferArray(scip, &names);
973
974 return SCIP_OKAY;
975}
SCIP_RETCODE SCIPcheckStage(SCIP *scip, const char *method, SCIP_Bool init, SCIP_Bool problem, SCIP_Bool transforming, SCIP_Bool transformed, SCIP_Bool initpresolve, SCIP_Bool presolving, SCIP_Bool exitpresolve, SCIP_Bool presolved, SCIP_Bool initsolve, SCIP_Bool solving, SCIP_Bool solved, SCIP_Bool exitsolve, SCIP_Bool freetrans, SCIP_Bool freescip)
Definition: debug.c:2203
methods for debugging
#define NULL
Definition: def.h:266
#define SCIP_MAXSTRLEN
Definition: def.h:287
#define SCIP_Bool
Definition: def.h:91
#define SCIP_Real
Definition: def.h:172
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define SCIP_CALL(x)
Definition: def.h:373
handler for variable index expressions
int SCIPgetIndexExprVaridx(SCIP_EXPR *expr)
Definition: expr_varidx.c:267
SCIP_Bool SCIPisExprVaridx(SCIP *scip, SCIP_EXPR *expr)
Definition: expr_varidx.c:252
SCIP_RETCODE SCIPcreateExprVaridx(SCIP *scip, SCIP_EXPR **expr, int varidx, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition: expr_varidx.c:220
int SCIPgetNVars(SCIP *scip)
Definition: scip_prob.c:1992
SCIP_VAR ** SCIPgetVars(SCIP *scip)
Definition: scip_prob.c:1947
int SCIPhashmapGetImageInt(SCIP_HASHMAP *hashmap, void *origin)
Definition: misc.c:3284
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
Definition: misc.c:3426
SCIP_RETCODE SCIPhashmapInsertInt(SCIP_HASHMAP *hashmap, void *origin, int image)
Definition: misc.c:3195
#define SCIPdebugMsg
Definition: scip_message.h:78
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: scip_param.c:83
SCIP_VAR * SCIPcolGetVar(SCIP_COL *col)
Definition: lp.c:17070
SCIP_Bool SCIPexpriterIsEnd(SCIP_EXPRITER *iterator)
Definition: expriter.c:969
SCIP_RETCODE SCIPreleaseExpr(SCIP *scip, SCIP_EXPR **expr)
Definition: scip_expr.c:1424
SCIP_Bool SCIPisExprVar(SCIP *scip, SCIP_EXPR *expr)
Definition: scip_expr.c:1438
SCIP_RETCODE SCIPcreateExpriter(SCIP *scip, SCIP_EXPRITER **iterator)
Definition: scip_expr.c:2344
SCIP_EXPR * SCIPexpriterGetNext(SCIP_EXPRITER *iterator)
Definition: expriter.c:858
SCIP_VAR * SCIPgetVarExprVar(SCIP_EXPR *expr)
Definition: expr_var.c:416
void SCIPfreeExpriter(SCIP_EXPRITER **iterator)
Definition: scip_expr.c:2358
SCIP_RETCODE SCIPduplicateExpr(SCIP *scip, SCIP_EXPR *expr, SCIP_EXPR **copyexpr, SCIP_DECL_EXPR_MAPEXPR((*mapexpr)), void *mapexprdata, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition: scip_expr.c:1288
SCIP_RETCODE SCIPexpriterInit(SCIP_EXPRITER *iterator, SCIP_EXPR *expr, SCIP_EXPRITER_TYPE type, SCIP_Bool allowrevisit)
Definition: expriter.c:501
#define SCIPallocBufferArray(scip, ptr, num)
Definition: scip_mem.h:124
#define SCIPfreeBufferArray(scip, ptr)
Definition: scip_mem.h:136
#define SCIPfreeBufferArrayNull(scip, ptr)
Definition: scip_mem.h:137
SCIP_RETCODE SCIPaddNlpiProblemRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2idx, SCIP_ROW **rows, int nrows)
Definition: scip_nlpi.c:787
SCIP_DECL_NLPICHGCONSSIDES(SCIPchgNlpiConsSides)
Definition: scip_nlpi.c:307
SCIP_DECL_NLPIGETPROBLEMPOINTER(SCIPgetNlpiProblemPointer)
Definition: scip_nlpi.c:259
SCIP_RETCODE SCIPupdateNlpiProblem(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2nlpiidx, SCIP_VAR **nlpivars, int nlpinvars, SCIP_Real cutoffbound)
Definition: scip_nlpi.c:735
SCIP_RETCODE SCIPincludeNlpi(SCIP *scip, const char *name, const char *description, int priority, SCIP_DECL_NLPICOPY((*nlpicopy)), SCIP_DECL_NLPIFREE((*nlpifree)), SCIP_DECL_NLPIGETSOLVERPOINTER((*nlpigetsolverpointer)), SCIP_DECL_NLPICREATEPROBLEM((*nlpicreateproblem)), SCIP_DECL_NLPIFREEPROBLEM((*nlpifreeproblem)), SCIP_DECL_NLPIGETPROBLEMPOINTER((*nlpigetproblempointer)), SCIP_DECL_NLPIADDVARS((*nlpiaddvars)), SCIP_DECL_NLPIADDCONSTRAINTS((*nlpiaddconstraints)), SCIP_DECL_NLPISETOBJECTIVE((*nlpisetobjective)), SCIP_DECL_NLPICHGVARBOUNDS((*nlpichgvarbounds)), SCIP_DECL_NLPICHGCONSSIDES((*nlpichgconssides)), SCIP_DECL_NLPIDELVARSET((*nlpidelvarset)), SCIP_DECL_NLPIDELCONSSET((*nlpidelconsset)), SCIP_DECL_NLPICHGLINEARCOEFS((*nlpichglinearcoefs)), SCIP_DECL_NLPICHGEXPR((*nlpichgexpr)), SCIP_DECL_NLPICHGOBJCONSTANT((*nlpichgobjconstant)), SCIP_DECL_NLPISETINITIALGUESS((*nlpisetinitialguess)), SCIP_DECL_NLPISOLVE((*nlpisolve)), SCIP_DECL_NLPIGETSOLSTAT((*nlpigetsolstat)), SCIP_DECL_NLPIGETTERMSTAT((*nlpigettermstat)), SCIP_DECL_NLPIGETSOLUTION((*nlpigetsolution)), SCIP_DECL_NLPIGETSTATISTICS((*nlpigetstatistics)), SCIP_NLPIDATA *nlpidata)
Definition: scip_nlpi.c:113
SCIP_DECL_NLPICHGEXPR(SCIPchgNlpiExpr)
Definition: scip_nlpi.c:347
SCIP_NLPI * SCIPfindNlpi(SCIP *scip, const char *name)
Definition: scip_nlpi.c:179
SCIP_DECL_NLPIADDVARS(SCIPaddNlpiVars)
Definition: scip_nlpi.c:267
SCIP_DECL_NLPIFREEPROBLEM(SCIPfreeNlpiProblem)
Definition: scip_nlpi.c:249
SCIP_DECL_NLPIADDCONSTRAINTS(SCIPaddNlpiConstraints)
Definition: scip_nlpi.c:277
SCIP_DECL_NLPICHGOBJCONSTANT(SCIPchgNlpiObjConstant)
Definition: scip_nlpi.c:357
SCIP_DECL_NLPIGETSTATISTICS(SCIPgetNlpiStatistics)
Definition: scip_nlpi.c:434
int SCIPnlpiGetPriority(SCIP_NLPI *nlpi)
Definition: nlpi.c:742
SCIP_DECL_NLPIDELVARSET(SCIPdelNlpiVarSet)
Definition: scip_nlpi.c:317
SCIP_RETCODE SCIPsetNlpiPriority(SCIP *scip, SCIP_NLPI *nlpi, int priority)
Definition: scip_nlpi.c:216
SCIP_DECL_NLPIGETTERMSTAT(SCIPgetNlpiTermstat)
Definition: scip_nlpi.c:414
SCIP_DECL_NLPISETINITIALGUESS(SCIPsetNlpiInitialGuess)
Definition: scip_nlpi.c:367
SCIP_DECL_NLPIGETSOLUTION(SCIPgetNlpiSolution)
Definition: scip_nlpi.c:424
SCIP_RETCODE SCIPaddNlpiProblemNlRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2idx, SCIP_NLROW **nlrows, int nnlrows)
Definition: scip_nlpi.c:870
SCIP_DECL_NLPISETOBJECTIVE(SCIPsetNlpiObjective)
Definition: scip_nlpi.c:287
SCIP_DECL_NLPIGETSOLVERPOINTER(SCIPgetNlpiSolverPointer)
Definition: scip_nlpi.c:231
SCIP_DECL_NLPICREATEPROBLEM(SCIPcreateNlpiProblem)
Definition: scip_nlpi.c:239
SCIP_DECL_NLPISOLVE(SCIPsolveNlpiParam)
Definition: scip_nlpi.c:391
SCIP_DECL_NLPICHGVARBOUNDS(SCIPchgNlpiVarBounds)
Definition: scip_nlpi.c:297
SCIP_DECL_NLPICHGLINEARCOEFS(SCIPchgNlpiLinearCoefs)
Definition: scip_nlpi.c:337
SCIP_DECL_NLPIDELCONSSET(SCIPdelNlpiConsSet)
Definition: scip_nlpi.c:327
SCIP_DECL_NLPIGETSOLSTAT(SCIPgetNlpiSolstat)
Definition: scip_nlpi.c:406
SCIP_RETCODE SCIPcreateNlpiProblemFromNlRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **nlpiprob, const char *name, SCIP_NLROW **nlrows, int nnlrows, SCIP_HASHMAP *var2idx, SCIP_HASHMAP *nlrow2idx, SCIP_Real *nlscore, SCIP_Real cutoffbound, SCIP_Bool setobj, SCIP_Bool onlyconvex)
Definition: scip_nlpi.c:449
int SCIPgetNNlpis(SCIP *scip)
Definition: scip_nlpi.c:205
SCIP_NLPI ** SCIPgetNlpis(SCIP *scip)
Definition: scip_nlpi.c:192
const char * SCIPnlrowGetName(SCIP_NLROW *nlrow)
Definition: nlp.c:1936
SCIP_Real SCIPnlrowGetRhs(SCIP_NLROW *nlrow)
Definition: nlp.c:1917
SCIP_Real SCIPnlrowGetLhs(SCIP_NLROW *nlrow)
Definition: nlp.c:1907
SCIP_EXPRCURV SCIPnlrowGetCurvature(SCIP_NLROW *nlrow)
Definition: nlp.c:1927
int SCIPnlrowGetNLinearVars(SCIP_NLROW *nlrow)
Definition: nlp.c:1867
SCIP_VAR ** SCIPnlrowGetLinearVars(SCIP_NLROW *nlrow)
Definition: nlp.c:1877
SCIP_Real SCIPnlrowGetConstant(SCIP_NLROW *nlrow)
Definition: nlp.c:1857
SCIP_EXPR * SCIPnlrowGetExpr(SCIP_NLROW *nlrow)
Definition: nlp.c:1897
SCIP_Real * SCIPnlrowGetLinearCoefs(SCIP_NLROW *nlrow)
Definition: nlp.c:1887
SCIP_Real SCIProwGetLhs(SCIP_ROW *row)
Definition: lp.c:17320
int SCIProwGetNNonz(SCIP_ROW *row)
Definition: lp.c:17241
SCIP_COL ** SCIProwGetCols(SCIP_ROW *row)
Definition: lp.c:17266
SCIP_Real SCIProwGetRhs(SCIP_ROW *row)
Definition: lp.c:17330
const char * SCIProwGetName(SCIP_ROW *row)
Definition: lp.c:17379
SCIP_Real SCIProwGetConstant(SCIP_ROW *row)
Definition: lp.c:17286
SCIP_Real * SCIProwGetVals(SCIP_ROW *row)
Definition: lp.c:17276
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPvarIsActive(SCIP_VAR *var)
Definition: var.c:17775
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
Definition: var.c:18171
SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
Definition: var.c:17953
const char * SCIPvarGetName(SCIP_VAR *var)
Definition: var.c:17446
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
Definition: var.c:18161
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition: misc.c:10880
static const char * paramname[]
Definition: lpi_msk.c:5103
memory allocation routines
#define BMSclearMemoryArray(ptr, num)
Definition: memory.h:130
SCIP_RETCODE SCIPnlpiSetInitialGuess(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_Real *primalvalues, SCIP_Real *consdualvalues, SCIP_Real *varlbdualvalues, SCIP_Real *varubdualvalues)
Definition: nlpi.c:528
SCIP_RETCODE SCIPnlpiChgVarBounds(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, const int nvars, const int *indices, const SCIP_Real *lbs, const SCIP_Real *ubs)
Definition: nlpi.c:376
SCIP_RETCODE SCIPnlpiSetObjective(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int nlins, const int *lininds, const SCIP_Real *linvals, SCIP_EXPR *expr, const SCIP_Real constant)
Definition: nlpi.c:352
SCIP_RETCODE SCIPnlpiGetStatistics(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_NLPSTATISTICS *statistics)
Definition: nlpi.c:675
SCIP_NLPSOLSTAT SCIPnlpiGetSolstat(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem)
Definition: nlpi.c:621
SCIP_RETCODE SCIPnlpiFreeProblem(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **problem)
Definition: nlpi.c:266
SCIP_RETCODE SCIPnlpiChgObjConstant(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_Real objconstant)
Definition: nlpi.c:508
SCIP_RETCODE SCIPnlpiDelVarSet(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int *dstats, int dstatssize)
Definition: nlpi.c:422
SCIP_RETCODE SCIPnlpiAddConstraints(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int nconss, const SCIP_Real *lhss, const SCIP_Real *rhss, const int *nlininds, int *const *lininds, SCIP_Real *const *linvals, SCIP_EXPR **exprs, const char **names)
Definition: nlpi.c:325
SCIP_RETCODE SCIPnlpiSolve(SCIP_SET *set, SCIP_STAT *stat, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_NLPPARAM *param)
Definition: nlpi.c:551
SCIP_RETCODE SCIPnlpiDelConsSet(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int *dstats, int dstatssize)
Definition: nlpi.c:443
void * SCIPnlpiGetProblemPointer(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem)
Definition: nlpi.c:285
SCIP_RETCODE SCIPnlpiAddVars(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int nvars, const SCIP_Real *lbs, const SCIP_Real *ubs, const char **varnames)
Definition: nlpi.c:302
SCIP_RETCODE SCIPnlpiGetSolution(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_Real **primalvalues, SCIP_Real **consdualvalues, SCIP_Real **varlbdualvalues, SCIP_Real **varubdualvalues, SCIP_Real *objval)
Definition: nlpi.c:653
SCIP_RETCODE SCIPnlpiChgExpr(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int idxcons, SCIP_EXPR *expr)
Definition: nlpi.c:487
void * SCIPnlpiGetSolverPointer(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem)
Definition: nlpi.c:228
SCIP_RETCODE SCIPnlpiChgConsSides(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int nconss, const int *indices, const SCIP_Real *lhss, const SCIP_Real *rhss)
Definition: nlpi.c:399
SCIP_RETCODE SCIPnlpiCreate(SCIP_NLPI **nlpi, const char *name, const char *description, int priority, SCIP_DECL_NLPICOPY((*nlpicopy)), SCIP_DECL_NLPIFREE((*nlpifree)), SCIP_DECL_NLPIGETSOLVERPOINTER((*nlpigetsolverpointer)), SCIP_DECL_NLPICREATEPROBLEM((*nlpicreateproblem)), SCIP_DECL_NLPIFREEPROBLEM((*nlpifreeproblem)), SCIP_DECL_NLPIGETPROBLEMPOINTER((*nlpigetproblempointer)), SCIP_DECL_NLPIADDVARS((*nlpiaddvars)), SCIP_DECL_NLPIADDCONSTRAINTS((*nlpiaddconstraints)), SCIP_DECL_NLPISETOBJECTIVE((*nlpisetobjective)), SCIP_DECL_NLPICHGVARBOUNDS((*nlpichgvarbounds)), SCIP_DECL_NLPICHGCONSSIDES((*nlpichgconssides)), SCIP_DECL_NLPIDELVARSET((*nlpidelvarset)), SCIP_DECL_NLPIDELCONSSET((*nlpidelconsset)), SCIP_DECL_NLPICHGLINEARCOEFS((*nlpichglinearcoefs)), SCIP_DECL_NLPICHGEXPR((*nlpichgexpr)), SCIP_DECL_NLPICHGOBJCONSTANT((*nlpichgobjconstant)), SCIP_DECL_NLPISETINITIALGUESS((*nlpisetinitialguess)), SCIP_DECL_NLPISOLVE((*nlpisolve)), SCIP_DECL_NLPIGETSOLSTAT((*nlpigetsolstat)), SCIP_DECL_NLPIGETTERMSTAT((*nlpigettermstat)), SCIP_DECL_NLPIGETSOLUTION((*nlpigetsolution)), SCIP_DECL_NLPIGETSTATISTICS((*nlpigetstatistics)), SCIP_NLPIDATA *nlpidata)
Definition: nlpi.c:53
SCIP_NLPTERMSTAT SCIPnlpiGetTermstat(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem)
Definition: nlpi.c:636
SCIP_RETCODE SCIPnlpiCreateProblem(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **problem, const char *name)
Definition: nlpi.c:244
SCIP_RETCODE SCIPnlpiChgLinearCoefs(SCIP_SET *set, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int idx, int nvals, const int *varidxs, const SCIP_Real *vals)
Definition: nlpi.c:464
internal methods for NLP solver interfaces
SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
Definition: paramset.c:679
int SCIPparamGetInt(SCIP_PARAM *param)
Definition: paramset.c:734
internal methods for handling parameter settings
public functions to work with algebraic expressions
public methods for LP management
public methods for message output
#define SCIPerrorMessage
Definition: pub_message.h:64
public methods for problem variables
public functions to work with algebraic expressions
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for nonlinear relaxation
static SCIP_DECL_PARAMCHGD(paramChgdNlpiPriority)
Definition: scip_nlpi.c:61
static SCIP_DECL_EXPR_MAPEXPR(mapvar2varidx)
Definition: scip_nlpi.c:79
public methods for NLPI solver interfaces
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
void SCIPsetSortNlpis(SCIP_SET *set)
Definition: set.c:5185
SCIP_NLPI * SCIPsetFindNlpi(SCIP_SET *set, const char *name)
Definition: set.c:5165
SCIP_RETCODE SCIPsetIncludeNlpi(SCIP_SET *set, SCIP_NLPI *nlpi)
Definition: set.c:5142
void SCIPsetSetPriorityNlpi(SCIP_SET *set, SCIP_NLPI *nlpi, int priority)
Definition: set.c:5199
internal methods for global SCIP settings
SCIP main data structure.
@ SCIP_EXPRCURV_CONVEX
Definition: type_expr.h:63
@ SCIP_EXPRCURV_CONCAVE
Definition: type_expr.h:64
@ SCIP_EXPRITER_DFS
Definition: type_expr.h:716
#define SCIP_DECL_NLPICOPY(x)
Definition: type_nlpi.h:215
#define SCIP_DECL_NLPIFREE(x)
Definition: type_nlpi.h:225
struct SCIP_NlpiData SCIP_NLPIDATA
Definition: type_nlpi.h:52
struct SCIP_ParamData SCIP_PARAMDATA
Definition: type_paramset.h:87
@ SCIP_INVALIDDATA
Definition: type_retcode.h:52
@ SCIP_OKAY
Definition: type_retcode.h:42
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63