Scippy

    SCIP

    Solving Constraint Integer Programs

    presol_convertinttobin.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 presol_convertinttobin.c
    26 * @ingroup DEFPLUGINS_PRESOL
    27 * @brief presolver that converts integer variables to binaries
    28 * @author Michael Winkler
    29 *
    30 * Converts integer variables at the beginning of Presolving into their binary representation. If necessary adds a
    31 * bounding knapsack constraint.
    32 *
    33 */
    34
    35/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    36
    38#include "scip/cons_knapsack.h"
    39#include "scip/debug.h"
    41#include "scip/pub_message.h"
    42#include "scip/pub_misc.h"
    43#include "scip/pub_presol.h"
    44#include "scip/pub_var.h"
    45#include "scip/scip_cons.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_presol.h"
    51#include "scip/scip_prob.h"
    52#include "scip/scip_var.h"
    53#include <string.h>
    54
    55#define PRESOL_NAME "convertinttobin"
    56#define PRESOL_DESC "converts integer variables to binaries"
    57#define PRESOL_PRIORITY +6000000 /**< priority of the presolver (>= 0: before, < 0: after constraint handlers) */
    58#define PRESOL_MAXROUNDS 0 /**< maximal number of presolving rounds the presolver participates in (-1: no
    59 * limit) */
    60#define PRESOL_TIMING SCIP_PRESOLTIMING_FAST /* timing of the presolver (fast, medium, or exhaustive) */
    61
    62#define DEFAULT_MAXDOMAINSIZE SCIP_LONGINT_MAX /**< absolute value of maximum domain size which will be converted */
    63#define DEFAULT_ONLYPOWERSOFTWO FALSE /**< should only integer variables with a domain size of 2^p - 1 be
    64 * converted(, there we don't need an knapsack-constraint) */
    65#define DEFAULT_SAMELOCKSINBOTHDIRECTIONS FALSE /**< should only integer variables with uplocks equals downlocks be converted */
    66
    67/** presolver data */
    68struct SCIP_PresolData
    69{
    70 SCIP_Longint maxdomainsize; /**< absolute value of maximum domain size */
    71 SCIP_Bool onlypoweroftwo; /**< should only integer variables with a domain size of 2^p - 1 be converted */
    72 SCIP_Bool samelocksinbothdirections; /**< should only integer variables with uplocks equals downlocks be converted */
    73};
    74
    75/*
    76 * Callback methods of presolver
    77 */
    78
    79/** copy method for constraint handler plugins (called when SCIP copies plugins) */
    80static
    81SCIP_DECL_PRESOLCOPY(presolCopyConvertinttobin)
    82{ /*lint --e{715}*/
    83 assert(scip != NULL);
    84 assert(presol != NULL);
    85 assert(strcmp(SCIPpresolGetName(presol), PRESOL_NAME) == 0);
    86
    87 /* call inclusion method of presolver */
    89
    90 return SCIP_OKAY;
    91}
    92
    93/** destructor of presolver to free user data (called when SCIP is exiting) */
    94static
    95SCIP_DECL_PRESOLFREE(presolFreeConvertinttobin)
    96{ /*lint --e{715}*/
    97 SCIP_PRESOLDATA* presoldata;
    98
    99 /* free presolver data */
    100 presoldata = SCIPpresolGetData(presol);
    101 assert(presoldata != NULL);
    102
    103 SCIPfreeBlockMemory(scip, &presoldata);
    104 SCIPpresolSetData(presol, NULL);
    105
    106 return SCIP_OKAY;
    107}
    108
    109/** presolving execution method */
    110static
    111SCIP_DECL_PRESOLEXEC(presolExecConvertinttobin)
    112{ /*lint --e{715}*/
    113 SCIP_VAR** scipvars;
    114 SCIP_VAR** vars;
    115 SCIP_PRESOLDATA* presoldata;
    116 int nbinvars;
    117 int nintvars;
    118 int v;
    119
    120 assert(scip != NULL);
    121 assert(presol != NULL);
    122 assert(strcmp(SCIPpresolGetName(presol), PRESOL_NAME) == 0);
    123 assert(result != NULL);
    124
    125 *result = SCIP_DIDNOTRUN;
    126
    127 /* get the problem variables */
    128 scipvars = SCIPgetVars(scip);
    129 nbinvars = SCIPgetNBinVars(scip);
    130 nintvars = SCIPgetNIntVars(scip);
    131 if( nintvars == 0 )
    132 return SCIP_OKAY;
    133
    134 /* get presolver data */
    135 presoldata = SCIPpresolGetData(presol);
    136 assert(presoldata != NULL);
    137
    138 *result = SCIP_DIDNOTFIND;
    139
    140 /* copy the integer variables into an own array, since adding binary variables affects the left-most slots in the
    141 * array and thereby interferes with our search loop
    142 */
    143 SCIP_CALL( SCIPduplicateBufferArray(scip, &vars, &scipvars[nbinvars], nintvars) );
    144
    145 /* scan the integer variables for possible conversion into binaries;
    146 * we have to collect the variables first in an own
    147 */
    148 for( v = 0; v < nintvars; ++v )
    149 {
    150 SCIP_VAR** newbinvars;
    151 SCIP_Real* newbinvarcoeffs;
    152 SCIP_Longint* weights;
    153 SCIP_CONS* newcons;
    154 SCIP_Real lb;
    155 SCIP_Real ub;
    156 SCIP_Longint domainsize;
    157 char newbinvarname[SCIP_MAXSTRLEN];
    158 char newconsname[SCIP_MAXSTRLEN];
    159 int nnewbinvars;
    160 int v2;
    161 SCIP_Longint scalar;
    162 SCIP_Bool infeasible;
    163 SCIP_Bool aggregated;
    164 SCIP_Bool noconsknapsack;
    165
    166 assert(SCIPvarGetType(vars[v]) == SCIP_VARTYPE_INTEGER && !SCIPvarIsImpliedIntegral(vars[v]));
    167
    168 /* skip variables which cannot be multi-aggregated */
    169 if( SCIPdoNotMultaggrVar(scip, vars[v]) )
    170 continue;
    171
    172 /* check for correct locks */
    173 if( presoldata->samelocksinbothdirections
    175 continue;
    176
    177 /* get variable's bounds */
    178 lb = SCIPvarGetLbGlobal(vars[v]);
    179 ub = SCIPvarGetUbGlobal(vars[v]);
    180 assert( SCIPisIntegral(scip, lb) );
    181 assert( SCIPisIntegral(scip, ub) );
    182
    183 if( SCIPisInfinity(scip, ub - lb) )
    184 domainsize = SCIP_LONGINT_MAX;
    185 else
    186 domainsize = (SCIP_Longint) SCIPceil(scip, ub - lb);
    187
    188 assert(domainsize >= 0);
    189
    190 /* check for allowed domainsize */
    191 if( SCIPisInfinity(scip, -lb) || SCIPisInfinity(scip, ub) || domainsize > presoldata->maxdomainsize )
    192 continue;
    193
    194 /* check for domainsize is not 2^p - 1 if necessary */
    195 if( presoldata->onlypoweroftwo )
    196 {
    197 /* stop if domainsize is not 2^p - 1*/
    198 SCIP_Longint tmp;
    199
    200 assert(domainsize < SCIP_LONGINT_MAX);
    201 tmp = domainsize + 1;
    202
    203 while( tmp % 2 == 0 )
    204 tmp /= 2;
    205 if( tmp != 1 )
    206 continue;
    207 }
    208
    209 noconsknapsack = FALSE;
    210
    211 nnewbinvars = (int)SCIPfloor(scip, (log((SCIP_Real) domainsize)/log(2.0))) + 1;
    212
    213 SCIPdebugMsg(scip, "integer variable <%s> [%g,%g], domainsize %" SCIP_LONGINT_FORMAT "\n, <uplocks = %d, downlocks = %d will be 'binarized' by %d binary variables\n ",
    214 SCIPvarGetName(vars[v]), lb, ub, domainsize, SCIPvarGetNLocksUpType(vars[v], SCIP_LOCKTYPE_MODEL),
    215 SCIPvarGetNLocksDownType(vars[v], SCIP_LOCKTYPE_MODEL), nnewbinvars);
    216
    217 assert(nnewbinvars > 0);
    218
    219 scalar = (SCIP_Longint)pow(2.0, nnewbinvars); /*lint !e747*/
    220 /* because of rounding errors */
    221 if( scalar == domainsize )
    222 {
    223 scalar *= 2;
    224 nnewbinvars++;
    225 }
    226 else if( scalar == domainsize + 1 )
    227 noconsknapsack = TRUE;
    228
    229 assert(scalar > domainsize);
    230
    231 SCIP_CALL( SCIPallocBufferArray(scip, &newbinvars, nnewbinvars) );
    232 SCIP_CALL( SCIPallocBufferArray(scip, &newbinvarcoeffs, nnewbinvars) );
    233 SCIP_CALL( SCIPallocBufferArray(scip, &weights, nnewbinvars) );
    234
    235 for( v2 = nnewbinvars - 1; v2 >= 0; --v2 )
    236 {
    237 SCIPdebugMsg(scip, "creating for <%s>[%g,%g] %d. binary variable\n", SCIPvarGetName(vars[v]), lb, ub, v2);
    238
    239 /* create binary variable */
    240 (void) SCIPsnprintf(newbinvarname, SCIP_MAXSTRLEN, "%s_bin_%d", SCIPvarGetName(vars[v]), v2);
    241 SCIP_CALL( SCIPcreateVar(scip, &newbinvars[v2], newbinvarname, 0.0, 1.0, 0.0, SCIP_VARTYPE_BINARY,
    242 SCIPvarIsInitial(vars[v]), SCIPvarIsRemovable(vars[v]), NULL, NULL, NULL, NULL, NULL) );
    243 SCIP_CALL( SCIPaddVar(scip, newbinvars[v2]) );
    244
    245 scalar /= 2;
    246 assert(scalar > 0);
    247
    248 newbinvarcoeffs[v2] = (SCIP_Real)scalar;
    249 weights[v2] = scalar;
    250 }
    251
    252#ifdef WITH_DEBUG_SOLUTION
    253 /* set the debug solution values */
    254 if( SCIPdebugIsMainscip(scip) )
    255 {
    256 SCIP_Real varval;
    257
    258 SCIP_CALL( SCIPdebugGetSolVal(scip, vars[v], &varval) );
    259 assert(SCIPisIntegral(scip, varval));
    260
    261 if( SCIPisPositive(scip, varval) )
    262 {
    263 SCIP_Real resvarval = varval;
    264
    265 for( v2 = nnewbinvars - 1; v2 >= 0; --v2 )
    266 {
    267 assert(SCIPisPositive(scip, resvarval));
    268 assert(SCIPisIntegral(scip, resvarval));
    269
    270 if( SCIPisLE(scip, newbinvarcoeffs[v2], resvarval) )
    271 {
    272 SCIP_CALL( SCIPdebugAddSolVal(scip, newbinvars[v2], 1.0) );
    273 resvarval -= newbinvarcoeffs[v2];
    274 }
    275
    276 if( SCIPisZero(scip, resvarval) )
    277 break;
    278 }
    279 }
    280 }
    281#endif
    282
    283 /* aggregate integer and binary variable */
    284 SCIP_CALL( SCIPmultiaggregateVar(scip, vars[v], nnewbinvars, newbinvars, (SCIP_Real*)newbinvarcoeffs, lb, &infeasible, &aggregated) );
    285 assert(!infeasible);
    286 assert(aggregated);
    287
    288 (void) SCIPsnprintf(newconsname, SCIP_MAXSTRLEN, "%s_bin_knapsack", SCIPvarGetName(vars[v]));
    289
    290 if( !noconsknapsack )
    291 {
    292 int nodd;
    293 nodd = 0;
    294 while( domainsize % 2 == 1 )
    295 {
    296 nodd++;
    297 domainsize = (domainsize - 1) / 2;
    298 }
    299 if( nodd > 0 )
    300 {
    301 SCIP_Longint divisor;
    302
    303 divisor = (SCIP_Longint)pow(2.0, nodd); /*lint !e747*/
    304 assert(divisor >= 2);
    305
    306 for( v2 = nodd; v2 < nnewbinvars; ++v2 )
    307 {
    308 weights[v2] /= divisor;
    309 }
    310 }
    311
    312 SCIP_CALL( SCIPcreateConsKnapsack(scip, &newcons, newconsname, nnewbinvars - nodd, &newbinvars[nodd],
    313 &weights[nodd], domainsize,
    315 SCIP_CALL( SCIPaddCons(scip, newcons) );
    316 SCIPdebugPrintCons(scip, newcons, NULL);
    317 SCIP_CALL( SCIPreleaseCons(scip, &newcons) );
    318 }
    319
    320 for( v2 = nnewbinvars - 1; v2 >= 0; --v2 )
    321 {
    322 /* release binary variable */
    323 SCIP_CALL( SCIPreleaseVar(scip, &newbinvars[v2]) );
    324 (*nchgvartypes)++;
    325 }
    326
    327 SCIPfreeBufferArray(scip, &newbinvars);
    328 SCIPfreeBufferArray(scip, &newbinvarcoeffs);
    329 SCIPfreeBufferArray(scip, &weights);
    330
    331 if( aggregated ) /*lint !e774*/
    332 *result = SCIP_SUCCESS;
    333 }
    334
    335 /* free temporary memory */
    337
    338 return SCIP_OKAY;
    339}
    340
    341
    342/*
    343 * presolver specific interface methods
    344 */
    345
    346/** creates the convertinttobin presolver and includes it in SCIP */
    348 SCIP* scip /**< SCIP data structure */
    349 )
    350{
    351 SCIP_PRESOLDATA* presoldata;
    352 SCIP_PRESOL* presolptr;
    353
    354 /* create convertinttobin presolver data */
    355 SCIP_CALL( SCIPallocBlockMemory(scip, &presoldata) );
    356
    357 presoldata->maxdomainsize = DEFAULT_MAXDOMAINSIZE;
    358 presoldata->onlypoweroftwo = DEFAULT_ONLYPOWERSOFTWO;
    359
    360 /* include presolver */
    362 presolExecConvertinttobin,
    363 presoldata) );
    364 assert(presolptr != NULL);
    365
    366 SCIP_CALL( SCIPsetPresolCopy(scip, presolptr, presolCopyConvertinttobin) );
    367 SCIP_CALL( SCIPsetPresolFree(scip, presolptr, presolFreeConvertinttobin) );
    368
    369 /* add convertinttobin presolver parameters */
    371 "presolving/" PRESOL_NAME "/maxdomainsize",
    372 "absolute value of maximum domain size for converting an integer variable to binaries variables",
    373 &presoldata->maxdomainsize, TRUE, DEFAULT_MAXDOMAINSIZE, 0LL, SCIP_LONGINT_MAX, NULL, NULL) );
    374
    375 /* add convertinttobin presolver parameters */
    377 "presolving/" PRESOL_NAME "/onlypoweroftwo",
    378 "should only integer variables with a domain size of 2^p - 1 be converted(, there we don't need an knapsack-constraint for restricting the sum of the binaries)",
    379 &presoldata->onlypoweroftwo, TRUE, DEFAULT_ONLYPOWERSOFTWO, NULL, NULL) );
    380
    381 /* add convertinttobin presolver parameters */
    383 "presolving/" PRESOL_NAME "/samelocksinbothdirections",
    384 "should only integer variables with uplocks equals downlocks be converted",
    385 &presoldata->samelocksinbothdirections, TRUE, DEFAULT_SAMELOCKSINBOTHDIRECTIONS, NULL, NULL) );
    386
    387 return SCIP_OKAY;
    388}
    Constraint handler for knapsack constraints of the form , x binary and .
    methods for debugging
    #define SCIPdebugGetSolVal(scip, var, val)
    Definition: debug.h:312
    #define SCIPdebugAddSolVal(scip, var, val)
    Definition: debug.h:311
    #define NULL
    Definition: def.h:248
    #define SCIP_MAXSTRLEN
    Definition: def.h:269
    #define SCIP_Longint
    Definition: def.h:141
    #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_LONGINT_MAX
    Definition: def.h:142
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_RETCODE SCIPcreateConsKnapsack(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Longint *weights, SCIP_Longint capacity, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
    SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
    Definition: scip_prob.c:1907
    int SCIPgetNIntVars(SCIP *scip)
    Definition: scip_prob.c:2340
    SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
    Definition: scip_prob.c:3274
    SCIP_VAR ** SCIPgetVars(SCIP *scip)
    Definition: scip_prob.c:2201
    int SCIPgetNBinVars(SCIP *scip)
    Definition: scip_prob.c:2293
    #define SCIPdebugMsg
    Definition: scip_message.h:78
    SCIP_RETCODE SCIPaddLongintParam(SCIP *scip, const char *name, const char *desc, SCIP_Longint *valueptr, SCIP_Bool isadvanced, SCIP_Longint defaultvalue, SCIP_Longint minvalue, SCIP_Longint maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:111
    SCIP_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 SCIPincludePresolConvertinttobin(SCIP *scip)
    SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
    Definition: scip_cons.c:1173
    #define SCIPallocBufferArray(scip, ptr, num)
    Definition: scip_mem.h:124
    #define SCIPfreeBufferArray(scip, ptr)
    Definition: scip_mem.h:136
    #define SCIPduplicateBufferArray(scip, ptr, source, num)
    Definition: scip_mem.h:132
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPallocBlockMemory(scip, ptr)
    Definition: scip_mem.h:89
    void SCIPpresolSetData(SCIP_PRESOL *presol, SCIP_PRESOLDATA *presoldata)
    Definition: presol.c:538
    SCIP_PRESOLDATA * SCIPpresolGetData(SCIP_PRESOL *presol)
    Definition: presol.c:528
    SCIP_RETCODE SCIPsetPresolFree(SCIP *scip, SCIP_PRESOL *presol, SCIP_DECL_PRESOLFREE((*presolfree)))
    Definition: scip_presol.c:164
    SCIP_RETCODE SCIPsetPresolCopy(SCIP *scip, SCIP_PRESOL *presol, SCIP_DECL_PRESOLCOPY((*presolcopy)))
    Definition: scip_presol.c:148
    SCIP_RETCODE SCIPincludePresolBasic(SCIP *scip, SCIP_PRESOL **presolptr, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
    Definition: scip_presol.c:113
    const char * SCIPpresolGetName(SCIP_PRESOL *presol)
    Definition: presol.c:625
    SCIP_Bool SCIPisIntegral(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisPositive(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
    SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPvarIsInitial(SCIP_VAR *var)
    Definition: var.c:23514
    int SCIPvarGetNLocksUpType(SCIP_VAR *var, SCIP_LOCKTYPE locktype)
    Definition: var.c:4386
    SCIP_Bool SCIPvarIsImpliedIntegral(SCIP_VAR *var)
    Definition: var.c:23498
    SCIP_Bool SCIPdoNotMultaggrVar(SCIP *scip, SCIP_VAR *var)
    Definition: scip_var.c:10942
    SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
    Definition: var.c:23453
    SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
    Definition: var.c:24142
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23267
    SCIP_RETCODE SCIPmultiaggregateVar(SCIP *scip, SCIP_VAR *var, int naggvars, SCIP_VAR **aggvars, SCIP_Real *scalars, SCIP_Real constant, SCIP_Bool *infeasible, SCIP_Bool *aggregated)
    Definition: scip_var.c:10834
    SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
    Definition: scip_var.c:1887
    SCIP_Bool SCIPvarIsRemovable(SCIP_VAR *var)
    Definition: var.c:23524
    SCIP_RETCODE SCIPcreateVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, 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:120
    SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
    Definition: var.c:24120
    int SCIPvarGetNLocksDownType(SCIP_VAR *var, SCIP_LOCKTYPE locktype)
    Definition: var.c:4328
    int SCIPsnprintf(char *t, int len, const char *s,...)
    Definition: misc.c:10827
    memory allocation routines
    #define PRESOL_NAME
    #define DEFAULT_MAXDOMAINSIZE
    #define PRESOL_PRIORITY
    static SCIP_DECL_PRESOLFREE(presolFreeConvertinttobin)
    static SCIP_DECL_PRESOLCOPY(presolCopyConvertinttobin)
    static SCIP_DECL_PRESOLEXEC(presolExecConvertinttobin)
    #define DEFAULT_SAMELOCKSINBOTHDIRECTIONS
    #define DEFAULT_ONLYPOWERSOFTWO
    #define PRESOL_MAXROUNDS
    #define PRESOL_TIMING
    #define PRESOL_DESC
    presolver that converts integer variables with domain [a,a+1] to binaries
    public methods for message output
    #define SCIPdebugPrintCons(x, y, z)
    Definition: pub_message.h:102
    public data structures and miscellaneous methods
    public methods for presolvers
    public methods for problem variables
    public methods for constraint handler plugins and constraints
    public methods for memory management
    public methods for message handling
    public methods for numerical tolerances
    public methods for SCIP parameter handling
    public methods for presolving plugins
    public methods for global and local (sub)problems
    public methods for SCIP variables
    struct SCIP_PresolData SCIP_PRESOLDATA
    Definition: type_presol.h:51
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_DIDNOTFIND
    Definition: type_result.h:44
    @ SCIP_SUCCESS
    Definition: type_result.h:58
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    @ SCIP_VARTYPE_INTEGER
    Definition: type_var.h:65
    @ SCIP_VARTYPE_BINARY
    Definition: type_var.h:64
    @ SCIP_LOCKTYPE_MODEL
    Definition: type_var.h:141