Scippy

    SCIP

    Solving Constraint Integer Programs

    presol.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.c
    26 * @ingroup OTHER_CFILES
    27 * @brief methods for presolvers
    28 * @author Tobias Achterberg
    29 * @author Timo Berthold
    30 *
    31 * @todo add maxrounds parameter for single timings, count number of runs of a presolver with given timing
    32 */
    33
    34/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    35
    36#include <assert.h>
    37#include <string.h>
    38
    39#include "scip/def.h"
    41#include "scip/set.h"
    42#include "scip/clock.h"
    43#include "scip/paramset.h"
    44#include "scip/scip.h"
    45#include "scip/pub_misc.h"
    46#include "scip/presol.h"
    47
    48#include "scip/struct_presol.h"
    49
    50
    51
    52/*
    53 * presolver methods
    54 */
    55
    56/** compares two presolvers w. r. to their priority */
    57SCIP_DECL_SORTPTRCOMP(SCIPpresolComp)
    58{ /*lint --e{715}*/
    59 return ((SCIP_PRESOL*)elem2)->priority - ((SCIP_PRESOL*)elem1)->priority;
    60}
    61
    62/** comparison method for sorting presolvers w.r.t. to their name */
    63SCIP_DECL_SORTPTRCOMP(SCIPpresolCompName)
    64{
    65 return strcmp(SCIPpresolGetName((SCIP_PRESOL*)elem1), SCIPpresolGetName((SCIP_PRESOL*)elem2));
    66}
    67
    68/** method to call, when the priority of a presolver was changed */
    69static
    70SCIP_DECL_PARAMCHGD(paramChgdPresolPriority)
    71{ /*lint --e{715}*/
    72 SCIP_PARAMDATA* paramdata;
    73
    74 paramdata = SCIPparamGetData(param);
    75 assert(paramdata != NULL);
    76
    77 /* use SCIPsetPresolPriority() to mark the presols unsorted */
    78 SCIP_CALL( SCIPsetPresolPriority(scip, (SCIP_PRESOL*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
    79
    80 return SCIP_OKAY;
    81}
    82
    83/** copies the given presolver to a new scip */
    85 SCIP_PRESOL* presol, /**< presolver */
    86 SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
    87 )
    88{
    89 assert(presol != NULL);
    90 assert(set != NULL);
    91 assert(set->scip != NULL);
    92
    93 if( presol->presolcopy != NULL )
    94 {
    95 SCIPsetDebugMsg(set, "including presolver %s in subscip %p\n", SCIPpresolGetName(presol), (void*)set->scip);
    96 SCIP_CALL( presol->presolcopy(set->scip, presol) );
    97 }
    98 return SCIP_OKAY;
    99}
    100
    101/** internal method for creating a presolver */
    102static
    104 SCIP_PRESOL** presol, /**< pointer to store presolver */
    105 SCIP_SET* set, /**< global SCIP settings */
    106 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    107 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    108 const char* name, /**< name of presolver */
    109 const char* desc, /**< description of presolver */
    110 int priority, /**< priority of the presolver (>= 0: before, < 0: after constraint handlers) */
    111 int maxrounds, /**< maximal number of presolving rounds the presolver participates in (-1: no limit) */
    112 SCIP_PRESOLTIMING timing, /**< timing mask of the presolver */
    113 SCIP_DECL_PRESOLCOPY ((*presolcopy)), /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */
    114 SCIP_DECL_PRESOLFREE ((*presolfree)), /**< destructor of presolver to free user data (called when SCIP is exiting) */
    115 SCIP_DECL_PRESOLINIT ((*presolinit)), /**< initialization method of presolver (called after problem was transformed) */
    116 SCIP_DECL_PRESOLEXIT ((*presolexit)), /**< deinitialization method of presolver (called before transformed problem is freed) */
    117 SCIP_DECL_PRESOLINITPRE((*presolinitpre)),/**< presolving initialization method of presolver (called when presolving is about to begin) */
    118 SCIP_DECL_PRESOLEXITPRE((*presolexitpre)),/**< presolving deinitialization method of presolver (called after presolving has been finished) */
    119 SCIP_DECL_PRESOLEXEC ((*presolexec)), /**< execution method of presolver */
    120 SCIP_PRESOLDATA* presoldata /**< presolver data */
    121 )
    122{
    124 char paramdesc[SCIP_MAXSTRLEN];
    125
    126 assert(presol != NULL);
    127 assert(name != NULL);
    128 assert(desc != NULL);
    129
    130 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
    131 * error message
    132 */
    133 if( timing < SCIP_PRESOLTIMING_NONE || timing > SCIP_PRESOLTIMING_MAX )
    134 {
    135 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
    136 "'SCIP_PRESOLTIMING' for <%s> presolver instead.\n", name);
    137
    139 }
    140
    141 SCIP_ALLOC( BMSallocMemory(presol) );
    142 BMSclearMemory(*presol);
    143
    144 SCIP_ALLOC( BMSduplicateMemoryArray(&(*presol)->name, name, strlen(name)+1) );
    145 SCIP_ALLOC( BMSduplicateMemoryArray(&(*presol)->desc, desc, strlen(desc)+1) );
    146 (*presol)->presolcopy = presolcopy;
    147 (*presol)->presolfree = presolfree;
    148 (*presol)->presolinit = presolinit;
    149 (*presol)->presolexit = presolexit;
    150 (*presol)->presolinitpre = presolinitpre;
    151 (*presol)->presolexitpre = presolexitpre;
    152 (*presol)->presolexec = presolexec;
    153 (*presol)->presoldata = presoldata;
    154 SCIP_CALL( SCIPclockCreate(&(*presol)->setuptime, SCIP_CLOCKTYPE_DEFAULT) );
    155 SCIP_CALL( SCIPclockCreate(&(*presol)->presolclock, SCIP_CLOCKTYPE_DEFAULT) );
    156 (*presol)->initialized = FALSE;
    157 (*presol)->exact = FALSE;
    158
    159 /* add parameters */
    160 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/priority", name);
    161 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of presolver <%s>", name);
    162 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    163 &(*presol)->priority, TRUE, priority, INT_MIN/4, INT_MAX/4,
    164 paramChgdPresolPriority, (SCIP_PARAMDATA*)(*presol)) ); /*lint !e740*/
    165
    166 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/maxrounds", name);
    167 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
    168 "maximal number of presolving rounds the presolver participates in (-1: no limit)",
    169 &(*presol)->maxrounds, FALSE, maxrounds, -1, INT_MAX, NULL, NULL) ); /*lint !e740*/
    170
    171 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/timing", name);
    172 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of presolver <%s> (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
    174 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    175 (int*)&(*presol)->timing, TRUE, (int)timing, (int) SCIP_PRESOLTIMING_FAST, (int) SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740*/
    176
    177 return SCIP_OKAY;
    178}
    179
    180/** creates a presolver */
    182 SCIP_PRESOL** presol, /**< pointer to store presolver */
    183 SCIP_SET* set, /**< global SCIP settings */
    184 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    185 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    186 const char* name, /**< name of presolver */
    187 const char* desc, /**< description of presolver */
    188 int priority, /**< priority of the presolver (>= 0: before, < 0: after constraint handlers) */
    189 int maxrounds, /**< maximal number of presolving rounds the presolver participates in (-1: no limit) */
    190 SCIP_PRESOLTIMING timing, /**< timing mask of the presolver */
    191 SCIP_DECL_PRESOLCOPY ((*presolcopy)), /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */
    192 SCIP_DECL_PRESOLFREE ((*presolfree)), /**< destructor of presolver to free user data (called when SCIP is exiting) */
    193 SCIP_DECL_PRESOLINIT ((*presolinit)), /**< initialization method of presolver (called after problem was transformed) */
    194 SCIP_DECL_PRESOLEXIT ((*presolexit)), /**< deinitialization method of presolver (called before transformed problem is freed) */
    195 SCIP_DECL_PRESOLINITPRE((*presolinitpre)),/**< presolving initialization method of presolver (called when presolving is about to begin) */
    196 SCIP_DECL_PRESOLEXITPRE((*presolexitpre)),/**< presolving deinitialization method of presolver (called after presolving has been finished) */
    197 SCIP_DECL_PRESOLEXEC ((*presolexec)), /**< execution method of presolver */
    198 SCIP_PRESOLDATA* presoldata /**< presolver data */
    199 )
    200{
    201 assert(presol != NULL);
    202 assert(name != NULL);
    203 assert(desc != NULL);
    204
    205 SCIP_CALL_FINALLY( doPresolCreate(presol, set, messagehdlr, blkmem, name, desc, priority, maxrounds, timing,
    206 presolcopy, presolfree, presolinit, presolexit, presolinitpre, presolexitpre, presolexec, presoldata),
    207 (void) SCIPpresolFree(presol, set) );
    208
    209 return SCIP_OKAY;
    210}
    211
    212/** frees memory of presolver */
    214 SCIP_PRESOL** presol, /**< pointer to presolver data structure */
    215 SCIP_SET* set /**< global SCIP settings */
    216 )
    217{
    218 assert(presol != NULL);
    219 if( *presol == NULL )
    220 return SCIP_OKAY;
    221 assert(!(*presol)->initialized);
    222 assert(set != NULL);
    223
    224 /* call destructor of presolver */
    225 if( (*presol)->presolfree != NULL )
    226 {
    227 SCIP_CALL( (*presol)->presolfree(set->scip, *presol) );
    228 }
    229
    230 SCIPclockFree(&(*presol)->presolclock);
    231 SCIPclockFree(&(*presol)->setuptime);
    232 BMSfreeMemoryArrayNull(&(*presol)->name);
    233 BMSfreeMemoryArrayNull(&(*presol)->desc);
    234 BMSfreeMemory(presol);
    235
    236 return SCIP_OKAY;
    237}
    238
    239/** initializes presolver */
    241 SCIP_PRESOL* presol, /**< presolver */
    242 SCIP_SET* set /**< global SCIP settings */
    243 )
    244{
    245 assert(presol != NULL);
    246 assert(set != NULL);
    247
    248 if( presol->initialized )
    249 {
    250 SCIPerrorMessage("presolver <%s> already initialized\n", presol->name);
    251 return SCIP_INVALIDCALL;
    252 }
    253
    254 if( set->misc_resetstat )
    255 {
    256 SCIPclockReset(presol->setuptime);
    258
    259 presol->lastnfixedvars = 0;
    260 presol->lastnaggrvars = 0;
    261 presol->lastnchgvartypes = 0;
    262 presol->lastnchgbds = 0;
    263 presol->lastnaddholes = 0;
    264 presol->lastndelconss = 0;
    265 presol->lastnaddconss = 0;
    266 presol->lastnupgdconss = 0;
    267 presol->lastnchgcoefs = 0;
    268 presol->lastnchgsides = 0;
    269 presol->nfixedvars = 0;
    270 presol->naggrvars = 0;
    271 presol->nchgvartypes = 0;
    272 presol->nchgbds = 0;
    273 presol->naddholes = 0;
    274 presol->ndelconss = 0;
    275 presol->naddconss = 0;
    276 presol->nupgdconss = 0;
    277 presol->nchgcoefs = 0;
    278 presol->nchgsides = 0;
    279 presol->ncalls = 0;
    280 }
    281
    282 /* call initialization method of presolver */
    283 if( presol->presolinit != NULL )
    284 {
    285 /* start timing */
    286 SCIPclockStart(presol->setuptime, set);
    287
    288 SCIP_CALL( presol->presolinit(set->scip, presol) );
    289
    290 /* stop timing */
    291 SCIPclockStop(presol->setuptime, set);
    292 }
    293 presol->initialized = TRUE;
    294
    295 return SCIP_OKAY;
    296}
    297
    298/** deinitializes presolver */
    300 SCIP_PRESOL* presol, /**< presolver */
    301 SCIP_SET* set /**< global SCIP settings */
    302 )
    303{
    304 assert(presol != NULL);
    305 assert(set != NULL);
    306
    307 if( !presol->initialized )
    308 {
    309 SCIPerrorMessage("presolver <%s> not initialized\n", presol->name);
    310 return SCIP_INVALIDCALL;
    311 }
    312
    313 /* call deinitialization method of presolver */
    314 if( presol->presolexit != NULL )
    315 {
    316 /* start timing */
    317 SCIPclockStart(presol->setuptime, set);
    318
    319 SCIP_CALL( presol->presolexit(set->scip, presol) );
    320
    321 /* stop timing */
    322 SCIPclockStop(presol->setuptime, set);
    323 }
    324 presol->initialized = FALSE;
    325
    326 return SCIP_OKAY;
    327}
    328
    329/** informs presolver that the presolving process is being started */
    331 SCIP_PRESOL* presol, /**< presolver */
    332 SCIP_SET* set /**< global SCIP settings */
    333 )
    334{
    335 assert(presol != NULL);
    336 assert(set != NULL);
    337
    338 presol->lastnfixedvars = 0;
    339 presol->lastnaggrvars = 0;
    340 presol->lastnchgvartypes = 0;
    341 presol->lastnchgbds = 0;
    342 presol->lastnaddholes = 0;
    343 presol->lastndelconss = 0;
    344 presol->lastnaddconss = 0;
    345 presol->lastnupgdconss = 0;
    346 presol->lastnchgcoefs = 0;
    347 presol->lastnchgsides = 0;
    348
    349 /* call presolving initialization method of presolver */
    350 if( presol->presolinitpre != NULL )
    351 {
    352 /* start timing */
    353 SCIPclockStart(presol->setuptime, set);
    354
    355 SCIP_CALL( presol->presolinitpre(set->scip, presol) );
    356
    357 /* stop timing */
    358 SCIPclockStop(presol->setuptime, set);
    359 }
    360
    361 return SCIP_OKAY;
    362}
    363
    364/** informs presolver that the presolving process is finished */
    366 SCIP_PRESOL* presol, /**< presolver */
    367 SCIP_SET* set /**< global SCIP settings */
    368 )
    369{
    370 assert(presol != NULL);
    371 assert(set != NULL);
    372
    373 /* call presolving deinitialization method of presolver */
    374 if( presol->presolexitpre != NULL )
    375 {
    376 /* start timing */
    377 SCIPclockStart(presol->setuptime, set);
    378
    379 SCIP_CALL( presol->presolexitpre(set->scip, presol) );
    380
    381 /* stop timing */
    382 SCIPclockStop(presol->setuptime, set);
    383 }
    384
    385 return SCIP_OKAY;
    386}
    387
    388/** executes presolver */
    390 SCIP_PRESOL* presol, /**< presolver */
    391 SCIP_SET* set, /**< global SCIP settings */
    392 SCIP_PRESOLTIMING timing, /**< current presolving timing */
    393 int nrounds, /**< number of presolving rounds already done */
    394 int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
    395 int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
    396 int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
    397 int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
    398 int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
    399 int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
    400 int* naddconss, /**< pointer to total number of added constraints of all presolvers */
    401 int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
    402 int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
    403 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
    404 SCIP_RESULT* result /**< pointer to store the result of the callback method */
    405 )
    406{
    407 int nnewfixedvars;
    408 int nnewaggrvars;
    409 int nnewchgvartypes;
    410 int nnewchgbds;
    411 int nnewaddholes;
    412 int nnewdelconss;
    413 int nnewaddconss;
    414 int nnewupgdconss;
    415 int nnewchgcoefs;
    416 int nnewchgsides;
    417
    418 assert(presol != NULL);
    419 assert(presol->presolexec != NULL);
    420 assert(set != NULL);
    421 assert(nfixedvars != NULL);
    422 assert(naggrvars != NULL);
    423 assert(nchgvartypes != NULL);
    424 assert(nchgbds != NULL);
    425 assert(naddholes != NULL);
    426 assert(ndelconss != NULL);
    427 assert(naddconss != NULL);
    428 assert(nupgdconss != NULL);
    429 assert(nchgcoefs != NULL);
    430 assert(nchgsides != NULL);
    431 assert(result != NULL);
    432
    433 *result = SCIP_DIDNOTRUN;
    434
    435 /* do not execute if in exact solving mode and presolver is not safe */
    436 if( set->exact_enable && !presol->exact )
    437 return SCIP_OKAY;
    438
    439 /* check number of presolving rounds */
    440 if( presol->maxrounds >= 0 && presol->ncalls >= presol->maxrounds )
    441 return SCIP_OKAY;
    442
    443 /* calculate the number of changes since last call */
    444 nnewfixedvars = *nfixedvars - presol->lastnfixedvars;
    445 nnewaggrvars = *naggrvars - presol->lastnaggrvars;
    446 nnewchgvartypes = *nchgvartypes - presol->lastnchgvartypes;
    447 nnewchgbds = *nchgbds - presol->lastnchgbds;
    448 nnewaddholes = *naddholes - presol->lastnaddholes;
    449 nnewdelconss = *ndelconss - presol->lastndelconss;
    450 nnewaddconss = *naddconss - presol->lastnaddconss;
    451 nnewupgdconss = *nupgdconss - presol->lastnupgdconss;
    452 nnewchgcoefs = *nchgcoefs - presol->lastnchgcoefs;
    453 nnewchgsides = *nchgsides - presol->lastnchgsides;
    454
    455 /* remember the number of changes prior to the call of the presolver */
    456 presol->lastnfixedvars = *nfixedvars;
    457 presol->lastnaggrvars = *naggrvars;
    458 presol->lastnchgvartypes = *nchgvartypes;
    459 presol->lastnchgbds = *nchgbds;
    460 presol->lastnaddholes = *naddholes;
    461 presol->lastndelconss = *ndelconss;
    462 presol->lastnaddconss = *naddconss;
    463 presol->lastnupgdconss = *nupgdconss;
    464 presol->lastnchgcoefs = *nchgcoefs;
    465 presol->lastnchgsides = *nchgsides;
    466
    467 /* check, if presolver should be called with the current timing */
    468 if( timing & presol->timing )
    469 {
    470 SCIPsetDebugMsg(set, "calling presolver <%s> with timing %u\n", presol->name, timing);
    471
    472 /* start timing */
    474
    475 /* call external method */
    476 SCIP_CALL( presol->presolexec(set->scip, presol, nrounds, timing,
    477 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewaddholes,
    478 nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides,
    479 nfixedvars, naggrvars, nchgvartypes, nchgbds, naddholes,
    480 ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
    481
    482 /* stop timing */
    483 SCIPclockStop(presol->presolclock, set);
    484
    485 /* add/count the new changes */
    486 assert( *nfixedvars - presol->lastnfixedvars >= 0 );
    487 assert( *naggrvars - presol->lastnaggrvars >= 0 );
    488 assert( *nchgvartypes - presol->lastnchgvartypes >= 0 );
    489 assert( *nchgbds - presol->lastnchgbds >= 0 );
    490 assert( *naddholes - presol->lastnaddholes >= 0 );
    491 assert( *ndelconss - presol->lastndelconss >= 0 );
    492 assert( *naddconss - presol->lastnaddconss >= 0 );
    493 assert( *nupgdconss - presol->lastnupgdconss >= 0 );
    494 assert( *nchgcoefs - presol->lastnchgcoefs >= 0 );
    495 assert( *nchgsides - presol->lastnchgsides >= 0 );
    496
    497 presol->nfixedvars += *nfixedvars - presol->lastnfixedvars;
    498 presol->naggrvars += *naggrvars - presol->lastnaggrvars;
    499 presol->nchgvartypes += *nchgvartypes - presol->lastnchgvartypes;
    500 presol->nchgbds += *nchgbds - presol->lastnchgbds;
    501 presol->naddholes += *naddholes - presol->lastnaddholes;
    502 presol->ndelconss += *ndelconss - presol->lastndelconss;
    503 presol->naddconss += *naddconss - presol->lastnaddconss;
    504 presol->nupgdconss += *nupgdconss - presol->lastnupgdconss;
    505 presol->nchgcoefs += *nchgcoefs - presol->lastnchgcoefs;
    506 presol->nchgsides += *nchgsides - presol->lastnchgsides;
    507
    508 /* check result code of callback method */
    509 if( *result != SCIP_CUTOFF
    510 && *result != SCIP_UNBOUNDED
    511 && *result != SCIP_SUCCESS
    512 && *result != SCIP_DIDNOTFIND
    513 && *result != SCIP_DIDNOTRUN )
    514 {
    515 SCIPerrorMessage("presolver <%s> returned invalid result <%d>\n", presol->name, *result);
    516 return SCIP_INVALIDRESULT;
    517 }
    518
    519 /* increase the number of calls, if the presolver tried to find reductions */
    520 if( *result != SCIP_DIDNOTRUN )
    521 ++(presol->ncalls);
    522 }
    523
    524 return SCIP_OKAY;
    525}
    526
    527/** gets user data of presolver */
    529 SCIP_PRESOL* presol /**< presolver */
    530 )
    531{
    532 assert(presol != NULL);
    533
    534 return presol->presoldata;
    535}
    536
    537/** sets user data of presolver; user has to free old data in advance! */
    539 SCIP_PRESOL* presol, /**< presolver */
    540 SCIP_PRESOLDATA* presoldata /**< new presolver user data */
    541 )
    542{
    543 assert(presol != NULL);
    544
    545 presol->presoldata = presoldata;
    546}
    547
    548/** sets copy method of presolver */
    550 SCIP_PRESOL* presol, /**< presolver */
    551 SCIP_DECL_PRESOLCOPY ((*presolcopy)) /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */
    552 )
    553{
    554 assert(presol != NULL);
    555
    556 presol->presolcopy = presolcopy;
    557}
    558
    559/** sets destructor method of presolver */
    561 SCIP_PRESOL* presol, /**< presolver */
    562 SCIP_DECL_PRESOLFREE ((*presolfree)) /**< destructor of presolver */
    563 )
    564{
    565 assert(presol != NULL);
    566
    567 presol->presolfree = presolfree;
    568}
    569
    570/** sets initialization method of presolver */
    572 SCIP_PRESOL* presol, /**< presolver */
    573 SCIP_DECL_PRESOLINIT ((*presolinit)) /**< initialize presolver */
    574 )
    575{
    576 assert(presol != NULL);
    577
    578 presol->presolinit = presolinit;
    579}
    580
    581/** sets deinitialization method of presolver */
    583 SCIP_PRESOL* presol, /**< presolver */
    584 SCIP_DECL_PRESOLEXIT ((*presolexit)) /**< deinitialize presolver */
    585 )
    586{
    587 assert(presol != NULL);
    588
    589 presol->presolexit = presolexit;
    590}
    591
    592/** sets solving process initialization method of presolver */
    594 SCIP_PRESOL* presol, /**< presolver */
    595 SCIP_DECL_PRESOLINITPRE ((*presolinitpre))/**< solving process initialization method of presolver */
    596 )
    597{
    598 assert(presol != NULL);
    599
    600 presol->presolinitpre = presolinitpre;
    601}
    602
    603/** sets solving process deinitialization method of presolver */
    605 SCIP_PRESOL* presol, /**< presolver */
    606 SCIP_DECL_PRESOLEXITPRE ((*presolexitpre))/**< solving process deinitialization method of presolver */
    607 )
    608{
    609 assert(presol != NULL);
    610
    611 presol->presolexitpre = presolexitpre;
    612}
    613
    614/** marks the presolver as safe to use in exact solving mode */
    616 SCIP_PRESOL* presol /**< presolver */
    617 )
    618{
    619 assert(presol != NULL);
    620
    621 presol->exact = TRUE;
    622}
    623
    624/** gets name of presolver */
    626 SCIP_PRESOL* presol /**< presolver */
    627 )
    628{
    629 assert(presol != NULL);
    630
    631 return presol->name;
    632}
    633
    634/** gets description of presolver */
    636 SCIP_PRESOL* presol /**< presolver */
    637 )
    638{
    639 assert(presol != NULL);
    640
    641 return presol->desc;
    642}
    643
    644/** gets priority of presolver */
    646 SCIP_PRESOL* presol /**< presolver */
    647 )
    648{
    649 assert(presol != NULL);
    650
    651 return presol->priority;
    652}
    653
    654/** gets round limit of presolver */
    656 SCIP_PRESOL* presol /**< presolver */
    657 )
    658{
    659 assert(presol != NULL);
    660
    661 return presol->maxrounds;
    662}
    663
    664/** sets priority of presolver */
    666 SCIP_PRESOL* presol, /**< presolver */
    667 SCIP_SET* set, /**< global SCIP settings */
    668 int priority /**< new priority of the presolver */
    669 )
    670{
    671 assert(presol != NULL);
    672 assert(set != NULL);
    673
    674 presol->priority = priority;
    675 set->presolssorted = FALSE;
    676}
    677
    678/** gets the timing mask of the presolver */
    680 SCIP_PRESOL* presol /**< presolver */
    681 )
    682{
    683 assert(presol != NULL);
    684
    685 return presol->timing;
    686}
    687
    688/** sets the timing mask of the presolver */
    690 SCIP_PRESOL* presol, /**< presolver */
    691 SCIP_PRESOLTIMING timing /**< timing mask of the presolver */
    692 )
    693{
    694 assert(presol != NULL);
    695
    696 presol->timing = timing;
    697}
    698
    699/** is presolver initialized? */
    701 SCIP_PRESOL* presol /**< presolver */
    702 )
    703{
    704 assert(presol != NULL);
    705
    706 return presol->initialized;
    707}
    708
    709/** enables or disables all clocks of \p presol, depending on the value of the flag */
    711 SCIP_PRESOL* presol, /**< the presolver for which all clocks should be enabled or disabled */
    712 SCIP_Bool enable /**< should the clocks of the presolver be enabled? */
    713 )
    714{
    715 assert(presol != NULL);
    716
    717 SCIPclockEnableOrDisable(presol->setuptime, enable);
    718 SCIPclockEnableOrDisable(presol->presolclock, enable);
    719}
    720
    721/** gets time in seconds used in this presolver for setting up for next stages */
    723 SCIP_PRESOL* presol /**< presolver */
    724 )
    725{
    726 assert(presol != NULL);
    727
    728 return SCIPclockGetTime(presol->setuptime);
    729}
    730
    731/** gets time in seconds used in this presolver */
    733 SCIP_PRESOL* presol /**< presolver */
    734 )
    735{
    736 assert(presol != NULL);
    737
    738 return SCIPclockGetTime(presol->presolclock);
    739}
    740
    741/** gets number of variables fixed in presolver */
    743 SCIP_PRESOL* presol /**< presolver */
    744 )
    745{
    746 assert(presol != NULL);
    747
    748 return presol->nfixedvars;
    749}
    750
    751/** gets number of variables aggregated in presolver */
    753 SCIP_PRESOL* presol /**< presolver */
    754 )
    755{
    756 assert(presol != NULL);
    757
    758 return presol->naggrvars;
    759}
    760
    761/** gets number of variable types changed in presolver */
    763 SCIP_PRESOL* presol /**< presolver */
    764 )
    765{
    766 assert(presol != NULL);
    767
    768 return presol->nchgvartypes;
    769}
    770
    771/** gets number of bounds changed in presolver */
    773 SCIP_PRESOL* presol /**< presolver */
    774 )
    775{
    776 assert(presol != NULL);
    777
    778 return presol->nchgbds;
    779}
    780
    781/** gets number of holes added to domains of variables in presolver */
    783 SCIP_PRESOL* presol /**< presolver */
    784 )
    785{
    786 assert(presol != NULL);
    787
    788 return presol->naddholes;
    789}
    790
    791/** gets number of constraints deleted in presolver */
    793 SCIP_PRESOL* presol /**< presolver */
    794 )
    795{
    796 assert(presol != NULL);
    797
    798 return presol->ndelconss;
    799}
    800
    801/** gets number of constraints added in presolver */
    803 SCIP_PRESOL* presol /**< presolver */
    804 )
    805{
    806 assert(presol != NULL);
    807
    808 return presol->naddconss;
    809}
    810
    811/** gets number of constraints upgraded in presolver */
    813 SCIP_PRESOL* presol /**< presolver */
    814 )
    815{
    816 assert(presol != NULL);
    817
    818 return presol->nupgdconss;
    819}
    820
    821/** gets number of coefficients changed in presolver */
    823 SCIP_PRESOL* presol /**< presolver */
    824 )
    825{
    826 assert(presol != NULL);
    827
    828 return presol->nchgcoefs;
    829}
    830
    831/** gets number of constraint sides changed in presolver */
    833 SCIP_PRESOL* presol /**< presolver */
    834 )
    835{
    836 assert(presol != NULL);
    837
    838 return presol->nchgsides;
    839}
    840
    841/** gets number of times the presolver was called and tried to find reductions */
    843 SCIP_PRESOL* presol /**< presolver */
    844 )
    845{
    846 assert(presol != NULL);
    847
    848 return presol->ncalls;
    849}
    void SCIPclockStop(SCIP_CLOCK *clck, SCIP_SET *set)
    Definition: clock.c:360
    void SCIPclockEnableOrDisable(SCIP_CLOCK *clck, SCIP_Bool enable)
    Definition: clock.c:260
    void SCIPclockStart(SCIP_CLOCK *clck, SCIP_SET *set)
    Definition: clock.c:290
    SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
    Definition: clock.c:438
    void SCIPclockReset(SCIP_CLOCK *clck)
    Definition: clock.c:209
    void SCIPclockFree(SCIP_CLOCK **clck)
    Definition: clock.c:185
    SCIP_RETCODE SCIPclockCreate(SCIP_CLOCK **clck, SCIP_CLOCKTYPE clocktype)
    Definition: clock.c:170
    internal methods for clocks and timing issues
    common defines and data types used in all packages of SCIP
    #define NULL
    Definition: def.h:248
    #define SCIP_MAXSTRLEN
    Definition: def.h:269
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_ALLOC(x)
    Definition: def.h:366
    #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
    #define SCIP_CALL_FINALLY(x, y)
    Definition: def.h:397
    SCIP_Real SCIPpresolGetSetupTime(SCIP_PRESOL *presol)
    Definition: presol.c:722
    int SCIPpresolGetNAggrVars(SCIP_PRESOL *presol)
    Definition: presol.c:752
    SCIP_Bool SCIPpresolIsInitialized(SCIP_PRESOL *presol)
    Definition: presol.c:700
    int SCIPpresolGetNUpgdConss(SCIP_PRESOL *presol)
    Definition: presol.c:812
    int SCIPpresolGetNCalls(SCIP_PRESOL *presol)
    Definition: presol.c:842
    int SCIPpresolGetNDelConss(SCIP_PRESOL *presol)
    Definition: presol.c:792
    int SCIPpresolGetNChgCoefs(SCIP_PRESOL *presol)
    Definition: presol.c:822
    void SCIPpresolSetTiming(SCIP_PRESOL *presol, SCIP_PRESOLTIMING timing)
    Definition: presol.c:689
    int SCIPpresolGetNAddHoles(SCIP_PRESOL *presol)
    Definition: presol.c:782
    void SCIPpresolMarkExact(SCIP_PRESOL *presol)
    Definition: presol.c:615
    SCIP_DECL_SORTPTRCOMP(SCIPpresolComp)
    Definition: presol.c:57
    void SCIPpresolSetData(SCIP_PRESOL *presol, SCIP_PRESOLDATA *presoldata)
    Definition: presol.c:538
    SCIP_Real SCIPpresolGetTime(SCIP_PRESOL *presol)
    Definition: presol.c:732
    int SCIPpresolGetNChgVarTypes(SCIP_PRESOL *presol)
    Definition: presol.c:762
    SCIP_PRESOLDATA * SCIPpresolGetData(SCIP_PRESOL *presol)
    Definition: presol.c:528
    int SCIPpresolGetPriority(SCIP_PRESOL *presol)
    Definition: presol.c:645
    int SCIPpresolGetNChgSides(SCIP_PRESOL *presol)
    Definition: presol.c:832
    int SCIPpresolGetNFixedVars(SCIP_PRESOL *presol)
    Definition: presol.c:742
    const char * SCIPpresolGetDesc(SCIP_PRESOL *presol)
    Definition: presol.c:635
    SCIP_RETCODE SCIPsetPresolPriority(SCIP *scip, SCIP_PRESOL *presol, int priority)
    Definition: scip_presol.c:281
    int SCIPpresolGetNChgBds(SCIP_PRESOL *presol)
    Definition: presol.c:772
    int SCIPpresolGetNAddConss(SCIP_PRESOL *presol)
    Definition: presol.c:802
    int SCIPpresolGetMaxrounds(SCIP_PRESOL *presol)
    Definition: presol.c:655
    SCIP_PRESOLTIMING SCIPpresolGetTiming(SCIP_PRESOL *presol)
    Definition: presol.c:679
    const char * SCIPpresolGetName(SCIP_PRESOL *presol)
    Definition: presol.c:625
    int SCIPsnprintf(char *t, int len, const char *s,...)
    Definition: misc.c:10827
    static const char * paramname[]
    Definition: lpi_msk.c:5172
    memory allocation routines
    #define BMSfreeMemory(ptr)
    Definition: memory.h:145
    #define BMSduplicateMemoryArray(ptr, source, num)
    Definition: memory.h:143
    #define BMSclearMemory(ptr)
    Definition: memory.h:129
    struct BMS_BlkMem BMS_BLKMEM
    Definition: memory.h:437
    #define BMSfreeMemoryArrayNull(ptr)
    Definition: memory.h:148
    #define BMSallocMemory(ptr)
    Definition: memory.h:118
    void SCIPmessagePrintError(const char *formatstr,...)
    Definition: message.c:791
    SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
    Definition: paramset.c:678
    int SCIPparamGetInt(SCIP_PARAM *param)
    Definition: paramset.c:733
    internal methods for handling parameter settings
    static SCIP_RETCODE doPresolCreate(SCIP_PRESOL **presol, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLCOPY((*presolcopy)), SCIP_DECL_PRESOLFREE((*presolfree)), SCIP_DECL_PRESOLINIT((*presolinit)), SCIP_DECL_PRESOLEXIT((*presolexit)), SCIP_DECL_PRESOLINITPRE((*presolinitpre)), SCIP_DECL_PRESOLEXITPRE((*presolexitpre)), SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
    Definition: presol.c:103
    void SCIPpresolSetExitpre(SCIP_PRESOL *presol, SCIP_DECL_PRESOLEXITPRE((*presolexitpre)))
    Definition: presol.c:604
    SCIP_RETCODE SCIPpresolFree(SCIP_PRESOL **presol, SCIP_SET *set)
    Definition: presol.c:213
    void SCIPpresolEnableOrDisableClocks(SCIP_PRESOL *presol, SCIP_Bool enable)
    Definition: presol.c:710
    void SCIPpresolSetPriority(SCIP_PRESOL *presol, SCIP_SET *set, int priority)
    Definition: presol.c:665
    SCIP_RETCODE SCIPpresolExitpre(SCIP_PRESOL *presol, SCIP_SET *set)
    Definition: presol.c:365
    void SCIPpresolSetExit(SCIP_PRESOL *presol, SCIP_DECL_PRESOLEXIT((*presolexit)))
    Definition: presol.c:582
    SCIP_RETCODE SCIPpresolExit(SCIP_PRESOL *presol, SCIP_SET *set)
    Definition: presol.c:299
    void SCIPpresolSetInitpre(SCIP_PRESOL *presol, SCIP_DECL_PRESOLINITPRE((*presolinitpre)))
    Definition: presol.c:593
    SCIP_RETCODE SCIPpresolCreate(SCIP_PRESOL **presol, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLCOPY((*presolcopy)), SCIP_DECL_PRESOLFREE((*presolfree)), SCIP_DECL_PRESOLINIT((*presolinit)), SCIP_DECL_PRESOLEXIT((*presolexit)), SCIP_DECL_PRESOLINITPRE((*presolinitpre)), SCIP_DECL_PRESOLEXITPRE((*presolexitpre)), SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
    Definition: presol.c:181
    void SCIPpresolSetCopy(SCIP_PRESOL *presol, SCIP_DECL_PRESOLCOPY((*presolcopy)))
    Definition: presol.c:549
    static SCIP_DECL_PARAMCHGD(paramChgdPresolPriority)
    Definition: presol.c:70
    SCIP_RETCODE SCIPpresolInit(SCIP_PRESOL *presol, SCIP_SET *set)
    Definition: presol.c:240
    SCIP_RETCODE SCIPpresolExec(SCIP_PRESOL *presol, SCIP_SET *set, SCIP_PRESOLTIMING timing, int nrounds, int *nfixedvars, int *naggrvars, int *nchgvartypes, int *nchgbds, int *naddholes, int *ndelconss, int *naddconss, int *nupgdconss, int *nchgcoefs, int *nchgsides, SCIP_RESULT *result)
    Definition: presol.c:389
    SCIP_RETCODE SCIPpresolCopyInclude(SCIP_PRESOL *presol, SCIP_SET *set)
    Definition: presol.c:84
    void SCIPpresolSetFree(SCIP_PRESOL *presol, SCIP_DECL_PRESOLFREE((*presolfree)))
    Definition: presol.c:560
    void SCIPpresolSetInit(SCIP_PRESOL *presol, SCIP_DECL_PRESOLINIT((*presolinit)))
    Definition: presol.c:571
    SCIP_RETCODE SCIPpresolInitpre(SCIP_PRESOL *presol, SCIP_SET *set)
    Definition: presol.c:330
    internal methods for presolvers
    #define SCIPerrorMessage
    Definition: pub_message.h:64
    public data structures and miscellaneous methods
    SCIP callable library.
    SCIP_RETCODE SCIPsetAddIntParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, 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: set.c:3229
    internal methods for global SCIP settings
    #define SCIPsetDebugMsg
    Definition: set.h:1811
    SCIP_CLOCK * setuptime
    Definition: struct_presol.h:58
    int lastnfixedvars
    Definition: struct_presol.h:62
    int lastnchgvartypes
    Definition: struct_presol.h:64
    int lastnupgdconss
    Definition: struct_presol.h:69
    SCIP_Bool initialized
    Definition: struct_presol.h:83
    SCIP_CLOCK * presolclock
    Definition: struct_presol.h:59
    SCIP_PRESOLTIMING timing
    Definition: struct_presol.h:85
    SCIP_Bool exact
    Definition: struct_presol.h:84
    SCIP_PRESOLDATA * presoldata
    Definition: struct_presol.h:57
    datastructures for presolvers
    Definition: heur_padm.c:135
    @ SCIP_CLOCKTYPE_DEFAULT
    Definition: type_clock.h:43
    struct SCIP_ParamData SCIP_PARAMDATA
    Definition: type_paramset.h:87
    #define SCIP_DECL_PRESOLCOPY(x)
    Definition: type_presol.h:60
    struct SCIP_PresolData SCIP_PRESOLDATA
    Definition: type_presol.h:51
    #define SCIP_DECL_PRESOLFREE(x)
    Definition: type_presol.h:68
    #define SCIP_DECL_PRESOLINITPRE(x)
    Definition: type_presol.h:98
    #define SCIP_DECL_PRESOLEXITPRE(x)
    Definition: type_presol.h:116
    #define SCIP_DECL_PRESOLINIT(x)
    Definition: type_presol.h:76
    #define SCIP_DECL_PRESOLEXIT(x)
    Definition: type_presol.h:84
    #define SCIP_DECL_PRESOLEXEC(x)
    Definition: type_presol.h:167
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_CUTOFF
    Definition: type_result.h:48
    @ SCIP_DIDNOTFIND
    Definition: type_result.h:44
    @ SCIP_UNBOUNDED
    Definition: type_result.h:47
    @ SCIP_SUCCESS
    Definition: type_result.h:58
    enum SCIP_Result SCIP_RESULT
    Definition: type_result.h:61
    @ SCIP_INVALIDRESULT
    Definition: type_retcode.h:53
    @ SCIP_PARAMETERWRONGVAL
    Definition: type_retcode.h:57
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_INVALIDCALL
    Definition: type_retcode.h:51
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    #define SCIP_PRESOLTIMING_MAX
    Definition: type_timing.h:59
    #define SCIP_PRESOLTIMING_FINAL
    Definition: type_timing.h:55
    #define SCIP_PRESOLTIMING_MEDIUM
    Definition: type_timing.h:53
    unsigned int SCIP_PRESOLTIMING
    Definition: type_timing.h:61
    #define SCIP_PRESOLTIMING_FAST
    Definition: type_timing.h:52
    #define SCIP_PRESOLTIMING_EXHAUSTIVE
    Definition: type_timing.h:54