Scippy

    SCIP

    Solving Constraint Integer Programs

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