Scippy

    SCIP

    Solving Constraint Integer Programs

    sepa_intobj.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_intobj.c
    26 * @ingroup DEFPLUGINS_SEPA
    27 * @brief integer objective value separator
    28 * @author Tobias Achterberg
    29 * @author Timo Berthold
    30 */
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    33#include "scip/pub_event.h"
    34#include "scip/pub_lp.h"
    35#include "scip/pub_message.h"
    36#include "scip/pub_sepa.h"
    37#include "scip/pub_var.h"
    38#include "scip/scip_branch.h"
    39#include "scip/scip_cut.h"
    40#include "scip/scip_event.h"
    41#include "scip/scip_general.h"
    42#include "scip/scip_lp.h"
    43#include "scip/scip_message.h"
    44#include "scip/scip_mem.h"
    45#include "scip/scip_numerics.h"
    46#include "scip/scip_prob.h"
    47#include "scip/scip_probing.h"
    48#include "scip/scip_sepa.h"
    49#include "scip/scip_sol.h"
    51#include "scip/scip_var.h"
    52#include "scip/sepa_intobj.h"
    53#include <string.h>
    54
    55
    56#define SEPA_NAME "intobj"
    57#define SEPA_DESC "integer objective value separator"
    58#define SEPA_PRIORITY -100
    59#define SEPA_FREQ -1
    60#define SEPA_MAXBOUNDDIST 0.0
    61#define SEPA_USESSUBSCIP FALSE /**< does the separator use a secondary SCIP instance? */
    62#define SEPA_DELAY FALSE /**< should separation method be delayed, if other separators found cuts? */
    63
    64#define EVENTHDLR_NAME "intobj"
    65#define EVENTHDLR_DESC "objective change event handler for integer objective value separator"
    66
    67
    68/*
    69 * Data structures
    70 */
    71
    72/** separator data */
    73struct SCIP_SepaData
    74{
    75 SCIP_ROW* objrow; /**< objective value inequality */
    76 SCIP_VAR* objvar; /**< objective value variable */
    77 SCIP_Real setoff; /**< setoff of the inequality */
    78};
    79
    80
    81/*
    82 * Local methods
    83 */
    84
    85/** creates separator data */
    86static
    88 SCIP* scip, /**< SCIP data structure */
    89 SCIP_SEPADATA** sepadata /**< pointer to store separator data */
    90 )
    91{
    92 assert(sepadata != NULL);
    93
    95 (*sepadata)->objrow = NULL;
    96 (*sepadata)->objvar = NULL;
    97 (*sepadata)->setoff = 0.0;
    98
    99 return SCIP_OKAY;
    100}
    101
    102/** frees separator data */
    103static
    105 SCIP* scip, /**< SCIP data structure */
    106 SCIP_SEPADATA** sepadata /**< pointer to separator data */
    107 )
    108{
    109 assert(sepadata != NULL);
    110 assert(*sepadata != NULL);
    111 assert((*sepadata)->objrow == NULL);
    112 assert((*sepadata)->objvar == NULL);
    113
    114 SCIPfreeBlockMemory(scip, sepadata);
    115
    116 return SCIP_OKAY;
    117}
    118
    119/** creates the objective value inequality and the objective value variable, if not yet existing */
    120static
    122 SCIP* scip, /**< SCIP data structure */
    123 SCIP_SEPA* sepa, /**< separator */
    124 SCIP_SEPADATA* sepadata /**< separator data */
    125 )
    126{
    127 assert(sepadata != NULL);
    128
    129 if( sepadata->objrow == NULL )
    130 {
    131 SCIP_VAR** vars;
    132 SCIP_Real obj;
    133 SCIP_Real intobjval;
    134 int nvars;
    135 int v;
    136 SCIP_Bool attendobjvarbound;
    137
    138 attendobjvarbound = FALSE;
    139 /* create and add objective value variable */
    140 if( sepadata->objvar == NULL )
    141 {
    142 SCIP_CALL( SCIPcreateVarImpl(scip, &sepadata->objvar, "objvar", -SCIPinfinity(scip), SCIPinfinity(scip), 0.0,
    144 SCIPvarMarkRelaxationOnly(sepadata->objvar);
    145 SCIP_CALL( SCIPaddVar(scip, sepadata->objvar) );
    146 SCIP_CALL( SCIPaddVarLocksType(scip, sepadata->objvar, SCIP_LOCKTYPE_MODEL, +1, +1) );
    147 }
    148 else
    149 attendobjvarbound = TRUE;
    150
    151 /* get problem variables */
    152 vars = SCIPgetVars(scip);
    153 nvars = SCIPgetNVars(scip);
    154
    155 /* create objective value inequality */
    156 if( attendobjvarbound )
    157 intobjval = SCIPceil(scip, SCIPgetLowerbound(scip)) - SCIPvarGetLbGlobal(sepadata->objvar);
    158 else
    159 intobjval = SCIPceil(scip, SCIPgetLowerbound(scip));
    160 SCIP_CALL( SCIPcreateEmptyRowSepa(scip, &sepadata->objrow, sepa, "objrow", intobjval, SCIPinfinity(scip),
    162 sepadata->setoff = intobjval;
    163
    164 SCIP_CALL( SCIPcacheRowExtensions(scip, sepadata->objrow) );
    165 for( v = 0; v < nvars; ++v )
    166 {
    167 obj = SCIPvarGetObj(vars[v]);
    168 if( !SCIPisZero(scip, obj) )
    169 {
    170 SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, vars[v], obj) );
    171 }
    172 }
    173 SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, sepadata->objvar, -1.0) );
    174 SCIP_CALL( SCIPflushRowExtensions(scip, sepadata->objrow) );
    175
    176 SCIPdebugMsg(scip, "created objective value row: ");
    177 SCIPdebug( SCIP_CALL( SCIPprintRow(scip, sepadata->objrow, NULL) ) );
    178 }
    179
    180 return SCIP_OKAY;
    181}
    182
    183/** searches and adds integral objective cuts that separate the given primal solution */
    184static
    186 SCIP* scip, /**< SCIP data structure */
    187 SCIP_SEPA* sepa, /**< the intobj separator */
    188 SCIP_SOL* sol, /**< the solution that should be separated, or NULL for LP solution */
    189 SCIP_RESULT* result /**< pointer to store the result */
    190 )
    191{
    192 SCIP_SEPADATA* sepadata;
    193 SCIP_Real objval;
    194 SCIP_Real intbound;
    195 SCIP_Bool infeasible;
    196 SCIP_Bool tightened;
    197
    198 assert(result != NULL);
    199 assert(*result == SCIP_DIDNOTRUN);
    200
    201 /* if the objective value may be fractional, we cannot do anything */
    202 if( !SCIPisObjIntegral(scip) )
    203 return SCIP_OKAY;
    204
    205 *result = SCIP_DIDNOTFIND;
    206
    207 /* if the current objective value is integral, there is no integral objective value cut */
    208 if( sol == NULL )
    209 objval = SCIPgetLPObjval(scip);
    210 else
    211 objval = SCIPgetSolTransObj(scip, sol);
    212 if( SCIPisFeasIntegral(scip, objval) )
    213 return SCIP_OKAY;
    214
    215 sepadata = SCIPsepaGetData(sepa);
    216 assert(sepadata != NULL);
    217
    218 /* the objective value is fractional: create the objective value inequality, if not yet existing */
    219 SCIP_CALL( createObjRow(scip, sepa, sepadata) );
    220
    221 /* adjust the bounds of the objective value variable */
    222 intbound = SCIPceil(scip, objval) - sepadata->setoff;
    223 SCIP_CALL( SCIPtightenVarLb(scip, sepadata->objvar, intbound, FALSE, &infeasible, &tightened) );
    224 SCIPdebugMsg(scip, "new objective variable lower bound: <%s>[%g,%g]\n",
    225 SCIPvarGetName(sepadata->objvar), SCIPvarGetLbLocal(sepadata->objvar), SCIPvarGetUbLocal(sepadata->objvar));
    226
    227 /* add the objective value inequality as a cut to the LP */
    228 if( infeasible )
    229 *result = SCIP_CUTOFF;
    230 else
    231 {
    232 if( !SCIProwIsInLP(sepadata->objrow) )
    233 {
    234 SCIP_CALL( SCIPaddRow(scip, sepadata->objrow, FALSE, &infeasible) );
    235 }
    236 if ( infeasible )
    237 *result = SCIP_CUTOFF;
    238 else if ( tightened )
    239 *result = SCIP_REDUCEDDOM;
    240 else
    241 *result = SCIP_SEPARATED;
    242 }
    243
    244 return SCIP_OKAY;
    245}
    246
    247
    248/*
    249 * Callback methods of separator
    250 */
    251
    252/** copy method for separator plugins (called when SCIP copies plugins) */
    253static
    254SCIP_DECL_SEPACOPY(sepaCopyIntobj)
    255{ /*lint --e{715}*/
    256 assert(scip != NULL);
    257 assert(sepa != NULL);
    258 assert(strcmp(SCIPsepaGetName(sepa), SEPA_NAME) == 0);
    259
    260 /* call inclusion method of constraint handler */
    262
    263 return SCIP_OKAY;
    264}
    265
    266/** destructor of separator to free user data (called when SCIP is exiting) */
    267static
    268SCIP_DECL_SEPAFREE(sepaFreeIntobj)
    269{ /*lint --e{715}*/
    270 SCIP_SEPADATA* sepadata;
    271
    272 /* free separator data */
    273 sepadata = SCIPsepaGetData(sepa);
    274 assert(sepadata != NULL);
    275
    276 SCIP_CALL( sepadataFree(scip, &sepadata) );
    277
    278 SCIPsepaSetData(sepa, NULL);
    279
    280 return SCIP_OKAY;
    281}
    282
    283
    284/** solving process deinitialization method of separator (called before branch and bound process data is freed) */
    285static
    286SCIP_DECL_SEPAEXITSOL(sepaExitsolIntobj)
    287{ /*lint --e{715}*/
    288 SCIP_SEPADATA* sepadata;
    289
    290 sepadata = SCIPsepaGetData(sepa);
    291 assert(sepadata != NULL);
    292
    293 /* release objective row */
    294 if( sepadata->objrow != NULL )
    295 {
    296 SCIP_CALL( SCIPreleaseRow(scip, &sepadata->objrow) );
    297 }
    298
    299 /* release objective variable */
    300 if( sepadata->objvar != NULL )
    301 {
    302 /* remove locks in createObjRow() */
    303 SCIP_CALL( SCIPaddVarLocksType(scip, sepadata->objvar, SCIP_LOCKTYPE_MODEL, -1, -1) );
    304 SCIP_CALL( SCIPreleaseVar(scip, &sepadata->objvar) );
    305 }
    306
    307 return SCIP_OKAY;
    308}
    309
    310
    311/** LP solution separation method of separator */
    312static
    313SCIP_DECL_SEPAEXECLP(sepaExeclpIntobj)
    314{ /*lint --e{715}*/
    315 *result = SCIP_DIDNOTRUN;
    316
    317 /* only call separator, if we are not close to terminating */
    318 if( SCIPisStopped(scip) )
    319 return SCIP_OKAY;
    320
    321 /* only call separator, if an optimal LP solution is at hand */
    323 return SCIP_OKAY;
    324
    325 /* only call separator, if there are fractional variables */
    326 if( SCIPgetNLPBranchCands(scip) == 0 )
    327 return SCIP_OKAY;
    328
    329 /* only call separator if not in probing with changed objective function
    330 * this separator did not track objective changes anymore
    331 */
    333 return SCIP_OKAY;
    334
    335 SCIP_CALL( separateCuts(scip, sepa, NULL, result) );
    336
    337 return SCIP_OKAY;
    338}
    339
    340
    341/** arbitrary primal solution separation method of separator */
    342static
    343SCIP_DECL_SEPAEXECSOL(sepaExecsolIntobj)
    344{ /*lint --e{715}*/
    345 *result = SCIP_DIDNOTRUN;
    346
    347 /* only call separator, if we are not close to terminating */
    348 if( SCIPisStopped(scip) )
    349 return SCIP_OKAY;
    350
    351 /* only call separator, if there can be no feasible integral objective value at least as good */
    353 return SCIP_OKAY;
    354
    355 SCIP_CALL( separateCuts(scip, sepa, sol, result) );
    356
    357 return SCIP_OKAY;
    358}
    359
    360
    361/*
    362 * event handler for catching newly added variables
    363 */
    364
    365
    366/** initialization method of event handler (called after problem was transformed) */
    367static
    368SCIP_DECL_EVENTINIT(eventInitIntobj)
    369{ /*lint --e{715}*/
    371
    372 return SCIP_OKAY;
    373}
    374
    375/** deinitialization method of event handler (called before transformed problem is freed) */
    376static
    377SCIP_DECL_EVENTEXIT(eventExitIntobj)
    378{ /*lint --e{715}*/
    380
    381 return SCIP_OKAY;
    382}
    383
    384
    385/** execution method of objective change event handler */
    386static
    387SCIP_DECL_EVENTEXEC(eventExecIntobj)
    388{ /*lint --e{715}*/
    389 SCIP_EVENTHDLRDATA* eventhdlrdata;
    390 SCIP_SEPADATA* sepadata;
    391 SCIP_VAR* var;
    392 SCIP_Real objdelta;
    393
    394 eventhdlrdata = SCIPeventhdlrGetData(eventhdlr);
    395 sepadata = (SCIP_SEPADATA*)eventhdlrdata;
    396 assert(sepadata != NULL);
    398
    399 /* we don't have anything to do, if the objective value inequality doesn't yet exist */
    400 if( sepadata->objrow == NULL )
    401 return SCIP_OKAY;
    402
    403 var = SCIPeventGetVar(event);
    404 SCIPdebugMsg(scip, "variable <%s> with obj=%g was added to the problem\n", SCIPvarGetName(var), SCIPvarGetObj(var));
    405
    406 objdelta = SCIPvarGetObj(var);
    407 if( !SCIPisZero(scip, objdelta) )
    408 {
    409 SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, var, SCIPvarGetObj(var)) );
    410 }
    411
    412 return SCIP_OKAY;
    413}
    414
    415
    416/*
    417 * separator specific interface methods
    418 */
    419
    420/** creates the integer objective value separator and includes it in SCIP */
    422 SCIP* scip /**< SCIP data structure */
    423 )
    424{
    425 SCIP_SEPADATA* sepadata;
    426 SCIP_EVENTHDLRDATA* eventhdlrdata;
    427 SCIP_SEPA* sepa;
    428 SCIP_EVENTHDLR* eventhdlr;
    429
    430 /* create intobj separator data */
    431 SCIP_CALL( sepadataCreate(scip, &sepadata) );
    432
    433 /* include separator */
    436 sepaExeclpIntobj, sepaExecsolIntobj,
    437 sepadata) );
    438
    439 assert(sepa != NULL);
    440
    441 /* set non-NULL pointers to callback methods */
    442 SCIP_CALL( SCIPsetSepaCopy(scip, sepa, sepaCopyIntobj) );
    443 SCIP_CALL( SCIPsetSepaFree(scip, sepa, sepaFreeIntobj) );
    444 SCIP_CALL( SCIPsetSepaExitsol(scip, sepa, sepaExitsolIntobj) );
    445
    446 /* include event handler for objective change events */
    447 eventhdlr = NULL;
    448 eventhdlrdata = (SCIP_EVENTHDLRDATA*)sepadata;
    450 eventExecIntobj, eventhdlrdata) );
    451 assert(eventhdlr != NULL);
    452
    453 SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitIntobj) );
    454 SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitIntobj) );
    455
    456 return SCIP_OKAY;
    457}
    #define NULL
    Definition: def.h:248
    #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_CALL(x)
    Definition: def.h:355
    SCIP_Bool SCIPisStopped(SCIP *scip)
    Definition: scip_general.c:759
    SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
    Definition: scip_prob.c:1907
    int SCIPgetNVars(SCIP *scip)
    Definition: scip_prob.c:2246
    SCIP_VAR ** SCIPgetVars(SCIP *scip)
    Definition: scip_prob.c:2201
    SCIP_Bool SCIPallVarsInProb(SCIP *scip)
    Definition: scip_prob.c:3247
    SCIP_Bool SCIPisObjIntegral(SCIP *scip)
    Definition: scip_prob.c:1801
    SCIP_Real SCIPgetLocalLowerbound(SCIP *scip)
    Definition: scip_prob.c:4178
    #define SCIPdebugMsg
    Definition: scip_message.h:78
    int SCIPgetNLPBranchCands(SCIP *scip)
    Definition: scip_branch.c:436
    SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
    Definition: scip_cut.c:225
    SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
    Definition: scip_event.c:111
    SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr)
    Definition: event.c:406
    SCIP_RETCODE SCIPsetEventhdlrExit(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_DECL_EVENTEXIT((*eventexit)))
    Definition: scip_event.c:185
    SCIP_RETCODE SCIPsetEventhdlrInit(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_DECL_EVENTINIT((*eventinit)))
    Definition: scip_event.c:171
    SCIP_EVENTTYPE SCIPeventGetType(SCIP_EVENT *event)
    Definition: event.c:1194
    SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
    Definition: event.c:1217
    SCIP_RETCODE SCIPcatchEvent(SCIP *scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
    Definition: scip_event.c:293
    SCIP_RETCODE SCIPdropEvent(SCIP *scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
    Definition: scip_event.c:333
    SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
    Definition: scip_lp.c:174
    SCIP_Real SCIPgetLPObjval(SCIP *scip)
    Definition: scip_lp.c:253
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPallocBlockMemory(scip, ptr)
    Definition: scip_mem.h:89
    SCIP_Bool SCIPisObjChangedProbing(SCIP *scip)
    Definition: scip_probing.c:553
    SCIP_RETCODE SCIPcacheRowExtensions(SCIP *scip, SCIP_ROW *row)
    Definition: scip_lp.c:1581
    SCIP_RETCODE SCIPflushRowExtensions(SCIP *scip, SCIP_ROW *row)
    Definition: scip_lp.c:1604
    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_RETCODE SCIPcreateEmptyRowSepa(SCIP *scip, SCIP_ROW **row, SCIP_SEPA *sepa, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
    Definition: scip_lp.c:1429
    SCIP_Bool SCIProwIsInLP(SCIP_ROW *row)
    Definition: lp.c:17917
    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
    const char * SCIPsepaGetName(SCIP_SEPA *sepa)
    Definition: sepa.c:746
    SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAFREE((*sepafree)))
    Definition: scip_sepa.c:173
    SCIP_RETCODE SCIPsetSepaExitsol(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAEXITSOL((*sepaexitsol)))
    Definition: scip_sepa.c:237
    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_Real SCIPgetSolTransObj(SCIP *scip, SCIP_SOL *sol)
    Definition: scip_sol.c:2005
    SCIP_Real SCIPgetLowerbound(SCIP *scip)
    SCIP_Real SCIPinfinity(SCIP *scip)
    SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
    SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
    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_Real SCIPvarGetUbLocal(SCIP_VAR *var)
    Definition: var.c:24268
    SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
    Definition: var.c:23900
    void SCIPvarMarkRelaxationOnly(SCIP_VAR *var)
    Definition: var.c:23618
    SCIP_RETCODE SCIPaddVarLocksType(SCIP *scip, SCIP_VAR *var, SCIP_LOCKTYPE locktype, int nlocksdown, int nlocksup)
    Definition: scip_var.c:5118
    SCIP_RETCODE SCIPcreateVarImpl(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_IMPLINTTYPE impltype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
    Definition: scip_var.c:225
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23267
    SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
    Definition: scip_var.c:1887
    SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
    Definition: var.c:24234
    SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
    Definition: var.c:24120
    SCIP_RETCODE SCIPincludeSepaIntobj(SCIP *scip)
    Definition: sepa_intobj.c:421
    public methods for managing events
    public methods for LP management
    public methods for message output
    #define SCIPdebug(x)
    Definition: pub_message.h:93
    public methods for separators
    public methods for problem variables
    public methods for branching rule plugins and branching
    public methods for cuts and aggregation rows
    public methods for event handler plugins and event handlers
    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 global and local (sub)problems
    public methods for the probing mode
    public methods for separator plugins
    public methods for solutions
    public methods for querying solving statistics
    public methods for SCIP variables
    #define SEPA_PRIORITY
    Definition: sepa_intobj.c:58
    static SCIP_RETCODE sepadataCreate(SCIP *scip, SCIP_SEPADATA **sepadata)
    Definition: sepa_intobj.c:87
    #define SEPA_DELAY
    Definition: sepa_intobj.c:62
    #define SEPA_DESC
    Definition: sepa_intobj.c:57
    #define SEPA_USESSUBSCIP
    Definition: sepa_intobj.c:61
    static SCIP_DECL_SEPACOPY(sepaCopyIntobj)
    Definition: sepa_intobj.c:254
    static SCIP_DECL_SEPAFREE(sepaFreeIntobj)
    Definition: sepa_intobj.c:268
    static SCIP_DECL_EVENTEXIT(eventExitIntobj)
    Definition: sepa_intobj.c:377
    static SCIP_DECL_SEPAEXECSOL(sepaExecsolIntobj)
    Definition: sepa_intobj.c:343
    static SCIP_RETCODE separateCuts(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
    Definition: sepa_intobj.c:185
    static SCIP_RETCODE sepadataFree(SCIP *scip, SCIP_SEPADATA **sepadata)
    Definition: sepa_intobj.c:104
    #define SEPA_MAXBOUNDDIST
    Definition: sepa_intobj.c:60
    #define SEPA_FREQ
    Definition: sepa_intobj.c:59
    static SCIP_DECL_SEPAEXECLP(sepaExeclpIntobj)
    Definition: sepa_intobj.c:313
    #define SEPA_NAME
    Definition: sepa_intobj.c:56
    #define EVENTHDLR_DESC
    Definition: sepa_intobj.c:65
    static SCIP_RETCODE createObjRow(SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
    Definition: sepa_intobj.c:121
    static SCIP_DECL_EVENTEXEC(eventExecIntobj)
    Definition: sepa_intobj.c:387
    static SCIP_DECL_SEPAEXITSOL(sepaExitsolIntobj)
    Definition: sepa_intobj.c:286
    static SCIP_DECL_EVENTINIT(eventInitIntobj)
    Definition: sepa_intobj.c:368
    #define EVENTHDLR_NAME
    Definition: sepa_intobj.c:64
    integer objective value separator
    struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA
    Definition: type_event.h:160
    #define SCIP_EVENTTYPE_VARADDED
    Definition: type_event.h:70
    @ SCIP_LPSOLSTAT_OPTIMAL
    Definition: type_lp.h:44
    @ 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_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
    struct SCIP_SepaData SCIP_SEPADATA
    Definition: type_sepa.h:52
    @ SCIP_IMPLINTTYPE_WEAK
    Definition: type_var.h:91
    @ SCIP_VARTYPE_CONTINUOUS
    Definition: type_var.h:71
    @ SCIP_LOCKTYPE_MODEL
    Definition: type_var.h:141