SCIP

    Solving Constraint Integer Programs

    heur_bound.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 heur_bound.c
    26 * @ingroup DEFPLUGINS_HEUR
    27 * @brief heuristic which fixes all integer variables to a bound (lower/upper) and solves the remaining LP
    28 * @author Gerald Gamrath
    29 *
    30 */
    31
    32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    33
    34#include "scip/heur_bound.h"
    35#include "scip/pub_heur.h"
    36#include "scip/pub_message.h"
    37#include "scip/pub_tree.h"
    38#include "scip/pub_var.h"
    39#include "scip/scip_branch.h"
    41#include "scip/scip_exact.h"
    42#include "scip/scip_general.h"
    43#include "scip/scip_heur.h"
    44#include "scip/scip_lp.h"
    45#include "scip/scip_mem.h"
    46#include "scip/scip_message.h"
    47#include "scip/scip_numerics.h"
    48#include "scip/scip_param.h"
    49#include "scip/scip_prob.h"
    50#include "scip/scip_probing.h"
    51#include "scip/scip_sol.h"
    53#include "scip/scip_timing.h"
    54#include "scip/scip_tree.h"
    55#ifdef SCIP_STATISTIC
    56#include "scip/clock.h"
    57#endif
    58
    59#define HEUR_NAME "bound"
    60#define HEUR_DESC "heuristic which fixes all integer variables to a bound and solves the remaining LP"
    61#define HEUR_DISPCHAR SCIP_HEURDISPCHAR_PROP
    62#define HEUR_PRIORITY -1107000
    63#define HEUR_FREQ -1
    64#define HEUR_FREQOFS 0
    65#define HEUR_MAXDEPTH -1
    66#define HEUR_TIMING SCIP_HEURTIMING_BEFORENODE
    67#define HEUR_USESSUBSCIP FALSE /**< does the heuristic use a secondary SCIP instance? */
    68
    69#define DEFAULT_ONLYWITHOUTSOL TRUE /**< Should heuristic only be executed if no primal solution was found, yet? */
    70#define DEFAULT_MAXPROPROUNDS 0 /* maximum number of propagation rounds during probing */
    71#define DEFAULT_BOUND 'l' /**< to which bound should integer variables be fixed? */
    72
    73
    74/*
    75 * Data structures
    76 */
    77
    78/** primal heuristic data */
    79struct SCIP_HeurData
    80{
    81 SCIP_Bool onlywithoutsol; /**< Should heuristic only be executed if no primal solution was found, yet? */
    82 int maxproprounds; /**< maximum number of propagation rounds during probing */
    83 char bound; /**< to which bound should integer variables be fixed? */
    84};
    85
    86/*
    87 * Local methods
    88 */
    89
    90/** main procedure of the bound heuristic */
    91static
    93 SCIP* scip, /**< original SCIP data structure */
    94 SCIP_HEUR* heur, /**< heuristic */
    95 SCIP_HEURDATA* heurdata, /**< heuristic data structure */
    96 SCIP_Bool lower, /**< should integer variables be fixed to their lower bound? */
    97 SCIP_RESULT* result /**< pointer to store the result */
    98 )
    99{
    100 SCIP_VAR** vars = SCIPgetVars(scip);
    101 SCIP_VAR* var;
    102 SCIP_Bool infeasible = FALSE;
    104 int maxproprounds;
    105 int v;
    106
    107 assert(nvars >= 0);
    108
    109 maxproprounds = heurdata->maxproprounds;
    110 if( maxproprounds == -2 )
    111 maxproprounds = 0;
    112
    113 /* stop if we would have infinite fixings */
    114 if( lower )
    115 {
    116 for( v = 0; v < nvars; ++v )
    117 {
    118 if( SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[v])) )
    119 return SCIP_OKAY;
    120 }
    121 }
    122 else
    123 {
    124 for( v = 0; v < nvars; ++v )
    125 {
    126 if( SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
    127 return SCIP_OKAY;
    128 }
    129 }
    130
    131 /* start probing */
    133
    134 for( v = 0; v < nvars; ++v )
    135 {
    136 var = vars[v];
    138
    139 /* skip variables which are already fixed */
    140 if( SCIPvarGetLbLocal(var) + 0.5 > SCIPvarGetUbLocal(var) )
    141 continue;
    142
    143 /* fix variable to lower bound */
    144 if( lower )
    145 {
    147 SCIPdebugMsg(scip, "fixing %d: variable <%s> to lower bound <%g> (%d pseudo cands)\n",
    149 }
    150 /* fix variable to upper bound */
    151 else
    152 {
    154 SCIPdebugMsg(scip, "fixing %d: variable <%s> to upper bound <%g> (%d pseudo cands)\n",
    156 }
    157
    158 /* propagate fixings */
    159 if( heurdata->maxproprounds != 0 )
    160 {
    161 SCIP_CALL( SCIPpropagateProbing(scip, maxproprounds, &infeasible, NULL) );
    162 }
    163
    164 /* todo: try to backtrack */
    165 /* stop if infeasible */
    166 if( infeasible )
    167 break;
    168 }
    169
    170 SCIPdebugMsg(scip, "probing ended with %sfeasible problem\n", infeasible ? "in" : "");
    171
    172 /*************************** Probing LP Solving ***************************/
    173
    174 /* solve lp only if the problem is still feasible */
    175 if( !infeasible )
    176 {
    177 char strbuf[SCIP_MAXSTRLEN];
    178 SCIP_LPSOLSTAT lpstatus;
    179 SCIP_Bool lperror;
    180 int ncols;
    181
    182 /* print message if relatively large LP is solved from scratch, since this could lead to a longer period during
    183 * which the user sees no output; more detailed probing stats only in debug mode */
    184 ncols = SCIPgetNLPCols(scip);
    185 if( !SCIPisLPSolBasic(scip) && ncols > 1000 )
    186 {
    187 int nunfixedcols = SCIPgetNUnfixedLPCols(scip);
    188
    189 if( nunfixedcols > 0.5 * ncols )
    190 {
    192 "Heuristic " HEUR_NAME " solving LP from scratch with %.1f %% unfixed columns (%d of %d) ...\n",
    193 100.0 * (nunfixedcols / (SCIP_Real)ncols), nunfixedcols, ncols);
    194 }
    195 }
    196 SCIPdebugMsg(scip, "Heuristic " HEUR_NAME " probing LP: %s\n",
    198
    199 /* solve LP; errors in the LP solver should not kill the overall solving process, if the LP is just needed for a
    200 * heuristic. hence in optimized mode, the return code is caught and a warning is printed, only in debug mode,
    201 * SCIP will stop.
    202 */
    203 SCIPdebugMsg(scip, "starting solving bound-heur LP at time %g, LP iterations: %" SCIP_LONGINT_FORMAT "\n",
    205#ifdef NDEBUG
    206 {
    207 SCIP_Bool retstat;
    208 retstat = SCIPsolveProbingLP(scip, -1, &lperror, NULL);
    209 if( retstat != SCIP_OKAY )
    210 {
    211 SCIPwarningMessage(scip, "Error while solving LP in bound heuristic; LP solve terminated with code <%d>\n",
    212 retstat);
    213 }
    214 }
    215#else
    216 SCIP_CALL( SCIPsolveProbingLP(scip, -1, &lperror, NULL) );
    217#endif
    218 SCIPdebugMsg(scip, "ending solving bound-heur LP at time %g\n", SCIPgetSolvingTime(scip));
    219
    220 lpstatus = SCIPgetLPSolstat(scip);
    221
    222 SCIPdebugMsg(scip, " -> new LP iterations: %" SCIP_LONGINT_FORMAT "\n", SCIPgetNLPIterations(scip));
    223 SCIPdebugMsg(scip, " -> error=%u, status=%d\n", lperror, lpstatus);
    224
    225 /* check if this is a feasible solution */
    226 if( lpstatus == SCIP_LPSOLSTAT_OPTIMAL && !lperror )
    227 {
    228 SCIP_SOL* newsol;
    229 SCIP_Bool stored;
    230 SCIP_Bool success;
    231
    232 /* create temporary solution */
    233 SCIP_CALL( SCIPcreateSol(scip, &newsol, heur) );
    234
    235 /* copy the current LP solution to the working solution */
    236 SCIP_CALL( SCIPlinkLPSol(scip, newsol) );
    237
    238 SCIP_CALL( SCIProundSol(scip, newsol, &success) );
    239
    240 if( success )
    241 {
    242 SCIPdebugMsg(scip, "bound heuristic found roundable primal solution: obj=%g\n",
    243 SCIPgetSolOrigObj(scip, newsol));
    244
    245 /* check solution for feasibility, and add it to solution store if possible.
    246 * Neither integrality nor feasibility of LP rows have to be checked, because they
    247 * are guaranteed by the heuristic at this stage.
    248 */
    249#ifdef SCIP_DEBUG
    250 SCIP_CALL( SCIPtrySol(scip, newsol, TRUE, TRUE, TRUE, TRUE, TRUE, &stored) );
    251#else
    252 SCIP_CALL( SCIPtrySol(scip, newsol, FALSE, FALSE, TRUE, FALSE, FALSE, &stored) );
    253#endif
    254
    255 if( stored )
    256 {
    257 SCIPdebugMsg(scip, "found feasible solution:\n");
    258 *result = SCIP_FOUNDSOL;
    259 }
    260 }
    261
    262 /* free solution */
    263 SCIP_CALL( SCIPfreeSol(scip, &newsol) );
    264 }
    265 }
    266
    267 /* exit probing mode */
    269
    270 return SCIP_OKAY;
    271}
    272
    273
    274/*
    275 * Callback methods of primal heuristic
    276 */
    277
    278/** copy method for primal heuristic plugins (called when SCIP copies plugins) */
    279static
    280SCIP_DECL_HEURCOPY(heurCopyBound)
    281{ /*lint --e{715}*/
    282 assert(scip != NULL);
    283 assert(heur != NULL);
    284
    286
    287 /* call inclusion method of heuristic */
    289
    290 return SCIP_OKAY;
    291}
    292
    293/** destructor of primal heuristic to free user data (called when SCIP is exiting) */
    294static
    295SCIP_DECL_HEURFREE(heurFreeBound)
    296{ /*lint --e{715}*/
    297 SCIP_HEURDATA* heurdata;
    298
    299 /* free heuristic data */
    300 heurdata = SCIPheurGetData(heur);
    301
    302 SCIPfreeBlockMemory(scip, &heurdata);
    303 SCIPheurSetData(heur, NULL);
    304
    305 return SCIP_OKAY;
    306}
    307
    308/** execution method of primal heuristic */
    309static
    310SCIP_DECL_HEUREXEC(heurExecBound)
    311{ /*lint --e{715}*/
    312 SCIP_HEURDATA* heurdata;
    313
    314 assert(heur != NULL);
    315 assert(scip != NULL);
    316 assert(result != NULL);
    317
    318 *result = SCIP_DIDNOTRUN;
    319
    321 return SCIP_OKAY;
    322
    324 return SCIP_OKAY;
    325
    326 heurdata = SCIPheurGetData(heur);
    327 assert(heurdata != NULL);
    328
    329 *result = SCIP_DIDNOTFIND;
    330
    331 if( SCIPisStopped(scip) )
    332 return SCIP_OKAY;
    333
    334 /* stop execution method if there is already a primal feasible solution at hand */
    335 if( SCIPgetBestSol(scip) != NULL && heurdata->onlywithoutsol )
    336 return SCIP_OKAY;
    337
    338 SCIPdebugMsg(scip, "apply bound heuristic at node %lld\n",
    340
    342 {
    343 SCIP_Bool cutoff;
    344
    345 SCIP_CALL( SCIPconstructLP(scip, &cutoff) );
    346
    347 /* manually cut off the node if the LP construction detected infeasibility (heuristics cannot return such a
    348 * result); the cutoff result is safe to use in exact solving mode, but we don't have enough information to
    349 * give a certificate for the cutoff
    350 */
    351 if( cutoff && !SCIPisCertified(scip) )
    352 {
    354 return SCIP_OKAY;
    355 }
    356
    358 }
    359
    360 if( heurdata->bound == 'l' || heurdata->bound == 'b' )
    361 {
    362 SCIP_CALL( applyBoundHeur(scip, heur, heurdata, TRUE, result) );
    363 }
    364 if( heurdata->bound == 'u' || heurdata->bound == 'b' )
    365 {
    366 SCIP_CALL( applyBoundHeur(scip, heur, heurdata, FALSE, result) );
    367 }
    368
    369 return SCIP_OKAY;
    370}
    371
    372/*
    373 * primal heuristic specific interface methods
    374 */
    375
    376/** creates the bound primal heuristic and includes it in SCIP */
    378 SCIP* scip /**< SCIP data structure */
    379 )
    380{
    381 SCIP_HEURDATA* heurdata;
    382 SCIP_HEUR* heur;
    383
    384 /* create bound primal heuristic data */
    385 SCIP_CALL( SCIPallocBlockMemory(scip, &heurdata) );
    386
    387 /* include primal heuristic */
    390 HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecBound, heurdata) );
    391
    392 assert(heur != NULL);
    393
    394 /* primal heuristic is safe to use in exact solving mode */
    395 SCIPheurMarkExact(heur);
    396
    397 /* set non-NULL pointers to callback methods */
    398 SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyBound) );
    399 SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeBound) );
    400
    401 /* add bound heuristic parameters */
    402
    403 SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/" HEUR_NAME "/onlywithoutsol",
    404 "Should heuristic only be executed if no primal solution was found, yet?",
    405 &heurdata->onlywithoutsol, TRUE, DEFAULT_ONLYWITHOUTSOL, NULL, NULL) );
    406
    407 SCIP_CALL( SCIPaddIntParam(scip, "heuristics/" HEUR_NAME "/maxproprounds",
    408 "maximum number of propagation rounds during probing (-1 infinity, -2 parameter settings)",
    409 &heurdata->maxproprounds, TRUE, DEFAULT_MAXPROPROUNDS, -1, INT_MAX/4, NULL, NULL) );
    410
    411 SCIP_CALL( SCIPaddCharParam(scip, "heuristics/" HEUR_NAME "/bound",
    412 "to which bound should integer variables be fixed? ('l'ower, 'u'pper, or 'b'oth)",
    413 &heurdata->bound, FALSE, DEFAULT_BOUND, "lub", NULL, NULL) );
    414
    415 return SCIP_OKAY;
    416}
    static long bound
    internal methods for clocks and timing issues
    #define NULL
    Definition: def.h:257
    #define SCIP_MAXSTRLEN
    Definition: def.h:278
    #define SCIP_Bool
    Definition: def.h:100
    #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 SCIP_LONGINT_FORMAT
    Definition: def.h:157
    #define SCIP_CALL(x)
    Definition: def.h:364
    SCIP_Bool SCIPisStopped(SCIP *scip)
    Definition: scip_general.c:767
    int SCIPgetNContVars(SCIP *scip)
    Definition: scip_prob.c:2569
    int SCIPgetNVars(SCIP *scip)
    Definition: scip_prob.c:2246
    SCIP_VAR ** SCIPgetVars(SCIP *scip)
    Definition: scip_prob.c:2201
    int SCIPgetNContImplVars(SCIP *scip)
    Definition: scip_prob.c:2522
    void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
    Definition: scip_message.c:225
    #define SCIPdebugMsg
    Definition: scip_message.h:78
    void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
    Definition: scip_message.c:120
    SCIP_RETCODE SCIPaddCharParam(SCIP *scip, const char *name, const char *desc, char *valueptr, SCIP_Bool isadvanced, char defaultvalue, const char *allowedvalues, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:167
    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 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 SCIPincludeHeurBound(SCIP *scip)
    Definition: heur_bound.c:377
    int SCIPgetNPseudoBranchCands(SCIP *scip)
    Definition: scip_branch.c:766
    SCIP_Bool SCIPisCertified(SCIP *scip)
    SCIP_RETCODE SCIPsetHeurCopy(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURCOPY((*heurcopy)))
    Definition: scip_heur.c:167
    SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
    Definition: heur.c:1368
    SCIP_RETCODE SCIPincludeHeurBasic(SCIP *scip, SCIP_HEUR **heur, const char *name, const char *desc, char dispchar, int priority, int freq, int freqofs, int maxdepth, SCIP_HEURTIMING timingmask, SCIP_Bool usessubscip, SCIP_DECL_HEUREXEC((*heurexec)), SCIP_HEURDATA *heurdata)
    Definition: scip_heur.c:122
    SCIP_RETCODE SCIPsetHeurFree(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURFREE((*heurfree)))
    Definition: scip_heur.c:183
    void SCIPheurMarkExact(SCIP_HEUR *heur)
    Definition: heur.c:1457
    const char * SCIPheurGetName(SCIP_HEUR *heur)
    Definition: heur.c:1467
    void SCIPheurSetData(SCIP_HEUR *heur, SCIP_HEURDATA *heurdata)
    Definition: heur.c:1378
    SCIP_RETCODE SCIPflushLP(SCIP *scip)
    Definition: scip_lp.c:154
    SCIP_Bool SCIPhasCurrentNodeLP(SCIP *scip)
    Definition: scip_lp.c:87
    SCIP_RETCODE SCIPconstructLP(SCIP *scip, SCIP_Bool *cutoff)
    Definition: scip_lp.c:130
    SCIP_Bool SCIPisLPConstructed(SCIP *scip)
    Definition: scip_lp.c:105
    SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
    Definition: scip_lp.c:174
    int SCIPgetNUnfixedLPCols(SCIP *scip)
    Definition: scip_lp.c:554
    int SCIPgetNLPCols(SCIP *scip)
    Definition: scip_lp.c:533
    SCIP_Bool SCIPisLPSolBasic(SCIP *scip)
    Definition: scip_lp.c:673
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPallocBlockMemory(scip, ptr)
    Definition: scip_mem.h:89
    SCIP_Longint SCIPnodeGetNumber(SCIP_NODE *node)
    Definition: tree.c:8513
    char * SCIPsnprintfProbingStats(SCIP *scip, char *strbuf, int len)
    SCIP_RETCODE SCIPpropagateProbing(SCIP *scip, int maxproprounds, SCIP_Bool *cutoff, SCIP_Longint *ndomredsfound)
    Definition: scip_probing.c:581
    SCIP_RETCODE SCIPstartProbing(SCIP *scip)
    Definition: scip_probing.c:120
    SCIP_RETCODE SCIPsolveProbingLP(SCIP *scip, int itlim, SCIP_Bool *lperror, SCIP_Bool *cutoff)
    Definition: scip_probing.c:825
    SCIP_RETCODE SCIPfixVarProbing(SCIP *scip, SCIP_VAR *var, SCIP_Real fixedval)
    Definition: scip_probing.c:419
    SCIP_RETCODE SCIPendProbing(SCIP *scip)
    Definition: scip_probing.c:261
    SCIP_SOL * SCIPgetBestSol(SCIP *scip)
    Definition: scip_sol.c:2986
    SCIP_RETCODE SCIPcreateSol(SCIP *scip, SCIP_SOL **sol, SCIP_HEUR *heur)
    Definition: scip_sol.c:514
    SCIP_RETCODE SCIPfreeSol(SCIP *scip, SCIP_SOL **sol)
    Definition: scip_sol.c:1250
    SCIP_RETCODE SCIProundSol(SCIP *scip, SCIP_SOL *sol, SCIP_Bool *success)
    Definition: scip_sol.c:3128
    SCIP_RETCODE SCIPtrySol(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:4017
    SCIP_RETCODE SCIPlinkLPSol(SCIP *scip, SCIP_SOL *sol)
    Definition: scip_sol.c:1293
    SCIP_Real SCIPgetSolOrigObj(SCIP *scip, SCIP_SOL *sol)
    Definition: scip_sol.c:1890
    SCIP_Longint SCIPgetNLPIterations(SCIP *scip)
    SCIP_Real SCIPgetSolvingTime(SCIP *scip)
    Definition: scip_timing.c:378
    SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
    SCIP_RETCODE SCIPcutoffNode(SCIP *scip, SCIP_NODE *node)
    Definition: scip_tree.c:436
    SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
    Definition: scip_tree.c:91
    SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
    Definition: var.c:24300
    SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
    Definition: var.c:23485
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23299
    SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
    Definition: var.c:24266
    #define DEFAULT_ONLYWITHOUTSOL
    Definition: heur_bound.c:69
    #define HEUR_TIMING
    Definition: heur_bound.c:66
    #define HEUR_FREQOFS
    Definition: heur_bound.c:64
    #define HEUR_DESC
    Definition: heur_bound.c:60
    static SCIP_DECL_HEURCOPY(heurCopyBound)
    Definition: heur_bound.c:280
    #define HEUR_DISPCHAR
    Definition: heur_bound.c:61
    #define HEUR_MAXDEPTH
    Definition: heur_bound.c:65
    #define HEUR_PRIORITY
    Definition: heur_bound.c:62
    static SCIP_DECL_HEUREXEC(heurExecBound)
    Definition: heur_bound.c:310
    static SCIP_RETCODE applyBoundHeur(SCIP *scip, SCIP_HEUR *heur, SCIP_HEURDATA *heurdata, SCIP_Bool lower, SCIP_RESULT *result)
    Definition: heur_bound.c:92
    #define HEUR_NAME
    Definition: heur_bound.c:59
    static SCIP_DECL_HEURFREE(heurFreeBound)
    Definition: heur_bound.c:295
    #define DEFAULT_BOUND
    Definition: heur_bound.c:71
    #define HEUR_FREQ
    Definition: heur_bound.c:63
    #define HEUR_USESSUBSCIP
    Definition: heur_bound.c:67
    #define DEFAULT_MAXPROPROUNDS
    Definition: heur_bound.c:70
    heuristic which fixes all integer variables to a bound (lower/upper) and solves the remaining LP
    public methods for primal heuristics
    public methods for message output
    public methods for branch and bound tree
    public methods for problem variables
    public methods for branching rule plugins and branching
    public methods for certified solving
    public methods for exact solving
    general public methods
    public methods for primal heuristic plugins and divesets
    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 the probing mode
    public methods for solutions
    public methods for querying solving statistics
    public methods for timing
    public methods for the branch-and-bound tree
    struct SCIP_HeurData SCIP_HEURDATA
    Definition: type_heur.h:77
    enum SCIP_LPSolStat SCIP_LPSOLSTAT
    Definition: type_lp.h:52
    @ SCIP_LPSOLSTAT_OPTIMAL
    Definition: type_lp.h:44
    @ SCIP_VERBLEVEL_FULL
    Definition: type_message.h:62
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_DIDNOTFIND
    Definition: type_result.h:44
    @ SCIP_FOUNDSOL
    Definition: type_result.h:56
    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
    @ SCIP_VARTYPE_CONTINUOUS
    Definition: type_var.h:71