SCIP

    Solving Constraint Integer Programs

    sepa_rapidlearning.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 sepa_rapidlearning.c
    26 * @ingroup DEFPLUGINS_SEPA
    27 * @brief rapidlearning separator
    28 * @author Timo Berthold
    29 * @author Jakob Witzig
    30 */
    31
    32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    33
    35#include "scip/scipdefplugins.h"
    36#include "scip/heuristics.h"
    37#include "scip/pub_var.h"
    38
    39#define SEPA_NAME "rapidlearning"
    40#define SEPA_DESC "rapid learning heuristic and separator"
    41#define SEPA_PRIORITY -1200000
    42#define SEPA_FREQ 5
    43#define SEPA_MAXBOUNDDIST 1.0
    44#define SEPA_USESSUBSCIP TRUE /**< does the separator use a secondary SCIP instance? */
    45#define SEPA_DELAY FALSE /**< should separation method be delayed, if other separators found cuts? */
    46
    47#define DEFAULT_APPLYCONFLICTS TRUE /**< should the found conflicts be applied in the original SCIP? */
    48#define DEFAULT_APPLYBDCHGS TRUE /**< should the found global bound deductions be applied in the original SCIP?
    49 * apply only if conflicts and incumbent solution will be copied too
    50 */
    51#define DEFAULT_APPLYINFERVALS TRUE /**< should the inference values be used as initialization in the original SCIP? */
    52#define DEFAULT_REDUCEDINFER FALSE /**< should the inference values only be used when rapid learning found other reductions? */
    53#define DEFAULT_APPLYPRIMALSOL TRUE /**< should the incumbent solution be copied to the original SCIP? */
    54#define DEFAULT_APPLYSOLVED TRUE /**< should a solved status be copied to the original SCIP? */
    55
    56#define DEFAULT_CHECKEXEC TRUE /**< check whether rapid learning should be executed */
    57#define DEFAULT_CHECKDEGANERACY TRUE /**< should local LP degeneracy be checked? */
    58#define DEFAULT_CHECKDUALBOUND FALSE /**< should the progress on the dual bound be checked? */
    59#define DEFAULT_CHECKLEAVES FALSE /**< should the ratio of leaves proven to be infeasible and exceeding the
    60 * cutoff bound be checked? */
    61#define DEFAULT_CHECKOBJ FALSE /**< should the local objection function be checked? */
    62#define DEFAULT_CHECKNSOLS TRUE /**< should the number of solutions found so far be checked? */
    63#define DEFAULT_MINDEGENERACY 0.7 /**< minimal degeneracy threshold to allow local rapid learning */
    64#define DEFAULT_MININFLPRATIO 10.0 /**< minimal threshold of inf/obj leaves to allow local rapid learning */
    65#define DEFAULT_MINVARCONSRATIO 2.0 /**< minimal ratio of unfixed variables in relation to basis size to
    66 * allow local rapid learning */
    67#define DEFAULT_NWAITINGNODES 100L /**< number of nodes that should be processed before rapid learning is
    68 * executed locally based on the progress of the dualbound */
    69
    70#define DEFAULT_MAXNVARS 10000 /**< maximum problem size (variables) for which rapid learning will be called */
    71#define DEFAULT_MAXNCONSS 10000 /**< maximum problem size (constraints) for which rapid learning will be called */
    72#define DEFAULT_MAXCALLS 100 /**< maximum number of overall calls */
    73
    74#define DEFAULT_MINNODES 500 /**< minimum number of nodes considered in rapid learning run */
    75#define DEFAULT_MAXNODES 5000 /**< maximum number of nodes considered in rapid learning run */
    76
    77#define DEFAULT_CONTVARS FALSE /**< should rapid learning be applied when there are continuous variables? */
    78#define DEFAULT_CONTVARSQUOT 0.3 /**< maximal portion of continuous variables to apply rapid learning */
    79#define DEFAULT_LPITERQUOT 0.2 /**< maximal fraction of LP iterations compared to node LP iterations */
    80#define DEFAULT_COPYCUTS TRUE /**< should all active cuts from the cutpool of the
    81 * original scip be copied to constraints of the subscip */
    82
    83
    84/*
    85 * Data structures
    86 */
    87
    88/** separator data */
    89struct SCIP_SepaData
    90{
    91 SCIP_Real lpiterquot; /**< maximal fraction of LP iterations compared to node LP iterations */
    92 SCIP_Real mindegeneracy; /**< minimal degeneracy threshold to allow local rapid learning */
    93 SCIP_Real mininflpratio; /**< minimal threshold of inf/obj leaves to allow local rapid learning */
    94 SCIP_Real minvarconsratio; /**< minimal ratio of unfixed variables in relation to basis size to
    95 * allow local rapid learning */
    96 int maxnvars; /**< maximum problem size (variables) for which rapid learning will be called */
    97 int maxnconss; /**< maximum problem size (constraints) for which rapid learning will be called */
    98 int maxcalls; /**< maximum number of overall calls */
    99 int minnodes; /**< minimum number of nodes considered in rapid learning run */
    100 int maxnodes; /**< maximum number of nodes considered in rapid learning run */
    101 SCIP_Longint nwaitingnodes; /**< number of nodes that should be processed before rapid learning is executed locally
    102 * based on the progress of the dualbound */
    103 SCIP_Bool applybdchgs; /**< should the found global bound deductions be applied in the original SCIP? */
    104 SCIP_Bool applyconflicts; /**< should the found conflicts be applied in the original SCIP? */
    105 SCIP_Bool applyinfervals; /**< should the inference values be used as initialization in the original SCIP? */
    106 SCIP_Bool applyprimalsol; /**< should the incumbent solution be copied to the original SCIP? */
    107 SCIP_Bool applysolved; /**< should a solved status ba copied to the original SCIP? */
    108 SCIP_Bool checkdegeneracy; /**< should local LP degeneracy be checked? */
    109 SCIP_Bool checkdualbound; /**< should the progress on the dual bound be checked? */
    110 SCIP_Bool checkleaves; /**< should the ratio of leaves proven to be infeasible and exceeding the
    111 * cutoff bound be checked? */
    112 SCIP_Bool checkexec; /**< check whether rapid learning should be executed */
    113 SCIP_Bool checkobj; /**< should the (local) objective function be checked? */
    114 SCIP_Bool checknsols; /**< should number if solutions found so far be checked? */
    115 SCIP_Bool contvars; /**< should rapid learning be applied when there are continuous variables? */
    116 SCIP_Real contvarsquot; /**< maximal portion of continuous variables to apply rapid learning */
    117 SCIP_Bool copycuts; /**< should all active cuts from cutpool be copied to constraints in
    118 * subproblem? */
    119 SCIP_Bool reducedinfer; /**< should the inference values only be used when rapid learning found other reductions? */
    120};
    121
    122/*
    123 * Callback methods of separator
    124 */
    125
    126/** copy method for separator plugins (called when SCIP copies plugins) */
    127static
    128SCIP_DECL_SEPACOPY(sepaCopyRapidlearning)
    129{ /*lint --e{715}*/
    130 assert(scip != NULL);
    131 assert(sepa != NULL);
    132
    134
    135 /* call inclusion method of constraint handler */
    137
    138 return SCIP_OKAY;
    139}
    140
    141/** destructor of separator to free user data (called when SCIP is exiting) */
    142static
    143SCIP_DECL_SEPAFREE(sepaFreeRapidlearning)
    144{ /*lint --e{715}*/
    145 SCIP_SEPADATA* sepadata;
    146
    147 assert(sepa != NULL);
    148 assert(scip != NULL);
    149
    151
    152 /* free separator data */
    153 sepadata = SCIPsepaGetData(sepa);
    154 assert(sepadata != NULL);
    155 SCIPfreeBlockMemory(scip, &sepadata);
    156 SCIPsepaSetData(sepa, NULL);
    157
    158 return SCIP_OKAY;
    159}
    160
    161
    162/** setup and solve sub-SCIP */
    163static
    165 SCIP* scip, /**< SCIP data structure */
    166 SCIP* subscip, /**< subSCIP data structure */
    167 SCIP_SEPADATA* sepadata, /**< separator data */
    168 int randseed, /**< global seed shift used in the sub-SCIP */
    169 SCIP_Bool global, /**< should rapid learning run on the global problem? */
    170 SCIP_RESULT* result /**< result pointer */
    171 )
    172{
    173 SCIP_VAR** vars; /* original problem's variables */
    174 SCIP_VAR** subvars; /* subproblem's variables */
    175 SCIP_HASHMAP* varmapfw; /* mapping of SCIP variables to sub-SCIP variables */
    176 SCIP_HASHMAP* varmapbw = NULL; /* mapping of sub-SCIP variables to SCIP variables */
    177
    178 SCIP_CONSHDLR** conshdlrs = NULL; /* array of constraint handler's that might that might obtain conflicts */
    179 int* oldnconss = NULL; /* number of constraints without rapid learning conflicts */
    180
    181 SCIP_Longint nodelimit; /* node limit for the subproblem */
    182
    183 int nconshdlrs; /* size of conshdlr and oldnconss array */
    184 int nvars; /* number of variables */
    185 int nbinvars;
    186 int nintvars;
    187 int nimplvars;
    188 int implstart;
    189 int implend;
    190 int restartnum; /* maximal number of conflicts that should be created */
    191 int i; /* counter */
    192
    193 SCIP_Bool success; /* was problem creation / copying constraint successful? */
    194
    195 SCIP_Bool cutoff; /* detected infeasibility */
    196 int nconflicts; /* statistic: number of conflicts applied */
    197 int nbdchgs; /* statistic: number of bound changes applied */
    198
    199 SCIP_Bool soladded = FALSE; /* statistic: was a new incumbent found? */
    200 SCIP_Bool dualboundchg; /* statistic: was a new dual bound found? */
    201 SCIP_Bool disabledualreductions; /* TRUE, if dual reductions in sub-SCIP are not valid for original SCIP,
    202 * e.g., because a constraint could not be copied or a primal solution
    203 * could not be copied back */
    204 int initseed;
    205 int seedshift;
    206 SCIP_Bool valid;
    207
    208#ifdef SCIP_DEBUG
    209 int n1startinfers = 0; /* statistic: number of one side infer values */
    210 int n2startinfers = 0; /* statistic: number of both side infer values */
    211#endif
    212
    213 SCIP_CALL( SCIPgetVarsData(scip, &vars, &nvars, &nbinvars, &nintvars, &nimplvars, NULL) );
    214
    215 /* initializing the subproblem */
    216 SCIP_CALL( SCIPallocBufferArray(scip, &subvars, nvars) );
    217 SCIP_CALL( SCIPhashmapCreate(&varmapfw, SCIPblkmem(subscip), nvars) );
    218 valid = FALSE;
    219
    220 /* copy the subproblem */
    221 SCIP_CALL( SCIPcopyConsCompression(scip, subscip, varmapfw, NULL, "rapid", NULL, NULL, 0, global, FALSE, FALSE, TRUE, &valid) );
    222
    223 if( sepadata->copycuts )
    224 {
    225 /* copies all active cuts from cutpool of sourcescip to linear constraints in targetscip */
    226 SCIP_CALL( SCIPcopyCuts(scip, subscip, varmapfw, NULL, global, NULL) );
    227 }
    228
    229 /* fill subvars array in the order of the variables of the main SCIP */
    230 for( i = 0; i < nvars; i++ )
    231 {
    232 subvars[i] = (SCIP_VAR*) SCIPhashmapGetImage(varmapfw, vars[i]);
    233 }
    234 SCIPhashmapFree(&varmapfw);
    235
    236 /* change implicit integer variables to integer type */
    237 implstart = nbinvars + nintvars;
    238 implend = nbinvars + nintvars + nimplvars;
    239 for( i = implstart; i < implend; i++ )
    240 {
    241 SCIP_Bool infeasible;
    242
    243 if( subvars[i] == NULL )
    244 continue;
    245
    246 assert(SCIPvarIsImpliedIntegral(subvars[i]));
    247 SCIP_CALL( SCIPchgVarType(subscip, subvars[i], SCIP_VARTYPE_INTEGER, &infeasible) );
    248 assert(!infeasible);
    249 SCIP_CALL( SCIPchgVarImplType(subscip, subvars[i], SCIP_IMPLINTTYPE_NONE, &infeasible) );
    250 assert(!infeasible);
    251 }
    252
    253 /* This avoids dual presolving.
    254 *
    255 * If the copy is not valid, it should be a relaxation of the problem (constraints might have failed to be copied,
    256 * but no variables should be missing because we stop earlier anyway if pricers are present).
    257 * By disabling dual presolving, conflicts and bound changes found in a relaxation are still valid for the original problem.
    258 */
    259 if( ! valid )
    260 {
    261 SCIP_CALL( SCIPsetBoolParam(subscip, "misc/allowweakdualreds", FALSE) );
    262 SCIP_CALL( SCIPsetBoolParam(subscip, "misc/allowstrongdualreds", FALSE) );
    263 }
    264
    265 SCIPdebugMsg(scip, "Copying SCIP was%s valid.\n", valid ? "" : " not");
    266
    267 /* mimic an FD solver: DFS, no LP solving, 1-FUIP instead of all-FUIP, ... */
    268 if( SCIPisParamFixed(subscip, "lp/solvefreq") )
    269 {
    270 SCIPwarningMessage(scip, "unfixing parameter lp/solvefreq in subscip of rapidlearning\n");
    271 SCIP_CALL( SCIPunfixParam(subscip, "lp/solvefreq") );
    272 }
    273 if( SCIPisParamFixed(subscip, "nodeselection/dfs/stdpriority") )
    274 {
    275 SCIPwarningMessage(scip, "unfixing parameter nodeselection/dfs/stdpriority in subscip of rapidlearning\n");
    276 SCIP_CALL( SCIPunfixParam(subscip, "nodeselection/dfs/stdpriority") );
    277 }
    279
    280 /* turn off pseudo objective propagation */
    281 if( !SCIPisParamFixed(subscip, "propagating/pseudoobj/freq") )
    282 {
    283 SCIP_CALL( SCIPsetIntParam(subscip, "propagating/pseudoobj/freq", -1) );
    284 }
    285
    286 /* use classic inference branching */
    287 if( !SCIPisParamFixed(subscip, "branching/inference/useweightedsum") )
    288 {
    289 SCIP_CALL( SCIPsetBoolParam(subscip, "branching/inference/useweightedsum", FALSE) );
    290 }
    291
    292 /* only create short conflicts */
    293 if( !SCIPisParamFixed(subscip, "conflict/maxvarsfac") )
    294 {
    295 SCIP_CALL( SCIPsetRealParam(subscip, "conflict/maxvarsfac", 0.05) );
    296 }
    297
    298 /* set node limit for the subproblem based on the number of LP iterations per node,
    299 * which are a determistic measure for the node processing time.
    300 *
    301 * Note: We scale by number of LPs + 1 because the counter is increased after solving the LP.
    302 */
    303 nodelimit = SCIPgetNLPIterations(scip) / (SCIPgetNLPs(scip) + 1);
    304 nodelimit = MAX(sepadata->minnodes, nodelimit);
    305 nodelimit = MIN(sepadata->maxnodes, nodelimit);
    306
    307 /* change global random seed */
    308 assert(randseed >= 0);
    309 SCIP_CALL( SCIPgetIntParam(scip, "randomization/randomseedshift", &seedshift) );
    310
    311 initseed = ((randseed + seedshift) % INT_MAX);
    312 SCIP_CALL( SCIPsetIntParam(subscip, "randomization/randomseedshift", initseed) );
    313
    314 restartnum = 1000;
    315
    316 #ifdef SCIP_DEBUG
    317 /* for debugging, enable full output */
    318 SCIP_CALL( SCIPsetIntParam(subscip, "display/verblevel", 5) );
    319 SCIP_CALL( SCIPsetIntParam(subscip, "display/freq", -1) );
    320 #else
    321 /* disable statistic timing inside sub SCIP and output to console */
    322 SCIP_CALL( SCIPsetIntParam(subscip, "display/verblevel", 0) );
    323 SCIP_CALL( SCIPsetBoolParam(subscip, "timing/statistictiming", FALSE) );
    324 #endif
    325
    326 /* set limits for the subproblem */
    327 SCIP_CALL( SCIPcopyLimits(scip, subscip) );
    328 SCIP_CALL( SCIPsetLongintParam(subscip, "limits/nodes", nodelimit/5) );
    329 SCIP_CALL( SCIPsetIntParam(subscip, "limits/restarts", 0) );
    330 SCIP_CALL( SCIPsetIntParam(subscip, "conflict/restartnum", restartnum) );
    331
    332 /* forbid recursive call of heuristics and separators solving subMIPs */
    333 SCIP_CALL( SCIPsetSubscipsOff(subscip, TRUE) );
    334
    335 /* disable cutting plane separation */
    337
    338 /* disable expensive presolving */
    340
    341 /* do not abort subproblem on CTRL-C */
    342 SCIP_CALL( SCIPsetBoolParam(subscip, "misc/catchctrlc", FALSE) );
    343
    344 /* add an objective cutoff */
    346
    347 /* create the variable mapping hash map */
    348 SCIP_CALL( SCIPhashmapCreate(&varmapbw, SCIPblkmem(scip), nvars) );
    349
    350 /* store reversing mapping of variables */
    351 SCIP_CALL( SCIPtransformProb(subscip) );
    352 for( i = 0; i < nvars; ++i)
    353 {
    354 if( subvars[i] != NULL )
    355 {
    356 SCIP_CALL( SCIPhashmapInsert(varmapbw, SCIPvarGetTransVar(subvars[i]), vars[i]) );
    357 }
    358 }
    359
    360 /* allocate memory for constraints storage. Each constraint that will be created from now on will be a conflict.
    361 * Therefore, we need to remember oldnconss to get the conflicts from the FD search.
    362 */
    363 nconshdlrs = 4;
    364 SCIP_CALL( SCIPallocBufferArray(scip, &conshdlrs, nconshdlrs) );
    365 SCIP_CALL( SCIPallocBufferArray(scip, &oldnconss, nconshdlrs) );
    366
    367 /* store number of constraints before rapid learning search */
    368 conshdlrs[0] = SCIPfindConshdlr(subscip, "setppc");
    369 conshdlrs[1] = SCIPfindConshdlr(subscip, "logicor");
    370 conshdlrs[2] = SCIPfindConshdlr(subscip, "linear");
    371 conshdlrs[3] = SCIPfindConshdlr(subscip, "bounddisjunction");
    372
    373 /* redundant constraints might be eliminated in presolving */
    374 SCIP_CALL( SCIPpresolve(subscip) );
    375
    376 for( i = 0; i < nconshdlrs; ++i)
    377 {
    378 if( conshdlrs[i] != NULL )
    379 oldnconss[i] = SCIPconshdlrGetNConss(conshdlrs[i]);
    380 }
    381
    382 /* solve the subproblem, abort after errors in debug mode */
    383 SCIP_CALL_ABORT( SCIPsolve(subscip) );
    384
    385 /* if problem was already solved do not increase limits to run again */
    386 if( SCIPgetStage(subscip) == SCIP_STAGE_SOLVED )
    387 {
    388 SCIPdebugMsg(scip, "Subscip was completely solved, status %d.\n", SCIPgetStatus(subscip));
    389 }
    390 /* abort solving, if limit of applied conflicts is reached */
    391 else if( SCIPgetNConflictConssApplied(subscip) >= restartnum )
    392 {
    393 SCIPdebugMsg(scip, "finish after %" SCIP_LONGINT_FORMAT " successful conflict calls.\n", SCIPgetNConflictConssApplied(subscip));
    394 }
    395 /* if the first 20% of the solution process were successful, proceed */
    396 else if( (sepadata->applyprimalsol && SCIPgetNSols(subscip) > 0 && SCIPisFeasLT(scip, SCIPgetUpperbound(subscip), SCIPgetUpperbound(scip) ) )
    397 || (sepadata->applybdchgs && SCIPgetNRootboundChgs(subscip) > 0 )
    398 || (sepadata->applyconflicts && SCIPgetNConflictConssApplied(subscip) > 0) )
    399 {
    400 SCIPdebugMsg(scip, "proceed solving after the first 20%% of the solution process, since:\n");
    401
    402 if( SCIPgetNSols(subscip) > 0 && SCIPisFeasLE(scip, SCIPgetUpperbound(subscip), SCIPgetUpperbound(scip) ) )
    403 {
    404 SCIPdebugMsg(scip, " - there was a better solution (%f < %f)\n",SCIPgetUpperbound(subscip), SCIPgetUpperbound(scip));
    405 }
    406 if( SCIPgetNRootboundChgs(subscip) > 0 )
    407 {
    408 SCIPdebugMsg(scip, " - there were %d changed variables bounds\n", SCIPgetNRootboundChgs(subscip) );
    409 }
    410 if( SCIPgetNConflictConssFound(subscip) > 0 )
    411 {
    412 SCIPdebugMsg(scip, " - there were %" SCIP_LONGINT_FORMAT " conflict constraints created\n", SCIPgetNConflictConssApplied(subscip));
    413 }
    414
    415 /* set node limit to 100% */
    416 SCIP_CALL( SCIPsetLongintParam(subscip, "limits/nodes", nodelimit) );
    417
    418 /* solve the subproblem, abort after errors in debug mode */
    419 SCIP_CALL_ABORT( SCIPsolve(subscip) );
    420 }
    421 else
    422 {
    423 SCIPdebugMsg(scip, "do not proceed solving after the first 20%% of the solution process.\n");
    424 }
    425
    426 #ifdef SCIP_DEBUG
    428 #endif
    429
    431 disabledualreductions = FALSE;
    432 else
    433 disabledualreductions = TRUE;
    434
    435 /* check, whether a solution was found */
    436 if( sepadata->applyprimalsol && SCIPgetNSols(subscip) > 0 )
    437 {
    438 SCIP_SOL** subsols;
    439 int nsubsols;
    440
    441 /* check, whether a solution was found;
    442 * due to numerics, it might happen that not all solutions are feasible -> try all solutions until was declared to be feasible
    443 */
    444 nsubsols = SCIPgetNSols(subscip);
    445 subsols = SCIPgetSols(subscip);
    446 soladded = FALSE;
    447
    448 /* try adding solution from subSCIP to SCIP, until finding one that is accepted */
    449 for( i = 0; i < nsubsols && !soladded; ++i )
    450 {
    451 SCIP_SOL* newsol;
    452
    453 SCIP_CALL( SCIPtranslateSubSol(scip, subscip, subsols[i], NULL, subvars, &newsol) );
    454 SCIP_CALL( SCIPtrySolFree(scip, &newsol, FALSE, FALSE, TRUE, TRUE, TRUE, &soladded) );
    455 }
    456 if( !soladded || !SCIPisEQ(scip, SCIPgetSolOrigObj(subscip, subsols[i-1]), SCIPgetSolOrigObj(subscip, subsols[0])) )
    457 disabledualreductions = TRUE;
    458 }
    459
    460 /* if the sub problem was solved completely, we update the dual bound */
    461 dualboundchg = FALSE;
    462 if( sepadata->applysolved && !disabledualreductions
    464 {
    465 /* we need to multiply the dualbound with the scaling factor and add the offset,
    466 * because this information has been disregarded in the sub-SCIP
    467 */
    468 SCIPdebugMsg(scip, "Update old dualbound %g to new dualbound %g.\n",
    470
    472 dualboundchg = TRUE;
    473 }
    474
    475 /* check, whether conflicts were created */
    476 nconflicts = 0;
    477 if( sepadata->applyconflicts && !disabledualreductions && SCIPgetNConflictConssApplied(subscip) > 0 )
    478 {
    479 SCIP_HASHMAP* consmap;
    480 int hashtablesize;
    481 int nmaxconfs;
    482
    483 assert(SCIPgetNConflictConssApplied(subscip) < (SCIP_Longint) INT_MAX);
    484 hashtablesize = (int) SCIPgetNConflictConssApplied(subscip);
    485 assert(hashtablesize < INT_MAX/5);
    486
    487 /* create the variable mapping hash map */
    488 SCIP_CALL( SCIPhashmapCreate(&consmap, SCIPblkmem(scip), hashtablesize) );
    489
    490 SCIP_CALL( SCIPgetIntParam(scip, "conflict/maxconss", &nmaxconfs) );
    491 if( global )
    492 nmaxconfs *= 20;
    493
    494 /* loop over all constraint handlers that might contain conflict constraints
    495 * @todo select promising constraints and not greedy
    496 */
    497 for( i = 0; i < nconshdlrs && nconflicts < nmaxconfs; ++i)
    498 {
    499 /* copy constraints that have been created in FD run */
    500 if( conshdlrs[i] != NULL && SCIPconshdlrGetNConss(conshdlrs[i]) > oldnconss[i] )
    501 {
    502 SCIP_CONS** conss;
    503 int c;
    504 int nconss;
    505
    506 nconss = SCIPconshdlrGetNConss(conshdlrs[i]);
    507 conss = SCIPconshdlrGetConss(conshdlrs[i]);
    508
    509 /* loop over all constraints that have been added in sub-SCIP run, these are the conflicts */
    510 for( c = oldnconss[i]; c < nconss && nconflicts < nmaxconfs; ++c)
    511 {
    512 SCIP_CONS* cons;
    513 SCIP_CONS* conscopy;
    514
    515 cons = conss[c];
    516 assert(cons != NULL);
    517
    518 success = FALSE;
    519
    520 /* @todo assert that flags are as they should be for conflicts */
    521 SCIP_CALL( SCIPgetConsCopy(subscip, scip, cons, &conscopy, conshdlrs[i], varmapbw, consmap, NULL,
    523 SCIPconsIsPropagated(cons), !global, FALSE, SCIPconsIsDynamic(cons),
    524 SCIPconsIsRemovable(cons), FALSE, TRUE, &success) );
    525
    526 if( success )
    527 {
    528 nconflicts++;
    529
    532 }
    533 else
    534 {
    535 SCIPdebugMsg(scip, "failed to copy conflict constraint %s back to original SCIP\n", SCIPconsGetName(cons));
    536 }
    537 }
    538 }
    539 }
    540 SCIPhashmapFree(&consmap);
    541 }
    542
    543 /* check, whether tighter (global) bounds were detected */
    544 cutoff = FALSE;
    545 nbdchgs = 0;
    546 if( sepadata->applybdchgs && !disabledualreductions )
    547 {
    548 for( i = 0; i < nvars; ++i )
    549 {
    550 SCIP_Bool tightened;
    551
    552 if( subvars[i] == NULL )
    553 continue;
    554
    555 assert(SCIPisLE(scip, SCIPvarGetLbGlobal(vars[i]), SCIPvarGetLbGlobal(subvars[i])));
    556 assert(SCIPisLE(scip, SCIPvarGetLbGlobal(subvars[i]), SCIPvarGetUbGlobal(subvars[i])));
    557 assert(SCIPisLE(scip, SCIPvarGetUbGlobal(subvars[i]), SCIPvarGetUbGlobal(vars[i])));
    558
    559 /* update the bounds of the original SCIP, if a better bound was proven in the sub-SCIP */
    560 if( global )
    561 {
    562#ifndef NDEBUG
    564#else
    566 return SCIP_INVALIDCALL;
    567#endif
    568 tightened = FALSE;
    569
    570 SCIP_CALL( SCIPtightenVarUbGlobal(scip, vars[i], SCIPvarGetUbGlobal(subvars[i]), FALSE, &cutoff, &tightened) );
    571
    572 if( cutoff )
    573 break;
    574
    575 if( tightened )
    576 nbdchgs++;
    577
    578 tightened = FALSE;
    579
    580 SCIP_CALL( SCIPtightenVarLbGlobal(scip, vars[i], SCIPvarGetLbGlobal(subvars[i]), FALSE, &cutoff, &tightened) );
    581
    582 if( cutoff )
    583 break;
    584
    585 if( tightened )
    586 nbdchgs++;
    587 }
    588 else
    589 {
    590 tightened = FALSE;
    591
    592 SCIP_CALL( SCIPtightenVarUb(scip, vars[i], SCIPvarGetUbGlobal(subvars[i]), FALSE, &cutoff, &tightened) );
    593
    594 if( cutoff )
    595 break;
    596
    597 if( tightened )
    598 nbdchgs++;
    599
    600 tightened = FALSE;
    601
    602 SCIP_CALL( SCIPtightenVarLb(scip, vars[i], SCIPvarGetLbGlobal(subvars[i]), FALSE, &cutoff, &tightened) );
    603
    604 if( cutoff )
    605 break;
    606
    607 if( tightened )
    608 nbdchgs++;
    609 }
    610 }
    611 }
    612
    613 /* install start values for inference branching */
    614 /* @todo use different nbranching counters for pseudo cost and inference values and update inference values in the tree */
    615 if( sepadata->applyinfervals && global && (!sepadata->reducedinfer || soladded || nbdchgs + nconflicts > 0) )
    616 {
    617 for( i = 0; i < nvars; ++i )
    618 {
    619 SCIP_Real downinfer;
    620 SCIP_Real upinfer;
    621 SCIP_Real downvsids;
    622 SCIP_Real upvsids;
    623 SCIP_Real downconflen;
    624 SCIP_Real upconflen;
    625
    626 if( subvars[i] == NULL )
    627 continue;
    628
    629 /* copy downwards branching statistics */
    630 downvsids = SCIPgetVarVSIDS(subscip, subvars[i], SCIP_BRANCHDIR_DOWNWARDS);
    631 downconflen = SCIPgetVarAvgConflictlength(subscip, subvars[i], SCIP_BRANCHDIR_DOWNWARDS);
    632 downinfer = SCIPgetVarAvgInferences(subscip, subvars[i], SCIP_BRANCHDIR_DOWNWARDS);
    633
    634 /* copy upwards branching statistics */
    635 upvsids = SCIPgetVarVSIDS(subscip, subvars[i], SCIP_BRANCHDIR_UPWARDS);
    636 upconflen = SCIPgetVarAvgConflictlength(subscip, subvars[i], SCIP_BRANCHDIR_UPWARDS);
    637 upinfer = SCIPgetVarAvgInferences(subscip, subvars[i], SCIP_BRANCHDIR_UPWARDS);
    638
    639#ifdef SCIP_DEBUG
    640 /* memorize statistics */
    641 if( downinfer+downconflen+downvsids > 0.0 || upinfer+upconflen+upvsids != 0 )
    642 n1startinfers++;
    643
    644 if( downinfer+downconflen+downvsids > 0.0 && upinfer+upconflen+upvsids != 0 )
    645 n2startinfers++;
    646#endif
    647
    648 SCIP_CALL( SCIPinitVarBranchStats(scip, vars[i], 0.0, 0.0, downvsids, upvsids, downconflen, upconflen, downinfer, upinfer, 0.0, 0.0) );
    649 }
    650 }
    651
    652#ifdef SCIP_DEBUG
    653 if( cutoff )
    654 {
    655 SCIPdebugMsg(scip, "Rapidlearning detected %s infeasibility.\n", global ? "global" : "local");
    656 }
    657
    658 SCIPdebugMsg(scip, "Rapidlearning added %d %s conflicts, changed %d bounds, %s primal solution, %s dual bound improvement.\n",
    659 nconflicts, global ? "global" : "local", nbdchgs, soladded ? "found" : "no", dualboundchg ? "found" : "no");
    660
    661 SCIPdebugMsg(scip, "YYY Infervalues initialized on one side: %5.2f %% of variables, %5.2f %% on both sides\n",
    662 100.0 * n1startinfers/(SCIP_Real)nvars, 100.0 * n2startinfers/(SCIP_Real)nvars);
    663#endif
    664
    665 /* change result pointer */
    666 if( cutoff )
    667 *result = SCIP_CUTOFF;
    668 else if( nconflicts > 0 || dualboundchg )
    669 *result = SCIP_CONSADDED;
    670 else if( nbdchgs > 0 )
    671 *result = SCIP_REDUCEDDOM;
    672
    673 /* free local data */
    674 assert(oldnconss != NULL);
    675 assert(conshdlrs != NULL);
    676 assert(varmapbw != NULL);
    677 SCIPfreeBufferArray(scip, &oldnconss);
    678 SCIPfreeBufferArray(scip, &conshdlrs);
    679 SCIPhashmapFree(&varmapbw);
    680
    681 /* free subproblem */
    682 SCIPfreeBufferArray(scip, &subvars);
    683
    684 return SCIP_OKAY;
    685}
    686
    687/** returns whether rapid learning is allowed to run locally */
    688static
    690 SCIP* scip, /**< SCIP data structure */
    691 SCIP_SEPADATA* sepadata, /**< separator's private data */
    692 SCIP_Bool* run /**< pointer to store whether rapid learning is allowed to run */
    693 )
    694{
    695 assert(scip != NULL);
    696 assert(sepadata != NULL);
    697
    698 *run = FALSE;
    699
    700 /* return TRUE if local exec should not be checked */
    701 if( !sepadata->checkexec )
    702 {
    703 *run = TRUE;
    704 }
    705
    706 /* problem has zero objective function, i.e., it is a pure feasibility problem */
    707 if( !(*run) && sepadata->checkobj && SCIPgetNObjVars(scip) == 0 )
    708 {
    709 SCIPdebugMsg(scip, "-> allow local rapid learning due to global zero objective\n");
    710
    711 *run = TRUE;
    712 }
    713
    714 /* check whether a solution was found */
    715 if( !(*run) && sepadata->checknsols && SCIPgetNSolsFound(scip) == 0 )
    716 {
    717 SCIPdebugMsg(scip, "-> allow local rapid learning due to no solution found so far\n");
    718
    719 *run = TRUE;
    720 }
    721
    722 /* check whether the dual bound has not changed since the root node */
    723 if( !(*run) && sepadata->checkdualbound && sepadata->nwaitingnodes < SCIPgetNNodes(scip) )
    724 {
    725 SCIP_Real rootdualbound;
    726 SCIP_Real locdualbound;
    727
    728 rootdualbound = SCIPgetLowerboundRoot(scip);
    729 locdualbound = SCIPgetLocalLowerbound(scip);
    730 assert(!SCIPisInfinity(scip, locdualbound));
    731
    732 if( SCIPisEQ(scip, rootdualbound, locdualbound) )
    733 {
    734 SCIPdebugMsg(scip, "-> allow local rapid learning due to equal dualbound\n");
    735
    736 *run = TRUE;
    737 }
    738 }
    739
    740 /* check leaf nodes */
    741 if( !(*run) && sepadata->checkleaves )
    742 {
    744
    745 if( SCIPisLE(scip, sepadata->mininflpratio, ratio) )
    746 {
    747 SCIPdebugMsg(scip, "-> allow local rapid learning due to inf/obj leaves ratio\n");
    748
    749 *run = TRUE;
    750 }
    751 }
    752
    753 /* check whether all undecided integer variables have zero objective coefficient */
    754 if( !(*run) && sepadata->checkobj )
    755 {
    756 SCIP_Bool allzero;
    757 SCIP_VAR** vars;
    758 int ndiscvars;
    759 int i;
    760
    761 allzero = TRUE;
    762 vars = SCIPgetVars(scip);
    764
    765 for( i = 0; i < ndiscvars; i++ )
    766 {
    767 assert(SCIPvarIsIntegral(vars[i]));
    768
    769 /* skip locally fixed variables */
    770 if( SCIPisEQ(scip, SCIPvarGetLbLocal(vars[i]), SCIPvarGetUbLocal(vars[i])) )
    771 continue;
    772
    773 if( !SCIPisZero(scip, SCIPvarGetObj(vars[i])) )
    774 {
    775 allzero = FALSE;
    776 break;
    777 }
    778 }
    779
    780 if( allzero )
    781 {
    782 SCIPdebugMsg(scip, "-> allow local rapid learning due to local zero objective\n");
    783
    784 *run = TRUE;
    785 }
    786 }
    787
    788 /* check degeneracy */
    789 if( !(*run) && sepadata->checkdegeneracy )
    790 {
    791 SCIP_Real degeneracy;
    792 SCIP_Real varconsratio;
    793
    794 SCIP_CALL( SCIPgetLPDualDegeneracy(scip, &degeneracy, &varconsratio) );
    795
    796 SCIPdebugMsg(scip, "degeneracy: %.2f ratio: %.2f\n", degeneracy, varconsratio);
    797
    798 if( degeneracy >= sepadata->mindegeneracy || varconsratio >= sepadata->minvarconsratio )
    799 {
    800 SCIPdebugMsg(scip, "-> allow local rapid learning due to degeneracy\n");
    801
    802 *run = TRUE;
    803 }
    804 }
    805
    806 return SCIP_OKAY;
    807}
    808
    809/** LP solution separation method of separator */
    810static
    811SCIP_DECL_SEPAEXECLP(sepaExeclpRapidlearning)
    812{/*lint --e{715}*/
    813 SCIP_VAR** vars;
    814 SCIP* subscip;
    815 SCIP_SEPADATA* sepadata;
    816 SCIP_Bool global;
    817 SCIP_Bool run;
    818 SCIP_Bool success;
    819 SCIP_RETCODE retcode;
    820 int nvars;
    821 int ncontvars;
    822 int ndiscvars;
    823 int i;
    824
    825 assert(scip != NULL);
    826 assert(sepa != NULL);
    827 assert(result != NULL);
    828
    829 *result = SCIP_DIDNOTRUN;
    830
    831 /* get separator's data */
    832 sepadata = SCIPsepaGetData(sepa);
    833 assert(sepadata != NULL);
    834
    835 ncontvars = SCIPgetNContVars(scip);
    836
    837 /* only run for integral programs */
    838 if( !sepadata->contvars && ncontvars >= 1 )
    839 return SCIP_OKAY;
    840
    841 nvars = SCIPgetNVars(scip);
    842 ndiscvars = nvars - ncontvars;
    843 assert(ndiscvars >= 0);
    844
    845 /* only run when still unfixed binary variables can exist */
    846 if( ndiscvars == 0 )
    847 return SCIP_OKAY;
    848
    849 /* only run if there are few enough continuous variables */
    850 if( sepadata->contvars && ncontvars > sepadata->contvarsquot * nvars )
    851 return SCIP_OKAY;
    852
    853 /* do not call rapid learning if the problem is too big */
    854 if( nvars > sepadata->maxnvars || SCIPgetNConss(scip) > sepadata->maxnconss )
    855 return SCIP_OKAY;
    856
    857 /* call separator at most maxcalls times */
    858 if( SCIPsepaGetNCalls(sepa) >= sepadata->maxcalls )
    859 return SCIP_OKAY;
    860
    861 /* do not run if pricers are present */
    862 if( SCIPgetNActivePricers(scip) > 0 )
    863 return SCIP_OKAY;
    864
    865 /* if the separator should be exclusive to the root node, this prevents multiple calls due to restarts */
    866 if( SCIPsepaGetFreq(sepa) == 0 && SCIPsepaGetNCalls(sepa) > 0 )
    867 return SCIP_OKAY;
    868
    869 /* call separator at most once per node */
    870 if( SCIPsepaGetNCallsAtNode(sepa) > 0 )
    871 return SCIP_OKAY;
    872
    873 /* the information deduced from rapid learning is globally valid only if we are at the root node; thus we can't use
    874 * the depth argument of the callback
    875 */
    877
    878 /* check if rapid learning should be applied locally */
    879 SCIP_CALL( checkExec(scip, sepadata, &run) );
    880
    881 /* @todo check whether we want to run at the root node again, e.g., inf/obj ratio is large enough */
    882 if( !run )
    883 return SCIP_OKAY;
    884
    885 if( SCIPisStopped(scip) )
    886 return SCIP_OKAY;
    887
    888 /* check whether there is enough time and memory left */
    889 SCIP_CALL( SCIPcheckCopyLimits(scip, &success) );
    890
    891 if( !success)
    892 return SCIP_OKAY;
    893
    894 /* skip rapid learning when the sub-SCIP would contain an integer variable with an infinite bound in direction of the
    895 * objective function; this might lead to very bad branching decisions when enforcing a pseudo solution (#1439)
    896 */
    897 vars = SCIPgetVars(scip);
    898 for( i = SCIPgetNBinVars(scip); i < ndiscvars; i++ )
    899 {
    900 SCIP_Real lb = SCIPvarGetLbLocal(vars[i]);
    901 SCIP_Real ub = SCIPvarGetUbLocal(vars[i]);
    902 SCIP_Real obj = SCIPvarGetObj(vars[i]);
    903
    904 if( (SCIPisNegative(scip, obj) && SCIPisInfinity(scip, ub))
    905 || (SCIPisPositive(scip, obj) && SCIPisInfinity(scip, -lb)) )
    906 {
    907 SCIPdebugMsg(scip, "unbounded integer variable %s (in [%g,%g]) with objective %g -> skip rapid learning\n",
    908 SCIPvarGetName(vars[i]), lb, ub, obj);
    909 return SCIP_OKAY;
    910 }
    911 }
    912
    913 *result = SCIP_DIDNOTFIND;
    914
    915 SCIP_CALL( SCIPcreate(&subscip) );
    916
    917 retcode = setupAndSolveSubscipRapidlearning(scip, subscip, sepadata, (int)SCIPsepaGetNCalls(sepa)+1, global, result);
    918
    919 SCIP_CALL( SCIPfree(&subscip) );
    920
    921 return retcode;
    922}
    923
    924
    925/*
    926 * separator specific interface methods
    927 */
    928
    929/** creates the rapidlearning separator and includes it in SCIP */
    931 SCIP* scip /**< SCIP data structure */
    932 )
    933{
    934 SCIP_SEPADATA* sepadata;
    935 SCIP_SEPA* sepa;
    936
    937 /* create rapidlearning separator data */
    938 SCIP_CALL( SCIPallocBlockMemory(scip, &sepadata) );
    939
    940 /* include separator */
    943 sepaExeclpRapidlearning, NULL,
    944 sepadata) );
    945
    946 assert(sepa != NULL);
    947
    948 /* set non-NULL pointers to callback methods */
    949 SCIP_CALL( SCIPsetSepaCopy(scip, sepa, sepaCopyRapidlearning) );
    950 SCIP_CALL( SCIPsetSepaFree(scip, sepa, sepaFreeRapidlearning) );
    951
    952 /* add rapidlearning separator parameters */
    953 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/applyconflicts",
    954 "should the found conflicts be applied in the original SCIP?",
    955 &sepadata->applyconflicts, TRUE, DEFAULT_APPLYCONFLICTS, NULL, NULL) );
    956
    957 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/applybdchgs",
    958 "should the found global bound deductions be applied in the original SCIP?",
    959 &sepadata->applybdchgs, TRUE, DEFAULT_APPLYBDCHGS, NULL, NULL) );
    960
    961 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/applyinfervals",
    962 "should the inference values be used as initialization in the original SCIP?",
    963 &sepadata->applyinfervals, TRUE, DEFAULT_APPLYINFERVALS, NULL, NULL) );
    964
    965 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/reducedinfer",
    966 "should the inference values only be used when " SEPA_NAME " found other reductions?",
    967 &sepadata->reducedinfer, TRUE, DEFAULT_REDUCEDINFER, NULL, NULL) );
    968
    969 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/applyprimalsol",
    970 "should the incumbent solution be copied to the original SCIP?",
    971 &sepadata->applyprimalsol, TRUE, DEFAULT_APPLYPRIMALSOL, NULL, NULL) );
    972
    973 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/applysolved",
    974 "should a solved status be copied to the original SCIP?",
    975 &sepadata->applysolved, TRUE, DEFAULT_APPLYSOLVED, NULL, NULL) );
    976
    977 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/checkdegeneracy",
    978 "should local LP degeneracy be checked?",
    979 &sepadata->checkdegeneracy, TRUE, DEFAULT_CHECKDEGANERACY, NULL, NULL) );
    980
    981 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/checkdualbound",
    982 "should the progress on the dual bound be checked?",
    983 &sepadata->checkdualbound, TRUE, DEFAULT_CHECKDUALBOUND, NULL, NULL) );
    984
    985 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/checkleaves",
    986 "should the ratio of leaves proven to be infeasible and exceeding the cutoff bound be checked?",
    987 &sepadata->checkleaves, TRUE, DEFAULT_CHECKLEAVES, NULL, NULL) );
    988
    989 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/checkexec",
    990 "check whether rapid learning should be executed",
    991 &sepadata->checkexec, TRUE, DEFAULT_CHECKEXEC, NULL, NULL) );
    992
    993 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/checkobj",
    994 "should the (local) objective function be checked?",
    995 &sepadata->checkobj, TRUE, DEFAULT_CHECKOBJ, NULL, NULL) );
    996
    997 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/checknsols",
    998 "should the number of solutions found so far be checked?",
    999 &sepadata->checknsols, TRUE, DEFAULT_CHECKNSOLS, NULL, NULL) );
    1000
    1001 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/contvars",
    1002 "should rapid learning be applied when there are continuous variables?",
    1003 &sepadata->contvars, TRUE, DEFAULT_CONTVARS, NULL, NULL) );
    1004
    1005 SCIP_CALL( SCIPaddRealParam(scip, "separating/" SEPA_NAME "/contvarsquot",
    1006 "maximal portion of continuous variables to apply rapid learning",
    1007 &sepadata->contvarsquot, TRUE, DEFAULT_CONTVARSQUOT, 0.0, 1.0, NULL, NULL) );
    1008
    1009 SCIP_CALL( SCIPaddRealParam(scip, "separating/" SEPA_NAME "/lpiterquot",
    1010 "maximal fraction of LP iterations compared to node LP iterations",
    1011 &sepadata->lpiterquot, TRUE, DEFAULT_LPITERQUOT, 0.0, SCIP_REAL_MAX, NULL, NULL) );
    1012
    1013 SCIP_CALL( SCIPaddRealParam(scip, "separating/" SEPA_NAME "/mindegeneracy",
    1014 "minimal degeneracy threshold to allow local rapid learning",
    1015 &sepadata->mindegeneracy, TRUE, DEFAULT_MINDEGENERACY, 0.0, 1.0, NULL, NULL) );
    1016
    1017 SCIP_CALL( SCIPaddRealParam(scip, "separating/" SEPA_NAME "/mininflpratio",
    1018 "minimal threshold of inf/obj leaves to allow local rapid learning",
    1019 &sepadata->mininflpratio, TRUE, DEFAULT_MININFLPRATIO, 0.0, SCIP_REAL_MAX, NULL, NULL) );
    1020
    1021 SCIP_CALL( SCIPaddRealParam(scip, "separating/" SEPA_NAME "/minvarconsratio",
    1022 "minimal ratio of unfixed variables in relation to basis size to allow local rapid learning",
    1023 &sepadata->minvarconsratio, TRUE, DEFAULT_MINVARCONSRATIO, 1.0, SCIP_REAL_MAX, NULL, NULL) );
    1024
    1025 SCIP_CALL( SCIPaddIntParam(scip, "separating/" SEPA_NAME "/maxnvars",
    1026 "maximum problem size (variables) for which rapid learning will be called",
    1027 &sepadata->maxnvars, TRUE, DEFAULT_MAXNVARS, 0, INT_MAX, NULL, NULL) );
    1028
    1029 SCIP_CALL( SCIPaddIntParam(scip, "separating/" SEPA_NAME "/maxnconss",
    1030 "maximum problem size (constraints) for which rapid learning will be called",
    1031 &sepadata->maxnconss, TRUE, DEFAULT_MAXNCONSS, 0, INT_MAX, NULL, NULL) );
    1032
    1033 SCIP_CALL( SCIPaddIntParam(scip, "separating/" SEPA_NAME "/maxcalls",
    1034 "maximum number of overall calls",
    1035 &sepadata->maxcalls, TRUE, DEFAULT_MAXCALLS, 0, INT_MAX, NULL, NULL) );
    1036
    1037 SCIP_CALL( SCIPaddIntParam(scip, "separating/" SEPA_NAME "/maxnodes",
    1038 "maximum number of nodes considered in rapid learning run",
    1039 &sepadata->maxnodes, TRUE, DEFAULT_MAXNODES, 0, INT_MAX, NULL, NULL) );
    1040
    1041 SCIP_CALL( SCIPaddIntParam(scip, "separating/" SEPA_NAME "/minnodes",
    1042 "minimum number of nodes considered in rapid learning run",
    1043 &sepadata->minnodes, TRUE, DEFAULT_MINNODES, 0, INT_MAX, NULL, NULL) );
    1044
    1045 SCIP_CALL( SCIPaddLongintParam(scip, "separating/" SEPA_NAME "/nwaitingnodes",
    1046 "number of nodes that should be processed before rapid learning is executed locally based on the progress of the dualbound",
    1047 &sepadata->nwaitingnodes, TRUE, DEFAULT_NWAITINGNODES, 0L, SCIP_LONGINT_MAX, NULL, NULL) );
    1048
    1049 SCIP_CALL( SCIPaddBoolParam(scip, "separating/" SEPA_NAME "/copycuts",
    1050 "should all active cuts from cutpool be copied to constraints in subproblem?",
    1051 &sepadata->copycuts, TRUE, DEFAULT_COPYCUTS, NULL, NULL) );
    1052
    1053 return SCIP_OKAY;
    1054}
    #define NULL
    Definition: def.h:257
    #define SCIP_Longint
    Definition: def.h:150
    #define SCIP_REAL_MAX
    Definition: def.h:167
    #define SCIP_Bool
    Definition: def.h:100
    #define MIN(x, y)
    Definition: def.h:233
    #define SCIP_STRINGEQ(name, reference, retcode)
    Definition: def.h:454
    #define SCIP_Real
    Definition: def.h:165
    #define TRUE
    Definition: def.h:102
    #define FALSE
    Definition: def.h:103
    #define MAX(x, y)
    Definition: def.h:229
    #define SCIP_CALL_ABORT(x)
    Definition: def.h:343
    #define SCIP_LONGINT_FORMAT
    Definition: def.h:157
    #define SCIP_LONGINT_MAX
    Definition: def.h:151
    #define SCIP_CALL(x)
    Definition: def.h:364
    SCIP_RETCODE SCIPcopyConsCompression(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, const char *suffix, SCIP_VAR **fixedvars, SCIP_Real *fixedvals, int nfixedvars, SCIP_Bool global, SCIP_Bool enablepricing, SCIP_Bool threadsafe, SCIP_Bool passmessagehdlr, SCIP_Bool *valid)
    Definition: scip_copy.c:2962
    SCIP_RETCODE SCIPcheckCopyLimits(SCIP *sourcescip, SCIP_Bool *success)
    Definition: scip_copy.c:3250
    SCIP_RETCODE SCIPgetConsCopy(SCIP *sourcescip, SCIP *targetscip, SCIP_CONS *sourcecons, SCIP_CONS **targetcons, SCIP_CONSHDLR *sourceconshdlr, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, const char *name, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool global, SCIP_Bool *valid)
    Definition: scip_copy.c:1581
    SCIP_RETCODE SCIPcopyCuts(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_Bool global, int *ncutsadded)
    Definition: scip_copy.c:2114
    SCIP_RETCODE SCIPtranslateSubSol(SCIP *scip, SCIP *subscip, SCIP_SOL *subsol, SCIP_HEUR *heur, SCIP_VAR **subvars, SCIP_SOL **newsol)
    Definition: scip_copy.c:1398
    SCIP_RETCODE SCIPcopyLimits(SCIP *sourcescip, SCIP *targetscip)
    Definition: scip_copy.c:3293
    SCIP_Bool SCIPisStopped(SCIP *scip)
    Definition: scip_general.c:767
    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 SCIPgetNObjVars(SCIP *scip)
    Definition: scip_prob.c:2616
    int SCIPgetNIntVars(SCIP *scip)
    Definition: scip_prob.c:2340
    int SCIPgetNImplVars(SCIP *scip)
    Definition: scip_prob.c:2387
    int SCIPgetNContVars(SCIP *scip)
    Definition: scip_prob.c:2569
    SCIP_RETCODE SCIPsetObjlimit(SCIP *scip, SCIP_Real objlimit)
    Definition: scip_prob.c:1661
    SCIP_RETCODE SCIPgetVarsData(SCIP *scip, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars, int *nimplvars, int *ncontvars)
    Definition: scip_prob.c:2115
    int SCIPgetNVars(SCIP *scip)
    Definition: scip_prob.c:2246
    int SCIPgetNConss(SCIP *scip)
    Definition: scip_prob.c:3620
    SCIP_VAR ** SCIPgetVars(SCIP *scip)
    Definition: scip_prob.c:2201
    int SCIPgetNBinVars(SCIP *scip)
    Definition: scip_prob.c:2293
    void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
    Definition: misc.c:3095
    void * SCIPhashmapGetImage(SCIP_HASHMAP *hashmap, void *origin)
    Definition: misc.c:3284
    SCIP_RETCODE SCIPhashmapInsert(SCIP_HASHMAP *hashmap, void *origin, void *image)
    Definition: misc.c:3143
    SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
    Definition: misc.c:3061
    SCIP_Real SCIPgetLocalLowerbound(SCIP *scip)
    Definition: scip_prob.c:4178
    SCIP_RETCODE SCIPupdateLocalDualbound(SCIP *scip, SCIP_Real newbound)
    Definition: scip_prob.c:4239
    SCIP_RETCODE SCIPaddConflict(SCIP *scip, SCIP_NODE *node, SCIP_CONS **cons, SCIP_NODE *validnode, SCIP_CONFTYPE conftype, SCIP_Bool iscutoffinvolved)
    Definition: scip_prob.c:3806
    #define SCIPdebugMsg
    Definition: scip_message.h:78
    void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
    Definition: scip_message.c:120
    SCIP_RETCODE SCIPaddLongintParam(SCIP *scip, const char *name, const char *desc, SCIP_Longint *valueptr, SCIP_Bool isadvanced, SCIP_Longint defaultvalue, SCIP_Longint minvalue, SCIP_Longint maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:111
    SCIP_Bool SCIPisParamFixed(SCIP *scip, const char *name)
    Definition: scip_param.c:219
    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_RETCODE SCIPsetLongintParam(SCIP *scip, const char *name, SCIP_Longint value)
    Definition: scip_param.c:545
    SCIP_RETCODE SCIPaddRealParam(SCIP *scip, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:139
    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 SCIPunfixParam(SCIP *scip, const char *name)
    Definition: scip_param.c:385
    SCIP_RETCODE SCIPsetPresolving(SCIP *scip, SCIP_PARAMSETTING paramsetting, SCIP_Bool quiet)
    Definition: scip_param.c:956
    SCIP_RETCODE SCIPsetEmphasis(SCIP *scip, SCIP_PARAMEMPHASIS paramemphasis, SCIP_Bool quiet)
    Definition: scip_param.c:882
    SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:57
    SCIP_RETCODE SCIPgetIntParam(SCIP *scip, const char *name, int *value)
    Definition: scip_param.c:269
    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
    SCIP_RETCODE SCIPsetSeparating(SCIP *scip, SCIP_PARAMSETTING paramsetting, SCIP_Bool quiet)
    Definition: scip_param.c:985
    int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
    Definition: cons.c:4782
    SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
    Definition: scip_cons.c:940
    SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
    Definition: cons.c:4739
    SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
    Definition: cons.c:8652
    SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
    Definition: cons.c:8562
    SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
    Definition: cons.c:8592
    SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
    Definition: cons.c:8582
    SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
    Definition: cons.c:8612
    const char * SCIPconsGetName(SCIP_CONS *cons)
    Definition: cons.c:8393
    SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
    Definition: cons.c:8572
    SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
    Definition: cons.c:8662
    SCIP_RETCODE SCIPgetLPDualDegeneracy(SCIP *scip, SCIP_Real *degeneracy, SCIP_Real *varconsratio)
    Definition: scip_lp.c:2757
    BMS_BLKMEM * SCIPblkmem(SCIP *scip)
    Definition: scip_mem.c:57
    #define SCIPallocBufferArray(scip, ptr, num)
    Definition: scip_mem.h:124
    #define SCIPfreeBufferArray(scip, ptr)
    Definition: scip_mem.h:136
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPallocBlockMemory(scip, ptr)
    Definition: scip_mem.h:89
    int SCIPgetNActivePricers(SCIP *scip)
    Definition: scip_pricer.c:348
    SCIP_RETCODE SCIPincludeSepaBasic(SCIP *scip, SCIP_SEPA **sepa, const char *name, const char *desc, int priority, int freq, SCIP_Real maxbounddist, SCIP_Bool usessubscip, SCIP_Bool delay, SCIP_DECL_SEPAEXECLP((*sepaexeclp)), SCIP_DECL_SEPAEXECSOL((*sepaexecsol)), SCIP_SEPADATA *sepadata)
    Definition: scip_sepa.c:115
    int SCIPsepaGetFreq(SCIP_SEPA *sepa)
    Definition: sepa.c:790
    const char * SCIPsepaGetName(SCIP_SEPA *sepa)
    Definition: sepa.c:746
    int SCIPsepaGetNCallsAtNode(SCIP_SEPA *sepa)
    Definition: sepa.c:893
    SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAFREE((*sepafree)))
    Definition: scip_sepa.c:173
    SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
    Definition: sepa.c:636
    void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
    Definition: sepa.c:646
    SCIP_RETCODE SCIPsetSepaCopy(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPACOPY((*sepacopy)))
    Definition: scip_sepa.c:157
    SCIP_Longint SCIPsepaGetNCalls(SCIP_SEPA *sepa)
    Definition: sepa.c:873
    int SCIPgetNSols(SCIP *scip)
    Definition: scip_sol.c:2887
    SCIP_SOL ** SCIPgetSols(SCIP *scip)
    Definition: scip_sol.c:2936
    SCIP_RETCODE SCIPtrySolFree(SCIP *scip, SCIP_SOL **sol, SCIP_Bool printreason, SCIP_Bool completely, SCIP_Bool checkbounds, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool *stored)
    Definition: scip_sol.c:4114
    SCIP_Real SCIPgetSolOrigObj(SCIP *scip, SCIP_SOL *sol)
    Definition: scip_sol.c:1890
    SCIP_Real SCIPretransformObj(SCIP *scip, SCIP_Real obj)
    Definition: scip_sol.c:2134
    SCIP_RETCODE SCIPtransformProb(SCIP *scip)
    Definition: scip_solve.c:232
    SCIP_RETCODE SCIPpresolve(SCIP *scip)
    Definition: scip_solve.c:2425
    SCIP_RETCODE SCIPsolve(SCIP *scip)
    Definition: scip_solve.c:2611
    SCIP_Longint SCIPgetNSolsFound(SCIP *scip)
    SCIP_Real SCIPgetUpperbound(SCIP *scip)
    SCIP_Real SCIPgetLowerboundRoot(SCIP *scip)
    SCIP_Longint SCIPgetNInfeasibleLeaves(SCIP *scip)
    SCIP_Longint SCIPgetNNodes(SCIP *scip)
    SCIP_Real SCIPgetDualbound(SCIP *scip)
    int SCIPgetNRootboundChgs(SCIP *scip)
    SCIP_RETCODE SCIPprintStatistics(SCIP *scip, FILE *file)
    SCIP_Longint SCIPgetNLPs(SCIP *scip)
    SCIP_Longint SCIPgetNConflictConssApplied(SCIP *scip)
    SCIP_Longint SCIPgetNObjlimLeaves(SCIP *scip)
    SCIP_Longint SCIPgetNConflictConssFound(SCIP *scip)
    SCIP_Longint SCIPgetNLPIterations(SCIP *scip)
    SCIP_Bool SCIPisPositive(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisFeasLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
    int SCIPgetEffectiveRootDepth(SCIP *scip)
    Definition: scip_tree.c:127
    int SCIPgetDepth(SCIP *scip)
    Definition: scip_tree.c:672
    SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
    Definition: scip_tree.c:91
    SCIP_RETCODE SCIPinitVarBranchStats(SCIP *scip, SCIP_VAR *var, SCIP_Real downpscost, SCIP_Real uppscost, SCIP_Real downvsids, SCIP_Real upvsids, SCIP_Real downconflen, SCIP_Real upconflen, SCIP_Real downinfer, SCIP_Real upinfer, SCIP_Real downcutoff, SCIP_Real upcutoff)
    Definition: scip_var.c:12009
    SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
    Definition: scip_var.c:6401
    SCIP_RETCODE SCIPtightenVarUbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
    Definition: scip_var.c:8257
    SCIP_Bool SCIPvarIsImpliedIntegral(SCIP_VAR *var)
    Definition: var.c:23530
    SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
    Definition: var.c:24300
    SCIP_Real SCIPgetVarAvgConflictlength(SCIP *scip, SCIP_VAR *var, SCIP_BRANCHDIR dir)
    Definition: scip_var.c:11837
    SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
    Definition: var.c:23932
    SCIP_RETCODE SCIPchgVarImplType(SCIP *scip, SCIP_VAR *var, SCIP_IMPLINTTYPE impltype, SCIP_Bool *infeasible)
    Definition: scip_var.c:10218
    SCIP_RETCODE SCIPtightenVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
    Definition: scip_var.c:6651
    SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
    Definition: var.c:24174
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23299
    SCIP_Bool SCIPvarIsIntegral(SCIP_VAR *var)
    Definition: var.c:23522
    SCIP_RETCODE SCIPchgVarType(SCIP *scip, SCIP_VAR *var, SCIP_VARTYPE vartype, SCIP_Bool *infeasible)
    Definition: scip_var.c:10113
    SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
    Definition: var.c:24266
    SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
    Definition: var.c:24152
    SCIP_VAR * SCIPvarGetTransVar(SCIP_VAR *var)
    Definition: var.c:23704
    SCIP_Real SCIPgetVarVSIDS(SCIP *scip, SCIP_VAR *var, SCIP_BRANCHDIR dir)
    Definition: scip_var.c:11649
    SCIP_Real SCIPgetVarAvgInferences(SCIP *scip, SCIP_VAR *var, SCIP_BRANCHDIR dir)
    Definition: scip_var.c:11891
    SCIP_Bool SCIPallowStrongDualReds(SCIP *scip)
    Definition: scip_var.c:10984
    SCIP_RETCODE SCIPtightenVarLbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
    Definition: scip_var.c:8026
    SCIP_RETCODE SCIPincludeSepaRapidlearning(SCIP *scip)
    methods commonly used by primal heuristics
    public methods for problem variables
    default SCIP plugins
    #define DEFAULT_CHECKDUALBOUND
    #define SEPA_PRIORITY
    #define DEFAULT_CHECKOBJ
    #define DEFAULT_MAXNCONSS
    #define DEFAULT_CHECKLEAVES
    #define DEFAULT_MINVARCONSRATIO
    #define SEPA_DELAY
    #define DEFAULT_NWAITINGNODES
    #define DEFAULT_CHECKEXEC
    #define DEFAULT_COPYCUTS
    #define DEFAULT_MAXNODES
    #define DEFAULT_MINNODES
    #define DEFAULT_CHECKNSOLS
    #define DEFAULT_APPLYSOLVED
    #define SEPA_DESC
    static SCIP_DECL_SEPACOPY(sepaCopyRapidlearning)
    #define SEPA_USESSUBSCIP
    #define DEFAULT_CONTVARS
    #define DEFAULT_CHECKDEGANERACY
    #define DEFAULT_LPITERQUOT
    #define DEFAULT_REDUCEDINFER
    #define DEFAULT_CONTVARSQUOT
    static SCIP_RETCODE setupAndSolveSubscipRapidlearning(SCIP *scip, SCIP *subscip, SCIP_SEPADATA *sepadata, int randseed, SCIP_Bool global, SCIP_RESULT *result)
    #define DEFAULT_MAXNVARS
    static SCIP_DECL_SEPAFREE(sepaFreeRapidlearning)
    static SCIP_DECL_SEPAEXECLP(sepaExeclpRapidlearning)
    #define DEFAULT_MAXCALLS
    #define DEFAULT_MININFLPRATIO
    #define SEPA_MAXBOUNDDIST
    #define SEPA_FREQ
    #define DEFAULT_APPLYCONFLICTS
    #define SEPA_NAME
    static SCIP_RETCODE checkExec(SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_Bool *run)
    #define DEFAULT_APPLYBDCHGS
    #define DEFAULT_APPLYPRIMALSOL
    #define DEFAULT_MINDEGENERACY
    #define DEFAULT_APPLYINFERVALS
    rapidlearning separator
    @ SCIP_CONFTYPE_UNKNOWN
    Definition: type_conflict.h:61
    @ SCIP_BRANCHDIR_DOWNWARDS
    Definition: type_history.h:43
    @ SCIP_BRANCHDIR_UPWARDS
    Definition: type_history.h:44
    @ SCIP_PARAMSETTING_OFF
    Definition: type_paramset.h:63
    @ SCIP_PARAMSETTING_FAST
    Definition: type_paramset.h:62
    @ SCIP_PARAMEMPHASIS_CPSOLVER
    Definition: type_paramset.h:72
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_CUTOFF
    Definition: type_result.h:48
    @ SCIP_REDUCEDDOM
    Definition: type_result.h:51
    @ SCIP_DIDNOTFIND
    Definition: type_result.h:44
    @ SCIP_CONSADDED
    Definition: type_result.h:52
    enum SCIP_Result SCIP_RESULT
    Definition: type_result.h:61
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_INVALIDCALL
    Definition: type_retcode.h:51
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    struct SCIP_SepaData SCIP_SEPADATA
    Definition: type_sepa.h:52
    @ SCIP_STAGE_SOLVED
    Definition: type_set.h:54
    @ SCIP_STATUS_OPTIMAL
    Definition: type_stat.h:43
    @ SCIP_STATUS_INFEASIBLE
    Definition: type_stat.h:44
    @ SCIP_IMPLINTTYPE_NONE
    Definition: type_var.h:90
    @ SCIP_VARTYPE_INTEGER
    Definition: type_var.h:65