Scippy

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