Scippy

    SCIP

    Solving Constraint Integer Programs

    benderscut_nogood.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 benderscut_nogood.c
    26 * @ingroup OTHER_CFILES
    27 * @brief Generates a no good cut for integer solutions that are infeasible for the subproblems
    28 * @author Stephen J. Maher
    29 */
    30
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    34#include "scip/cons_linear.h"
    35#include "scip/pub_benderscut.h"
    36#include "scip/pub_benders.h"
    37#include "scip/pub_lp.h"
    38#include "scip/pub_message.h"
    39#include "scip/pub_misc.h"
    40#include "scip/pub_var.h"
    41#include "scip/scip_benders.h"
    42#include "scip/scip_cons.h"
    43#include "scip/scip_cut.h"
    44#include "scip/scip_general.h"
    45#include "scip/scip_lp.h"
    46#include "scip/scip_mem.h"
    47#include "scip/scip_message.h"
    48#include "scip/scip_numerics.h"
    49#include "scip/scip_param.h"
    50#include "scip/scip_prob.h"
    51#include "scip/scip_sol.h"
    52#include <string.h>
    53
    54#define BENDERSCUT_NAME "nogood"
    55#define BENDERSCUT_DESC "no good Benders' decomposition integer cut"
    56#define BENDERSCUT_PRIORITY 500
    57#define BENDERSCUT_LPCUT FALSE
    58
    59
    60
    61#define SCIP_DEFAULT_ADDCUTS FALSE /** Should cuts be generated, instead of constraints */
    62
    63/*
    64 * Data structures
    65 */
    66
    67/** Benders' decomposition cuts data */
    68struct SCIP_BenderscutData
    69{
    70 SCIP_BENDERS* benders; /**< the Benders' decomposition data structure */
    71 int curriter; /**< the current Benders' decomposition subproblem solve iteration */
    72 SCIP_Bool addcuts; /**< should cuts be generated instead of constraints */
    73 SCIP_Bool cutadded; /**< has a cut been added in the current iteration. Only one cut per round */
    74 SCIP_Bool subprobsvalid; /**< is it valid to apply nogood cuts for this problem */
    75};
    76
    77
    78/*
    79 * Local methods
    80 */
    81
    82/** determines if the subproblems are valid for generating nogood cuts */
    83static
    85 SCIP_BENDERS* benders, /**< the benders' decomposition structure */
    86 SCIP_BENDERSCUT* benderscut /**< the benders' decomposition cut method */
    87 )
    88{
    89 SCIP_BENDERSCUTDATA* benderscutdata;
    90 int nmastervars;
    91 int nmasterbinvars;
    92 int i;
    93
    94 assert( benders != NULL );
    95 assert( benderscut != NULL );
    96 assert( strcmp(SCIPbenderscutGetName(benderscut), BENDERSCUT_NAME) == 0 );
    97
    98 /* getting the Benders' cut data */
    99 benderscutdata = SCIPbenderscutGetData(benderscut);
    100 assert( benderscutdata != NULL );
    101 assert(benderscutdata->benders == benders);
    102
    103 /* checking whether the nogood cut is valid for this subproblem */
    104 for( i = 0; i < SCIPbendersGetNSubproblems(benders); i++ )
    105 {
    106 /* it is only possible to generate the no-good cut for subproblems that only include binary master variables */
    107 SCIPbendersGetSubproblemMasterVarsData(benders, i, NULL, &nmastervars, &nmasterbinvars, NULL);
    108
    109 if( nmastervars != nmasterbinvars )
    110 {
    111 benderscutdata->subprobsvalid = FALSE;
    112 break;
    113 }
    114 }
    115}
    116
    117
    118/** compute no good cut */
    119static
    121 SCIP* masterprob, /**< the SCIP instance of the master problem */
    122 SCIP_BENDERS* benders, /**< the benders' decomposition structure */
    123 SCIP_SOL* sol, /**< primal CIP solution */
    124 SCIP_CONS* cons, /**< the constraint for the generated cut, can be NULL */
    125 SCIP_ROW* row, /**< the row for the generated cut, can be NULL */
    126 SCIP_Bool addcut /**< indicates whether a cut is created instead of a constraint */
    127 )
    128{
    129 SCIP_VAR** vars;
    130 int nvars;
    131 SCIP_Real lhs;
    132 int i;
    133#ifndef NDEBUG
    134 SCIP_Real verifycons;
    135#endif
    136
    137 assert(masterprob != NULL);
    138 assert(benders != NULL);
    139 assert(cons != NULL || addcut);
    140 assert(row != NULL || !addcut);
    141
    142 nvars = SCIPgetNVars(masterprob);
    143 vars = SCIPgetVars(masterprob);
    144
    145 /* adding the subproblem objective function value to the lhs */
    146 if( addcut )
    147 lhs = SCIProwGetLhs(row);
    148 else
    149 lhs = SCIPgetLhsLinear(masterprob, cons);
    150
    151 /* adding the violation to the lhs */
    152 lhs += 1.0;
    153
    154 /* looping over all master problem variables to update the coefficients in the computed cut. */
    155 for( i = 0; i < nvars; i++ )
    156 {
    157 SCIP_Real coef;
    158
    159 if( !SCIPvarIsBinary(vars[i]) )
    160 continue;
    161
    162 /* if the variable is on its upper bound, then the subproblem objective value is added to the cut */
    163 if( SCIPisFeasEQ(masterprob, SCIPgetSolVal(masterprob, sol, vars[i]), 1.0) )
    164 {
    165 coef = -1.0;
    166 lhs -= 1.0;
    167 }
    168 else
    169 coef = 1.0;
    170
    171 /* adding the variable to the cut. The coefficient is the subproblem objective value */
    172 if( addcut )
    173 {
    174 SCIP_CALL( SCIPaddVarToRow(masterprob, row, vars[i], coef) );
    175 }
    176 else
    177 {
    178 SCIP_CALL( SCIPaddCoefLinear(masterprob, cons, vars[i], coef) );
    179 }
    180 }
    181
    182 /* Update the lhs of the cut */
    183 if( addcut )
    184 {
    185 SCIP_CALL( SCIPchgRowLhs(masterprob, row, lhs) );
    186 }
    187 else
    188 {
    189 SCIP_CALL( SCIPchgLhsLinear(masterprob, cons, lhs) );
    190 }
    191
    192#ifndef NDEBUG
    193 if( addcut )
    194 verifycons = SCIPgetRowSolActivity(masterprob, row, sol);
    195 else
    196 verifycons = SCIPgetActivityLinear(masterprob, cons, sol);
    197#endif
    198
    199 assert(SCIPisFeasEQ(masterprob, verifycons, lhs - 1));
    200
    201 return SCIP_OKAY;
    202}
    203
    204
    205
    206/** generates and applies Benders' cuts */
    207static
    209 SCIP* masterprob, /**< the SCIP instance of the master problem */
    210 SCIP_BENDERS* benders, /**< the benders' decomposition */
    211 SCIP_BENDERSCUT* benderscut, /**< the benders' decomposition cut method */
    212 SCIP_SOL* sol, /**< primal CIP solution */
    213 SCIP_BENDERSENFOTYPE type, /**< the enforcement type calling this function */
    214 SCIP_RESULT* result /**< the result from solving the subproblems */
    215 )
    216{
    217 SCIP_BENDERSCUTDATA* benderscutdata;
    218 SCIP_CONSHDLR* consbenders;
    219 SCIP_CONS* cons;
    220 SCIP_ROW* row;
    221 char cutname[SCIP_MAXSTRLEN];
    222 SCIP_Bool addcut;
    223
    224 assert(masterprob != NULL);
    225 assert(benders != NULL);
    226 assert(benderscut != NULL);
    227 assert(result != NULL);
    228
    229 row = NULL;
    230 cons = NULL;
    231
    232 /* retrieving the Benders' cut data */
    233 benderscutdata = SCIPbenderscutGetData(benderscut);
    234
    235 /* if the cuts are generated prior to the solving stage, then rows can not be generated. So constraints must be
    236 * added to the master problem.
    237 */
    238 if( SCIPgetStage(masterprob) < SCIP_STAGE_INITSOLVE )
    239 addcut = FALSE;
    240 else
    241 addcut = benderscutdata->addcuts;
    242
    243 /* retrieving the Benders' decomposition constraint handler */
    244 consbenders = SCIPfindConshdlr(masterprob, "benders");
    245
    246 /* setting the name of the generated cut */
    247 (void) SCIPsnprintf(cutname, SCIP_MAXSTRLEN, "nogoodcut_%" SCIP_LONGINT_FORMAT, SCIPbenderscutGetNFound(benderscut) );
    248
    249 /* creating an empty row or constraint for the Benders' cut */
    250 if( addcut )
    251 {
    252 SCIP_CALL( SCIPcreateEmptyRowConshdlr(masterprob, &row, consbenders, cutname, 0.0, SCIPinfinity(masterprob), FALSE,
    253 FALSE, TRUE) );
    254 }
    255 else
    256 {
    257 SCIP_CALL( SCIPcreateConsBasicLinear(masterprob, &cons, cutname, 0, NULL, NULL, 0.0, SCIPinfinity(masterprob)) );
    258 SCIP_CALL( SCIPsetConsDynamic(masterprob, cons, TRUE) );
    259 SCIP_CALL( SCIPsetConsRemovable(masterprob, cons, TRUE) );
    260 }
    261
    262 /* computing the coefficients of the optimality cut */
    263 SCIP_CALL( computeNogoodCut(masterprob, benders, sol, cons, row, addcut) );
    264
    265 /* adding the constraint to the master problem */
    266 if( addcut )
    267 {
    268 SCIP_Bool infeasible;
    269
    271 {
    272 SCIP_CALL( SCIPaddRow(masterprob, row, FALSE, &infeasible) );
    273 assert(!infeasible);
    274 }
    275 else
    276 {
    278 SCIP_CALL( SCIPaddPoolCut(masterprob, row) );
    279 }
    280
    281#ifdef SCIP_DEBUG
    282 SCIP_CALL( SCIPprintRow(masterprob, row, NULL) );
    283 SCIPinfoMessage(masterprob, NULL, ";\n");
    284#endif
    285
    286 /* release the row */
    287 SCIP_CALL( SCIPreleaseRow(masterprob, &row) );
    288
    289 (*result) = SCIP_SEPARATED;
    290 }
    291 else
    292 {
    293 SCIP_CALL( SCIPaddCons(masterprob, cons) );
    294
    295 SCIPdebugPrintCons(masterprob, cons, NULL);
    296
    297 SCIP_CALL( SCIPreleaseCons(masterprob, &cons) );
    298
    299 (*result) = SCIP_CONSADDED;
    300 }
    301
    302 /* updating the cut added flag */
    303 benderscutdata->cutadded = TRUE;
    304
    305 return SCIP_OKAY;
    306}
    307
    308/*
    309 * Callback methods of Benders' decomposition cuts
    310 */
    311
    312/** destructor of Benders' decomposition cuts to free user data (called when SCIP is exiting) */
    313static
    314SCIP_DECL_BENDERSCUTFREE(benderscutFreeNogood)
    315{ /*lint --e{715}*/
    316 SCIP_BENDERSCUTDATA* benderscutdata;
    317
    318 assert( benderscut != NULL );
    319 assert( strcmp(SCIPbenderscutGetName(benderscut), BENDERSCUT_NAME) == 0 );
    320
    321 /* free Benders' cut data */
    322 benderscutdata = SCIPbenderscutGetData(benderscut);
    323 assert( benderscutdata != NULL );
    324
    325 SCIPfreeBlockMemory(scip, &benderscutdata);
    326
    327 SCIPbenderscutSetData(benderscut, NULL);
    328
    329 return SCIP_OKAY;
    330}
    331
    332
    333/** execution method of Benders' decomposition cuts */
    334static
    335SCIP_DECL_BENDERSCUTEXEC(benderscutExecNogood)
    336{ /*lint --e{715}*/
    337 SCIP* subproblem;
    338 SCIP_BENDERSCUTDATA* benderscutdata;
    339
    340 assert(scip != NULL);
    341 assert(benders != NULL);
    342 assert(benderscut != NULL);
    343 assert(result != NULL);
    344
    345 subproblem = SCIPbendersSubproblem(benders, probnumber);
    346
    347 if( subproblem == NULL )
    348 {
    349 SCIPdebugMsg(scip, "The subproblem %d is set to NULL. The <%s> Benders' decomposition cut can not be executed.\n",
    350 probnumber, BENDERSCUT_NAME);
    351
    352 (*result) = SCIP_DIDNOTRUN;
    353 return SCIP_OKAY;
    354 }
    355
    356 benderscutdata = SCIPbenderscutGetData(benderscut);
    357 assert(benderscutdata != NULL);
    358
    359 /* at the first iteration we check the validity of the subproblem for generating nogood cuts */
    360 if( benderscutdata->curriter == -1 )
    361 checkSubproblemValidity(benders, benderscut);
    362
    363 /* if the curriter is less than the number of Benders' decomposition calls, then we are in a new round.
    364 * So the cutadded flag must be set to FALSE
    365 */
    366 if( benderscutdata->curriter < SCIPbendersGetNCalls(benders) )
    367 {
    368 benderscutdata->curriter = SCIPbendersGetNCalls(benders);
    369 benderscutdata->cutadded = FALSE;
    370 }
    371
    372 /* if a cut has been added in this Benders' decomposition call, then no more must be added */
    373 if( benderscutdata->cutadded )
    374 return SCIP_OKAY;
    375
    376 /* it is only possible to generate nogood cuts if all linking variables are binary */
    377 if( !benderscutdata->subprobsvalid )
    378 {
    379 SCIPinfoMessage(scip, NULL, "The nogood cuts can only be applied to problems "
    380 "where all linking variables are binary. The nogood cuts will be disabled.\n");
    381
    382 SCIPbenderscutSetEnabled(benderscut, FALSE);
    383
    384 return SCIP_OKAY;
    385 }
    386
    387 /* We can not rely on complete recourse for the subproblems. As such, the subproblems may be feasible for the LP, but
    388 * infeasible for the IP. As such, if one subproblem is infeasible, then a no good cut is generated.
    389 */
    390 if( SCIPgetStatus(subproblem) == SCIP_STATUS_INFEASIBLE )
    391 {
    392 /* generating a cut */
    393 SCIP_CALL( generateAndApplyBendersNogoodCut(scip, benders, benderscut, sol, type, result) );
    394 }
    395
    396 return SCIP_OKAY;
    397}
    398
    399
    400/*
    401 * Benders' decomposition cuts specific interface methods
    402 */
    403
    404/** creates the nogood Benders' decomposition cuts and includes it in SCIP */
    406 SCIP* scip, /**< SCIP data structure */
    407 SCIP_BENDERS* benders /**< Benders' decomposition */
    408 )
    409{
    410 SCIP_BENDERSCUTDATA* benderscutdata;
    411 SCIP_BENDERSCUT* benderscut;
    413
    414 assert(benders != NULL);
    415
    416 /* create nogood Benders' decomposition cuts data */
    417 SCIP_CALL( SCIPallocBlockMemory(scip, &benderscutdata) );
    418 benderscutdata->benders = benders;
    419 benderscutdata->curriter = -1;
    420 benderscutdata->cutadded = FALSE;
    421 benderscutdata->subprobsvalid = TRUE;
    422
    423 benderscut = NULL;
    424
    425 /* include Benders' decomposition cuts */
    427 BENDERSCUT_PRIORITY, BENDERSCUT_LPCUT, benderscutExecNogood, benderscutdata) );
    428
    429 assert(benderscut != NULL);
    430
    431 /* set non fundamental callbacks via setter functions */
    432 SCIP_CALL( SCIPsetBenderscutFree(scip, benderscut, benderscutFreeNogood) );
    433
    434 /* add nogood Benders' decomposition cuts parameters */
    435 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "benders/%s/benderscut/%s/addcuts",
    438 "should cuts be generated and added to the cutpool instead of global constraints directly added to the problem.",
    439 &benderscutdata->addcuts, FALSE, SCIP_DEFAULT_ADDCUTS, NULL, NULL) );
    440
    441 return SCIP_OKAY;
    442}
    #define SCIP_DEFAULT_ADDCUTS
    #define BENDERSCUT_LPCUT
    static SCIP_RETCODE generateAndApplyBendersNogoodCut(SCIP *masterprob, SCIP_BENDERS *benders, SCIP_BENDERSCUT *benderscut, SCIP_SOL *sol, SCIP_BENDERSENFOTYPE type, SCIP_RESULT *result)
    #define BENDERSCUT_PRIORITY
    #define BENDERSCUT_DESC
    #define BENDERSCUT_NAME
    static SCIP_DECL_BENDERSCUTEXEC(benderscutExecNogood)
    static SCIP_RETCODE computeNogoodCut(SCIP *masterprob, SCIP_BENDERS *benders, SCIP_SOL *sol, SCIP_CONS *cons, SCIP_ROW *row, SCIP_Bool addcut)
    static void checkSubproblemValidity(SCIP_BENDERS *benders, SCIP_BENDERSCUT *benderscut)
    static SCIP_DECL_BENDERSCUTFREE(benderscutFreeNogood)
    Generates a no-good cut for solutions that are integer infeasible.
    Constraint handler for linear constraints in their most general form, .
    #define NULL
    Definition: def.h:248
    #define SCIP_MAXSTRLEN
    Definition: def.h:269
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define FALSE
    Definition: def.h:94
    #define SCIP_LONGINT_FORMAT
    Definition: def.h:148
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_RETCODE SCIPincludeBenderscutNogood(SCIP *scip, SCIP_BENDERS *benders)
    SCIP_RETCODE SCIPaddCoefLinear(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_Real val)
    SCIP_Real SCIPgetLhsLinear(SCIP *scip, SCIP_CONS *cons)
    SCIP_RETCODE SCIPcreateConsBasicLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs)
    SCIP_Real SCIPgetActivityLinear(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol)
    SCIP_RETCODE SCIPchgLhsLinear(SCIP *scip, SCIP_CONS *cons, SCIP_Real lhs)
    SCIP_STATUS SCIPgetStatus(SCIP *scip)
    Definition: scip_general.c:562
    SCIP_STAGE SCIPgetStage(SCIP *scip)
    Definition: scip_general.c:444
    int SCIPgetNVars(SCIP *scip)
    Definition: scip_prob.c:2246
    SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
    Definition: scip_prob.c:3274
    SCIP_VAR ** SCIPgetVars(SCIP *scip)
    Definition: scip_prob.c:2201
    void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
    Definition: scip_message.c:208
    #define SCIPdebugMsg
    Definition: scip_message.h:78
    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
    const char * SCIPbendersGetName(SCIP_BENDERS *benders)
    Definition: benders.c:5967
    int SCIPbendersGetNSubproblems(SCIP_BENDERS *benders)
    Definition: benders.c:6011
    SCIP * SCIPbendersSubproblem(SCIP_BENDERS *benders, int probnumber)
    Definition: benders.c:6021
    void SCIPbendersGetSubproblemMasterVarsData(SCIP_BENDERS *benders, int probnumber, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars)
    Definition: benders.c:6259
    int SCIPbendersGetNCalls(SCIP_BENDERS *benders)
    Definition: benders.c:6033
    SCIP_RETCODE SCIPincludeBenderscutBasic(SCIP *scip, SCIP_BENDERS *benders, SCIP_BENDERSCUT **benderscutptr, const char *name, const char *desc, int priority, SCIP_Bool islpcut, SCIP_DECL_BENDERSCUTEXEC((*benderscutexec)), SCIP_BENDERSCUTDATA *benderscutdata)
    SCIP_RETCODE SCIPsetBenderscutFree(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTFREE((*benderscutfree)))
    void SCIPbenderscutSetData(SCIP_BENDERSCUT *benderscut, SCIP_BENDERSCUTDATA *benderscutdata)
    Definition: benderscut.c:413
    const char * SCIPbenderscutGetName(SCIP_BENDERSCUT *benderscut)
    Definition: benderscut.c:492
    SCIP_BENDERSCUTDATA * SCIPbenderscutGetData(SCIP_BENDERSCUT *benderscut)
    Definition: benderscut.c:403
    SCIP_Longint SCIPbenderscutGetNFound(SCIP_BENDERSCUT *benderscut)
    Definition: benderscut.c:543
    void SCIPbenderscutSetEnabled(SCIP_BENDERSCUT *benderscut, SCIP_Bool enabled)
    Definition: benderscut.c:593
    SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
    Definition: scip_cons.c:940
    SCIP_RETCODE SCIPsetConsDynamic(SCIP *scip, SCIP_CONS *cons, SCIP_Bool dynamic)
    Definition: scip_cons.c:1449
    SCIP_RETCODE SCIPsetConsRemovable(SCIP *scip, SCIP_CONS *cons, SCIP_Bool removable)
    Definition: scip_cons.c:1474
    SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
    Definition: scip_cons.c:1173
    SCIP_RETCODE SCIPaddPoolCut(SCIP *scip, SCIP_ROW *row)
    Definition: scip_cut.c:336
    SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
    Definition: scip_cut.c:225
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPallocBlockMemory(scip, ptr)
    Definition: scip_mem.h:89
    SCIP_Real SCIProwGetLhs(SCIP_ROW *row)
    Definition: lp.c:17686
    SCIP_RETCODE SCIPchgRowLhs(SCIP *scip, SCIP_ROW *row, SCIP_Real lhs)
    Definition: scip_lp.c:1529
    SCIP_RETCODE SCIPcreateEmptyRowConshdlr(SCIP *scip, SCIP_ROW **row, SCIP_CONSHDLR *conshdlr, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
    Definition: scip_lp.c:1367
    SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
    Definition: scip_lp.c:1646
    SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
    Definition: scip_lp.c:2176
    SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
    Definition: scip_lp.c:1508
    SCIP_Real SCIPgetRowSolActivity(SCIP *scip, SCIP_ROW *row, SCIP_SOL *sol)
    Definition: scip_lp.c:2108
    SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
    Definition: scip_sol.c:1765
    SCIP_Real SCIPinfinity(SCIP *scip)
    SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
    Definition: var.c:23478
    int SCIPsnprintf(char *t, int len, const char *s,...)
    Definition: misc.c:10827
    static const char * paramname[]
    Definition: lpi_msk.c:5172
    public methods for Benders' decomposition
    public methods for Benders' decomposition cuts
    public methods for LP management
    public methods for message output
    #define SCIPdebugPrintCons(x, y, z)
    Definition: pub_message.h:102
    public data structures and miscellaneous methods
    public methods for problem variables
    public methods for Benders decomposition
    public methods for constraint handler plugins and constraints
    public methods for cuts and aggregation rows
    general public methods
    public methods for the LP relaxation, rows and columns
    public methods for memory management
    public methods for message handling
    public methods for numerical tolerances
    public methods for SCIP parameter handling
    public methods for global and local (sub)problems
    public methods for solutions
    @ SCIP_BENDERSENFOTYPE_RELAX
    Definition: type_benders.h:52
    @ SCIP_BENDERSENFOTYPE_LP
    Definition: type_benders.h:51
    @ SCIP_BENDERSENFOTYPE_CHECK
    Definition: type_benders.h:54
    @ SCIP_BENDERSENFOTYPE_PSEUDO
    Definition: type_benders.h:53
    enum SCIP_BendersEnfoType SCIP_BENDERSENFOTYPE
    Definition: type_benders.h:56
    struct SCIP_BenderscutData SCIP_BENDERSCUTDATA
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_CONSADDED
    Definition: type_result.h:52
    @ SCIP_SEPARATED
    Definition: type_result.h:49
    enum SCIP_Result SCIP_RESULT
    Definition: type_result.h:61
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    @ SCIP_STAGE_INITSOLVE
    Definition: type_set.h:52
    @ SCIP_STATUS_INFEASIBLE
    Definition: type_stat.h:44