Scippy

    SCIP

    Solving Constraint Integer Programs

    prop.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 prop.c
    26 * @ingroup OTHER_CFILES
    27 * @brief methods and datastructures for propagators
    28 * @author Tobias Achterberg
    29 * @author Timo Berthold
    30 */
    31
    32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    33
    34#include <assert.h>
    35#include <string.h>
    36
    37#include "scip/def.h"
    38#include "scip/set.h"
    39#include "scip/stat.h"
    40#include "scip/clock.h"
    41#include "scip/paramset.h"
    42#include "scip/var.h"
    43#include "scip/scip.h"
    44#include "scip/prop.h"
    45#include "scip/pub_message.h"
    46#include "scip/pub_misc.h"
    47
    48#include "scip/struct_prop.h"
    49
    50
    51/** compares two propagators w. r. to their priority */
    53{ /*lint --e{715}*/
    54 return ((SCIP_PROP*)elem2)->priority - ((SCIP_PROP*)elem1)->priority;
    55}
    56
    57/** compares two propagators w. r. to their priority */
    58SCIP_DECL_SORTPTRCOMP(SCIPpropCompPresol)
    59{ /*lint --e{715}*/
    60 return ((SCIP_PROP*)elem2)->presolpriority - ((SCIP_PROP*)elem1)->presolpriority;
    61}
    62
    63/** comparison method for sorting propagators w.r.t. to their name */
    64SCIP_DECL_SORTPTRCOMP(SCIPpropCompName)
    65{
    66 return strcmp(SCIPpropGetName((SCIP_PROP*)elem1), SCIPpropGetName((SCIP_PROP*)elem2));
    67}
    68
    69/** method to call, when the priority of a propagator was changed */
    70static
    71SCIP_DECL_PARAMCHGD(paramChgdPropPriority)
    72{ /*lint --e{715}*/
    73 SCIP_PARAMDATA* paramdata;
    74
    75 paramdata = SCIPparamGetData(param);
    76 assert(paramdata != NULL);
    77
    78 /* use SCIPsetPropPriority() to mark the props unsorted */
    79 SCIP_CALL( SCIPsetPropPriority(scip, (SCIP_PROP*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
    80
    81 return SCIP_OKAY;
    82}
    83
    84/** method to call, when the presolving priority of a propagator was changed */
    85static
    86SCIP_DECL_PARAMCHGD(paramChgdPropPresolPriority)
    87{ /*lint --e{715}*/
    88 SCIP_PARAMDATA* paramdata;
    89
    90 paramdata = SCIPparamGetData(param);
    91 assert(paramdata != NULL);
    92
    93 /* use SCIPsetPropPriority() to mark the props unsorted */
    94 SCIP_CALL( SCIPsetPropPresolPriority(scip, (SCIP_PROP*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
    95
    96 return SCIP_OKAY;
    97}
    98
    99/** copies the given propagator to a new scip */
    101 SCIP_PROP* prop, /**< propagator */
    102 SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
    103 )
    104{
    105 assert(prop != NULL);
    106 assert(set != NULL);
    107 assert(set->scip != NULL);
    108
    109 if( prop->propcopy != NULL )
    110 {
    111 SCIPsetDebugMsg(set, "including propagator %s in subscip %p\n", SCIPpropGetName(prop), (void*)set->scip);
    112 SCIP_CALL( prop->propcopy(set->scip, prop) );
    113 }
    114 return SCIP_OKAY;
    115}
    116
    117/** internal method for creating a propagator */
    118static
    120 SCIP_PROP** prop, /**< pointer to propagator data structure */
    121 SCIP_SET* set, /**< global SCIP settings */
    122 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    123 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    124 const char* name, /**< name of propagator */
    125 const char* desc, /**< description of propagator */
    126 int priority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
    127 int freq, /**< frequency for calling propagator */
    128 SCIP_Bool delay, /**< should propagator be delayed, if other propagators found reductions? */
    129 SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagator should be executed */
    130 int presolpriority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
    131 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
    132 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the propagator's presolving method */
    133 SCIP_DECL_PROPCOPY ((*propcopy)), /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
    134 SCIP_DECL_PROPFREE ((*propfree)), /**< destructor of propagator */
    135 SCIP_DECL_PROPINIT ((*propinit)), /**< initialize propagator */
    136 SCIP_DECL_PROPEXIT ((*propexit)), /**< deinitialize propagator */
    137 SCIP_DECL_PROPINITPRE ((*propinitpre)), /**< presolving initialization method of propagator */
    138 SCIP_DECL_PROPEXITPRE ((*propexitpre)), /**< presolving deinitialization method of propagator */
    139 SCIP_DECL_PROPINITSOL ((*propinitsol)), /**< solving process initialization method of propagator */
    140 SCIP_DECL_PROPEXITSOL ((*propexitsol)), /**< solving process deinitialization method of propagator */
    141 SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
    142 SCIP_DECL_PROPEXEC ((*propexec)), /**< execution method of propagator */
    143 SCIP_DECL_PROPRESPROP ((*propresprop)), /**< propagation conflict resolving method */
    144 SCIP_PROPDATA* propdata /**< propagator data */
    145 )
    146{
    148 char paramdesc[SCIP_MAXSTRLEN];
    149
    150 assert(prop != NULL);
    151 assert(name != NULL);
    152 assert(desc != NULL);
    153 assert(freq >= -1);
    154 assert(propexec != NULL);
    155
    156 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
    157 * error message
    158 */
    159 if( presoltiming < SCIP_PRESOLTIMING_NONE || presoltiming > SCIP_PRESOLTIMING_MAX )
    160 {
    161 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
    162 "'SCIP_PRESOLTIMING' for <%s> propagator instead.\n", name);
    163
    165 }
    166
    167 SCIP_ALLOC( BMSallocMemory(prop) );
    168 BMSclearMemory(*prop);
    169
    170 SCIP_ALLOC( BMSduplicateMemoryArray(&(*prop)->name, name, strlen(name)+1) );
    171 SCIP_ALLOC( BMSduplicateMemoryArray(&(*prop)->desc, desc, strlen(desc)+1) );
    172 (*prop)->priority = priority;
    173 (*prop)->freq = freq;
    174 (*prop)->propcopy = propcopy;
    175 (*prop)->propfree = propfree;
    176 (*prop)->propinit = propinit;
    177 (*prop)->propexit = propexit;
    178 (*prop)->propinitpre = propinitpre;
    179 (*prop)->propexitpre = propexitpre;
    180 (*prop)->propinitsol = propinitsol;
    181 (*prop)->propexitsol = propexitsol;
    182 (*prop)->proppresol = proppresol;
    183 (*prop)->propexec = propexec;
    184 (*prop)->propresprop = propresprop;
    185 (*prop)->propdata = propdata;
    186 SCIP_CALL( SCIPclockCreate(&(*prop)->setuptime, SCIP_CLOCKTYPE_DEFAULT) );
    187 SCIP_CALL( SCIPclockCreate(&(*prop)->proptime, SCIP_CLOCKTYPE_DEFAULT) );
    188 SCIP_CALL( SCIPclockCreate(&(*prop)->sbproptime, SCIP_CLOCKTYPE_DEFAULT) );
    189 SCIP_CALL( SCIPclockCreate(&(*prop)->resproptime, SCIP_CLOCKTYPE_DEFAULT) );
    190 SCIP_CALL( SCIPclockCreate(&(*prop)->presoltime, SCIP_CLOCKTYPE_DEFAULT) );
    191 (*prop)->ncalls = 0;
    192 (*prop)->nrespropcalls = 0;
    193 (*prop)->ncutoffs = 0;
    194 (*prop)->ndomredsfound = 0;
    195 (*prop)->wasdelayed = FALSE;
    196 (*prop)->exact = FALSE;
    197 (*prop)->initialized = FALSE;
    198
    199 /* add parameters */
    200 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/priority", name);
    201 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of propagator <%s>", name);
    202 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    203 &(*prop)->priority, TRUE, priority, INT_MIN/4, INT_MAX/4,
    204 paramChgdPropPriority, (SCIP_PARAMDATA*)(*prop)) ); /*lint !e740*/
    205
    206 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/freq", name);
    207 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "frequency for calling propagator <%s> (-1: never, 0: only in root node)", name);
    208 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    209 &(*prop)->freq, FALSE, freq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
    210
    211 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/delay", name);
    212 SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
    213 "should propagator be delayed, if other propagators found reductions?",
    214 &(*prop)->delay, TRUE, delay, NULL, NULL) ); /*lint !e740*/
    215
    216 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/timingmask", name);
    217 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing when propagator should be called (%u:BEFORELP, %u:DURINGLPLOOP, %u:AFTERLPLOOP, %u:ALWAYS))",
    219 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    220 (int*)(&(*prop)->timingmask), TRUE, (int)timingmask, (int)SCIP_PROPTIMING_NONE, (int)SCIP_PROPTIMING_ALWAYS, NULL, NULL) ); /*lint !e713*/
    221
    222 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/presolpriority", name);
    223 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "presolving priority of propagator <%s>", name);
    224 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    225 &(*prop)->presolpriority, TRUE, presolpriority, INT_MIN/4, INT_MAX/4,
    226 paramChgdPropPresolPriority, (SCIP_PARAMDATA*)(*prop)) ); /*lint !e740*/
    227
    228 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/maxprerounds", name);
    229 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
    230 "maximal number of presolving rounds the propagator participates in (-1: no limit)",
    231 &(*prop)->maxprerounds, FALSE, presolmaxrounds, -1, INT_MAX, NULL, NULL) ); /*lint !e740*/
    232
    233 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/presoltiming", name);
    234 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of the presolving method of propagator <%s> (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
    236 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
    237 (int*)&(*prop)->presoltiming, TRUE, (int)presoltiming, (int)SCIP_PRESOLTIMING_NONE, (int)SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740*/
    238
    239 return SCIP_OKAY;
    240}
    241
    242/** creates a propagator */
    244 SCIP_PROP** prop, /**< pointer to propagator data structure */
    245 SCIP_SET* set, /**< global SCIP settings */
    246 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    247 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    248 const char* name, /**< name of propagator */
    249 const char* desc, /**< description of propagator */
    250 int priority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
    251 int freq, /**< frequency for calling propagator */
    252 SCIP_Bool delay, /**< should propagator be delayed, if other propagators found reductions? */
    253 SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagator should be executed */
    254 int presolpriority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
    255 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
    256 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the propagator's presolving method */
    257 SCIP_DECL_PROPCOPY ((*propcopy)), /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
    258 SCIP_DECL_PROPFREE ((*propfree)), /**< destructor of propagator */
    259 SCIP_DECL_PROPINIT ((*propinit)), /**< initialize propagator */
    260 SCIP_DECL_PROPEXIT ((*propexit)), /**< deinitialize propagator */
    261 SCIP_DECL_PROPINITPRE ((*propinitpre)), /**< presolving initialization method of propagator */
    262 SCIP_DECL_PROPEXITPRE ((*propexitpre)), /**< presolving deinitialization method of propagator */
    263 SCIP_DECL_PROPINITSOL ((*propinitsol)), /**< solving process initialization method of propagator */
    264 SCIP_DECL_PROPEXITSOL ((*propexitsol)), /**< solving process deinitialization method of propagator */
    265 SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
    266 SCIP_DECL_PROPEXEC ((*propexec)), /**< execution method of propagator */
    267 SCIP_DECL_PROPRESPROP ((*propresprop)), /**< propagation conflict resolving method */
    268 SCIP_PROPDATA* propdata /**< propagator data */
    269 )
    270{
    271 assert(prop != NULL);
    272 assert(name != NULL);
    273 assert(desc != NULL);
    274 assert(freq >= -1);
    275 assert(propexec != NULL);
    276
    277 SCIP_CALL_FINALLY( doPropCreate(prop, set, messagehdlr, blkmem, name, desc, priority, freq, delay, timingmask,
    278 presolpriority, presolmaxrounds, presoltiming, propcopy, propfree, propinit, propexit, propinitpre, propexitpre,
    279 propinitsol, propexitsol, proppresol, propexec, propresprop, propdata), (void) SCIPpropFree(prop, set) );
    280
    281 return SCIP_OKAY;
    282}
    283
    284/** calls destructor and frees memory of propagator */
    286 SCIP_PROP** prop, /**< pointer to propagator data structure */
    287 SCIP_SET* set /**< global SCIP settings */
    288 )
    289{
    290 assert(prop != NULL);
    291 if( *prop == NULL )
    292 return SCIP_OKAY;
    293 assert(!(*prop)->initialized);
    294 assert(set != NULL);
    295
    296 /* call destructor of propagator */
    297 if( (*prop)->propfree != NULL )
    298 {
    299 SCIP_CALL( (*prop)->propfree(set->scip, *prop) );
    300 }
    301
    302 SCIPclockFree(&(*prop)->presoltime);
    303 SCIPclockFree(&(*prop)->resproptime);
    304 SCIPclockFree(&(*prop)->sbproptime);
    305 SCIPclockFree(&(*prop)->proptime);
    306 SCIPclockFree(&(*prop)->setuptime);
    307 BMSfreeMemoryArrayNull(&(*prop)->desc);
    308 BMSfreeMemoryArrayNull(&(*prop)->name);
    309 BMSfreeMemory(prop);
    310
    311 return SCIP_OKAY;
    312}
    313
    314/** initializes propagator */
    316 SCIP_PROP* prop, /**< propagator */
    317 SCIP_SET* set /**< global SCIP settings */
    318 )
    319{
    320 assert(prop != NULL);
    321 assert(set != NULL);
    322
    323 if( prop->initialized )
    324 {
    325 SCIPerrorMessage("propagator <%s> already initialized\n", prop->name);
    326 return SCIP_INVALIDCALL;
    327 }
    328
    329 if( set->misc_resetstat )
    330 {
    336
    337 prop->ncalls = 0;
    338 prop->nrespropcalls = 0;
    339 prop->ncutoffs = 0;
    340 prop->ndomredsfound = 0;
    341 prop->lastnfixedvars = 0;
    342 prop->lastnaggrvars = 0;
    343 prop->lastnchgvartypes = 0;
    344 prop->lastnchgbds = 0;
    345 prop->lastnaddholes = 0;
    346 prop->lastndelconss = 0;
    347 prop->lastnaddconss = 0;
    348 prop->lastnupgdconss = 0;
    349 prop->lastnchgcoefs = 0;
    350 prop->lastnchgsides = 0;
    351 prop->nfixedvars = 0;
    352 prop->naggrvars = 0;
    353 prop->nchgvartypes = 0;
    354 prop->nchgbds = 0;
    355 prop->naddholes = 0;
    356 prop->ndelconss = 0;
    357 prop->naddconss = 0;
    358 prop->nupgdconss = 0;
    359 prop->nchgcoefs = 0;
    360 prop->nchgsides = 0;
    361 prop->npresolcalls = 0;
    362 prop->wasdelayed = FALSE;
    363 }
    364
    365 if( prop->propinit != NULL )
    366 {
    367 /* start timing */
    369
    370 SCIP_CALL( prop->propinit(set->scip, prop) );
    371
    372 /* stop timing */
    374 }
    375 prop->initialized = TRUE;
    376
    377 return SCIP_OKAY;
    378}
    379
    380/** calls exit method of propagator */
    382 SCIP_PROP* prop, /**< propagator */
    383 SCIP_SET* set /**< global SCIP settings */
    384 )
    385{
    386 assert(prop != NULL);
    387 assert(set != NULL);
    388
    389 if( !prop->initialized )
    390 {
    391 SCIPerrorMessage("propagator <%s> not initialized\n", prop->name);
    392 return SCIP_INVALIDCALL;
    393 }
    394
    395 if( prop->propexit != NULL )
    396 {
    397 /* start timing */
    399
    400 SCIP_CALL( prop->propexit(set->scip, prop) );
    401
    402 /* stop timing */
    404 }
    405 prop->initialized = FALSE;
    406
    407 return SCIP_OKAY;
    408}
    409
    410/** informs propagator that the presolving process is being started */
    412 SCIP_PROP* prop, /**< propagator */
    413 SCIP_SET* set /**< global SCIP settings */
    414 )
    415{
    416 assert(prop != NULL);
    417 assert(set != NULL);
    418
    419 prop->lastnfixedvars = 0;
    420 prop->lastnaggrvars = 0;
    421 prop->lastnchgvartypes = 0;
    422 prop->lastnchgbds = 0;
    423 prop->lastnaddholes = 0;
    424 prop->lastndelconss = 0;
    425 prop->lastnaddconss = 0;
    426 prop->lastnupgdconss = 0;
    427 prop->lastnchgcoefs = 0;
    428 prop->lastnchgsides = 0;
    429 prop->wasdelayed = FALSE;
    430
    431 /* call presolving initialization method of propagator */
    432 if( prop->propinitpre != NULL )
    433 {
    434 /* start timing */
    436
    437 SCIP_CALL( prop->propinitpre(set->scip, prop) );
    438
    439 /* stop timing */
    441 }
    442
    443 return SCIP_OKAY;
    444}
    445
    446/** informs propagator that the presolving process is finished */
    448 SCIP_PROP* prop, /**< propagator */
    449 SCIP_SET* set /**< global SCIP settings */
    450 )
    451{
    452 assert(prop != NULL);
    453 assert(set != NULL);
    454
    455 /* call presolving deinitialization method of propagator */
    456 if( prop->propexitpre != NULL )
    457 {
    458 /* start timing */
    460
    461 SCIP_CALL( prop->propexitpre(set->scip, prop) );
    462
    463 /* stop timing */
    465 }
    466
    467 return SCIP_OKAY;
    468}
    469
    470/** informs propagator that the prop and bound process is being started */
    472 SCIP_PROP* prop, /**< propagator */
    473 SCIP_SET* set /**< global SCIP settings */
    474 )
    475{
    476 assert(prop != NULL);
    477 assert(set != NULL);
    478
    479 /* call solving process initialization method of propagator */
    480 if( prop->propinitsol != NULL )
    481 {
    482 /* start timing */
    484
    485 SCIP_CALL( prop->propinitsol(set->scip, prop) );
    486
    487 /* stop timing */
    489 }
    490
    491 return SCIP_OKAY;
    492}
    493
    494/** informs propagator that the prop and bound process data is being freed */
    496 SCIP_PROP* prop, /**< propagator */
    497 SCIP_SET* set, /**< global SCIP settings */
    498 SCIP_Bool restart /**< was this exit solve call triggered by a restart? */
    499 )
    500{
    501 assert(prop != NULL);
    502 assert(set != NULL);
    503
    504 /* call solving process deinitialization method of propagator */
    505 if( prop->propexitsol != NULL )
    506 {
    507 /* start timing */
    509
    510 SCIP_CALL( prop->propexitsol(set->scip, prop, restart) );
    511
    512 /* stop timing */
    514 }
    515
    516 return SCIP_OKAY;
    517}
    518
    519/** executes presolving method of propagator */
    521 SCIP_PROP* prop, /**< propagator */
    522 SCIP_SET* set, /**< global SCIP settings */
    523 SCIP_PRESOLTIMING timing, /**< current presolving timing */
    524 int nrounds, /**< number of presolving rounds already done */
    525 int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
    526 int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
    527 int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
    528 int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
    529 int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
    530 int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
    531 int* naddconss, /**< pointer to total number of added constraints of all presolvers */
    532 int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
    533 int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
    534 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
    535 SCIP_RESULT* result /**< pointer to store the result of the callback method */
    536 )
    537{
    538 assert(prop != NULL);
    539 assert(set != NULL);
    540 assert(nfixedvars != NULL);
    541 assert(naggrvars != NULL);
    542 assert(nchgvartypes != NULL);
    543 assert(nchgbds != NULL);
    544 assert(naddholes != NULL);
    545 assert(ndelconss != NULL);
    546 assert(naddconss != NULL);
    547 assert(nupgdconss != NULL);
    548 assert(nchgcoefs != NULL);
    549 assert(nchgsides != NULL);
    550 assert(result != NULL);
    551
    552 *result = SCIP_DIDNOTRUN;
    553
    554 if( prop->proppresol == NULL || (set->exact_enable && !prop->exact) )
    555 return SCIP_OKAY;
    556
    557 /* check number of presolving rounds */
    558 if( prop->maxprerounds >= 0 && prop->npresolcalls >= prop->maxprerounds )
    559 return SCIP_OKAY;
    560
    561 /* check, if presolver should be delayed */
    562 if( prop->presoltiming & timing )
    563 {
    564 int nnewfixedvars;
    565 int nnewaggrvars;
    566 int nnewchgvartypes;
    567 int nnewchgbds;
    568 int nnewaddholes;
    569 int nnewdelconss;
    570 int nnewaddconss;
    571 int nnewupgdconss;
    572 int nnewchgcoefs;
    573 int nnewchgsides;
    574
    575 SCIPsetDebugMsg(set, "calling presolving method of propagator <%s>\n", prop->name);
    576
    577 /* calculate the number of changes since last call */
    578 nnewfixedvars = *nfixedvars - prop->lastnfixedvars;
    579 nnewaggrvars = *naggrvars - prop->lastnaggrvars;
    580 nnewchgvartypes = *nchgvartypes - prop->lastnchgvartypes;
    581 nnewchgbds = *nchgbds - prop->lastnchgbds;
    582 nnewaddholes = *naddholes - prop->lastnaddholes;
    583 nnewdelconss = *ndelconss - prop->lastndelconss;
    584 nnewaddconss = *naddconss - prop->lastnaddconss;
    585 nnewupgdconss = *nupgdconss - prop->lastnupgdconss;
    586 nnewchgcoefs = *nchgcoefs - prop->lastnchgcoefs;
    587 nnewchgsides = *nchgsides - prop->lastnchgsides;
    588
    589 /* remember the number of changes prior to the call of the presolver method of the propagator */
    590 prop->lastnfixedvars = *nfixedvars;
    591 prop->lastnaggrvars = *naggrvars;
    592 prop->lastnchgvartypes = *nchgvartypes;
    593 prop->lastnchgbds = *nchgbds;
    594 prop->lastnaddholes = *naddholes;
    595 prop->lastndelconss = *ndelconss;
    596 prop->lastnaddconss = *naddconss;
    597 prop->lastnupgdconss = *nupgdconss;
    598 prop->lastnchgcoefs = *nchgcoefs;
    599 prop->lastnchgsides = *nchgsides;
    600
    601 /* start timing */
    603
    604 /* call external method */
    605 SCIP_CALL( prop->proppresol(set->scip, prop, nrounds, timing,
    606 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewaddholes,
    607 nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides,
    608 nfixedvars, naggrvars, nchgvartypes, nchgbds, naddholes,
    609 ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
    610
    611 /* stop timing */
    613
    614 /* add/count the new changes */
    615 prop->nfixedvars += *nfixedvars - prop->lastnfixedvars;
    616 prop->naggrvars += *naggrvars - prop->lastnaggrvars;
    617 prop->nchgvartypes += *nchgvartypes - prop->lastnchgvartypes;
    618 prop->nchgbds += *nchgbds - prop->lastnchgbds;
    619 prop->naddholes += *naddholes - prop->lastnaddholes;
    620 prop->ndelconss += *ndelconss - prop->lastndelconss;
    621 prop->naddconss += *naddconss - prop->lastnaddconss;
    622 prop->nupgdconss += *nupgdconss - prop->lastnupgdconss;
    623 prop->nchgcoefs += *nchgcoefs - prop->lastnchgcoefs;
    624 prop->nchgsides += *nchgsides - prop->lastnchgsides;
    625
    626 /* check result code of callback method */
    627 if( *result != SCIP_CUTOFF
    628 && *result != SCIP_UNBOUNDED
    629 && *result != SCIP_SUCCESS
    630 && *result != SCIP_DIDNOTFIND
    631 && *result != SCIP_DIDNOTRUN )
    632 {
    633 SCIPerrorMessage("propagator <%s> returned invalid result <%d>\n", prop->name, *result);
    634 return SCIP_INVALIDRESULT;
    635 }
    636
    637 /* increase the number of presolving calls, if the propagator tried to find reductions */
    638 if( *result != SCIP_DIDNOTRUN )
    639 ++(prop->npresolcalls);
    640 }
    641
    642 return SCIP_OKAY;
    643}
    644
    645/** calls execution method of propagator */
    647 SCIP_PROP* prop, /**< propagator */
    648 SCIP_SET* set, /**< global SCIP settings */
    649 SCIP_STAT* stat, /**< dynamic problem statistics */
    650 int depth, /**< depth of current node */
    651 SCIP_Bool execdelayed, /**< execute propagator even if it is marked to be delayed */
    652 SCIP_Bool instrongbranching, /**< are we currently doing strong branching? */
    653 SCIP_PROPTIMING proptiming, /**< current point in the node solving process */
    654 SCIP_RESULT* result /**< pointer to store the result of the callback method */
    655 )
    656{
    657 assert(prop != NULL);
    658 assert(prop->propexec != NULL);
    659 assert(prop->freq >= -1);
    660 assert(set != NULL);
    661 assert(set->scip != NULL);
    662 assert(stat != NULL);
    663 assert(depth >= 0);
    664 assert(result != NULL);
    665
    666 if( ((depth == 0 && prop->freq == 0) || (prop->freq > 0 && depth % prop->freq == 0))
    667 && (!set->exact_enable || prop->exact) )
    668 {
    669 if( !prop->delay || execdelayed )
    670 {
    671 SCIP_Longint oldndomchgs;
    672 SCIP_Longint oldnprobdomchgs;
    673
    674 SCIPsetDebugMsg(set, "executing propagator <%s>\n", prop->name);
    675
    676 oldndomchgs = stat->nboundchgs + stat->nholechgs;
    677 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
    678
    679 /* start timing */
    680 if( instrongbranching )
    682 else
    684
    685 /* call external propagation method */
    686 SCIP_CALL( prop->propexec(set->scip, prop, proptiming, result) );
    687
    688 /* stop timing */
    689 if( instrongbranching )
    691 else
    692 SCIPclockStop(prop->proptime, set);
    693
    694 /* update statistics */
    695 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
    696 prop->ncalls++;
    697 if( *result == SCIP_CUTOFF )
    698 prop->ncutoffs++;
    699
    700 /* update domain reductions; therefore remove the domain
    701 * reduction counts which were generated in probing mode */
    702 prop->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
    703 prop->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
    704
    705 /* evaluate result */
    706 if( *result != SCIP_CUTOFF
    707 && *result != SCIP_REDUCEDDOM
    708 && *result != SCIP_DIDNOTFIND
    709 && *result != SCIP_DIDNOTRUN
    710 && *result != SCIP_DELAYED
    711 && *result != SCIP_DELAYNODE )
    712 {
    713 SCIPerrorMessage("execution method of propagator <%s> returned invalid result <%d>\n",
    714 prop->name, *result);
    715 return SCIP_INVALIDRESULT;
    716 }
    717 }
    718 else
    719 {
    720 SCIPsetDebugMsg(set, "propagator <%s> was delayed\n", prop->name);
    721 *result = SCIP_DELAYED;
    722 }
    723
    724 /* remember whether propagator was delayed */
    725 prop->wasdelayed = (*result == SCIP_DELAYED);
    726 }
    727 else
    728 *result = SCIP_DIDNOTRUN;
    729
    730 return SCIP_OKAY;
    731}
    732
    733/** resolves the given conflicting bound, that was deduced by the given propagator, by putting all "reason" bounds
    734 * leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
    735 * SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
    736 *
    737 * @note it is sufficient to explain the relaxed bound change
    738 */
    740 SCIP_PROP* prop, /**< propagator */
    741 SCIP_SET* set, /**< global SCIP settings */
    742 SCIP_VAR* infervar, /**< variable whose bound was deduced by the constraint */
    743 int inferinfo, /**< user inference information attached to the bound change */
    744 SCIP_BOUNDTYPE inferboundtype, /**< bound that was deduced (lower or upper bound) */
    745 SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
    746 SCIP_Real relaxedbd, /**< the relaxed bound */
    747 SCIP_RESULT* result /**< pointer to store the result of the callback method */
    748 )
    749{
    750 assert(prop != NULL);
    751 assert((inferboundtype == SCIP_BOUNDTYPE_LOWER
    752 && SCIPgetVarLbAtIndex(set->scip, infervar, bdchgidx, TRUE) > SCIPvarGetLbGlobal(infervar))
    753 || (inferboundtype == SCIP_BOUNDTYPE_UPPER
    754 && SCIPgetVarUbAtIndex(set->scip, infervar, bdchgidx, TRUE) < SCIPvarGetUbGlobal(infervar)));
    755 assert(result != NULL);
    756
    757 *result = SCIP_DIDNOTRUN;
    758
    759 if( prop->propresprop != NULL )
    760 {
    761 /* start timing */
    763
    764 SCIP_CALL( prop->propresprop(set->scip, prop, infervar, inferinfo, inferboundtype, bdchgidx,
    765 relaxedbd, result) );
    766
    767 /* stop timing */
    769
    770 /* update statistic */
    771 prop->nrespropcalls++;
    772
    773 /* check result code */
    774 if( *result != SCIP_SUCCESS && *result != SCIP_DIDNOTFIND )
    775 {
    776 SCIPerrorMessage("propagation conflict resolving method of propagator <%s> returned invalid result <%d>\n",
    777 prop->name, *result);
    778 return SCIP_INVALIDRESULT;
    779 }
    780 }
    781 else
    782 {
    783 SCIPerrorMessage("propagation conflict resolving method of propagator <%s> is not implemented\n", prop->name);
    784 return SCIP_PLUGINNOTFOUND;
    785 }
    786
    787 return SCIP_OKAY;
    788}
    789
    790/** gets user data of propagator */
    792 SCIP_PROP* prop /**< propagator */
    793 )
    794{
    795 assert(prop != NULL);
    796
    797 return prop->propdata;
    798}
    799
    800/** sets user data of propagator; user has to free old data in advance! */
    802 SCIP_PROP* prop, /**< propagator */
    803 SCIP_PROPDATA* propdata /**< new propagator user data */
    804 )
    805{
    806 assert(prop != NULL);
    807
    808 prop->propdata = propdata;
    809}
    810
    811/** sets copy method of propagator */
    813 SCIP_PROP* prop, /**< propagator */
    814 SCIP_DECL_PROPCOPY ((*propcopy)) /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
    815 )
    816{
    817 assert(prop != NULL);
    818
    819 prop->propcopy = propcopy;
    820}
    821
    822/** sets destructor method of propagator */
    824 SCIP_PROP* prop, /**< propagator */
    825 SCIP_DECL_PROPFREE ((*propfree)) /**< destructor of propagator */
    826 )
    827{
    828 assert(prop != NULL);
    829
    830 prop->propfree = propfree;
    831}
    832
    833/** sets initialization method of propagator */
    835 SCIP_PROP* prop, /**< propagator */
    836 SCIP_DECL_PROPINIT ((*propinit)) /**< initialize propagator */
    837 )
    838{
    839 assert(prop != NULL);
    840
    841 prop->propinit = propinit;
    842}
    843
    844/** sets deinitialization method of propagator */
    846 SCIP_PROP* prop, /**< propagator */
    847 SCIP_DECL_PROPEXIT ((*propexit)) /**< deinitialize propagator */
    848 )
    849{
    850 assert(prop != NULL);
    851
    852 prop->propexit = propexit;
    853}
    854
    855/** sets solving process initialization method of propagator */
    857 SCIP_PROP* prop, /**< propagator */
    858 SCIP_DECL_PROPINITSOL((*propinitsol)) /**< solving process initialization method of propagator */
    859 )
    860{
    861 assert(prop != NULL);
    862
    863 prop->propinitsol = propinitsol;
    864}
    865
    866/** sets solving process deinitialization method of propagator */
    868 SCIP_PROP* prop, /**< propagator */
    869 SCIP_DECL_PROPEXITSOL ((*propexitsol)) /**< solving process deinitialization method of propagator */
    870 )
    871{
    872 assert(prop != NULL);
    873
    874 prop->propexitsol = propexitsol;
    875}
    876
    877/** sets preprocessing initialization method of propagator */
    879 SCIP_PROP* prop, /**< propagator */
    880 SCIP_DECL_PROPINITPRE((*propinitpre)) /**< preprocessing initialization method of propagator */
    881 )
    882{
    883 assert(prop != NULL);
    884
    885 prop->propinitpre = propinitpre;
    886}
    887
    888/** sets preprocessing deinitialization method of propagator */
    890 SCIP_PROP* prop, /**< propagator */
    891 SCIP_DECL_PROPEXITPRE((*propexitpre)) /**< preprocessing deinitialization method of propagator */
    892 )
    893{
    894 assert(prop != NULL);
    895
    896 prop->propexitpre = propexitpre;
    897}
    898
    899/** sets presolving method of propagator */
    901 SCIP_PROP* prop, /**< propagator */
    902 SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
    903 int presolpriority, /**< presolving priority of the propagator (>= 0: before, < 0: after constraint handlers) */
    904 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
    905 SCIP_PRESOLTIMING presoltiming /**< timing mask of the propagator's presolving method */
    906 )
    907{
    908 assert(prop != NULL);
    909
    910 prop->proppresol = proppresol;
    911 prop->presolpriority = presolpriority;
    912 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
    913 * error message
    914 */
    915 if( presoltiming < SCIP_PRESOLTIMING_FAST || presoltiming > SCIP_PRESOLTIMING_MAX )
    916 {
    917 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
    918 "'SCIP_PRESOLTIMING' for <%s> constraint handler instead.\n", prop->name);
    919
    921 }
    922
    923 prop->presoltiming = presoltiming;
    924 prop->maxprerounds = presolmaxrounds;
    925
    926 return SCIP_OKAY;
    927}
    928
    929/** sets propagation conflict resolving callback of propagator */
    931 SCIP_PROP* prop, /**< propagator */
    932 SCIP_DECL_PROPRESPROP ((*propresprop)) /**< propagation conflict resolving callback */
    933 )
    934{
    935 assert(prop != NULL);
    936
    937 prop->propresprop = propresprop;
    938}
    939
    940/** marks the propagator as safe to use in exact solving mode */
    942 SCIP_PROP* prop /**< propagator */
    943 )
    944{
    945 assert(prop != NULL);
    946
    947 prop->exact = TRUE;
    948}
    949
    950/** gets name of propagator */
    951const char* SCIPpropGetName(
    952 SCIP_PROP* prop /**< propagator */
    953 )
    954{
    955 assert(prop != NULL);
    956
    957 return prop->name;
    958}
    959
    960/** gets description of propagator */
    961const char* SCIPpropGetDesc(
    962 SCIP_PROP* prop /**< propagator */
    963 )
    964{
    965 assert(prop != NULL);
    966
    967 return prop->desc;
    968}
    969
    970/** gets priority of propagator */
    972 SCIP_PROP* prop /**< propagator */
    973 )
    974{
    975 assert(prop != NULL);
    976
    977 return prop->priority;
    978}
    979
    980/** gets presolving priority of propagator */
    982 SCIP_PROP* prop /**< propagator */
    983 )
    984{
    985 assert(prop != NULL);
    986
    987 return prop->presolpriority;
    988}
    989
    990/** sets priority of propagator */
    992 SCIP_PROP* prop, /**< propagator */
    993 SCIP_SET* set, /**< global SCIP settings */
    994 int priority /**< new priority of the propagator */
    995 )
    996{
    997 assert(prop != NULL);
    998 assert(set != NULL);
    999
    1000 prop->priority = priority;
    1001 set->propssorted = FALSE;
    1002}
    1003
    1004/** sets presolving priority of propagator */
    1006 SCIP_PROP* prop, /**< propagator */
    1007 SCIP_SET* set, /**< global SCIP settings */
    1008 int presolpriority /**< new priority of the propagator */
    1009 )
    1010{
    1011 assert(prop != NULL);
    1012 assert(set != NULL);
    1013
    1014 prop->presolpriority = presolpriority;
    1015 set->propspresolsorted = FALSE;
    1016}
    1017
    1018/** gets frequency of propagator */
    1020 SCIP_PROP* prop /**< propagator */
    1021 )
    1022{
    1023 assert(prop != NULL);
    1024
    1025 return prop->freq;
    1026}
    1027
    1028/** enables or disables all clocks of \p prop, depending on the value of the flag */
    1030 SCIP_PROP* prop, /**< the propagator for which all clocks should be enabled or disabled */
    1031 SCIP_Bool enable /**< should the clocks of the propagator be enabled? */
    1032 )
    1033{
    1034 assert(prop != NULL);
    1035
    1036 SCIPclockEnableOrDisable(prop->setuptime, enable);
    1037 SCIPclockEnableOrDisable(prop->presoltime, enable);
    1038 SCIPclockEnableOrDisable(prop->proptime, enable);
    1040 SCIPclockEnableOrDisable(prop->sbproptime, enable);
    1041}
    1042
    1043/** gets time in seconds used for setting up this propagator for new stages */
    1045 SCIP_PROP* prop /**< propagator */
    1046 )
    1047{
    1048 assert(prop != NULL);
    1049
    1050 return SCIPclockGetTime(prop->setuptime);
    1051}
    1052
    1053/** sets frequency of propagator */
    1055 SCIP_PROP* prop, /**< propagator */
    1056 int freq /**< new frequency of propagator */
    1057 )
    1058{
    1059 assert(prop != NULL);
    1060 assert(freq >= -1);
    1061
    1062 prop->freq = freq;
    1063}
    1064
    1065/** gets time in seconds used in this propagator for propagation */
    1067 SCIP_PROP* prop /**< propagator */
    1068 )
    1069{
    1070 assert(prop != NULL);
    1071
    1072 return SCIPclockGetTime(prop->proptime);
    1073}
    1074
    1075/** gets time in seconds used in this propagator for propagation during strong branching */
    1077 SCIP_PROP* prop /**< propagator */
    1078 )
    1079{
    1080 assert(prop != NULL);
    1081
    1082 return SCIPclockGetTime(prop->sbproptime);
    1083}
    1084
    1085/** gets time in seconds used in this propagator for resolve propagation */
    1087 SCIP_PROP* prop /**< propagator */
    1088 )
    1089{
    1090 assert(prop != NULL);
    1091
    1092 return SCIPclockGetTime(prop->resproptime);
    1093}
    1094
    1095/** gets time in seconds used in this propagator for presolving */
    1097 SCIP_PROP* prop /**< propagator */
    1098 )
    1099{
    1100 assert(prop != NULL);
    1101
    1102 return SCIPclockGetTime(prop->presoltime);
    1103}
    1104
    1105/** gets the total number of times, the propagator was called */
    1107 SCIP_PROP* prop /**< propagator */
    1108 )
    1109{
    1110 assert(prop != NULL);
    1111
    1112 return prop->ncalls;
    1113}
    1114
    1115/** gets the total number of times, the propagator was called for resolving a propagation */
    1117 SCIP_PROP* prop /**< propagator */
    1118 )
    1119{
    1120 assert(prop != NULL);
    1121
    1122 return prop->nrespropcalls;
    1123}
    1124
    1125/** gets total number of times, this propagator detected a cutoff */
    1127 SCIP_PROP* prop /**< propagator */
    1128 )
    1129{
    1130 assert(prop != NULL);
    1131
    1132 return prop->ncutoffs;
    1133}
    1134
    1135/** gets total number of domain reductions found by this propagator */
    1137 SCIP_PROP* prop /**< propagator */
    1138 )
    1139{
    1140 assert(prop != NULL);
    1141
    1142 return prop->ndomredsfound;
    1143}
    1144
    1145/** should propagator be delayed, if other propagators found reductions? */
    1147 SCIP_PROP* prop /**< propagator */
    1148 )
    1149{
    1150 assert(prop != NULL);
    1151
    1152 return prop->delay;
    1153}
    1154
    1155/** was propagator delayed at the last call? */
    1157 SCIP_PROP* prop /**< propagator */
    1158 )
    1159{
    1160 assert(prop != NULL);
    1161
    1162 return prop->wasdelayed;
    1163}
    1164
    1165/** is propagator initialized? */
    1167 SCIP_PROP* prop /**< propagator */
    1168 )
    1169{
    1170 assert(prop != NULL);
    1171
    1172 return prop->initialized;
    1173}
    1174
    1175/** gets number of variables fixed during presolving of propagator */
    1177 SCIP_PROP* prop /**< propagator */
    1178 )
    1179{
    1180 assert(prop != NULL);
    1181
    1182 return prop->nfixedvars;
    1183}
    1184
    1185/** gets number of variables aggregated during presolving of propagator */
    1187 SCIP_PROP* prop /**< propagator */
    1188 )
    1189{
    1190 assert(prop != NULL);
    1191
    1192 return prop->naggrvars;
    1193}
    1194
    1195/** gets number of variable types changed during presolving of propagator */
    1197 SCIP_PROP* prop /**< propagator */
    1198 )
    1199{
    1200 assert(prop != NULL);
    1201
    1202 return prop->nchgvartypes;
    1203}
    1204
    1205/** gets number of bounds changed during presolving of propagator */
    1207 SCIP_PROP* prop /**< propagator */
    1208 )
    1209{
    1210 assert(prop != NULL);
    1211
    1212 return prop->nchgbds;
    1213}
    1214
    1215/** gets number of holes added to domains of variables during presolving of propagator */
    1217 SCIP_PROP* prop /**< propagator */
    1218 )
    1219{
    1220 assert(prop != NULL);
    1221
    1222 return prop->naddholes;
    1223}
    1224
    1225/** gets number of constraints deleted during presolving of propagator */
    1227 SCIP_PROP* prop /**< propagator */
    1228 )
    1229{
    1230 assert(prop != NULL);
    1231
    1232 return prop->ndelconss;
    1233}
    1234
    1235/** gets number of constraints added during presolving of propagator */
    1237 SCIP_PROP* prop /**< propagator */
    1238 )
    1239{
    1240 assert(prop != NULL);
    1241
    1242 return prop->naddconss;
    1243}
    1244
    1245/** gets number of constraints upgraded during presolving of propagator */
    1247 SCIP_PROP* prop /**< propagator */
    1248 )
    1249{
    1250 assert(prop != NULL);
    1251
    1252 return prop->nupgdconss;
    1253}
    1254
    1255/** gets number of coefficients changed during presolving of propagator */
    1257 SCIP_PROP* prop /**< propagator */
    1258 )
    1259{
    1260 assert(prop != NULL);
    1261
    1262 return prop->nchgcoefs;
    1263}
    1264
    1265/** gets number of constraint sides changed during presolving of propagator */
    1267 SCIP_PROP* prop /**< propagator */
    1268 )
    1269{
    1270 assert(prop != NULL);
    1271
    1272 return prop->nchgsides;
    1273}
    1274
    1275/** gets number of times the propagator was called in presolving and tried to find reductions */
    1277 SCIP_PROP* prop /**< propagator */
    1278 )
    1279{
    1280 assert(prop != NULL);
    1281
    1282 return prop->npresolcalls;
    1283}
    1284
    1285/** returns the timing mask of the propagator */
    1287 SCIP_PROP* prop /**< propagator */
    1288 )
    1289{
    1290 assert(prop != NULL);
    1291
    1292 return prop->timingmask;
    1293}
    1294
    1295/** sets new timing mask for propagator */
    1297 SCIP_PROP* prop, /**< propagator */
    1298 SCIP_PROPTIMING timingmask /**< new timing mask of propagator */
    1299 )
    1300{
    1301 assert(prop != NULL);
    1302
    1303 prop->timingmask = timingmask;
    1304}
    1305
    1306/** does the propagator perform presolving? */
    1308 SCIP_PROP* prop /**< propagator */
    1309 )
    1310{
    1311 assert(prop != NULL);
    1312
    1313 return (prop->proppresol != NULL);
    1314}
    1315
    1316/** returns the timing mask of the presolving method of the propagator */
    1318 SCIP_PROP* prop /**< propagator */
    1319 )
    1320{
    1321 assert(prop != NULL);
    1322
    1323 return prop->presoltiming;
    1324}
    1325
    1326/** sets the timing mask of the presolving method of the propagator */
    1328 SCIP_PROP* prop, /**< propagator */
    1329 SCIP_PRESOLTIMING presoltiming /** timing mask to be set */
    1330 )
    1331{
    1332 assert(prop != NULL);
    1333
    1334 prop->presoltiming = presoltiming;
    1335}
    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_Longint
    Definition: def.h:141
    #define SCIP_MAXTREEDEPTH
    Definition: def.h:297
    #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_Bool SCIPpropDoesPresolve(SCIP_PROP *prop)
    Definition: prop.c:1307
    SCIP_Real SCIPpropGetRespropTime(SCIP_PROP *prop)
    Definition: prop.c:1086
    SCIP_Bool SCIPpropIsDelayed(SCIP_PROP *prop)
    Definition: prop.c:1146
    SCIP_Real SCIPpropGetPresolTime(SCIP_PROP *prop)
    Definition: prop.c:1096
    void SCIPpropSetPresolTiming(SCIP_PROP *prop, SCIP_PRESOLTIMING presoltiming)
    Definition: prop.c:1327
    SCIP_Bool SCIPpropWasDelayed(SCIP_PROP *prop)
    Definition: prop.c:1156
    SCIP_Longint SCIPpropGetNCutoffs(SCIP_PROP *prop)
    Definition: prop.c:1126
    SCIP_Real SCIPpropGetSetupTime(SCIP_PROP *prop)
    Definition: prop.c:1044
    int SCIPpropGetNAddHoles(SCIP_PROP *prop)
    Definition: prop.c:1216
    int SCIPpropGetNChgBds(SCIP_PROP *prop)
    Definition: prop.c:1206
    void SCIPpropSetData(SCIP_PROP *prop, SCIP_PROPDATA *propdata)
    Definition: prop.c:801
    int SCIPpropGetNChgSides(SCIP_PROP *prop)
    Definition: prop.c:1266
    SCIP_RETCODE SCIPsetPropPriority(SCIP *scip, SCIP_PROP *prop, int priority)
    Definition: scip_prop.c:370
    int SCIPpropGetNUpgdConss(SCIP_PROP *prop)
    Definition: prop.c:1246
    int SCIPpropGetNPresolCalls(SCIP_PROP *prop)
    Definition: prop.c:1276
    SCIP_Longint SCIPpropGetNRespropCalls(SCIP_PROP *prop)
    Definition: prop.c:1116
    SCIP_Real SCIPpropGetStrongBranchPropTime(SCIP_PROP *prop)
    Definition: prop.c:1076
    SCIP_Longint SCIPpropGetNDomredsFound(SCIP_PROP *prop)
    Definition: prop.c:1136
    int SCIPpropGetFreq(SCIP_PROP *prop)
    Definition: prop.c:1019
    SCIP_PROPDATA * SCIPpropGetData(SCIP_PROP *prop)
    Definition: prop.c:791
    SCIP_RETCODE SCIPsetPropPresolPriority(SCIP *scip, SCIP_PROP *prop, int presolpriority)
    Definition: scip_prop.c:385
    int SCIPpropGetNChgCoefs(SCIP_PROP *prop)
    Definition: prop.c:1256
    int SCIPpropGetNAggrVars(SCIP_PROP *prop)
    Definition: prop.c:1186
    const char * SCIPpropGetDesc(SCIP_PROP *prop)
    Definition: prop.c:961
    int SCIPpropGetPresolPriority(SCIP_PROP *prop)
    Definition: prop.c:981
    int SCIPpropGetNFixedVars(SCIP_PROP *prop)
    Definition: prop.c:1176
    const char * SCIPpropGetName(SCIP_PROP *prop)
    Definition: prop.c:951
    void SCIPpropSetTimingmask(SCIP_PROP *prop, SCIP_PROPTIMING timingmask)
    Definition: prop.c:1296
    int SCIPpropGetNAddConss(SCIP_PROP *prop)
    Definition: prop.c:1236
    int SCIPpropGetPriority(SCIP_PROP *prop)
    Definition: prop.c:971
    void SCIPpropSetFreq(SCIP_PROP *prop, int freq)
    Definition: prop.c:1054
    SCIP_Real SCIPpropGetTime(SCIP_PROP *prop)
    Definition: prop.c:1066
    int SCIPpropGetNChgVarTypes(SCIP_PROP *prop)
    Definition: prop.c:1196
    SCIP_PRESOLTIMING SCIPpropGetPresolTiming(SCIP_PROP *prop)
    Definition: prop.c:1317
    SCIP_Bool SCIPpropIsInitialized(SCIP_PROP *prop)
    Definition: prop.c:1166
    void SCIPpropMarkExact(SCIP_PROP *prop)
    Definition: prop.c:941
    SCIP_DECL_SORTPTRCOMP(SCIPpropComp)
    Definition: prop.c:52
    SCIP_Longint SCIPpropGetNCalls(SCIP_PROP *prop)
    Definition: prop.c:1106
    SCIP_PROPTIMING SCIPpropGetTimingmask(SCIP_PROP *prop)
    Definition: prop.c:1286
    int SCIPpropGetNDelConss(SCIP_PROP *prop)
    Definition: prop.c:1226
    SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
    Definition: var.c:24142
    SCIP_Real SCIPgetVarUbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
    Definition: scip_var.c:2872
    SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
    Definition: var.c:24120
    SCIP_Real SCIPgetVarLbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
    Definition: scip_var.c:2736
    int SCIPsnprintf(char *t, int len, const char *s,...)
    Definition: misc.c:10827
    static const char * paramname[]
    Definition: lpi_msk.c:5172
    #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
    void SCIPpropSetPriority(SCIP_PROP *prop, SCIP_SET *set, int priority)
    Definition: prop.c:991
    SCIP_RETCODE SCIPpropInitsol(SCIP_PROP *prop, SCIP_SET *set)
    Definition: prop.c:471
    SCIP_RETCODE SCIPpropInit(SCIP_PROP *prop, SCIP_SET *set)
    Definition: prop.c:315
    void SCIPpropSetResprop(SCIP_PROP *prop, SCIP_DECL_PROPRESPROP((*propresprop)))
    Definition: prop.c:930
    void SCIPpropSetExitsol(SCIP_PROP *prop, SCIP_DECL_PROPEXITSOL((*propexitsol)))
    Definition: prop.c:867
    void SCIPpropSetFree(SCIP_PROP *prop, SCIP_DECL_PROPFREE((*propfree)))
    Definition: prop.c:823
    SCIP_RETCODE SCIPpropCreate(SCIP_PROP **prop, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming, SCIP_DECL_PROPCOPY((*propcopy)), SCIP_DECL_PROPFREE((*propfree)), SCIP_DECL_PROPINIT((*propinit)), SCIP_DECL_PROPEXIT((*propexit)), SCIP_DECL_PROPINITPRE((*propinitpre)), SCIP_DECL_PROPEXITPRE((*propexitpre)), SCIP_DECL_PROPINITSOL((*propinitsol)), SCIP_DECL_PROPEXITSOL((*propexitsol)), SCIP_DECL_PROPPRESOL((*proppresol)), SCIP_DECL_PROPEXEC((*propexec)), SCIP_DECL_PROPRESPROP((*propresprop)), SCIP_PROPDATA *propdata)
    Definition: prop.c:243
    SCIP_RETCODE SCIPpropCopyInclude(SCIP_PROP *prop, SCIP_SET *set)
    Definition: prop.c:100
    SCIP_RETCODE SCIPpropExitpre(SCIP_PROP *prop, SCIP_SET *set)
    Definition: prop.c:447
    SCIP_RETCODE SCIPpropExit(SCIP_PROP *prop, SCIP_SET *set)
    Definition: prop.c:381
    void SCIPpropEnableOrDisableClocks(SCIP_PROP *prop, SCIP_Bool enable)
    Definition: prop.c:1029
    static SCIP_RETCODE doPropCreate(SCIP_PROP **prop, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming, SCIP_DECL_PROPCOPY((*propcopy)), SCIP_DECL_PROPFREE((*propfree)), SCIP_DECL_PROPINIT((*propinit)), SCIP_DECL_PROPEXIT((*propexit)), SCIP_DECL_PROPINITPRE((*propinitpre)), SCIP_DECL_PROPEXITPRE((*propexitpre)), SCIP_DECL_PROPINITSOL((*propinitsol)), SCIP_DECL_PROPEXITSOL((*propexitsol)), SCIP_DECL_PROPPRESOL((*proppresol)), SCIP_DECL_PROPEXEC((*propexec)), SCIP_DECL_PROPRESPROP((*propresprop)), SCIP_PROPDATA *propdata)
    Definition: prop.c:119
    void SCIPpropSetExitpre(SCIP_PROP *prop, SCIP_DECL_PROPEXITPRE((*propexitpre)))
    Definition: prop.c:889
    SCIP_RETCODE SCIPpropResolvePropagation(SCIP_PROP *prop, SCIP_SET *set, SCIP_VAR *infervar, int inferinfo, SCIP_BOUNDTYPE inferboundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd, SCIP_RESULT *result)
    Definition: prop.c:739
    SCIP_RETCODE SCIPpropExitsol(SCIP_PROP *prop, SCIP_SET *set, SCIP_Bool restart)
    Definition: prop.c:495
    void SCIPpropSetInitsol(SCIP_PROP *prop, SCIP_DECL_PROPINITSOL((*propinitsol)))
    Definition: prop.c:856
    void SCIPpropSetExit(SCIP_PROP *prop, SCIP_DECL_PROPEXIT((*propexit)))
    Definition: prop.c:845
    void SCIPpropSetPresolPriority(SCIP_PROP *prop, SCIP_SET *set, int presolpriority)
    Definition: prop.c:1005
    void SCIPpropSetInitpre(SCIP_PROP *prop, SCIP_DECL_PROPINITPRE((*propinitpre)))
    Definition: prop.c:878
    static SCIP_DECL_PARAMCHGD(paramChgdPropPriority)
    Definition: prop.c:71
    SCIP_RETCODE SCIPpropPresol(SCIP_PROP *prop, 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: prop.c:520
    SCIP_RETCODE SCIPpropExec(SCIP_PROP *prop, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool execdelayed, SCIP_Bool instrongbranching, SCIP_PROPTIMING proptiming, SCIP_RESULT *result)
    Definition: prop.c:646
    SCIP_RETCODE SCIPpropInitpre(SCIP_PROP *prop, SCIP_SET *set)
    Definition: prop.c:411
    void SCIPpropSetInit(SCIP_PROP *prop, SCIP_DECL_PROPINIT((*propinit)))
    Definition: prop.c:834
    SCIP_RETCODE SCIPpropFree(SCIP_PROP **prop, SCIP_SET *set)
    Definition: prop.c:285
    SCIP_RETCODE SCIPpropSetPresol(SCIP_PROP *prop, SCIP_DECL_PROPPRESOL((*proppresol)), int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming)
    Definition: prop.c:900
    void SCIPpropSetCopy(SCIP_PROP *prop, SCIP_DECL_PROPCOPY((*propcopy)))
    Definition: prop.c:812
    internal methods for propagators
    public methods for message output
    #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
    SCIP_RETCODE SCIPsetAddBoolParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: set.c:3207
    internal methods for global SCIP settings
    #define SCIPsetDebugMsg
    Definition: set.h:1811
    internal methods for problem statistics
    int priority
    Definition: struct_prop.h:71
    SCIP_Bool initialized
    Definition: struct_prop.h:101
    SCIP_CLOCK * resproptime
    Definition: struct_prop.h:69
    int nfixedvars
    Definition: struct_prop.h:87
    SCIP_CLOCK * presoltime
    Definition: struct_prop.h:70
    int lastnchgvartypes
    Definition: struct_prop.h:79
    int lastnfixedvars
    Definition: struct_prop.h:77
    int npresolcalls
    Definition: struct_prop.h:97
    int lastnchgbds
    Definition: struct_prop.h:80
    SCIP_Longint ncutoffs
    Definition: struct_prop.h:50
    SCIP_PROPTIMING timingmask
    Definition: struct_prop.h:73
    int ndelconss
    Definition: struct_prop.h:92
    int nchgvartypes
    Definition: struct_prop.h:89
    SCIP_CLOCK * setuptime
    Definition: struct_prop.h:66
    int lastnchgsides
    Definition: struct_prop.h:86
    int lastnaddholes
    Definition: struct_prop.h:81
    int maxprerounds
    Definition: struct_prop.h:76
    int lastnupgdconss
    Definition: struct_prop.h:84
    int lastnaddconss
    Definition: struct_prop.h:83
    SCIP_CLOCK * sbproptime
    Definition: struct_prop.h:68
    SCIP_PRESOLTIMING presoltiming
    Definition: struct_prop.h:74
    int nchgcoefs
    Definition: struct_prop.h:95
    SCIP_PROPDATA * propdata
    Definition: struct_prop.h:65
    char * desc
    Definition: struct_prop.h:53
    int presolpriority
    Definition: struct_prop.h:75
    SCIP_Bool wasdelayed
    Definition: struct_prop.h:99
    SCIP_Bool exact
    Definition: struct_prop.h:100
    char * name
    Definition: struct_prop.h:52
    SCIP_CLOCK * proptime
    Definition: struct_prop.h:67
    SCIP_Longint ndomredsfound
    Definition: struct_prop.h:51
    int nupgdconss
    Definition: struct_prop.h:94
    int nchgsides
    Definition: struct_prop.h:96
    SCIP_Bool delay
    Definition: struct_prop.h:98
    int naggrvars
    Definition: struct_prop.h:88
    int lastnchgcoefs
    Definition: struct_prop.h:85
    int lastnaggrvars
    Definition: struct_prop.h:78
    SCIP_Longint ncalls
    Definition: struct_prop.h:48
    int naddconss
    Definition: struct_prop.h:93
    SCIP_Longint nrespropcalls
    Definition: struct_prop.h:49
    int naddholes
    Definition: struct_prop.h:91
    int lastndelconss
    Definition: struct_prop.h:82
    int nchgbds
    Definition: struct_prop.h:90
    SCIP_Longint nprobholechgs
    Definition: struct_stat.h:120
    SCIP_Longint nboundchgs
    Definition: struct_stat.h:117
    SCIP_Longint nholechgs
    Definition: struct_stat.h:118
    SCIP_Longint nprobboundchgs
    Definition: struct_stat.h:119
    datastructures for propagators
    Definition: heur_padm.c:135
    @ SCIP_CLOCKTYPE_DEFAULT
    Definition: type_clock.h:43
    @ SCIP_BOUNDTYPE_UPPER
    Definition: type_lp.h:58
    @ SCIP_BOUNDTYPE_LOWER
    Definition: type_lp.h:57
    enum SCIP_BoundType SCIP_BOUNDTYPE
    Definition: type_lp.h:60
    struct SCIP_ParamData SCIP_PARAMDATA
    Definition: type_paramset.h:87
    #define SCIP_DECL_PROPCOPY(x)
    Definition: type_prop.h:61
    #define SCIP_DECL_PROPEXITPRE(x)
    Definition: type_prop.h:114
    #define SCIP_DECL_PROPINITSOL(x)
    Definition: type_prop.h:129
    #define SCIP_DECL_PROPINIT(x)
    Definition: type_prop.h:77
    #define SCIP_DECL_PROPFREE(x)
    Definition: type_prop.h:69
    #define SCIP_DECL_PROPEXITSOL(x)
    Definition: type_prop.h:141
    #define SCIP_DECL_PROPEXIT(x)
    Definition: type_prop.h:85
    #define SCIP_DECL_PROPPRESOL(x)
    Definition: type_prop.h:193
    #define SCIP_DECL_PROPINITPRE(x)
    Definition: type_prop.h:99
    #define SCIP_DECL_PROPRESPROP(x)
    Definition: type_prop.h:258
    struct SCIP_PropData SCIP_PROPDATA
    Definition: type_prop.h:52
    #define SCIP_DECL_PROPEXEC(x)
    Definition: type_prop.h:217
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_CUTOFF
    Definition: type_result.h:48
    @ SCIP_DELAYED
    Definition: type_result.h:43
    @ SCIP_REDUCEDDOM
    Definition: type_result.h:51
    @ SCIP_DIDNOTFIND
    Definition: type_result.h:44
    @ SCIP_UNBOUNDED
    Definition: type_result.h:47
    @ SCIP_SUCCESS
    Definition: type_result.h:58
    @ SCIP_DELAYNODE
    Definition: type_result.h:59
    enum SCIP_Result SCIP_RESULT
    Definition: type_result.h:61
    @ SCIP_INVALIDRESULT
    Definition: type_retcode.h:53
    @ SCIP_PLUGINNOTFOUND
    Definition: type_retcode.h:54
    @ 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_PROPTIMING_NONE
    Definition: type_timing.h:65
    #define SCIP_PRESOLTIMING_FINAL
    Definition: type_timing.h:55
    unsigned int SCIP_PROPTIMING
    Definition: type_timing.h:75
    #define SCIP_PRESOLTIMING_MEDIUM
    Definition: type_timing.h:53
    unsigned int SCIP_PRESOLTIMING
    Definition: type_timing.h:61
    #define SCIP_PROPTIMING_AFTERLPLOOP
    Definition: type_timing.h:68
    #define SCIP_PRESOLTIMING_FAST
    Definition: type_timing.h:52
    #define SCIP_PRESOLTIMING_EXHAUSTIVE
    Definition: type_timing.h:54
    #define SCIP_PROPTIMING_BEFORELP
    Definition: type_timing.h:66
    #define SCIP_PROPTIMING_ALWAYS
    Definition: type_timing.h:73
    #define SCIP_PRESOLTIMING_NONE
    Definition: type_timing.h:51
    #define SCIP_PROPTIMING_DURINGLPLOOP
    Definition: type_timing.h:67
    internal methods for problem variables