type_cons.h
Go to the documentation of this file.
29 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/ 47 typedef struct SCIP_Conshdlr SCIP_CONSHDLR; /**< constraint handler for a specific constraint type */ 50 typedef struct SCIP_ConsData SCIP_CONSDATA; /**< locally defined constraint type specific data */ 51 typedef struct SCIP_ConsSetChg SCIP_CONSSETCHG; /**< tracks additions and removals of the set of active constraints */ 55 * If the copy process was a one to one the valid pointer can set to TRUE. Otherwise, you have to set this pointer to 56 * FALSE. In case all problem defining objects (constraint handlers and variable pricers) return a valid TRUE for all 57 * their copying calls, SCIP assumes that it is a overall one to one copy of the original instance. In this case any 58 * reductions made in the copied SCIP instance can be transfer to the original SCIP instance. If the valid pointer is 59 * set to TRUE and it was not one to one copy, it might happen that optimal solutions are cut off. 66 #define SCIP_DECL_CONSHDLRCOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_Bool* valid) 68 /** destructor of constraint handler to free constraint handler data (called when SCIP is exiting) 84 #define SCIP_DECL_CONSINIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 94 #define SCIP_DECL_CONSEXIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 96 /** presolving initialization method of constraint handler (called when presolving is about to begin) 98 * This method is called when the presolving process is about to begin, even if presolving is turned off. 101 * Necessary modifications that have to be performed even if presolving is turned off should be done here or in the 104 * @note Note that the constraint array might contain constraints that were created but not added to the problem. 105 * Constraints that are not added, i.e., for which SCIPconsIsAdded() returns FALSE, cannot be used for problem 114 #define SCIP_DECL_CONSINITPRE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 116 /** presolving deinitialization method of constraint handler (called after presolving has been finished) 118 * This method is called after the presolving has been finished, even if presolving is turned off. 121 * Necessary modifications that have to be performed even if presolving is turned off should be done here or in the 124 * Besides necessary modifications and clean up, no time consuming operations should be performed, especially if the 125 * problem has already been solved. Use the method SCIPgetStatus(), which in this case returns SCIP_STATUS_OPTIMAL, 128 * @note Note that the constraint array might contain constraints that were created but not added to the problem. 129 * Constraints that are not added, i.e., for which SCIPconsIsAdded() returns FALSE, cannot be used for problem 138 #define SCIP_DECL_CONSEXITPRE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 140 /** solving process initialization method of constraint handler (called when branch and bound process is about to begin) 142 * This method is called when the presolving was finished and the branch and bound process is about to begin. 145 * Besides necessary modifications and clean up, no time consuming operations should be performed, especially if the 146 * problem has already been solved. Use the method SCIPgetStatus(), which in this case returns SCIP_STATUS_OPTIMAL, 149 * @note Note that the constraint array might contain constraints that were created but not added to the problem. 150 * Constraints that are not added, i.e., for which SCIPconsIsAdded() returns FALSE, cannot be used for problem 159 #define SCIP_DECL_CONSINITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 161 /** solving process deinitialization method of constraint handler (called before branch and bound process data is freed) 164 * The constraint handler should use this call to clean up its branch and bound data, in particular to release 174 #define SCIP_DECL_CONSEXITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, SCIP_Bool restart) 178 * @warning There may exist unprocessed events. For example, a variable's bound may have been already changed, but the 187 #define SCIP_DECL_CONSDELETE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, SCIP_CONSDATA** consdata) 197 #define SCIP_DECL_CONSTRANS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* sourcecons, SCIP_CONS** targetcons) 199 /** LP initialization method of constraint handler (called before the initial LP relaxation at a node is solved) 201 * Puts the LP relaxations of all "initial" constraints into the LP. The method should put a canonic LP relaxation 210 #define SCIP_DECL_CONSINITLP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 214 * Separates all constraints of the constraint handler. The method is called in the LP solution loop, 217 * The first nusefulconss constraints are the ones, that are identified to likely be violated. The separation 218 * method should process only the useful constraints in most runs, and only occasionally the remaining 229 * possible return values for *result (if more than one applies, the first in the list should be used): 234 * - SCIP_NEWROUND : a cutting plane was generated and a new separation round should immediately start 235 * - SCIP_DIDNOTFIND : the separator searched, but did not find domain reductions, cutting planes, or cut constraints 239 #define SCIP_DECL_CONSSEPALP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, \ 244 * Separates all constraints of the constraint handler. The method is called outside the LP solution loop (e.g., by 248 * The first nusefulconss constraints are the ones, that are identified to likely be violated. The separation 249 * method should process only the useful constraints in most runs, and only occasionally the remaining 261 * possible return values for *result (if more than one applies, the first in the list should be used): 266 * - SCIP_NEWROUND : a cutting plane was generated and a new separation round should immediately start 267 * - SCIP_DIDNOTFIND : the separator searched, but did not find domain reductions, cutting planes, or cut constraints 271 #define SCIP_DECL_CONSSEPASOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, \ 276 * The method is called at the end of the node processing loop for a node where the LP was solved. 277 * The LP solution has to be checked for feasibility. If possible, an infeasibility should be resolved by 278 * branching, reducing a variable's domain to exclude the solution or separating the solution with a valid 281 * The enforcing methods of the active constraint handlers are called in decreasing order of their enforcing 282 * priorities until the first constraint handler returned with the value SCIP_CUTOFF, SCIP_SEPARATED, 284 * The integrality constraint handler has an enforcing priority of zero. A constraint handler which can 285 * (or wants) to enforce its constraints only for integral solutions should have a negative enforcing priority 287 * A constraint handler which wants to incorporate its own branching strategy even on non-integral 288 * solutions must have an enforcing priority greater than zero (e.g. the SOS-constraint incorporates 291 * The first nusefulconss constraints are the ones, that are identified to likely be violated. The enforcing 292 * method should process the useful constraints first. The other nconss - nusefulconss constraints should only 304 * possible return values for *result (if more than one applies, the first in the list should be used): 309 * - SCIP_BRANCHED : no changes were made to the problem, but a branching was applied to resolve an infeasibility 313 #define SCIP_DECL_CONSENFOLP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nusefulconss, \ 318 * The method is called at the end of the node processing loop for a node where the LP was not solved. 319 * The pseudo solution has to be checked for feasibility. If possible, an infeasibility should be resolved by 320 * branching, reducing a variable's domain to exclude the solution or adding an additional constraint. 321 * Separation is not possible, since the LP is not processed at the current node. All LP informations like 324 * Like in the enforcing method for LP solutions, the enforcing methods of the active constraint handlers are 325 * called in decreasing order of their enforcing priorities until the first constraint handler returned with 328 * The first nusefulconss constraints are the ones, that are identified to likely be violated. The enforcing 329 * method should process the useful constraints first. The other nconss - nusefulconss constraints should only 332 * If the pseudo solution's objective value is lower than the lower bound of the node, it cannot be feasible 333 * and the enforcing method may skip it's check and set *result to SCIP_DIDNOTRUN. However, it can also process 346 * possible return values for *result (if more than one applies, the first in the list should be used): 350 * - SCIP_BRANCHED : no changes were made to the problem, but a branching was applied to resolve an infeasibility 351 * - SCIP_SOLVELP : at least one constraint is infeasible, and this can only be resolved by solving the LP 356 #define SCIP_DECL_CONSENFOPS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nusefulconss, \ 363 * The check methods of the active constraint handlers are called in decreasing order of their check 365 * The integrality constraint handler has a check priority of zero. A constraint handler which can 366 * (or wants) to check its constraints only for integral solutions should have a negative check priority 368 * A constraint handler which wants to check feasibility even on non-integral solutions must have a 369 * check priority greater than zero (e.g. if the check is much faster than testing all variables for 372 * In some cases, integrality conditions or rows of the current LP don't have to be checked, because their 391 #define SCIP_DECL_CONSCHECK(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, SCIP_SOL* sol, \ 396 * The first nusefulconss constraints are the ones, that are identified to likely be violated. The propagation 397 * method should process only the useful constraints in most runs, and only occasionally the remaining 400 * @note if the constraint handler uses dual information in propagation it is nesassary to check via calling 401 * SCIPallowDualReds and SCIPallowObjProp if dual reductions and propgation with the current cutoff bound, resp., 421 #define SCIP_DECL_CONSPROP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nusefulconss, int nmarkedconss, \ 438 * - nnewchgvartypes : number of variable type changes since the last call to the presolving method 439 * - nnewchgbds : number of variable bounds tightened since the last call to the presolving method 445 * - nnewchgsides : number of changed left or right hand sides since the last call to the presolving method 447 * @note the counters state the changes since the last call including the changes of this presolving method during its 450 * @note if the constraint handler performs dual presolving it is nesassary to check via calling SCIPallowDualReds 463 * - nchgsides : pointer to count total number of changed left/right hand sides of all presolvers 472 * - SCIP_UNBOUNDED : at least one variable is not bounded by any constraint in obj. direction -> problem is unbounded 473 * - SCIP_CUTOFF : at least one constraint is infeasible in the variable's bounds -> problem is infeasible 479 #define SCIP_DECL_CONSPRESOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nrounds, \ 480 SCIP_PRESOLTIMING presoltiming, int nnewfixedvars, int nnewaggrvars, int nnewchgvartypes, int nnewchgbds, int nnewholes, \ 483 int* ndelconss, int* naddconss, int* nupgdconss, int* nchgcoefs, int* nchgsides, SCIP_RESULT* result) 487 * This method is called during conflict analysis. If the constraint handler wants to support conflict analysis, 488 * it should call SCIPinferVarLbCons() or SCIPinferVarUbCons() in domain propagation instead of SCIPchgVarLb() or 490 * In the SCIPinferVarLbCons() and SCIPinferVarUbCons() calls, the handler provides the constraint, that deduced the 492 * The propagation conflict resolving method can then be implemented, to provide a "reasons" for the bound 493 * changes, i.e. the bounds of variables at the time of the propagation, that forced the constraint to set the 494 * conflict variable's bound to its current value. It can use the "inferinfo" tag to identify its own propagation 495 * rule and thus identify the "reason" bounds. The bounds that form the reason of the assignment must then be provided 496 * by calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(), SCIPaddConflictRelaxedLb(), 497 * SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), and/or SCIPaddConflictBinvar() in the propagation conflict 500 * For example, the logicor constraint c = "x or y or z" fixes variable z to TRUE (i.e. changes the lower bound of z 501 * to 1.0), if both, x and y, are assigned to FALSE (i.e. if the upper bounds of these variables are 0.0). It uses 502 * SCIPinferVarLbCons(scip, z, 1.0, c, 0) to apply this assignment (an inference information tag is not needed by the 504 * In the conflict analysis, the constraint handler may be asked to resolve the lower bound change on z with 506 * With a call to SCIPvarGetLbAtIndex(z, bdchgidx, TRUE), the handler can find out, that the lower bound of 507 * variable z was set to 1.0 at the given point of time, and should call SCIPaddConflictUb(scip, x, bdchgidx) and 508 * SCIPaddConflictUb(scip, y, bdchgidx) to tell SCIP, that the upper bounds of x and y at this point of time were 516 * - inferinfo : the user information passed to the corresponding SCIPinferVarLbCons() or SCIPinferVarUbCons() call 518 * - bdchgidx : the index of the bound change, representing the point of time where the change took place 525 * - SCIP_SUCCESS : the conflicting bound change has been successfully resolved by adding all reason bounds 526 * - SCIP_DIDNOTFIND : the conflicting bound change could not be resolved and has to be put into the conflict set 530 #define SCIP_DECL_CONSRESPROP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, \ 531 SCIP_VAR* infervar, int inferinfo, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX* bdchgidx, SCIP_Real relaxedbd, \ 537 * It should update the rounding locks of all associated variables with calls to SCIPaddVarLocks(), 540 * SCIPaddVarLocks(scip, var, nlockspos, nlocksneg), saying that rounding down is potentially rendering the 541 * (positive) constraint infeasible and rounding up is potentially rendering the negation of the constraint 544 * SCIPaddVarLocks(scip, var, nlocksneg, nlockspos), saying that rounding up is potentially rendering the 545 * constraint's negation infeasible and rounding up is potentially rendering the constraint itself 547 * - If the constraint may get violated by changing the variable in any direction, it should call 550 * Consider the linear constraint "3x -5y +2z <= 7" as an example. The variable rounding lock method of the 552 * SCIPaddVarLocks(scip, y, nlockspos, nlocksneg) and SCIPaddVarLocks(scip, z, nlocksneg, nlockspos) to tell SCIP, 553 * that rounding up of x and z and rounding down of y can destroy the feasibility of the constraint, while rounding 554 * down of x and z and rounding up of y can destroy the feasibility of the constraint's negation "3x -5y +2z > 7". 556 * SCIPaddVarLocks(scip, ..., nlockspos + nlocksneg, nlockspos + nlocksneg) on all variables, since rounding in both 557 * directions of each variable can destroy both the feasibility of the constraint and it's negation 560 * If the constraint itself contains other constraints as sub constraints (e.g. the "or" constraint concatenation 561 * "c(x) or d(x)"), the rounding lock methods of these constraints should be called in a proper way. 563 * SCIPaddConsLocks(scip, c, nlockspos, nlocksneg), saying that infeasibility of c may lead to infeasibility of 564 * the (positive) constraint, and infeasibility of c's negation (i.e. feasibility of c) may lead to infeasibility 566 * - If the constraint may get violated by the feasibility of the sub constraint c, it should call 567 * SCIPaddConsLocks(scip, c, nlocksneg, nlockspos), saying that infeasibility of c may lead to infeasibility of 568 * the constraint's negation (i.e. feasibility of the constraint), and infeasibility of c's negation (i.e. feasibility 570 * - If the constraint may get violated by any change in the feasibility of the sub constraint c, it should call 573 * Consider the or concatenation "c(x) or d(x)". The variable rounding lock method of the or constraint handler 574 * should call SCIPaddConsLocks(scip, c, nlockspos, nlocksneg) and SCIPaddConsLocks(scip, d, nlockspos, nlocksneg) 577 * As a second example, consider the equivalence constraint "y <-> c(x)" with variable y and constraint c. The 578 * constraint demands, that y == 1 if and only if c(x) is satisfied. The variable lock method of the corresponding 579 * constraint handler should call SCIPaddVarLocks(scip, y, nlockspos + nlocksneg, nlockspos + nlocksneg) and 580 * SCIPaddConsLocks(scip, c, nlockspos + nlocksneg, nlockspos + nlocksneg), because any modification to the 581 * value of y or to the feasibility of c can alter the feasibility of the equivalence constraint. 586 * - cons : the constraint that should lock rounding of its variables, or NULL if the constraint handler 588 * - nlockspos : number of times, the roundings should be locked for the constraint (may be negative) 589 * - nlocksneg : number of times, the roundings should be locked for the constraint's negation (may be negative) 591 #define SCIP_DECL_CONSLOCK(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, int nlockspos, int nlocksneg) 595 * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but 598 * This method is always called after a constraint of the constraint handler was activated. The constraint 606 #define SCIP_DECL_CONSACTIVE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons) 610 * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but 613 * This method is always called before a constraint of the constraint handler is deactivated. The constraint 621 #define SCIP_DECL_CONSDEACTIVE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons) 625 * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but 628 * This method is always called after a constraint of the constraint handler was enabled. The constraint 636 #define SCIP_DECL_CONSENABLE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons) 640 * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but 643 * This method is always called before a constraint of the constraint handler is disabled. The constraint 651 #define SCIP_DECL_CONSDISABLE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons) 655 * This method is optinal and only of interest if you are using SCIP as a branch-and-price framework. That means, you 656 * are generating new variables during the search. If you are not doing that just define the function pointer to be 659 * If this method gets implemented you should iterate over all constraints of the constraint handler and delete all 668 #define SCIP_DECL_CONSDELVARS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss) 672 * The constraint handler can store a representation of the constraint into the given text file. Use the method 675 * @note There are several methods which help to display variables. These are SCIPwriteVarName(), SCIPwriteVarsList(), 678 * input: - scip : SCIP main data structure - conshdlr : the constraint handler itself - cons : the constraint that 682 #define SCIP_DECL_CONSPRINT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, FILE* file) 686 * The constraint handler can provide a copy method which copies a constraint from one SCIP data structure into a other 687 * SCIP data structure. If a copy of a constraint is created the constraint has to be captured (The capture is usually 690 * If the copy process was a one to one the valid pointer can set to TRUE. Otherwise, you have to set this pointer to 691 * FALSE. In case all problem defining objects (constraint handlers and variable pricers) return a valid TRUE for all 692 * their copying calls, SCIP assumes that it is a overall one to one copy of the original instance. In this case any 693 * reductions made in the copied SCIP instance can be transfer to the original SCIP instance. If the valid pointer is 694 * set to TRUE and it was not one to one copy, it might happen that optimal solutions are cut off. 705 * - varmap : a SCIP_HASHMAP mapping variables of the source SCIP to corresponding variables of the target SCIP 706 * - consmap : a SCIP_HASHMAP mapping constraints of the source SCIP to corresponding constraints of the target SCIP 724 SCIP* sourcescip, SCIP_CONSHDLR* sourceconshdlr, SCIP_CONS* sourcecons, SCIP_HASHMAP* varmap, SCIP_HASHMAP* consmap, \ 725 SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, \ 726 SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, \ 731 * The constraint handler can provide a callback to parse the output created by the display method 734 * @note For parsing there are several methods which are handy. Have a look at: SCIPparseVarName(), 735 * SCIPparseVarsList(), SCIPparseVarsLinearsum(), SCIPparseVarsPolynomial(), SCIPstrToRealValue(), and 758 #define SCIP_DECL_CONSPARSE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** cons, \ 760 SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, \ 761 SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool* success) 765 * The constraint handler can (this callback is optional) provide this callback to return the variables which are 766 * involved in that particular constraint. If this is possible, the variables should be copyied into the variables 767 * array and the success pointers has to be set to TRUE. Otherwise the success has to be set FALSE or the callback 777 * - varssize : available slots in vars array which is needed to check if the array is large enough 780 #define SCIP_DECL_CONSGETVARS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, \ 785 * The constraint handler can (this callback is optional) provide this callback to return the number variable which are 786 * involved in that particular constraint. If this is not possible, the success pointers has to be set to FALSE or the 796 * - success : pointer to store whether the constraint successfully returned the number of variables 798 #define SCIP_DECL_CONSGETNVARS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, \ 803 * This callback is used inside the various diving heuristics of SCIP and does not affect the normal branching 805 * The constraint handler can provide this callback to render the current solution (even more) infeasible by 807 * since diving heuristics do not necessarily solve LP relaxations at every probing depth, some of the variable 809 * The solution is rendered infeasible by determining bound changes that should be applied to the next explored search node 811 * An alternative in case that the preferred bound change(s) were detected infeasible must be provided. 813 * The constraint handler must take care to only add bound changes that further shrink the variable domain. 815 * The success pointer must be used to indicate whether the constraint handler succeeded in selecting diving bound 816 * changes. The infeasible pointer should be set to TRUE if the constraint handler found a local infeasibility. If the 817 * constraint handler needs to select between several candidates, it may use the scoring mechanism of the diveset 824 * @note: @p sol is usually the LP relaxation solution unless the caller of the method, usually a diving heuristic, 834 * - success : pointer to store whether the constraint handler succeeded to determine dive bound changes 835 * - infeasible : pointer to store whether the constraint handler detected an infeasibility in the local node 837 #define SCIP_DECL_CONSGETDIVEBDCHGS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_DIVESET* diveset, \ timing definitions for SCIP type definitions for return codes for SCIP methods Definition: struct_cons.h:36 type definitions for primal heuristics Definition: struct_cons.h:116 type definitions for SCIP's main datastructure type definitions for problem variables type definitions for storing primal CIP solutions Definition: struct_cons.h:105 result codes for SCIP callback methods common defines and data types used in all packages of SCIP |