Scippy

    SCIP

    Solving Constraint Integer Programs

    conflict_graphanalysis.h
    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 conflict_graphanalysis.h
    26 * @ingroup OTHER_CFILES
    27 * @brief methods and datastructures for conflict analysis
    28 * @author Tobias Achterberg
    29 * @author Timo Berthold
    30 * @author Stefan Heinz
    31 * @author Marc Pfetsch
    32 * @author Michael Winkler
    33 * @author Jakob Witzig
    34 *
    35 * This file implements a conflict analysis method like the one used in modern
    36 * SAT solvers like zchaff. The algorithm works as follows:
    37 *
    38 * Given is a set of bound changes that are not allowed being applied simultaneously, because they
    39 * render the current node infeasible (e.g. because a single constraint is infeasible in the these
    40 * bounds, or because the LP relaxation is infeasible). The goal is to deduce a clause on variables
    41 * -- a conflict clause -- representing the "reason" for this conflict, i.e., the branching decisions
    42 * or the deductions (applied e.g. in domain propagation) that lead to the conflict. This clause can
    43 * then be added to the constraint set to help cutting off similar parts of the branch and bound
    44 * tree, that would lead to the same conflict. A conflict clause can also be generated, if the
    45 * conflict was detected by a locally valid constraint. In this case, the resulting conflict clause
    46 * is also locally valid in the same depth as the conflict detecting constraint. If all involved
    47 * variables are binary, a linear (set covering) constraint can be generated, otherwise a bound
    48 * disjunction constraint is generated. Details are given in
    49 *
    50 * Tobias Achterberg, Conflict Analysis in Mixed Integer Programming@n
    51 * Discrete Optimization, 4, 4-20 (2007)
    52 *
    53 * See also @ref CONF. Here is an outline of the algorithm:
    54 *
    55 * -# Put all the given bound changes to a priority queue, which is ordered,
    56 * such that the bound change that was applied last due to branching or deduction
    57 * is at the top of the queue. The variables in the queue are always active
    58 * problem variables. Because binary variables are preferred over general integer
    59 * variables, integer variables are put on the priority queue prior to the binary
    60 * variables. Create an empty conflict set.
    61 * -# Remove the top bound change b from the priority queue.
    62 * -# Perform the following case distinction:
    63 * -# If the remaining queue is non-empty, and bound change b' (the one that is now
    64 * on the top of the queue) was applied at the same depth level as b, and if
    65 * b was a deduction with known inference reason, and if the inference constraint's
    66 * valid depth is smaller or equal to the conflict detecting constraint's valid
    67 * depth:
    68 * - Resolve bound change b by asking the constraint that inferred the
    69 * bound change to put all the bound changes on the priority queue, that
    70 * lead to the deduction of b.
    71 * Note that these bound changes have at most the same inference depth
    72 * level as b, and were deduced earlier than b.
    73 * -# Otherwise, the bound change b was a branching decision or a deduction with
    74 * missing inference reason, or the inference constraint's validity is more local
    75 * than the one of the conflict detecting constraint.
    76 * - If a the bound changed corresponds to a binary variable, add it or its
    77 * negation to the conflict set, depending on which of them is currently fixed to
    78 * FALSE (i.e., the conflict set consists of literals that cannot be FALSE
    79 * altogether at the same time).
    80 * - Otherwise put the bound change into the conflict set.
    81 * Note that if the bound change was a branching, all deduced bound changes
    82 * remaining in the priority queue have smaller inference depth level than b,
    83 * since deductions are always applied after the branching decisions. However,
    84 * there is the possibility, that b was a deduction, where the inference
    85 * reason was not given or the inference constraint was too local.
    86 * With this lack of information, we must treat the deduced bound change like
    87 * a branching, and there may exist other deduced bound changes of the same
    88 * inference depth level in the priority queue.
    89 * -# If priority queue is non-empty, goto step 2.
    90 * -# The conflict set represents the conflict clause saying that at least one
    91 * of the conflict variables must take a different value. The conflict set is then passed
    92 * to the conflict handlers, that may create a corresponding constraint (e.g. a logicor
    93 * constraint or bound disjunction constraint) out of these conflict variables and
    94 * add it to the problem.
    95 *
    96 * If all deduced bound changes come with (global) inference information, depending on
    97 * the conflict analyzing strategy, the resulting conflict set has the following property:
    98 * - 1-FirstUIP: In the depth level where the conflict was found, at most one variable
    99 * assigned at that level is member of the conflict set. This conflict variable is the
    100 * first unique implication point of its depth level (FUIP).
    101 * - All-FirstUIP: For each depth level, at most one variable assigned at that level is
    102 * member of the conflict set. This conflict variable is the first unique implication
    103 * point of its depth level (FUIP).
    104 *
    105 * The user has to do the following to get the conflict analysis running in its
    106 * current implementation:
    107 * - A constraint handler or propagator supporting the conflict analysis must implement
    108 * the CONSRESPROP/PROPRESPROP call, that processes a bound change inference b and puts all
    109 * the reason bounds leading to the application of b with calls to
    110 * SCIPaddConflictBound() on the conflict queue (algorithm step 3.(a)).
    111 * - If the current bounds lead to a deduction of a bound change (e.g. in domain
    112 * propagation), a constraint handler should call SCIPinferVarLbCons() or
    113 * SCIPinferVarUbCons(), thus providing the constraint that inferred the bound change.
    114 * A propagator should call SCIPinferVarLbProp() or SCIPinferVarUbProp() instead,
    115 * thus providing a pointer to itself.
    116 * - If (in the current bounds) an infeasibility is detected, the constraint handler or
    117 * propagator should
    118 * 1. call SCIPinitConflictAnalysis() to initialize the conflict queue,
    119 * 2. call SCIPaddConflictBound() for each bound that lead to the conflict,
    120 * 3. call SCIPanalyzeConflictCons() or SCIPanalyzeConflict() to analyze the conflict
    121 * and add an appropriate conflict constraint.
    122 */
    123
    124/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    125
    126#ifndef __SCIP_CONFLICT_GRAPHANALYSIS_H__
    127#define __SCIP_CONFLICT_GRAPHANALYSIS_H__
    128
    129#include "scip/def.h"
    130#include "scip/type_cuts.h"
    131#include "scip/type_conflict.h"
    132#include "scip/type_reopt.h"
    133#include "scip/type_implics.h"
    134#include "scip/type_set.h"
    135#include "scip/type_stat.h"
    136#include "scip/type_lp.h"
    137#include "lpi/type_lpi.h"
    138#include "scip/type_branch.h"
    139#include "scip/type_mem.h"
    140#include "scip/type_var.h"
    141#include "scip/type_prob.h"
    142#include "scip/type_event.h"
    143#include "scip/type_message.h"
    144#include <string.h>
    145#ifndef _WIN32
    146#include <strings.h> /*lint --e{766}*/
    147#endif
    148
    149#ifdef __cplusplus
    150extern "C" {
    151#endif
    152
    153/** creates an empty conflict set */
    155 SCIP_CONFLICTSET** conflictset, /**< pointer to store the conflict set */
    156 BMS_BLKMEM* blkmem /**< block memory of transformed problem */
    157 );
    158
    159/** frees a conflict set */
    161 SCIP_CONFLICTSET** conflictset, /**< pointer to the conflict set */
    162 BMS_BLKMEM* blkmem /**< block memory of transformed problem */
    163 );
    164
    165/** copies the given conflict handler to a new scip */
    167 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    168 SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
    169 );
    170
    171/** creates a conflict handler */
    173 SCIP_CONFLICTHDLR** conflicthdlr, /**< pointer to conflict handler data structure */
    174 SCIP_SET* set, /**< global SCIP settings */
    175 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    176 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    177 const char* name, /**< name of conflict handler */
    178 const char* desc, /**< description of conflict handler */
    179 int priority, /**< priority of the conflict handler */
    180 SCIP_DECL_CONFLICTCOPY((*conflictcopy)), /**< copy method of conflict handler or NULL if you don't want to copy your plugin into sub-SCIPs */
    181 SCIP_DECL_CONFLICTFREE((*conflictfree)), /**< destructor of conflict handler */
    182 SCIP_DECL_CONFLICTINIT((*conflictinit)), /**< initialize conflict handler */
    183 SCIP_DECL_CONFLICTEXIT((*conflictexit)), /**< deinitialize conflict handler */
    184 SCIP_DECL_CONFLICTINITSOL((*conflictinitsol)),/**< solving process initialization method of conflict handler */
    185 SCIP_DECL_CONFLICTEXITSOL((*conflictexitsol)),/**< solving process deinitialization method of conflict handler */
    186 SCIP_DECL_CONFLICTEXEC((*conflictexec)), /**< conflict processing method of conflict handler */
    187 SCIP_CONFLICTHDLRDATA* conflicthdlrdata /**< conflict handler data */
    188 );
    189
    190/** calls destructor and frees memory of conflict handler */
    192 SCIP_CONFLICTHDLR** conflicthdlr, /**< pointer to conflict handler data structure */
    193 SCIP_SET* set /**< global SCIP settings */
    194 );
    195
    196/** calls init method of conflict handler */
    198 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    199 SCIP_SET* set /**< global SCIP settings */
    200 );
    201
    202/** calls exit method of conflict handler */
    204 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    205 SCIP_SET* set /**< global SCIP settings */
    206 );
    207
    208/** informs conflict handler that the branch and bound process is being started */
    210 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    211 SCIP_SET* set /**< global SCIP settings */
    212 );
    213
    214/** informs conflict handler that the branch and bound process data is being freed */
    216 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    217 SCIP_SET* set /**< global SCIP settings */
    218 );
    219
    220/** calls execution method of conflict handler */
    222 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    223 SCIP_SET* set, /**< global SCIP settings */
    224 SCIP_NODE* node, /**< node to add conflict constraint to */
    225 SCIP_NODE* validnode, /**< node at which the constraint is valid */
    226 SCIP_BDCHGINFO** bdchginfos, /**< bound change resembling the conflict set */
    227 SCIP_Real* relaxedbds, /**< array with relaxed bounds which are efficient to create a valid conflict */
    228 int nbdchginfos, /**< number of bound changes in the conflict set */
    229 SCIP_CONFTYPE conftype, /**< type of the conflict */
    230 SCIP_Bool usescutoffbound, /**< depends the conflict on the cutoff bound? */
    231 SCIP_Bool resolved, /**< was the conflict set already used to create a constraint? */
    232 SCIP_RESULT* result /**< pointer to store the result of the callback method */
    233 );
    234
    235/** sets priority of conflict handler */
    237 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    238 SCIP_SET* set, /**< global SCIP settings */
    239 int priority /**< new priority of the conflict handler */
    240 );
    241
    242/** set copy method of conflict handler */
    244 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    245 SCIP_DECL_CONFLICTCOPY((*conflictcopy)) /**< copy method of the conflict handler */
    246 );
    247
    248/** set destructor of conflict handler */
    250 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    251 SCIP_DECL_CONFLICTFREE((*conflictfree)) /**< destructor of conflict handler */
    252 );
    253
    254/** set initialization method of conflict handler */
    256 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    257 SCIP_DECL_CONFLICTINIT((*conflictinit)) /**< initialization method conflict handler */
    258 );
    259
    260/** set deinitialization method of conflict handler */
    262 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    263 SCIP_DECL_CONFLICTEXIT((*conflictexit)) /**< deinitialization method conflict handler */
    264 );
    265
    266/** set solving process initialization method of conflict handler */
    268 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    269 SCIP_DECL_CONFLICTINITSOL((*conflictinitsol))/**< solving process initialization method of conflict handler */
    270 );
    271
    272/** set solving process deinitialization method of conflict handler */
    274 SCIP_CONFLICTHDLR* conflicthdlr, /**< conflict handler */
    275 SCIP_DECL_CONFLICTEXITSOL((*conflictexitsol))/**< solving process deinitialization method of conflict handler */
    276 );
    277
    278/** enables or disables all clocks of \p conflicthdlr, depending on the value of the flag */
    280 SCIP_CONFLICTHDLR* conflicthdlr, /**< the conflict handler for which all clocks should be enabled or disabled */
    281 SCIP_Bool enable /**< should the clocks of the conflict handler be enabled? */
    282 );
    283
    284/** return TRUE if conflict graph analysis is applicable */
    286 SCIP_SET* set /**< global SCIP settings */
    287 );
    288
    289/** creates a temporary bound change information object that is destroyed after the conflict sets are flushed */
    291 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    292 BMS_BLKMEM* blkmem, /**< block memory */
    293 SCIP_SET* set, /**< global SCIP settings */
    294 SCIP_VAR* var, /**< active variable that changed the bounds */
    295 SCIP_BOUNDTYPE boundtype, /**< type of bound for var: lower or upper bound */
    296 SCIP_Real oldbound, /**< old value for bound */
    297 SCIP_Real newbound, /**< new value for bound */
    298 SCIP_BDCHGINFO** bdchginfo /**< pointer to store bound change information */
    299 );
    300
    301
    302/*
    303 * Conflict LP Bound Changes
    304 */
    305
    306
    307/** calculates the maximal size of conflict sets to be used */
    309 SCIP_SET* set, /**< global SCIP settings */
    310 SCIP_PROB* prob /**< problem data */
    311 );
    312
    313/** undoes bound changes on variables, still leaving the given infeasibility proof valid */
    315 SCIP_SET* set, /**< global SCIP settings */
    316 SCIP_PROB* prob, /**< problem data */
    317 int currentdepth, /**< current depth in the tree */
    318 SCIP_Real* proofcoefs, /**< coefficients in infeasibility proof */
    319 SCIP_Real prooflhs, /**< left hand side of proof */
    320 SCIP_Real* proofact, /**< current activity of proof */
    321 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables */
    322 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables */
    323 int* lbchginfoposs, /**< positions of currently active lower bound change information in variables' arrays */
    324 int* ubchginfoposs, /**< positions of currently active upper bound change information in variables' arrays */
    325 SCIP_LPBDCHGS* oldlpbdchgs, /**< old LP bound changes used for reset the LP bound change, or NULL */
    326 SCIP_LPBDCHGS* relaxedlpbdchgs, /**< relaxed LP bound changes used for reset the LP bound change, or NULL */
    327 SCIP_Bool* resolve, /**< pointer to store whether the changed LP should be resolved again, or NULL */
    328 SCIP_LPI* lpi /**< pointer to LPi to access infinity of LP solver; necessary to set correct values */
    329 );
    330
    331/** applies conflict analysis starting with given bound changes, that could not be undone during previous
    332 * infeasibility analysis
    333 */
    335 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    336 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    337 SCIP_SET* set, /**< global SCIP settings */
    338 SCIP_STAT* stat, /**< problem statistics */
    339 SCIP_PROB* prob, /**< problem data */
    340 SCIP_TREE* tree, /**< branch and bound tree */
    341 SCIP_Bool diving, /**< are we in strong branching or diving mode? */
    342 int* lbchginfoposs, /**< positions of currently active lower bound change information in variables' arrays */
    343 int* ubchginfoposs, /**< positions of currently active upper bound change information in variables' arrays */
    344 int* nconss, /**< pointer to store the number of generated conflict constraints */
    345 int* nliterals, /**< pointer to store the number of literals in generated conflict constraints */
    346 int* nreconvconss, /**< pointer to store the number of generated reconvergence constraints */
    347 int* nreconvliterals /**< pointer to store the number of literals generated reconvergence constraints */
    348 );
    349
    350/** initializes propagation and resolution conflict analysis by clearing the conflict candidate queues */
    352 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    353 SCIP_SET* set, /**< global SCIP settings */
    354 SCIP_STAT* stat, /**< problem statistics */
    355 SCIP_PROB* prob, /**< problem data */
    356 SCIP_CONFTYPE conftype, /**< type of the conflict */
    357 SCIP_Bool usescutoffbound /**< depends the conflict on a cutoff bound? */
    358 );
    359
    360/** adds variable's bound to conflict candidate queue */
    362 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    363 BMS_BLKMEM* blkmem, /**< block memory */
    364 SCIP_SET* set, /**< global SCIP settings */
    365 SCIP_STAT* stat, /**< dynamic problem statistics */
    366 SCIP_VAR* var, /**< problem variable */
    367 SCIP_BOUNDTYPE boundtype, /**< type of bound that was changed: lower or upper bound */
    368 SCIP_BDCHGIDX* bdchgidx /**< bound change index (time stamp of bound change), or NULL for current time */
    369 );
    370
    371/** adds variable's bound to conflict candidate queue with the additional information of a relaxed bound */
    373 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    374 BMS_BLKMEM* blkmem, /**< block memory */
    375 SCIP_SET* set, /**< global SCIP settings */
    376 SCIP_STAT* stat, /**< dynamic problem statistics */
    377 SCIP_VAR* var, /**< problem variable */
    378 SCIP_BOUNDTYPE boundtype, /**< type of bound that was changed: lower or upper bound */
    379 SCIP_BDCHGIDX* bdchgidx, /**< bound change index (time stamp of bound change), or NULL for current time */
    380 SCIP_Real relaxedbd /**< the relaxed bound */
    381 );
    382
    383/** checks if the given variable is already part of the current conflict set or queued for resolving with the same or
    384 * even stronger bound
    385 */
    387 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    388 SCIP_VAR* var, /**< problem variable */
    389 SCIP_SET* set, /**< global SCIP settings */
    390 SCIP_BOUNDTYPE boundtype, /**< type of bound for which the score should be increased */
    391 SCIP_BDCHGIDX* bdchgidx, /**< bound change index (time stamp of bound change), or NULL for current time */
    392 SCIP_Bool* used /**< pointer to store if the variable is already used */
    393 );
    394
    395/** returns the conflict lower bound if the variable is present in the current conflict set; otherwise the global lower
    396 * bound
    397 */
    399 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    400 SCIP_VAR* var /**< problem variable */
    401 );
    402
    403/** returns the conflict upper bound if the variable is present in the current conflict set; otherwise the global upper
    404 * bound
    405 */
    407 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    408 SCIP_VAR* var /**< problem variable */
    409 );
    410
    411/** try to find a subset of changed bounds leading to an infeasible LP
    412 *
    413 * 1. call undoBdchgsDualfarkas() or undoBdchgsDualsol()
    414 * -> update lb/ubchginfoposs arrays
    415 * -> store additional changes in bdchg and curvarlbs/ubs arrays
    416 * -> apply additional changes to the LPI
    417 * 2. (optional) if additional bound changes were undone:
    418 * -> resolve LP
    419 * -> goto 1.
    420 * 3. redo all bound changes in the LPI to restore the LPI to its original state
    421 * 4. analyze conflict
    422 * -> put remaining changed bounds (see lb/ubchginfoposs arrays) into starting conflict set
    423 */
    425 SCIP_CONFLICT* conflict, /**< conflict data */
    426 SCIP_SET* set, /**< global SCIP settings */
    427 SCIP_STAT* stat, /**< problem statistics */
    428 SCIP_PROB* origprob, /**< original problem */
    429 SCIP_PROB* transprob, /**< transformed problem */
    430 SCIP_TREE* tree, /**< branch and bound tree */
    431 SCIP_REOPT* reopt, /**< reoptimization data */
    432 SCIP_LP* lp, /**< LP data */
    433 SCIP_LPI* lpi, /**< LPI data */
    434 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    435 BMS_BLKMEM* blkmem, /**< block memory */
    436 SCIP_Real* proofcoefs, /**< coefficients in the proof constraint */
    437 SCIP_Real* prooflhs, /**< lhs of the proof constraint */
    438 SCIP_Real* proofactivity, /**< maximal activity of the proof constraint */
    439 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables */
    440 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables */
    441 int* lbchginfoposs, /**< positions of currently active lower bound change information in variables' arrays */
    442 int* ubchginfoposs, /**< positions of currently active upper bound change information in variables' arrays */
    443 int* iterations, /**< pointer to store the total number of LP iterations used */
    444 SCIP_Bool marklpunsolved, /**< whether LP should be marked unsolved after analysis (needed for strong branching) */
    445 SCIP_Bool* dualproofsuccess, /**< pointer to store success result of dual proof analysis */
    446 SCIP_Bool* valid /**< pointer to store whether the result is still a valid proof */
    447 );
    448
    450 SCIP_CONFLICTSET* conflictset /**< conflict set */
    451 );
    452
    454 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    455 SCIP_BDCHGINFO* bdchginfo /**< bound change information */
    456 );
    457
    458#ifdef __cplusplus
    459}
    460#endif
    461
    462#endif
    void SCIPconflictsetFree(SCIP_CONFLICTSET **conflictset, BMS_BLKMEM *blkmem)
    SCIP_Bool SCIPconflictGraphApplicable(SCIP_SET *set)
    void conflictsetPrint(SCIP_CONFLICTSET *conflictset)
    void SCIPconflicthdlrEnableOrDisableClocks(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_Bool enable)
    SCIP_RETCODE conflictCreateTmpBdchginfo(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_Real oldbound, SCIP_Real newbound, SCIP_BDCHGINFO **bdchginfo)
    SCIP_RETCODE SCIPconflictAnalyzeRemainingBdchgs(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_TREE *tree, SCIP_Bool diving, int *lbchginfoposs, int *ubchginfoposs, int *nconss, int *nliterals, int *nreconvconss, int *nreconvliterals)
    SCIP_RETCODE SCIPrunBoundHeuristic(SCIP_CONFLICT *conflict, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *origprob, SCIP_PROB *transprob, SCIP_TREE *tree, SCIP_REOPT *reopt, SCIP_LP *lp, SCIP_LPI *lpi, SCIP_EVENTFILTER *eventfilter, BMS_BLKMEM *blkmem, SCIP_Real *proofcoefs, SCIP_Real *prooflhs, SCIP_Real *proofactivity, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, int *lbchginfoposs, int *ubchginfoposs, int *iterations, SCIP_Bool marklpunsolved, SCIP_Bool *dualproofsuccess, SCIP_Bool *valid)
    SCIP_RETCODE SCIPconflicthdlrCreate(SCIP_CONFLICTHDLR **conflicthdlr, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, SCIP_DECL_CONFLICTCOPY((*conflictcopy)), SCIP_DECL_CONFLICTFREE((*conflictfree)), SCIP_DECL_CONFLICTINIT((*conflictinit)), SCIP_DECL_CONFLICTEXIT((*conflictexit)), SCIP_DECL_CONFLICTINITSOL((*conflictinitsol)), SCIP_DECL_CONFLICTEXITSOL((*conflictexitsol)), SCIP_DECL_CONFLICTEXEC((*conflictexec)), SCIP_CONFLICTHDLRDATA *conflicthdlrdata)
    SCIP_RETCODE SCIPconflicthdlrExit(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set)
    void SCIPconflicthdlrSetInit(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_DECL_CONFLICTINIT((*conflictinit)))
    int conflictCalcMaxsize(SCIP_SET *set, SCIP_PROB *prob)
    void SCIPconflicthdlrSetPriority(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set, int priority)
    SCIP_RETCODE SCIPconflictAddBound(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx)
    SCIP_RETCODE SCIPconflicthdlrFree(SCIP_CONFLICTHDLR **conflicthdlr, SCIP_SET *set)
    SCIP_RETCODE SCIPconflicthdlrExitsol(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set)
    SCIP_RETCODE SCIPconflictAddRelaxedBound(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd)
    void SCIPconflicthdlrSetFree(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_DECL_CONFLICTFREE((*conflictfree)))
    void SCIPconflicthdlrSetExitsol(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_DECL_CONFLICTEXITSOL((*conflictexitsol)))
    SCIP_Real SCIPconflictGetVarUb(SCIP_CONFLICT *conflict, SCIP_VAR *var)
    SCIP_RETCODE SCIPconflicthdlrCopyInclude(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set)
    void SCIPconflicthdlrSetExit(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_DECL_CONFLICTEXIT((*conflictexit)))
    SCIP_RETCODE SCIPundoBdchgsProof(SCIP_SET *set, SCIP_PROB *prob, int currentdepth, SCIP_Real *proofcoefs, SCIP_Real prooflhs, SCIP_Real *proofact, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, int *lbchginfoposs, int *ubchginfoposs, SCIP_LPBDCHGS *oldlpbdchgs, SCIP_LPBDCHGS *relaxedlpbdchgs, SCIP_Bool *resolve, SCIP_LPI *lpi)
    void SCIPconflicthdlrSetCopy(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_DECL_CONFLICTCOPY((*conflictcopy)))
    SCIP_RETCODE SCIPconflictIsVarUsed(SCIP_CONFLICT *conflict, SCIP_VAR *var, SCIP_SET *set, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool *used)
    SCIP_RETCODE SCIPconflictsetCreate(SCIP_CONFLICTSET **conflictset, BMS_BLKMEM *blkmem)
    SCIP_RETCODE SCIPconflictInit(SCIP_CONFLICT *conflict, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_CONFTYPE conftype, SCIP_Bool usescutoffbound)
    SCIP_RETCODE SCIPconflicthdlrExec(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set, SCIP_NODE *node, SCIP_NODE *validnode, SCIP_BDCHGINFO **bdchginfos, SCIP_Real *relaxedbds, int nbdchginfos, SCIP_CONFTYPE conftype, SCIP_Bool usescutoffbound, SCIP_Bool resolved, SCIP_RESULT *result)
    SCIP_RETCODE SCIPconflicthdlrInitsol(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set)
    SCIP_RETCODE SCIPconflicthdlrInit(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_SET *set)
    void SCIPconflicthdlrSetInitsol(SCIP_CONFLICTHDLR *conflicthdlr, SCIP_DECL_CONFLICTINITSOL((*conflictinitsol)))
    SCIP_Real SCIPconflictGetVarLb(SCIP_CONFLICT *conflict, SCIP_VAR *var)
    SCIP_Bool bdchginfoIsInvalid(SCIP_CONFLICT *conflict, SCIP_BDCHGINFO *bdchginfo)
    common defines and data types used in all packages of SCIP
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_Real
    Definition: def.h:156
    struct BMS_BlkMem BMS_BLKMEM
    Definition: memory.h:437
    Definition: heur_padm.c:135
    type definitions for branching rules
    type definitions for conflict analysis
    #define SCIP_DECL_CONFLICTEXIT(x)
    #define SCIP_DECL_CONFLICTCOPY(x)
    Definition: type_conflict.h:89
    #define SCIP_DECL_CONFLICTEXEC(x)
    #define SCIP_DECL_CONFLICTINITSOL(x)
    #define SCIP_DECL_CONFLICTFREE(x)
    Definition: type_conflict.h:97
    #define SCIP_DECL_CONFLICTINIT(x)
    enum SCIP_ConflictType SCIP_CONFTYPE
    Definition: type_conflict.h:68
    struct SCIP_ConflicthdlrData SCIP_CONFLICTHDLRDATA
    Definition: type_conflict.h:50
    #define SCIP_DECL_CONFLICTEXITSOL(x)
    type definitions for cuts
    type definitions for managing events
    type definitions for implications, variable bounds, and cliques
    type definitions for LP management
    enum SCIP_BoundType SCIP_BOUNDTYPE
    Definition: type_lp.h:60
    type definitions for specific LP solvers interface
    type definitions for block memory pools and memory buffers
    type definitions for message output methods
    type definitions for storing and manipulating the main problem
    type definitions for collecting reoptimization information
    enum SCIP_Result SCIP_RESULT
    Definition: type_result.h:61
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    type definitions for global SCIP settings
    type definitions for problem statistics
    type definitions for problem variables