SCIP Doxygen Documentation
Loading...
Searching...
No Matches
iisfinder.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-2026 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 iisfinder.c
26 * @ingroup OTHER_CFILES
27 * @brief methods for IIS finders
28 * @author Mark Turner
29 */
30
31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32
33#include <assert.h>
34
35#include "scip/set.h"
36#include "scip/clock.h"
37#include "scip/misc.h"
38#include "scip/paramset.h"
39#include "scip/scip.h"
40#include "scip/cons_linear.h"
41#include "scip/iisfinder.h"
44
45
46/** method to call, when the priority of an IIS finder was changed */
47static
48SCIP_DECL_PARAMCHGD(paramChgdIISfinderPriority)
49{ /*lint --e{715}*/
50 SCIP_PARAMDATA* paramdata;
51
52 paramdata = SCIPparamGetData(param);
53 assert(paramdata != NULL);
54
55 /* use SCIPsetIISPriority() to mark the IIS unsorted */
56 SCIP_CALL( SCIPsetIISfinderPriority(scip, (SCIP_IISFINDER*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
57
58 return SCIP_OKAY;
59}
60
61/** internal method for creating the subscip that will hold the IIS */
62static
64 SCIP_SET* set, /**< global SCIP settings */
65 SCIP_IIS* iis, /**< pointer to store IIS */
66 SCIP_Real timelim, /**< timelimit */
67 SCIP_Longint nodelim, /**< nodelimit */
68 SCIP_Bool* success /**< whether the created subscip is complete */
69 )
70{
71 SCIP_VAR** vars;
72 int nvars;
73 int i;
74
75 assert(set != NULL);
76 assert(iis != NULL);
77 assert(success != NULL);
78
79 *success = FALSE;
80
81 /* Create the subscip used for storing the IIS */
82 if( iis->subscip != NULL )
83 {
84 SCIPdebugMsg(set->scip, "An IIS for this problem already exists. Removing it before starting search procedure again.\n");
85
86 /* free sub-SCIP */
87 SCIP_CALL( SCIPiisReset(&iis) );
88 }
89
90 assert( iis->subscip == NULL );
91 assert( iis->varsmap == NULL );
92 assert( iis->conssmap == NULL );
93
94 /* create a new SCIP instance */
95 SCIP_CALL( SCIPcreate(&(iis->subscip)) );
96
97 /* Create hash maps */
100
101 /* create problem in sub-SCIP */
102 SCIP_CALL( SCIPcopyOrig(set->scip, iis->subscip, iis->varsmap, iis->conssmap, "iis", TRUE, FALSE, TRUE, success) );
103
104 if( !(*success) )
105 return SCIP_OKAY;
106
107 /* Remove the objective */
110 for( i = 0; i < nvars; i++ )
111 SCIP_CALL( SCIPchgVarObj(iis->subscip, vars[i], 0.0 ) );
112
113 /* copy parameter settings */
114 /** @todo: Do we really want to copy the parameter settings? */
116#ifdef SCIP_DEBUG
117 /* for debugging, enable full output */
118 SCIP_CALL( SCIPsetIntParam(iis->subscip, "display/verblevel", 5) );
119 SCIP_CALL( SCIPsetIntParam(iis->subscip, "display/freq", 100000000) );
120#else
121 /* disable statistic timing inside sub SCIP and output to console */
122 SCIP_CALL( SCIPsetIntParam(iis->subscip, "display/verblevel", 0) );
123 SCIP_CALL( SCIPsetBoolParam(iis->subscip, "timing/statistictiming", FALSE) );
124#endif
126 SCIP_CALL( SCIPsetIntParam(iis->subscip, "limits/bestsol", 1) );
127 SCIP_CALL( SCIPsetRealParam(iis->subscip, "limits/time", timelim - SCIPclockGetTime(iis->iistime)) );
128 SCIP_CALL( SCIPsetLongintParam(iis->subscip, "limits/nodes", nodelim) );
129
130 return SCIP_OKAY;
131}
132
133/** checks the problem for trivial infeasibility reasons, e.g. contradicting bounds */
134static
136 SCIP* scip, /**< pointer to SCIP */
137 SCIP_Bool* trivial /**< pointer to store whether the problem is trivially infeasible */
138 )
139{
140 SCIP_CONS** conss;
141 SCIP_VAR** vars;
142 SCIP_Real* coefs;
143 SCIP_Real maxactivity;
144 SCIP_Real minactivity;
145 SCIP_Real lhs;
146 SCIP_Real rhs;
147 SCIP_Bool success;
148 int violatingcons;
149 int nconss;
150 int nvars;
151 int i;
152 int j;
153
154 assert( trivial != NULL );
155 *trivial = FALSE;
156
157 /* Check for contradicting bounds */
160 for( i = 0; i < nvars; i++ )
161 {
163 {
164 *trivial = TRUE;
165 break;
166 }
167 }
168
169 /* Check for linear max (min) activities that do not respect their lhs (rhs) */
170 violatingcons = -1;
171 conss = SCIPgetConss(scip);
172 nconss = SCIPgetNConss(scip);
173 for( i = 0; i < nconss; ++i )
174 {
175 /**@todo generalize activity evaluation */
176 /* Skip the constraint if it is not linear */
177 if( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[i])), "linear") != 0 )
178 continue;
179
180 /* Get variable information */
181 nvars = SCIPgetNVarsLinear(scip, conss[i]);
182 vars = SCIPgetVarsLinear(scip, conss[i]);
183 coefs = SCIPgetValsLinear(scip, conss[i]);
184
185 /* Check the left-hand side */
186 lhs = SCIPconsGetLhs(scip, conss[i], &success);
187 assert( success );
188
189 if( !SCIPisInfinity(scip, -lhs) )
190 {
191 /* Compute the maximum activity */
192 maxactivity = 0.0;
193 for( j = 0; j < nvars; ++j )
194 maxactivity += coefs[j] * (coefs[j] >= 0.0 ? SCIPvarGetUbOriginal(vars[j]) : SCIPvarGetLbOriginal(vars[j]));
195
196 /* Is the violation (maxactivity < lhs) true? */
197 if( SCIPisSumLT(scip, maxactivity, lhs) )
198 {
199 *trivial = TRUE;
200 violatingcons = i;
201 break;
202 }
203 }
204
205 /* Check the right-hand side */
206 rhs = SCIPconsGetRhs(scip, conss[i], &success);
207 assert( success );
208
209 if( !SCIPisInfinity(scip, rhs) )
210 {
211 /* Compute the minimum activity */
212 minactivity = 0.0;
213 for( j = 0; j < nvars; ++j )
214 minactivity += coefs[j] * (coefs[j] >= 0.0 ? SCIPvarGetLbOriginal(vars[j]) : SCIPvarGetUbOriginal(vars[j]));
215
216 /* Is the violation (rhs < minactivity) true? */
217 if( SCIPisSumLT(scip, rhs, minactivity) )
218 {
219 *trivial = TRUE;
220 violatingcons = i;
221 break;
222 }
223 }
224 }
225
226 /* Delete all constraints not relevant to the infeasibility */
227 if( *trivial )
228 {
229 for( i = nconss - 1; i >= 0; i-- )
230 {
231 if( i == violatingcons )
232 continue;
233 SCIP_CALL( SCIPdelCons(scip, conss[i]) );
234 }
235 }
236 return SCIP_OKAY;
237}
238
239/** internal method for creating an IIS finder */
240static
242 SCIP_IISFINDER** iisfinder, /**< pointer to store IIS finder */
243 SCIP_SET* set, /**< global SCIP settings */
244 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
245 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
246 const char* name, /**< name of IIS finder */
247 const char* desc, /**< description of IIS finder */
248 int priority, /**< priority of the IIS finder */
249 SCIP_DECL_IISFINDERCOPY ((*iisfindercopy)), /**< copy method of IIS finder or NULL if you don't want to copy your plugin into sub-SCIPs */
250 SCIP_DECL_IISFINDERFREE ((*iisfinderfree)), /**< destructor of IIS finder */
251 SCIP_DECL_IISFINDEREXEC ((*iisfinderexec)), /**< IIS finder execution method */
252 SCIP_IISFINDERDATA* iisfinderdata /**< IIS finder data */
253 )
254{
256 char paramdesc[SCIP_MAXSTRLEN];
257
258 assert(iisfinder != NULL);
259 assert(name != NULL);
260 assert(desc != NULL);
261 assert(iisfinderexec != NULL);
262
263 SCIP_ALLOC( BMSallocClearBlockMemory(blkmem, iisfinder) );
264
265 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &(*iisfinder)->name, name, strlen(name)+1) );
266 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &(*iisfinder)->desc, desc, strlen(desc)+1) );
267 (*iisfinder)->priority = priority;
268 (*iisfinder)->iisfindercopy = iisfindercopy;
269 (*iisfinder)->iisfinderfree = iisfinderfree;
270 (*iisfinder)->iisfinderexec = iisfinderexec;
271 (*iisfinder)->iisfinderdata = iisfinderdata;
272
273 /* create clocks */
274 SCIP_CALL( SCIPclockCreate(&(*iisfinder)->iisfindertime, SCIP_CLOCKTYPE_DEFAULT) );
275
276 /* add parameters */
277 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "iis/%s/priority", name);
278 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of iis generation rule <%s>", name);
279 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
280 &(*iisfinder)->priority, FALSE, priority, INT_MIN/4, INT_MAX/2,
281 paramChgdIISfinderPriority, (SCIP_PARAMDATA*)(*iisfinder)) ); /*lint !e740*/
282
283 return SCIP_OKAY;
284}
285
286
287/** creates an IIS finder */
289 SCIP_IISFINDER** iisfinder, /**< pointer to store IIS finder */
290 SCIP_SET* set, /**< global SCIP settings */
291 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
292 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
293 const char* name, /**< name of IIS finder */
294 const char* desc, /**< description of IIS finder */
295 int priority, /**< priority of the IIS finder in standard mode */
296 SCIP_DECL_IISFINDERCOPY ((*iisfindercopy)), /**< copy method of IIS finder or NULL if you don't want to copy your plugin into sub-SCIPs */
297 SCIP_DECL_IISFINDERFREE ((*iisfinderfree)), /**< destructor of IIS finder */
298 SCIP_DECL_IISFINDEREXEC ((*iisfinderexec)), /**< IIS finder execution method */
299 SCIP_IISFINDERDATA* iisfinderdata /**< IIS finder data */
300 )
301{
302 assert(iisfinder != NULL);
303 assert(name != NULL);
304 assert(desc != NULL);
305 assert(iisfinderexec != NULL);
306
307 SCIP_CALL_FINALLY( doIISfinderCreate(iisfinder, set, messagehdlr, blkmem, name, desc, priority,
308 iisfindercopy, iisfinderfree, iisfinderexec, iisfinderdata), (void) SCIPiisfinderFree(iisfinder, set, blkmem) );
309
310 return SCIP_OKAY;
311}
312
313/** gets name of IIS finder */
315 SCIP_IISFINDER* iisfinder /**< IIS finder */
316 )
317{
318 assert(iisfinder != NULL);
319
320 return iisfinder->name;
321}
322
323/** calls IIS finder generation method */
325 SCIP_SET* set /**< global SCIP settings */
326 )
327{
328 SCIP_CONS** conss;
329 SCIP_VAR** vars;
330 SCIP_IIS* iis;
332 SCIP_RETCODE retcode;
333 SCIP_Real timelim;
334 SCIP_Longint nodelim;
335 SCIP_Bool silent;
336 SCIP_Bool makeirreducible;
337 SCIP_Bool stopafterone;
338 SCIP_Bool removeunusedvars;
339 SCIP_Bool trivial;
340 SCIP_Bool islinear;
341 SCIP_Bool success;
342 int nconss;
343 int nvars;
344 int nbounds;
345 int i;
346 int j;
347
348 /* exact mode is not supported */
349 if( set->exact_enable )
350 {
351 SCIPinfoMessage(set->scip, NULL, "IIS generation does not yet support exact mode.\n");
352 return SCIP_OKAY;
353 }
354
355 /* sort the iis finders by priority */
357
358 /* Get the IIS data. */
359 iis = SCIPgetIIS(set->scip);
360 SCIP_CALL( SCIPiisReset(&iis) );
361 SCIP_CALL( SCIPgetRealParam(set->scip, "iis/time", &timelim) );
362 SCIP_CALL( SCIPgetLongintParam(set->scip, "iis/nodes", &nodelim) );
363
364 /* Create the subscip used for storing the IIS */
365 SCIP_CALL( createSubscipIIS(set, iis, timelim, nodelim, &success) );
366
367 if( !success )
368 {
369 SCIPinfoMessage(iis->subscip, NULL, "Error copying original problem instance. IIS generation suspended.\n");
370 return SCIP_OKAY;
371 }
372
374
375 /* If the model is not yet shown to be infeasible then check for infeasibility */
376 if( SCIPgetStage(set->scip) == SCIP_STAGE_PROBLEM )
377 {
378 retcode = SCIPsolve(iis->subscip);
379
380 if( retcode != SCIP_OKAY )
381 {
382 SCIPinfoMessage(iis->subscip, NULL, "Error proving infeasibility of initial problem. IIS generation suspended.\n");
384 return SCIP_OKAY;
385 }
386
388 {
389 switch( SCIPgetStatus(iis->subscip) )
390 {
400 SCIPinfoMessage(iis->subscip, NULL, "Some limit reached. Failed to prove infeasibility of initial problem.\n");
402 return SCIP_OKAY;
403
405 SCIPinfoMessage(iis->subscip, NULL, "Initial problem is infeasible or Unbounded. Not performing IIS generation.\n");
407 return SCIP_OKAY;
408
411 SCIPdebugMsg(iis->subscip, "User interrupt. Stopping.\n");
413 return SCIP_OKAY;
414
419 SCIPinfoMessage(iis->subscip, NULL, "Initial problem is feasible. No IIS exists.\n");
421 return SCIP_OKAY;
422
424 break;
425
427 default:
428 SCIPinfoMessage(iis->subscip, NULL, "Unexpected return status %d. Failing to show (in)feasibility of initial problem. Exiting ...\n", SCIPgetStatus(iis->subscip));
430 return SCIP_OKAY;
431 }
432 }
433 else
434 {
435 SCIPinfoMessage(iis->subscip, NULL, "Initial solve to verify infeasibility failed.\n");
437 return SCIP_OKAY;
438 }
439 iis->nnodes += SCIPgetNTotalNodes(iis->subscip);
441 iis->infeasible = TRUE;
442 }
443 else if( SCIPgetStage(set->scip) == SCIP_STAGE_SOLVED )
444 {
446 {
447 SCIPinfoMessage(iis->subscip, NULL, "Initial problem does not have an infeasible status. Not performing an IIS algorithm.\n");
449 return SCIP_OKAY;
450 }
451 iis->infeasible = TRUE;
452 }
453 else
454 {
455 SCIPinfoMessage(iis->subscip, NULL, "Initial problem is neither in problem stage or infeasible.\n");
456 return SCIP_OKAY;
457 }
458
459 /* Check for trivial infeasibility reasons */
460 SCIP_CALL( checkTrivialInfeas(iis->subscip, &trivial) );
461 if( trivial )
463
464 /* Try all IIS generators */
465 SCIP_CALL( SCIPgetBoolParam(set->scip, "iis/stopafterone", &stopafterone) );
466 if( !trivial )
467 {
468 for( i = 0; i < set->niisfinders; ++i )
469 {
470 SCIP_IISFINDER* iisfinder;
471 iisfinder = set->iisfinders[i];
472 assert( iis->infeasible );
473
474 /* start timing */
475 SCIPclockStart(iisfinder->iisfindertime, set);
476
477 SCIPdebugMsg(iis->subscip, "----- STARTING IIS FINDER %s -----\n", iisfinder->name);
478 SCIP_CALL( iisfinder->iisfinderexec(iis, iisfinder, &result) );
480
481 /* stop timing */
482 SCIPclockStop(iisfinder->iisfindertime, set);
483
484 /* recreate the initial subscip if the IIS finder has produced an invalid infeasible subsystem */
485 if( !iis->infeasible )
486 {
487 SCIP_CALL( createSubscipIIS(set, iis, timelim, nodelim, &success) );
488 assert(success);
489 }
490
491 if( timelim - SCIPclockGetTime(iis->iistime) <= 0 || (nodelim != -1 && iis->nnodes > nodelim) )
492 {
493 SCIPdebugMsg(iis->subscip, "Time or node limit hit. Stopping Search.\n");
494 break;
495 }
496
497 if( (stopafterone && (result == SCIP_SUCCESS)) || (iis->irreducible == TRUE) )
498 break;
499 }
500 }
501
502 /* Ensure the problem is irreducible if requested */
503 SCIP_CALL( SCIPgetBoolParam(set->scip, "iis/irreducible", &makeirreducible) );
504 if( !iis->irreducible && makeirreducible && !(timelim - SCIPclockGetTime(iis->iistime) <= 0 || (nodelim != -1 && iis->nnodes > nodelim)) && !trivial )
505 {
506 SCIPdebugMsg(iis->subscip, "----- STARTING GREEDY SINGLETON DELETION ALGORITHM. ATTEMPT TO ENSURE IRREDUCIBILITY -----\n");
507
508 assert( iis->infeasible );
510 assert( iis->infeasible );
511 }
512
513 /* Remove redundant constraints that potentially are left over from indicator constraints,
514 * that is constraints containing a variables with no bounds and that only features in a single constraint */
515 nconss = SCIPgetNOrigConss(iis->subscip);
516 conss = SCIPgetOrigConss(iis->subscip);
517 for( i = nconss -1; i >= 0; --i )
518 {
519 islinear = strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[i])), "linear") == 0;
520 if( islinear && SCIPconsGetNUses(conss[i]) <= 1)
521 {
522 nvars = SCIPgetNVarsLinear(iis->subscip, conss[i]);
523 vars = SCIPgetVarsLinear(iis->subscip, conss[i]);
524 for( j = 0; j < nvars; ++j )
525 {
527 {
528 SCIP_CALL( SCIPdelCons(iis->subscip, conss[i]) );
529 break;
530 }
531 }
532 }
533 }
534
535 SCIP_CALL( SCIPgetBoolParam(set->scip, "iis/removeunusedvars", &removeunusedvars) );
536 if( removeunusedvars )
537 {
538 SCIP_Bool deleted;
539
542 for( i = nvars - 1; i >= 0; i-- )
543 {
545 {
546 SCIP_CALL( SCIPdelVar(iis->subscip, vars[i], &deleted) );
547 assert( deleted );
548 }
549 }
550 }
551
552 SCIP_CALL( SCIPgetBoolParam(set->scip, "iis/silent", &silent) );
553 if( !silent )
555
556 /* stop timing */
558
559 if( !silent )
560 {
561 nbounds = 0;
562 SCIPinfoMessage(set->scip, NULL, "\n");
563 if( iis->infeasible && iis->irreducible )
564 SCIPinfoMessage(set->scip, NULL, "IIS Status : irreducible infeasible subsystem (IIS) found\n");
565 else if( iis->infeasible )
566 SCIPinfoMessage(set->scip, NULL, "IIS Status : infeasible subsystem (IS) found\n");
567 else
568 SCIPinfoMessage(set->scip, NULL, "IIS Status : failed to find an infeasible subsystem (IS)\n");
569 if( iis->irreducible )
570 SCIPinfoMessage(set->scip, NULL, "IIS irreducible : yes\n");
571 else
572 SCIPinfoMessage(set->scip, NULL, "IIS irreducible : no\n");
573 assert( iis->subscip != NULL );
574 SCIPinfoMessage(set->scip, NULL, "Generation Time (sec) : %.2f\n", SCIPiisGetTime(iis));
575 SCIPinfoMessage(set->scip, NULL, "Generation Nodes : %lld\n", SCIPiisGetNNodes(iis));
576 SCIPinfoMessage(set->scip, NULL, "Num. Cons. in IIS : %d\n", SCIPgetNOrigConss(iis->subscip));
579 for( i = 0; i < nvars; i++ )
580 {
582 ++nbounds;
584 ++nbounds;
585 }
586 SCIPinfoMessage(set->scip, NULL, "Num. Vars. in IIS : %d\n", nvars);
587 SCIPinfoMessage(set->scip, NULL, "Num. Bounds in IIS : %d\n", nbounds);
588 }
589
590 return SCIP_OKAY;
591}
592
593/** gets description of the IIS finder */
595 SCIP_IISFINDER* iisfinder /**< IIS finder */
596 )
597{
598 assert(iisfinder != NULL);
599
600 return iisfinder->desc;
601}
602
603/** copies the given IIS finder to a new scip */
605 SCIP_IISFINDER* iisfinder, /**< IIS finder */
606 SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
607 )
608{
609 assert(iisfinder != NULL);
610 assert(set != NULL);
611 assert(set->scip != NULL);
612
613 if( iisfinder->iisfindercopy != NULL )
614 {
615 SCIPsetDebugMsg(set, "including IIS finder %s in subscip %p\n", SCIPiisfinderGetName(iisfinder), (void*)set->scip);
616 SCIP_CALL( iisfinder->iisfindercopy(set->scip, iisfinder) );
617 }
618 return SCIP_OKAY;
619}
620
621/** frees memory of IIS finder */
623 SCIP_IISFINDER** iisfinder, /**< IIS finder */
624 SCIP_SET* set, /**< global SCIP settings */
625 BMS_BLKMEM* blkmem /**< block memory */
626 )
627{
628 assert(iisfinder != NULL);
629
630 if( *iisfinder == NULL )
631 return SCIP_OKAY;
632
633 assert(set != NULL);
634
635 /* call destructor of IIS */
636 if( (*iisfinder)->iisfinderfree != NULL )
637 {
638 SCIP_CALL( (*iisfinder)->iisfinderfree(set->scip, *iisfinder) );
639 }
640
641 /* free clocks */
642 SCIPclockFree(&(*iisfinder)->iisfindertime);
643
644 BMSfreeBlockMemoryArrayNull(blkmem, &(*iisfinder)->name, strlen((*iisfinder)->name)+1);
645 BMSfreeBlockMemoryArrayNull(blkmem, &(*iisfinder)->desc, strlen((*iisfinder)->desc)+1);
646 BMSfreeBlockMemory(blkmem, iisfinder);
647
648 return SCIP_OKAY;
649}
650
651/** gets user data of IIS finder */
653 SCIP_IISFINDER* iisfinder /**< IIS finder */
654 )
655{
656 assert(iisfinder != NULL);
657
658 return iisfinder->iisfinderdata;
659}
660
661/** sets user data of IIS finder; user has to free old data in advance! */
663 SCIP_IISFINDER* iisfinder, /**< IIS finder */
664 SCIP_IISFINDERDATA* iisfinderdata /**< new IIS finder user data */
665 )
666{
667 assert(iisfinder != NULL);
668
669 iisfinder->iisfinderdata = iisfinderdata;
670}
671
672/** gets priority of IIS finder */
674 SCIP_IISFINDER* iisfinder /**< IIS finder */
675 )
676{
677 assert(iisfinder != NULL);
678
679 return iisfinder->priority;
680}
681
682/** enables or disables all clocks of @p iisfinder, depending on the value of the flag */
684 SCIP_IISFINDER* iisfinder, /**< the IIS finder for which all clocks should be enabled or disabled */
685 SCIP_Bool enable /**< should the clocks of the IIS be enabled? */
686 )
687{
688 assert(iisfinder != NULL);
689
690 SCIPclockEnableOrDisable(iisfinder->iisfindertime, enable);
691}
692
693/** sets copy method of IIS finder */
695 SCIP_IISFINDER* iisfinder, /**< IIS finder */
696 SCIP_DECL_IISFINDERCOPY ((*iisfindercopy)) /**< copy method of IIS finder or NULL if you don't want to copy your plugin into sub-SCIPs */
697 )
698{
699 assert(iisfinder != NULL);
700
701 iisfinder->iisfindercopy = iisfindercopy;
702}
703
704/** sets destructor method of IIS finder */
706 SCIP_IISFINDER* iisfinder, /**< IIS finder */
707 SCIP_DECL_IISFINDERFREE ((*iisfinderfree)) /**< destructor of IIS finder */
708 )
709{
710 assert(iisfinder != NULL);
711
712 iisfinder->iisfinderfree = iisfinderfree;
713}
714
715/** sets priority of IIS finder */
717 SCIP_IISFINDER* iisfinder, /**< IIS finder */
718 SCIP_SET* set, /**< global SCIP settings */
719 int priority /**< new priority of the IIS finder */
720 )
721{
722 assert(iisfinder != NULL);
723 assert(set != NULL);
724
725 iisfinder->priority = priority;
726 set->iisfinderssorted = FALSE;
727}
728
729/** gets time in seconds used in this IIS finder */
731 SCIP_IISFINDER* iisfinder /**< IIS finder */
732 )
733{
734 assert(iisfinder != NULL);
735
736 return SCIPclockGetTime(iisfinder->iisfindertime);
737}
738
739/** prints output line during IIS calculations */
741 SCIP_IIS* iis, /**< pointer to the IIS */
742 SCIP_Bool printheaders /**< whether the headers should be printed instead of the info */
743 )
744{
745 SCIP_VAR** vars;
746 SCIP* scip;
747 int i;
748 int nvars;
749 int nbounds = 0;
750 const char* infeasible = iis->infeasible ? "yes" : "no";
751
752 scip = SCIPiisGetSubscip(iis);
753 assert(scip != NULL);
754
755 if( printheaders || (iis->niismessagecalls % 15 == 0) )
756 {
757 SCIPinfoMessage(scip, NULL, "time(s)| node | cons | vars | bounds| infeasible\n");
758 if( printheaders )
759 return;
760 }
761 iis->niismessagecalls += 1;
762
765 for( i = 0; i < nvars; i++ )
766 {
768 ++nbounds;
770 ++nbounds;
771 }
772 SCIPinfoMessage(scip, NULL, "%7.1f|%7lld|%7d|%7d|%7d| %10s\n", SCIPiisGetTime(iis), SCIPiisGetNNodes(iis), SCIPgetNOrigConss(scip), nvars, nbounds, infeasible);
773}
774
775/** creates and captures a new IIS */
777 SCIP_IIS** iis, /**< pointer to return the created IIS */
778 SCIP_SET* set, /**< global SCIP settings */
779 BMS_BLKMEM* blkmem /**< block memory */
780 )
781{
782 assert(iis != NULL);
783
784 SCIP_ALLOC( BMSallocBlockMemory(blkmem, iis) );
785
786 (*iis)->subscip = NULL;
787 (*iis)->subscip = NULL;
788 (*iis)->varsmap = NULL;
789 (*iis)->conssmap = NULL;
790 SCIP_CALL( SCIPrandomCreate(&((*iis)->randnumgen), blkmem, SCIPsetInitializeRandomSeed(set, 0x5EED)) );
792 (*iis)->niismessagecalls = 0;
793 (*iis)->nnodes = 0;
794 (*iis)->infeasible = FALSE;
795 (*iis)->irreducible = FALSE;
796
797 return SCIP_OKAY;
798}
799
800/** releases an IIS */
802 SCIP_IIS** iis, /**< pointer to the IIS */
803 BMS_BLKMEM* blkmem /**< block memory */
804 )
805{
806 assert(iis != NULL);
807 if( *iis == NULL )
808 return SCIP_OKAY;
809
810 if( (*iis)->subscip != NULL )
811 {
812 SCIP_CALL( SCIPfree(&((*iis)->subscip)) );
813 (*iis)->subscip = NULL;
814 }
815
816 if( (*iis)->varsmap != NULL )
817 {
818 SCIPhashmapFree(&((*iis)->varsmap));
819 (*iis)->varsmap = NULL;
820 }
821
822 if( (*iis)->conssmap != NULL )
823 {
824 SCIPhashmapFree(&((*iis)->conssmap));
825 (*iis)->conssmap = NULL;
826 }
827
828 if( (*iis)->randnumgen != NULL )
829 {
830 SCIPrandomFree(&((*iis)->randnumgen), blkmem);
831 (*iis)->randnumgen = NULL;
832 }
833
834 SCIPclockFree(&(*iis)->iistime);
835
836 BMSfreeBlockMemory(blkmem, iis);
837 *iis = NULL;
838
839 return SCIP_OKAY;
840}
841
842/** reset an IIS (in case one exists from a previous solve) */
844 SCIP_IIS** iis /**< pointer to the IIS */
845 )
846{
847 assert(iis != NULL);
848 if( *iis == NULL )
849 return SCIP_OKAY;
850
851 if( (*iis)->subscip != NULL )
852 {
853 SCIP_CALL( SCIPfree(&((*iis)->subscip)) );
854 (*iis)->subscip = NULL;
855 }
856
857 if( (*iis)->varsmap != NULL )
858 {
859 SCIPhashmapFree(&((*iis)->varsmap));
860 (*iis)->varsmap = NULL;
861 }
862
863 if( (*iis)->conssmap != NULL )
864 {
865 SCIPhashmapFree(&((*iis)->conssmap));
866 (*iis)->conssmap = NULL;
867 }
868
869 SCIPclockReset((*iis)->iistime);
870 (*iis)->niismessagecalls = 0;
871 (*iis)->nnodes = 0;
872 (*iis)->infeasible = FALSE;
873 (*iis)->irreducible = FALSE;
874
875 return SCIP_OKAY;
876}
877
878/** gets time in seconds used in the IIS */
880 SCIP_IIS* iis /**< IIS */
881 )
882{
883 assert( iis != NULL );
884
885 return SCIPclockGetTime(iis->iistime);
886}
887
888/** Gets whether the IIS subscip is currently infeasible. */
890 SCIP_IIS* iis /**< IIS data structure */
891 )
892{
893 assert( iis != NULL );
894
895 return iis->infeasible;
896}
897
898/** Gets whether the IIS subscip is irreducible. */
900 SCIP_IIS* iis /**< IIS data structure */
901 )
902{
903 assert( iis != NULL );
904
905 return iis->irreducible;
906}
907
908/** Gets the number of nodes in the IIS solve. */
910 SCIP_IIS* iis /**< IIS data structure */
911 )
912{
913 assert( iis != NULL );
914
915 return iis->nnodes;
916}
917
918/** Sets the flag that states whether the IIS subscip is currently infeasible. */
920 SCIP_IIS* iis, /**< IIS data structure */
921 SCIP_Bool infeasible /**< The new infeasibility status of the IIS subscip */
922 )
923{
924 assert( iis != NULL );
925 iis->infeasible = infeasible;
926}
927
928/** Sets the flag that states whether the IIS subscip is irreducible. */
930 SCIP_IIS* iis, /**< IIS data structure */
931 SCIP_Bool irreducible /**< The new irreducible status of the IIS */
932 )
933{
934 assert( iis != NULL );
935 iis->irreducible = irreducible;
936}
937
938/** Increments the number of nodes in the IIS solve. */
940 SCIP_IIS* iis, /**< IIS data structure */
941 SCIP_Longint nnodes /**< The number of nodes to add to the IIS */
942 )
943{
944 assert( iis != NULL );
945 iis->nnodes += nnodes;
946}
947
948/** get the randnumgen of the IIS */
950 SCIP_IIS* iis /**< pointer to the IIS */
951 )
952{
953 assert( iis != NULL );
954 return iis->randnumgen;
955}
956
957/** get the subscip of an IIS */
959 SCIP_IIS* iis /**< pointer to the IIS */
960 )
961{
962 assert( iis != NULL );
963 return iis->subscip;
964}
965
966/** compares two IIS finders w. r. to their priority */
967SCIP_DECL_SORTPTRCOMP(SCIPiisfinderComp)
968{ /*lint --e{715}*/
969 return ((SCIP_IISFINDER*)elem2)->priority - ((SCIP_IISFINDER*)elem1)->priority;
970}
void SCIPclockStop(SCIP_CLOCK *clck, SCIP_SET *set)
Definition clock.c:360
void SCIPclockEnableOrDisable(SCIP_CLOCK *clck, SCIP_Bool enable)
Definition clock.c:260
void SCIPclockStart(SCIP_CLOCK *clck, SCIP_SET *set)
Definition clock.c:290
SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
Definition clock.c:438
void SCIPclockReset(SCIP_CLOCK *clck)
Definition clock.c:209
void SCIPclockFree(SCIP_CLOCK **clck)
Definition clock.c:185
SCIP_RETCODE SCIPclockCreate(SCIP_CLOCK **clck, SCIP_CLOCKTYPE clocktype)
Definition clock.c:170
internal methods for clocks and timing issues
Constraint handler for linear constraints in their most general form, .
#define NULL
Definition def.h:255
#define SCIP_MAXSTRLEN
Definition def.h:276
#define SCIP_Longint
Definition def.h:148
#define SCIP_Bool
Definition def.h:98
#define SCIP_ALLOC(x)
Definition def.h:373
#define SCIP_Real
Definition def.h:163
#define TRUE
Definition def.h:100
#define FALSE
Definition def.h:101
#define SCIP_CALL(x)
Definition def.h:362
#define SCIP_CALL_FINALLY(x, y)
Definition def.h:404
#define nnodes
Definition gastrans.c:74
SCIP_VAR ** SCIPgetVarsLinear(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_Real * SCIPgetValsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcopyOrig(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, const char *suffix, SCIP_Bool enablepricing, SCIP_Bool threadsafe, SCIP_Bool passmessagehdlr, SCIP_Bool *valid)
Definition scip_copy.c:3044
SCIP_RETCODE SCIPcopyParamSettings(SCIP *sourcescip, SCIP *targetscip)
Definition scip_copy.c:2547
SCIP_RETCODE SCIPfree(SCIP **scip)
SCIP_RETCODE SCIPcreate(SCIP **scip)
SCIP_STATUS SCIPgetStatus(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
int SCIPgetNOrigConss(SCIP *scip)
Definition scip_prob.c:3712
SCIP_VAR ** SCIPgetOrigVars(SCIP *scip)
Definition scip_prob.c:2811
SCIP_CONS ** SCIPgetConss(SCIP *scip)
Definition scip_prob.c:3666
SCIP_RETCODE SCIPdelCons(SCIP *scip, SCIP_CONS *cons)
Definition scip_prob.c:3420
int SCIPgetNConss(SCIP *scip)
Definition scip_prob.c:3620
int SCIPgetNOrigVars(SCIP *scip)
Definition scip_prob.c:2838
SCIP_RETCODE SCIPdelVar(SCIP *scip, SCIP_VAR *var, SCIP_Bool *deleted)
Definition scip_prob.c:2041
SCIP_CONS ** SCIPgetOrigConss(SCIP *scip)
Definition scip_prob.c:3739
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
Definition misc.c:3095
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
Definition misc.c:3061
SCIP_RETCODE SCIPiisGreedyMakeIrreducible(SCIP_IIS *iis)
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
#define SCIPdebugMsg
SCIP_RETCODE SCIPgetBoolParam(SCIP *scip, const char *name, SCIP_Bool *value)
Definition scip_param.c:250
SCIP_RETCODE SCIPsetLongintParam(SCIP *scip, const char *name, SCIP_Longint value)
Definition scip_param.c:545
SCIP_RETCODE SCIPsetIntParam(SCIP *scip, const char *name, int value)
Definition scip_param.c:487
SCIP_RETCODE SCIPsetSubscipsOff(SCIP *scip, SCIP_Bool quiet)
Definition scip_param.c:904
SCIP_RETCODE SCIPgetRealParam(SCIP *scip, const char *name, SCIP_Real *value)
Definition scip_param.c:307
SCIP_RETCODE SCIPgetLongintParam(SCIP *scip, const char *name, SCIP_Longint *value)
Definition scip_param.c:288
SCIP_RETCODE SCIPsetBoolParam(SCIP *scip, const char *name, SCIP_Bool value)
Definition scip_param.c:429
SCIP_RETCODE SCIPsetRealParam(SCIP *scip, const char *name, SCIP_Real value)
Definition scip_param.c:603
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4316
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
Definition cons.c:8409
int SCIPconsGetNUses(SCIP_CONS *cons)
Definition cons.c:8429
SCIP_RANDNUMGEN * SCIPiisGetRandnumgen(SCIP_IIS *iis)
Definition iisfinder.c:949
void SCIPiisAddNNodes(SCIP_IIS *iis, SCIP_Longint nnodes)
Definition iisfinder.c:939
SCIP * SCIPiisGetSubscip(SCIP_IIS *iis)
Definition iisfinder.c:958
SCIP_RETCODE SCIPsetIISfinderPriority(SCIP *scip, SCIP_IISFINDER *iisfinder, int priority)
const char * SCIPiisfinderGetName(SCIP_IISFINDER *iisfinder)
Definition iisfinder.c:314
void SCIPiisSetSubscipIrreducible(SCIP_IIS *iis, SCIP_Bool irreducible)
Definition iisfinder.c:929
SCIP_Longint SCIPiisGetNNodes(SCIP_IIS *iis)
Definition iisfinder.c:909
SCIP_IISFINDERDATA * SCIPiisfinderGetData(SCIP_IISFINDER *iisfinder)
Definition iisfinder.c:652
int SCIPiisfinderGetPriority(SCIP_IISFINDER *iisfinder)
Definition iisfinder.c:673
void SCIPiisfinderSetData(SCIP_IISFINDER *iisfinder, SCIP_IISFINDERDATA *iisfinderdata)
Definition iisfinder.c:662
SCIP_Real SCIPiisGetTime(SCIP_IIS *iis)
Definition iisfinder.c:879
void SCIPiisfinderInfoMessage(SCIP_IIS *iis, SCIP_Bool printheaders)
Definition iisfinder.c:740
SCIP_Bool SCIPiisIsSubscipInfeasible(SCIP_IIS *iis)
Definition iisfinder.c:889
void SCIPiisSetSubscipInfeasible(SCIP_IIS *iis, SCIP_Bool infeasible)
Definition iisfinder.c:919
SCIP_Real SCIPiisfinderGetTime(SCIP_IISFINDER *iisfinder)
Definition iisfinder.c:730
SCIP_Bool SCIPiisIsSubscipIrreducible(SCIP_IIS *iis)
Definition iisfinder.c:899
const char * SCIPiisfinderGetDesc(SCIP_IISFINDER *iisfinder)
Definition iisfinder.c:594
SCIP_IIS * SCIPgetIIS(SCIP *scip)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
Definition scip_mem.c:57
SCIP_RETCODE SCIPfreeTransform(SCIP *scip)
SCIP_RETCODE SCIPsolve(SCIP *scip)
SCIP_Longint SCIPgetNTotalNodes(SCIP *scip)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisSumLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPvarGetLbOriginal(SCIP_VAR *var)
Definition var.c:24020
int SCIPvarGetNUses(SCIP_VAR *var)
Definition var.c:23277
SCIP_Real SCIPvarGetUbOriginal(SCIP_VAR *var)
Definition var.c:24063
SCIP_Bool SCIPvarIsDeletable(SCIP_VAR *var)
Definition var.c:23632
SCIP_RETCODE SCIPchgVarObj(SCIP *scip, SCIP_VAR *var, SCIP_Real newobj)
Definition scip_var.c:5372
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition misc.c:10827
return SCIP_OKAY
assert(minobj< SCIPgetCutoffbound(scip))
int nvars
static SCIP_VAR ** vars
SCIP_RETCODE SCIPiisCreate(SCIP_IIS **iis, SCIP_SET *set, BMS_BLKMEM *blkmem)
Definition iisfinder.c:776
SCIP_RETCODE SCIPiisReset(SCIP_IIS **iis)
Definition iisfinder.c:843
SCIP_RETCODE SCIPiisfinderCreate(SCIP_IISFINDER **iisfinder, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, SCIP_DECL_IISFINDERCOPY((*iisfindercopy)), SCIP_DECL_IISFINDERFREE((*iisfinderfree)), SCIP_DECL_IISFINDEREXEC((*iisfinderexec)), SCIP_IISFINDERDATA *iisfinderdata)
Definition iisfinder.c:288
void SCIPiisfinderSetPriority(SCIP_IISFINDER *iisfinder, SCIP_SET *set, int priority)
Definition iisfinder.c:716
static SCIP_RETCODE checkTrivialInfeas(SCIP *scip, SCIP_Bool *trivial)
Definition iisfinder.c:135
void SCIPiisfinderSetCopy(SCIP_IISFINDER *iisfinder,)
Definition iisfinder.c:694
SCIP_RETCODE SCIPiisFree(SCIP_IIS **iis, BMS_BLKMEM *blkmem)
Definition iisfinder.c:801
static SCIP_RETCODE createSubscipIIS(SCIP_SET *set, SCIP_IIS *iis, SCIP_Real timelim, SCIP_Longint nodelim, SCIP_Bool *success)
Definition iisfinder.c:63
void SCIPiisfinderEnableOrDisableClocks(SCIP_IISFINDER *iisfinder, SCIP_Bool enable)
Definition iisfinder.c:683
void SCIPiisfinderSetFree(SCIP_IISFINDER *iisfinder,)
Definition iisfinder.c:705
SCIP_RETCODE SCIPiisfinderFree(SCIP_IISFINDER **iisfinder, SCIP_SET *set, BMS_BLKMEM *blkmem)
Definition iisfinder.c:622
SCIP_RETCODE SCIPiisfinderCopyInclude(SCIP_IISFINDER *iisfinder, SCIP_SET *set)
Definition iisfinder.c:604
SCIP_RETCODE SCIPiisGenerate(SCIP_SET *set)
Definition iisfinder.c:324
static SCIP_RETCODE doIISfinderCreate(SCIP_IISFINDER **iisfinder, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, SCIP_DECL_IISFINDERCOPY((*iisfindercopy)), SCIP_DECL_IISFINDERFREE((*iisfinderfree)), SCIP_DECL_IISFINDEREXEC((*iisfinderexec)), SCIP_IISFINDERDATA *iisfinderdata)
Definition iisfinder.c:241
internal methods for IIS finder
greedy deletion and addition filter heuristic to compute IISs
static const char * paramname[]
Definition lpi_msk.c:5172
#define BMSduplicateBlockMemoryArray(mem, ptr, source, num)
Definition memory.h:462
#define BMSfreeBlockMemory(mem, ptr)
Definition memory.h:465
#define BMSallocBlockMemory(mem, ptr)
Definition memory.h:451
#define BMSfreeBlockMemoryArrayNull(mem, ptr, num)
Definition memory.h:468
#define BMSallocClearBlockMemory(mem, ptr)
Definition memory.h:452
struct BMS_BlkMem BMS_BLKMEM
Definition memory.h:437
void SCIPrandomFree(SCIP_RANDNUMGEN **randnumgen, BMS_BLKMEM *blkmem)
Definition misc.c:10209
SCIP_RETCODE SCIPrandomCreate(SCIP_RANDNUMGEN **randnumgen, BMS_BLKMEM *blkmem, unsigned int initialseed)
Definition misc.c:10193
internal miscellaneous methods
SCIP_Real SCIPconsGetLhs(SCIP *scip, SCIP_CONS *cons, SCIP_Bool *success)
SCIP_Real SCIPconsGetRhs(SCIP *scip, SCIP_CONS *cons, SCIP_Bool *success)
Definition misc_linear.c:48
SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
Definition paramset.c:678
int SCIPparamGetInt(SCIP_PARAM *param)
Definition paramset.c:733
internal methods for handling parameter settings
SCIP callable library.
SCIP_RETCODE SCIPsetAddIntParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, 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 set.c:3229
void SCIPsetSortIISfinders(SCIP_SET *set)
Definition set.c:5237
unsigned int SCIPsetInitializeRandomSeed(SCIP_SET *set, unsigned int initialseedvalue)
Definition set.c:7800
internal methods for global SCIP settings
#define SCIPsetDebugMsg
Definition set.h:1811
SCIP_Longint nnodes
SCIP_HASHMAP * conssmap
SCIP_HASHMAP * varsmap
SCIP_Bool irreducible
SCIP_Bool infeasible
SCIP_RANDNUMGEN * randnumgen
SCIP_CLOCK * iistime
SCIP_CLOCK * iisfindertime
SCIP_IISFINDERDATA * iisfinderdata
data structures for irreducible infeasible subsystems (IIS)
@ SCIP_CLOCKTYPE_DEFAULT
Definition type_clock.h:43
struct SCIP_Cons SCIP_CONS
Definition type_cons.h:63
#define SCIP_DECL_IISFINDERFREE(x)
#define SCIP_DECL_IISFINDEREXEC(x)
struct SCIP_IISfinder SCIP_IISFINDER
struct SCIP_IISfinderData SCIP_IISFINDERDATA
#define SCIP_DECL_IISFINDERCOPY(x)
struct SCIP_Messagehdlr SCIP_MESSAGEHDLR
#define SCIP_DECL_SORTPTRCOMP(x)
Definition type_misc.h:189
struct SCIP_RandNumGen SCIP_RANDNUMGEN
Definition type_misc.h:127
struct SCIP_ParamData SCIP_PARAMDATA
#define SCIP_DECL_PARAMCHGD(x)
@ SCIP_DIDNOTRUN
Definition type_result.h:42
@ SCIP_DIDNOTFIND
Definition type_result.h:44
@ SCIP_SUCCESS
Definition type_result.h:58
enum SCIP_Result SCIP_RESULT
Definition type_result.h:61
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_Set SCIP_SET
Definition type_set.h:71
@ SCIP_STAGE_PROBLEM
Definition type_set.h:45
@ SCIP_STAGE_SOLVED
Definition type_set.h:54
@ SCIP_STATUS_OPTIMAL
Definition type_stat.h:43
@ SCIP_STATUS_TOTALNODELIMIT
Definition type_stat.h:50
@ SCIP_STATUS_BESTSOLLIMIT
Definition type_stat.h:60
@ SCIP_STATUS_SOLLIMIT
Definition type_stat.h:59
@ SCIP_STATUS_UNBOUNDED
Definition type_stat.h:45
@ SCIP_STATUS_UNKNOWN
Definition type_stat.h:42
@ SCIP_STATUS_PRIMALLIMIT
Definition type_stat.h:57
@ SCIP_STATUS_GAPLIMIT
Definition type_stat.h:56
@ SCIP_STATUS_USERINTERRUPT
Definition type_stat.h:47
@ SCIP_STATUS_TERMINATE
Definition type_stat.h:48
@ SCIP_STATUS_INFORUNBD
Definition type_stat.h:46
@ SCIP_STATUS_STALLNODELIMIT
Definition type_stat.h:52
@ SCIP_STATUS_TIMELIMIT
Definition type_stat.h:54
@ SCIP_STATUS_INFEASIBLE
Definition type_stat.h:44
@ SCIP_STATUS_NODELIMIT
Definition type_stat.h:49
@ SCIP_STATUS_DUALLIMIT
Definition type_stat.h:58
@ SCIP_STATUS_MEMLIMIT
Definition type_stat.h:55
@ SCIP_STATUS_RESTARTLIMIT
Definition type_stat.h:62
struct SCIP_Var SCIP_VAR
Definition type_var.h:166