SCIP

    Solving Constraint Integer Programs

    cutsel_hybrid.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 cutsel_hybrid.c
    26 * @ingroup DEFPLUGINS_CUTSEL
    27 * @brief hybrid cut selector
    28 * @author Leona Gottwald
    29 * @author Felipe Serrano
    30 * @author Mark Turner
    31 */
    32
    33/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    34
    35#include "scip/scip_cutsel.h"
    36#include "scip/scip_cut.h"
    37#include "scip/scip_lp.h"
    39#include "scip/cutsel_hybrid.h"
    40
    41
    42#define CUTSEL_NAME "hybrid"
    43#define CUTSEL_DESC "weighted sum of efficacy, dircutoffdist, objparal, and intsupport"
    44#define CUTSEL_PRIORITY 8000
    45
    46#define RANDSEED 0x5EED
    47#define GOODSCORE 0.9
    48#define BADSCORE 0.0
    49
    50#define DEFAULT_EFFICACYWEIGHT 1.0 /**< weight of efficacy in score calculation */
    51#define DEFAULT_DIRCUTOFFDISTWEIGHT 0.0 /**< weight of directed cutoff distance in score calculation */
    52#define DEFAULT_OBJPARALWEIGHT 0.1 /**< weight of objective parallelism in score calculation */
    53#define DEFAULT_INTSUPPORTWEIGHT 0.1 /**< weight of integral support in cut score calculation */
    54#define DEFAULT_MINORTHO 0.90 /**< minimal orthogonality for a cut to enter the LP */
    55#define DEFAULT_MINORTHOROOT 0.90 /**< minimal orthogonality for a cut to enter the LP in the root node */
    56
    57/*
    58 * Data structures
    59 */
    60
    61/** cut selector data */
    62struct SCIP_CutselData
    63{
    64 SCIP_RANDNUMGEN* randnumgen; /**< random generator for tiebreaking */
    65 SCIP_Real goodscore; /**< threshold for score of cut relative to best score to be considered good,
    66 * so that less strict filtering is applied */
    67 SCIP_Real badscore; /**< threshold for score of cut relative to best score to be discarded */
    68 SCIP_Real objparalweight; /**< weight of objective parallelism in cut score calculation */
    69 SCIP_Real efficacyweight; /**< weight of efficacy in cut score calculation */
    70 SCIP_Real dircutoffdistweight;/**< weight of directed cutoff distance in cut score calculation */
    71 SCIP_Real intsupportweight; /**< weight of integral support in cut score calculation */
    72 SCIP_Real minortho; /**< minimal orthogonality for a cut to enter the LP */
    73 SCIP_Real minorthoroot; /**< minimal orthogonality for a cut to enter the LP in the root node */
    74};
    75
    76
    77/*
    78 * Local methods
    79 */
    80
    81/** returns the maximum score of cuts; if scores is not NULL, then stores the individual score of each cut in scores */
    82static
    84 SCIP* scip, /**< SCIP data structure */
    85 SCIP_ROW** cuts, /**< array with cuts to score */
    86 SCIP_RANDNUMGEN* randnumgen, /**< random number generator for tie-breaking, or NULL */
    87 SCIP_Real dircutoffdistweight,/**< weight of directed cutoff distance in cut score calculation */
    88 SCIP_Real efficacyweight, /**< weight of efficacy in cut score calculation */
    89 SCIP_Real objparalweight, /**< weight of objective parallelism in cut score calculation */
    90 SCIP_Real intsupportweight, /**< weight of integral support in cut score calculation */
    91 int ncuts, /**< number of cuts in cuts array */
    92 SCIP_Real* scores /**< array to store the score of cuts or NULL */
    93 )
    94{
    95 SCIP_Real maxscore = 0.0;
    96 SCIP_SOL* sol;
    97 int i;
    98
    99 sol = SCIPgetBestSol(scip);
    100
    101 /* if there is an incumbent and the factor is not 0.0, compute directed cutoff distances for the incumbent */
    102 if( sol != NULL && dircutoffdistweight > 0.0 )
    103 {
    104 for( i = 0; i < ncuts; ++i )
    105 {
    106 SCIP_Real score;
    107 SCIP_Real objparallelism;
    108 SCIP_Real intsupport;
    109 SCIP_Real efficacy;
    110
    111 if( intsupportweight > 0.0 )
    112 intsupport = intsupportweight * SCIPgetRowNumIntCols(scip, cuts[i]) / (SCIP_Real) SCIProwGetNNonz(cuts[i]);
    113 else
    114 intsupport = 0.0;
    115
    116 if( objparalweight > 0.0 )
    117 objparallelism = objparalweight * SCIPgetRowObjParallelism(scip, cuts[i]);
    118 else
    119 objparallelism = 0.0;
    120
    121 efficacy = SCIPgetCutEfficacy(scip, NULL, cuts[i]);
    122
    123 if( SCIProwIsLocal(cuts[i]) )
    124 {
    125 score = dircutoffdistweight * efficacy;
    126 }
    127 else
    128 {
    129 score = SCIPgetCutLPSolCutoffDistance(scip, sol, cuts[i]);
    130 score = dircutoffdistweight * MAX(score, efficacy);
    131 }
    132
    133 efficacy *= efficacyweight;
    134 score += objparallelism + intsupport + efficacy;
    135
    136 /* add small term to prefer global pool cuts */
    137 if( SCIProwIsInGlobalCutpool(cuts[i]) )
    138 score += 1e-4;
    139
    140 if( randnumgen != NULL )
    141 {
    142 score += SCIPrandomGetReal(randnumgen, 0.0, 1e-6);
    143 }
    144
    145 maxscore = MAX(maxscore, score);
    146
    147 if( scores != NULL )
    148 scores[i] = score;
    149 }
    150 }
    151 else
    152 {
    153 /* in case there is no solution add the directed cutoff distance weight to the efficacy weight
    154 * since the efficacy underestimates the directed cuttoff distance
    155 */
    156 efficacyweight += dircutoffdistweight;
    157 for( i = 0; i < ncuts; ++i )
    158 {
    159 SCIP_Real score;
    160 SCIP_Real objparallelism;
    161 SCIP_Real intsupport;
    162 SCIP_Real efficacy;
    163
    164 if( intsupportweight > 0.0 )
    165 intsupport = intsupportweight * SCIPgetRowNumIntCols(scip, cuts[i]) / (SCIP_Real) SCIProwGetNNonz(cuts[i]);
    166 else
    167 intsupport = 0.0;
    168
    169 if( objparalweight > 0.0 )
    170 objparallelism = objparalweight * SCIPgetRowObjParallelism(scip, cuts[i]);
    171 else
    172 objparallelism = 0.0;
    173
    174 efficacy = efficacyweight > 0.0 ? efficacyweight * SCIPgetCutEfficacy(scip, NULL, cuts[i]) : 0.0;
    175
    176 score = objparallelism + intsupport + efficacy;
    177
    178 /* add small term to prefer global pool cuts */
    179 if( SCIProwIsInGlobalCutpool(cuts[i]) )
    180 score += 1e-4;
    181
    182 if( randnumgen != NULL )
    183 {
    184 score += SCIPrandomGetReal(randnumgen, 0.0, 1e-6);
    185 }
    186
    187 maxscore = MAX(maxscore, score);
    188
    189 if( scores != NULL )
    190 scores[i] = score;
    191 }
    192 }
    193 return maxscore;
    194}
    195
    196
    197/** move the cut with the highest score to the first position in the array; there must be at least one cut */
    198static
    200 SCIP_ROW** cuts, /**< array with cuts to perform selection algorithm */
    201 SCIP_Real* scores, /**< array with scores of cuts to perform selection algorithm */
    202 int ncuts /**< number of cuts in given array */
    203 )
    204{
    205 int i;
    206 int bestpos;
    207 SCIP_Real bestscore;
    208
    209 assert(ncuts > 0);
    210 assert(cuts != NULL);
    211 assert(scores != NULL);
    212
    213 bestscore = scores[0];
    214 bestpos = 0;
    215
    216 for( i = 1; i < ncuts; ++i )
    217 {
    218 if( scores[i] > bestscore )
    219 {
    220 bestpos = i;
    221 bestscore = scores[i];
    222 }
    223 }
    224
    225 SCIPswapPointers((void**) &cuts[bestpos], (void**) &cuts[0]);
    226 SCIPswapReals(&scores[bestpos], &scores[0]);
    227}
    228
    229/** filters the given array of cuts to enforce a maximum parallelism constraint
    230 * w.r.t the given cut; moves filtered cuts to the end of the array and returns number of selected cuts */
    231static
    233 SCIP_ROW* cut, /**< cut to filter orthogonality with */
    234 SCIP_ROW** cuts, /**< array with cuts to perform selection algorithm */
    235 SCIP_Real* scores, /**< array with scores of cuts to perform selection algorithm */
    236 int ncuts, /**< number of cuts in given array */
    237 SCIP_Real goodscore, /**< threshold for the score to be considered a good cut */
    238 SCIP_Real goodmaxparall, /**< maximal parallelism for good cuts */
    239 SCIP_Real maxparall /**< maximal parallelism for all cuts that are not good */
    240 )
    241{
    242 int i;
    243
    244 assert( cut != NULL );
    245 assert( ncuts == 0 || cuts != NULL );
    246 assert( ncuts == 0 || scores != NULL );
    247
    248 for( i = ncuts - 1; i >= 0; --i )
    249 {
    250 SCIP_Real thisparall;
    251 SCIP_Real thismaxparall;
    252
    253 thisparall = SCIProwGetParallelism(cut, cuts[i], 'e');
    254 thismaxparall = scores[i] >= goodscore ? goodmaxparall : maxparall;
    255
    256 if( thisparall > thismaxparall )
    257 {
    258 --ncuts;
    259 SCIPswapPointers((void**) &cuts[i], (void**) &cuts[ncuts]);
    260 SCIPswapReals(&scores[i], &scores[ncuts]);
    261 }
    262 }
    263
    264 return ncuts;
    265}
    266
    267
    268/*
    269 * Callback methods of cut selector
    270 */
    271
    272
    273/** copy method for cut selector plugin (called when SCIP copies plugins) */
    274static
    275SCIP_DECL_CUTSELCOPY(cutselCopyHybrid)
    276{ /*lint --e{715}*/
    277 assert(scip != NULL);
    278 assert(cutsel != NULL);
    279
    281
    282 /* call inclusion method of cut selector */
    284
    285 return SCIP_OKAY;
    286}
    287
    288/** destructor of cut selector to free user data (called when SCIP is exiting) */
    289/**! [SnippetCutselFreeHybrid] */
    290static
    291SCIP_DECL_CUTSELFREE(cutselFreeHybrid)
    292{ /*lint --e{715}*/
    293 SCIP_CUTSELDATA* cutseldata;
    294
    295 cutseldata = SCIPcutselGetData(cutsel);
    296
    297 SCIPfreeBlockMemory(scip, &cutseldata);
    298
    299 SCIPcutselSetData(cutsel, NULL);
    300
    301 return SCIP_OKAY;
    302}
    303/**! [SnippetCutselFreeHybrid] */
    304
    305/** initialization method of cut selector (called after problem was transformed) */
    306static
    307SCIP_DECL_CUTSELINIT(cutselInitHybrid)
    308{ /*lint --e{715}*/
    309 SCIP_CUTSELDATA* cutseldata;
    310
    311 cutseldata = SCIPcutselGetData(cutsel);
    312 assert(cutseldata != NULL);
    313
    314 SCIP_CALL( SCIPcreateRandom(scip, &(cutseldata)->randnumgen, RANDSEED, TRUE) );
    315
    316 return SCIP_OKAY;
    317}
    318
    319/** deinitialization method of cut selector (called before transformed problem is freed) */
    320static
    321SCIP_DECL_CUTSELEXIT(cutselExitHybrid)
    322{ /*lint --e{715}*/
    323 SCIP_CUTSELDATA* cutseldata;
    324
    325 cutseldata = SCIPcutselGetData(cutsel);
    326 assert(cutseldata != NULL);
    327 assert(cutseldata->randnumgen != NULL);
    328
    329 SCIPfreeRandom(scip, &cutseldata->randnumgen);
    330
    331 return SCIP_OKAY;
    332}
    333
    334/** cut selection method of cut selector */
    335static
    336SCIP_DECL_CUTSELSELECT(cutselSelectHybrid)
    337{ /*lint --e{715}*/
    338 SCIP_CUTSELDATA* cutseldata;
    339 SCIP_Real goodmaxparall;
    340 SCIP_Real maxparall;
    341
    342 assert(cutsel != NULL);
    343 assert(result != NULL);
    344
    345 *result = SCIP_SUCCESS;
    346
    347 cutseldata = SCIPcutselGetData(cutsel);
    348 assert(cutseldata != NULL);
    349
    350 SCIP_Real minortho = cutseldata->minortho;
    351 if( root )
    352 minortho = cutseldata->minorthoroot;
    353
    354 maxparall = 1.0 - minortho;
    355 goodmaxparall = MAX(0.5, 1.0 - minortho);
    356
    357 SCIP_CALL( SCIPselectCutsHybrid(scip, cuts, forcedcuts, cutseldata->randnumgen, cutseldata->goodscore, cutseldata->badscore,
    358 goodmaxparall, maxparall, cutseldata->dircutoffdistweight, cutseldata->efficacyweight,
    359 cutseldata->objparalweight, cutseldata->intsupportweight, ncuts, nforcedcuts, maxnselectedcuts, nselectedcuts) );
    360
    361 return SCIP_OKAY;
    362}
    363
    364
    365/*
    366 * cut selector specific interface methods
    367 */
    368
    369/** creates the hybrid cut selector and includes it in SCIP */
    371 SCIP* scip /**< SCIP data structure */
    372 )
    373{
    374 SCIP_CUTSELDATA* cutseldata;
    375 SCIP_CUTSEL* cutsel;
    376
    377 /* create hybrid cut selector data */
    378 SCIP_CALL( SCIPallocBlockMemory(scip, &cutseldata) );
    379 BMSclearMemory(cutseldata);
    380 cutseldata->goodscore = GOODSCORE;
    381 cutseldata->badscore = BADSCORE;
    382
    384 cutseldata) );
    385
    386 assert(cutsel != NULL);
    387
    388 /* set non fundamental callbacks via setter functions */
    389 SCIP_CALL( SCIPsetCutselCopy(scip, cutsel, cutselCopyHybrid) );
    390
    391 SCIP_CALL( SCIPsetCutselFree(scip, cutsel, cutselFreeHybrid) );
    392 SCIP_CALL( SCIPsetCutselInit(scip, cutsel, cutselInitHybrid) );
    393 SCIP_CALL( SCIPsetCutselExit(scip, cutsel, cutselExitHybrid) );
    394
    395 /* add hybrid cut selector parameters */
    397 "cutselection/" CUTSEL_NAME "/efficacyweight",
    398 "weight of efficacy in cut score calculation",
    399 &cutseldata->efficacyweight, FALSE, DEFAULT_EFFICACYWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
    400
    402 "cutselection/" CUTSEL_NAME "/dircutoffdistweight",
    403 "weight of directed cutoff distance in cut score calculation",
    404 &cutseldata->dircutoffdistweight, FALSE, DEFAULT_DIRCUTOFFDISTWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
    405
    407 "cutselection/" CUTSEL_NAME "/objparalweight",
    408 "weight of objective parallelism in cut score calculation",
    409 &cutseldata->objparalweight, FALSE, DEFAULT_OBJPARALWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
    410
    412 "cutselection/" CUTSEL_NAME "/intsupportweight",
    413 "weight of integral support in cut score calculation",
    414 &cutseldata->intsupportweight, FALSE, DEFAULT_INTSUPPORTWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
    415
    417 "cutselection/" CUTSEL_NAME "/minortho",
    418 "minimal orthogonality for a cut to enter the LP",
    419 &cutseldata->minortho, FALSE, DEFAULT_MINORTHO, 0.0, 1.0, NULL, NULL) );
    420
    422 "cutselection/" CUTSEL_NAME "/minorthoroot",
    423 "minimal orthogonality for a cut to enter the LP in the root node",
    424 &cutseldata->minorthoroot, FALSE, DEFAULT_MINORTHOROOT, 0.0, 1.0, NULL, NULL) );
    425
    426 return SCIP_OKAY;
    427}
    428
    429
    430/** perform a cut selection algorithm for the given array of cuts
    431 *
    432 * This is the selection method of the hybrid cut selector which uses a weighted sum of the
    433 * efficacy, parallelism, directed cutoff distance, and the integral support.
    434 * The input cuts array gets re-sorted s.t the selected cuts come first and the remaining
    435 * ones are the end.
    436 */
    438 SCIP* scip, /**< SCIP data structure */
    439 SCIP_ROW** cuts, /**< array with cuts to perform selection algorithm */
    440 SCIP_ROW** forcedcuts, /**< array with forced cuts */
    441 SCIP_RANDNUMGEN* randnumgen, /**< random number generator for tie-breaking, or NULL */
    442 SCIP_Real goodscorefac, /**< factor of best score among the given cuts to consider a cut good
    443 * and filter with less strict settings of the maximum parallelism */
    444 SCIP_Real badscorefac, /**< factor of best score among the given cuts to consider a cut bad
    445 * and discard it regardless of its parallelism to other cuts */
    446 SCIP_Real goodmaxparall, /**< maximum parallelism for good cuts */
    447 SCIP_Real maxparall, /**< maximum parallelism for non-good cuts */
    448 SCIP_Real dircutoffdistweight,/**< weight of directed cutoff distance in cut score calculation */
    449 SCIP_Real efficacyweight, /**< weight of efficacy in cut score calculation */
    450 SCIP_Real objparalweight, /**< weight of objective parallelism in cut score calculation */
    451 SCIP_Real intsupportweight, /**< weight of integral support in cut score calculation */
    452 int ncuts, /**< number of cuts in cuts array */
    453 int nforcedcuts, /**< number of forced cuts */
    454 int maxselectedcuts, /**< maximal number of cuts from cuts array to select */
    455 int* nselectedcuts /**< pointer to return number of selected cuts from cuts array */
    456 )
    457{
    458 SCIP_Real* scores;
    459 SCIP_Real* scoresptr;
    460 SCIP_Real maxforcedscores;
    461 SCIP_Real maxnonforcedscores;
    462 SCIP_Real goodscore;
    463 SCIP_Real badscore;
    464 int i;
    465
    466 assert(cuts != NULL && ncuts > 0);
    467 assert(forcedcuts != NULL || nforcedcuts == 0);
    468 assert(nselectedcuts != NULL);
    469
    470 *nselectedcuts = 0;
    471
    472 SCIP_CALL( SCIPallocBufferArray(scip, &scores, ncuts) );
    473
    474 /* compute scores of cuts and max score of cuts and forced cuts (used to define goodscore) */
    475 maxforcedscores = scoring(scip, forcedcuts, randnumgen, dircutoffdistweight, efficacyweight, objparalweight, intsupportweight, nforcedcuts, NULL);
    476 maxnonforcedscores = scoring(scip, cuts, randnumgen, dircutoffdistweight, efficacyweight, objparalweight, intsupportweight, ncuts, scores);
    477
    478 goodscore = MAX(maxforcedscores, maxnonforcedscores);
    479
    480 /* compute values for filtering cuts */
    481 badscore = goodscore * badscorefac;
    482 goodscore *= goodscorefac;
    483
    484 /* perform cut selection algorithm for the cuts */
    485
    486 /* forced cuts are going to be selected so use them to filter cuts */
    487 for( i = 0; i < nforcedcuts && ncuts > 0; ++i )
    488 {
    489 ncuts = filterWithParallelism(forcedcuts[i], cuts, scores, ncuts, goodscore, goodmaxparall, maxparall);
    490 }
    491
    492 /* now greedily select the remaining cuts */
    493 scoresptr = scores;
    494 while( ncuts > 0 )
    495 {
    496 SCIP_ROW* selectedcut;
    497
    498 selectBestCut(cuts, scores, ncuts);
    499 selectedcut = cuts[0];
    500
    501 /* if the best cut of the remaining cuts is considered bad, we discard it and all remaining cuts */
    502 if( scores[0] < badscore )
    503 break;
    504
    505 ++(*nselectedcuts);
    506
    507 /* if the maximal number of cuts was selected, we can stop here */
    508 if( *nselectedcuts == maxselectedcuts )
    509 break;
    510
    511 /* move the pointers to the next position and filter the remaining cuts to enforce the maximum parallelism constraint */
    512 ++cuts;
    513 ++scores;
    514 --ncuts;
    515
    516 ncuts = filterWithParallelism(selectedcut, cuts, scores, ncuts, goodscore, goodmaxparall, maxparall);
    517 }
    518
    519 SCIPfreeBufferArray(scip, &scoresptr);
    520
    521 return SCIP_OKAY;
    522}
    static SCIP_DECL_CUTSELSELECT(cutselSelectHybrid)
    #define DEFAULT_EFFICACYWEIGHT
    Definition: cutsel_hybrid.c:50
    #define DEFAULT_OBJPARALWEIGHT
    Definition: cutsel_hybrid.c:52
    #define RANDSEED
    Definition: cutsel_hybrid.c:46
    static SCIP_DECL_CUTSELINIT(cutselInitHybrid)
    static int filterWithParallelism(SCIP_ROW *cut, SCIP_ROW **cuts, SCIP_Real *scores, int ncuts, SCIP_Real goodscore, SCIP_Real goodmaxparall, SCIP_Real maxparall)
    static SCIP_DECL_CUTSELEXIT(cutselExitHybrid)
    static SCIP_Real scoring(SCIP *scip, SCIP_ROW **cuts, SCIP_RANDNUMGEN *randnumgen, SCIP_Real dircutoffdistweight, SCIP_Real efficacyweight, SCIP_Real objparalweight, SCIP_Real intsupportweight, int ncuts, SCIP_Real *scores)
    Definition: cutsel_hybrid.c:83
    static void selectBestCut(SCIP_ROW **cuts, SCIP_Real *scores, int ncuts)
    #define CUTSEL_DESC
    Definition: cutsel_hybrid.c:43
    #define CUTSEL_PRIORITY
    Definition: cutsel_hybrid.c:44
    #define BADSCORE
    Definition: cutsel_hybrid.c:48
    #define DEFAULT_MINORTHO
    Definition: cutsel_hybrid.c:54
    #define DEFAULT_DIRCUTOFFDISTWEIGHT
    Definition: cutsel_hybrid.c:51
    #define GOODSCORE
    Definition: cutsel_hybrid.c:47
    #define CUTSEL_NAME
    Definition: cutsel_hybrid.c:42
    static SCIP_DECL_CUTSELCOPY(cutselCopyHybrid)
    #define DEFAULT_MINORTHOROOT
    Definition: cutsel_hybrid.c:55
    static SCIP_DECL_CUTSELFREE(cutselFreeHybrid)
    #define DEFAULT_INTSUPPORTWEIGHT
    Definition: cutsel_hybrid.c:53
    hybrid cut selector
    #define NULL
    Definition: def.h:257
    #define SCIP_INVALID
    Definition: def.h:187
    #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(x)
    Definition: def.h:364
    SCIP_RETCODE SCIPselectCutsHybrid(SCIP *scip, SCIP_ROW **cuts, SCIP_ROW **forcedcuts, SCIP_RANDNUMGEN *randnumgen, SCIP_Real goodscorefac, SCIP_Real badscorefac, SCIP_Real goodmaxparall, SCIP_Real maxparall, SCIP_Real dircutoffdistweight, SCIP_Real efficacyweight, SCIP_Real objparalweight, SCIP_Real intsupportweight, int ncuts, int nforcedcuts, int maxselectedcuts, int *nselectedcuts)
    SCIP_RETCODE SCIPincludeCutselHybrid(SCIP *scip)
    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
    void SCIPswapPointers(void **pointer1, void **pointer2)
    Definition: misc.c:10511
    void SCIPswapReals(SCIP_Real *value1, SCIP_Real *value2)
    Definition: misc.c:10498
    SCIP_Real SCIPgetCutEfficacy(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
    Definition: scip_cut.c:94
    SCIP_Real SCIPgetCutLPSolCutoffDistance(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
    Definition: scip_cut.c:72
    SCIP_RETCODE SCIPsetCutselInit(SCIP *scip, SCIP_CUTSEL *cutsel, SCIP_DECL_CUTSELINIT((*cutselinit)))
    Definition: scip_cutsel.c:163
    SCIP_RETCODE SCIPincludeCutselBasic(SCIP *scip, SCIP_CUTSEL **cutsel, const char *name, const char *desc, int priority, SCIP_DECL_CUTSELSELECT((*cutselselect)), SCIP_CUTSELDATA *cutseldata)
    Definition: scip_cutsel.c:98
    SCIP_RETCODE SCIPsetCutselCopy(SCIP *scip, SCIP_CUTSEL *cutsel, SCIP_DECL_CUTSELCOPY((*cutselcopy)))
    Definition: scip_cutsel.c:131
    SCIP_CUTSELDATA * SCIPcutselGetData(SCIP_CUTSEL *cutsel)
    Definition: cutsel.c:419
    SCIP_RETCODE SCIPsetCutselFree(SCIP *scip, SCIP_CUTSEL *cutsel, SCIP_DECL_CUTSELFREE((*cutselfree)))
    Definition: scip_cutsel.c:147
    void SCIPcutselSetData(SCIP_CUTSEL *cutsel, SCIP_CUTSELDATA *cutseldata)
    Definition: cutsel.c:429
    const char * SCIPcutselGetName(SCIP_CUTSEL *cutsel)
    Definition: cutsel.c:159
    SCIP_RETCODE SCIPsetCutselExit(SCIP *scip, SCIP_CUTSEL *cutsel, SCIP_DECL_CUTSELEXIT((*cutselexit)))
    Definition: scip_cutsel.c:179
    #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
    SCIP_Real SCIProwGetParallelism(SCIP_ROW *row1, SCIP_ROW *row2, char orthofunc)
    Definition: lp.c:7970
    int SCIProwGetNNonz(SCIP_ROW *row)
    Definition: lp.c:17607
    SCIP_Bool SCIProwIsInGlobalCutpool(SCIP_ROW *row)
    Definition: lp.c:17885
    SCIP_Bool SCIProwIsLocal(SCIP_ROW *row)
    Definition: lp.c:17795
    SCIP_Real SCIPgetRowObjParallelism(SCIP *scip, SCIP_ROW *row)
    Definition: scip_lp.c:2154
    int SCIPgetRowNumIntCols(SCIP *scip, SCIP_ROW *row)
    Definition: scip_lp.c:1832
    SCIP_SOL * SCIPgetBestSol(SCIP *scip)
    Definition: scip_sol.c:2986
    void SCIPfreeRandom(SCIP *scip, SCIP_RANDNUMGEN **randnumgen)
    SCIP_Real SCIPrandomGetReal(SCIP_RANDNUMGEN *randnumgen, SCIP_Real minrandval, SCIP_Real maxrandval)
    Definition: misc.c:10245
    SCIP_RETCODE SCIPcreateRandom(SCIP *scip, SCIP_RANDNUMGEN **randnumgen, unsigned int initialseed, SCIP_Bool useglobalseed)
    #define BMSclearMemory(ptr)
    Definition: memory.h:129
    public methods for cuts and aggregation rows
    public methods for cut selector plugins
    public methods for the LP relaxation, rows and columns
    public methods for random numbers
    struct SCIP_CutselData SCIP_CUTSELDATA
    Definition: type_cutsel.h:53
    @ SCIP_SUCCESS
    Definition: type_result.h:58
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_INVALIDCALL
    Definition: type_retcode.h:51
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63