cons.c
Go to the documentation of this file.
32 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
55 #define AGERESETAVG_INIT 1000.0 /**< initial value of the exponentially decaying weighted sum for ages */
57 #define AGERESETAVG_DECAY 0.0005 /**< weight of a new addend in the exponentially decyaing sum */
58 #define AGERESETAVG_AGELIMIT 2.0 /**< in dynamic setting, a constraint is deleted if its age exceeds the
60 #define AGERESETAVG_OBSOLETEAGE 1.8 /**< in dynamic setting, a constraint is marked obsolete if its age exceeds the
314 assert(conshdlr->propconss[c]->markpropagate || (conshdlr->propconss[c]->obsolete == (c >= conshdlr->nusefulpropconss)));
325 )
334 )
341 /** updates the exponentially decaying weighted age average for age resets after a constraint age was reset */
366 || (set->cons_agelimit == 0 && cons->age > AGERESETAVG_AGELIMIT * conshdlrGetAgeresetavg(cons->conshdlr))));
381 || (set->cons_obsoleteage == 0 && cons->age > AGERESETAVG_OBSOLETEAGE * conshdlrGetAgeresetavg(cons->conshdlr))));
384 /** marks constraint to be obsolete; it will be moved to the last part of the constraint arrays, such that
457 * thus, we have to reset the enforcement counters in order to enforce all constraints again, especially
459 * this case should occur almost never, because a constraint that was not enforced in the last enforcement
460 * is a newly added one, and it is very unlikely that this constraint will become obsolete before the next
462 * this reset is not performed for separation and propagation, because they are not vital for correctness
484 /* in case the constraint is marked to be propagated, we do not move it in the propconss array since the first
514 * it will be moved to the first part of the constraint arrays, such that it is checked, enforced, separated,
541 assert(conshdlr->nusefulcheckconss <= cons->checkconsspos && cons->checkconsspos < conshdlr->ncheckconss);
559 assert(conshdlr->nusefulsepaconss <= cons->sepaconsspos && cons->sepaconsspos < conshdlr->nsepaconss);
574 assert(conshdlr->nusefulenfoconss <= cons->enfoconsspos && cons->enfoconsspos < conshdlr->nenfoconss);
587 /* in case the constraint is marked to be propagated, we do not move it in the propconss array since the first
593 assert(conshdlr->nusefulpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->npropconss);
615 * @note the propagation array is divided into three parts in contrast to the other constraint arrays;
616 * the first part contains constraints which were marked to be propagated (independently of its age)
617 * the second part contains the useful (non-obsolete) constraints which are not marked to be propagated
620 * @note if a constraint gets marked for propagation we put it into the first part regardless of its age
636 /* it may happen that the constraint is deleted while updates are delayed: in this case we just return */
645 /* propagation of the constraint is globally or locally disabled, so we do not have to move the constraint in the
655 /* if the constraint is obsolete, we need to move it first to the non-obsolete part of the array */
658 assert(conshdlr->nusefulpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->npropconss);
671 assert(conshdlr->nmarkedpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->nusefulpropconss);
690 * @note the propagation array is divided into three parts in contrast to the other constraint arrays;
691 * the first part contains constraints which were marked to be propagated (independently of its age)
692 * the second part contains the useful (non-obsolete) constraints which are not marked to be propagated
695 * @note if a constraint gets unmarked for propagation, it is put into the right part depending on its age
711 /* it may happen that the constraint is deleted while updates are delayed: in this case we just return */
720 /* propagation of the constraint is globally or locally disabled, so we do not have to move the constraint in the
731 /* first, move the constraint out of the first part to the second part of the constraint array */
1010 /* we have to make sure that even this obsolete constraint is enforced in the next enforcement call;
1011 * if the same LP or pseudo solution is enforced again, only the newly added useful constraints are
1013 * enforced again; this is not needed for separation and propagation, because they are not vital for correctness
1062 /* if the constraint that moved to the free position was a newly added constraint and not enforced in the last
1064 * this check is not performed for separation and propagation, because they are not vital for correctness
1112 conshdlr->checkconss[conshdlr->ncheckconss] = conshdlr->checkconss[conshdlr->nusefulcheckconss];
1208 /* if the constraint is marked to be propagated, we have to move it to the first part of the array */
1211 /* temporarily unmark the constraint to be propagated, such that we can use the method below */
1242 /* unmark constraint to be propagated; this will move the constraint to the obsolete or non-obsolete part of the
1299 SCIPsetDebugMsg(set, "enable separation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1327 SCIPdebugMessage("disable separation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1359 SCIPsetDebugMsg(set, "enable propagation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1387 SCIPdebugMessage("disable propagation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1428 SCIPsetDebugMsg(set, "enable constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1490 SCIPsetDebugMsg(set, "disable constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1537 int depth, /**< depth in the tree where the activation takes place, or -1 for global problem */
1563 SCIPsetDebugMsg(set, "activate constraint <%s> in constraint handler <%s> (depth %d, focus=%u)\n",
1583 /* add constraint to the initconss array if the constraint is initial and added to the focus node */
1630 SCIPsetDebugMsg(set, "deactivate constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1683 * recent obsolete check constraints will be moved to the last positions in the sepa-, enfo-, check-, and prop-arrays;
1684 * recent useful constraints will be moved to the first positions in the sepa-, enfo-, check-, and prop-arrays;
1685 * constraints which were recently marked to be propagated are moved to the first positions in the prop-array;
1706 SCIPsetDebugMsg(set, "processing %d constraints that have to be updated in constraint handler <%s>\n",
1722 SCIPsetDebugMsg(set, " -> constraint <%s>: insert=%u, activate=%u, deactivate=%u, enable=%u, disable=%u, sepaenable=%u, sepadisable=%u, propenable=%u, propdisable=%u, obsolete=%u, free=%u (consdata=%p)\n",
1745 SCIP_CALL( conshdlrActivateCons(conshdlr, set, stat, cons, cons->activedepth, cons->updateactfocus) );
1821 /* nothing to do here: the constraint is freed, when it is released from the updateconss array */
1881 /** marks constraint handler to delay all constraint updates until the next conshdlrProcessUpdates() call */
1885 )
1909 SCIPsetDebugMsg(set, "constraint updates of constraint handler <%s> will be processed immediately (count:%d)\n",
1938 SCIPsetDebugMsg(set, "constraint <%s> of age %g has to be updated in constraint handler <%s> (consdata=%p)\n",
1987 SCIPsetDebugMsg(set, "including constraint handler %s in subscip %p\n", SCIPconshdlrGetName(conshdlr), (void*)set->scip);
2005 int checkpriority, /**< priority of the constraint handler for checking feasibility (and propagation) */
2006 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
2007 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
2008 int eagerfreq, /**< frequency for using all instead of only the useful constraints in separation,
2010 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
2011 SCIP_Bool delaysepa, /**< should separation method be delayed, if other separators found cuts? */
2012 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
2013 SCIP_Bool needscons, /**< should the constraint handler be skipped, if no constraints are available? */
2014 SCIP_PROPTIMING proptiming, /**< positions in the node solving loop where propagation method of constraint handlers should be executed */
2015 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the constraint handler's presolving method */
2016 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
2020 SCIP_DECL_CONSINITPRE ((*consinitpre)), /**< presolving initialization method of constraint handler */
2021 SCIP_DECL_CONSEXITPRE ((*consexitpre)), /**< presolving deinitialization method of constraint handler */
2022 SCIP_DECL_CONSINITSOL ((*consinitsol)), /**< solving process initialization method of constraint handler */
2023 SCIP_DECL_CONSEXITSOL ((*consexitsol)), /**< solving process deinitialization method of constraint handler */
2025 SCIP_DECL_CONSTRANS ((*constrans)), /**< transform constraint data into data belonging to the transformed problem */
2026 SCIP_DECL_CONSINITLP ((*consinitlp)), /**< initialize LP with relaxations of "initial" constraints */
2028 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
2030 SCIP_DECL_CONSENFORELAX ((*consenforelax)), /**< enforcing constraints for relaxation solutions */
2047 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), /**< constraint handler diving solution enforcement method */
2062 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
2067 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
2240 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing when constraint propagation should be called (%u:BEFORELP, %u:DURINGLPLOOP, %u:AFTERLPLOOP, %u:ALWAYS)", SCIP_PROPTIMING_BEFORELP, SCIP_PROPTIMING_DURINGLPLOOP, SCIP_PROPTIMING_AFTERLPLOOP, SCIP_PROPTIMING_ALWAYS);
2242 (int*)(&(*conshdlr)->proptiming), TRUE, (int) proptiming, (int) SCIP_PROPTIMING_BEFORELP, (int) SCIP_PROPTIMING_ALWAYS, NULL, NULL) ); /*lint !e713*/
2246 "frequency for using all instead of only the useful constraints in separation, propagation and enforcement (-1: never, 0: only in first evaluation)",
2265 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of the constraint handler's presolving method (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
2266 SCIP_PRESOLTIMING_FAST, SCIP_PRESOLTIMING_MEDIUM, SCIP_PRESOLTIMING_EXHAUSTIVE, SCIP_PRESOLTIMING_FINAL);
2268 (int*)&(*conshdlr)->presoltiming, TRUE, (int) presoltiming, (int) SCIP_PRESOLTIMING_FAST, (int) SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740 !e713*/
2283 int checkpriority, /**< priority of the constraint handler for checking feasibility (and propagation) */
2284 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
2285 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
2286 int eagerfreq, /**< frequency for using all instead of only the useful constraints in separation,
2288 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
2289 SCIP_Bool delaysepa, /**< should separation method be delayed, if other separators found cuts? */
2290 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
2291 SCIP_Bool needscons, /**< should the constraint handler be skipped, if no constraints are available? */
2292 SCIP_PROPTIMING proptiming, /**< positions in the node solving loop where propagation method of constraint handlers should be executed */
2293 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the constraint handler's presolving method */
2294 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
2298 SCIP_DECL_CONSINITPRE ((*consinitpre)), /**< presolving initialization method of constraint handler */
2299 SCIP_DECL_CONSEXITPRE ((*consexitpre)), /**< presolving deinitialization method of constraint handler */
2300 SCIP_DECL_CONSINITSOL ((*consinitsol)), /**< solving process initialization method of constraint handler */
2301 SCIP_DECL_CONSEXITSOL ((*consexitsol)), /**< solving process deinitialization method of constraint handler */
2303 SCIP_DECL_CONSTRANS ((*constrans)), /**< transform constraint data into data belonging to the transformed problem */
2304 SCIP_DECL_CONSINITLP ((*consinitlp)), /**< initialize LP with relaxations of "initial" constraints */
2306 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
2308 SCIP_DECL_CONSENFORELAX ((*consenforelax)), /**< enforcing constraints for relaxation solutions */
2325 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), /**< constraint handler diving solution enforcement method */
2337 SCIP_CALL_FINALLY( doConshdlrCreate(conshdlr, set, messagehdlr, blkmem, name, desc, sepapriority, enfopriority,
2338 checkpriority, sepafreq, propfreq, eagerfreq, maxprerounds, delaysepa, delayprop, needscons, proptiming,
2339 presoltiming, conshdlrcopy, consfree, consinit, consexit, consinitpre, consexitpre, consinitsol, consexitsol,
2340 consdelete, constrans, consinitlp, conssepalp, conssepasol, consenfolp, consenforelax, consenfops, conscheck,
2341 consprop, conspresol, consresprop, conslock, consactive, consdeactive, consenable, consdisable, consdelvars,
2482 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2483 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2484 * external method; to avoid this, these changes will be buffered and processed after the method call
2526 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2527 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2528 * external method; to avoid this, these changes will be buffered and processed after the method call
2593 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2594 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2595 * external method; to avoid this, these changes will be buffered and processed after the method call
2612 /* after a restart the LP is empty but the initial constraints are not included in the initialconss array anymore;
2613 * we have to put them back into this array in order to obtain the correct initial root relaxation
2621 /**@todo should only active constraints be added to the initconss array? at least cons->active is asserted in
2649 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2650 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2651 * external method; to avoid this, these changes will be buffered and processed after the method call
2693 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2694 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2695 * external method; to avoid this, these changes will be buffered and processed after the method call
2730 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2731 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2732 * external method; to avoid this, these changes will be buffered and processed after the method call
2740 SCIP_CALL( conshdlr->consexitsol(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss, restart) );
2752 /** calls LP initialization method of constraint handler to separate all initial active constraints */
2759 SCIP_Bool initkeptconss, /**< Also initialize constraints which are valid at a more global node,
2762 SCIP_Bool* cutoff /**< pointer to store whether infeasibility was detected while building the LP */
2779 SCIPsetDebugMsg(set, "initializing LP with %d initial constraints of handler <%s> (ninitconss=%d, kept=%d, initkept=%u)\n",
2780 initkeptconss ? conshdlr->ninitconss : conshdlr->ninitconss - conshdlr->ninitconsskept, conshdlr->name,
2783 /* no constraints to initialize (or only kept constraints which do not need to be initialized this time) -> return */
2784 if( conshdlr->needscons && (conshdlr->ninitconss == 0 || (!initkeptconss && conshdlr->ninitconss == conshdlr->ninitconsskept)) )
2787 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2788 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2789 * external method; to avoid this, these changes will be buffered and processed after the method call
2800 /* add all kept initial constraints which are currently active to the second part of the initconss array */
2801 /* @todo keep track of where a constraint was already initialized (e.g., in the conssetchg)? */
2814 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &conshdlr->initconss[conshdlr->ninitconsskept],
2878 || (0 <= conshdlr->lastnusefulsepaconss && conshdlr->lastnusefulsepaconss <= conshdlr->nusefulsepaconss));
2899 /* all constraints that were not yet separated on the new LP solution must be useful constraints, which means,
2928 SCIPsetDebugMsg(set, "separating constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
2949 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2950 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2951 * external method; to avoid this, these changes will be buffered and processed after the method call
2997 SCIPerrorMessage("LP separation method of constraint handler <%s> returned invalid result <%d>\n",
3005 SCIPsetDebugMsg(set, "LP separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3080 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3081 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3082 * external method; to avoid this, these changes will be buffered and processed after the method call
3091 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, conss, nconss, nusefulconss, sol, result) );
3124 SCIPerrorMessage("SOL separation method of constraint handler <%s> returned invalid result <%d>\n",
3132 SCIPsetDebugMsg(set, "SOL separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3143 /** calls enforcing method of constraint handler for a relaxation solution for all constraints added after last
3172 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3182 * the integrality constraint handler always needs to be enforced for all constraints since external branching
3198 /* if we already enforced the same relaxation solution at this node, we will only enforce new constraints in the
3199 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3210 /* all constraints that were not yet enforced on the new relaxation solution must be useful constraints, which means,
3242 SCIPdebugMessage("enforcing constraints %d to %d of %d constraints of handler <%s> (%s relaxation solution)\n",
3243 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, relaxchanged ? "new" : "old");
3264 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3265 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3266 * external method; to avoid this, these changes will be buffered and processed after the method call
3274 SCIP_CALL( conshdlr->consenforelax(set->scip, relaxsol, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3315 SCIPerrorMessage("enforcing method of constraint handler <%s> for relaxation solutions returned invalid result <%d>\n",
3320 /* if the same relaxation solution was already enforced at this node, we only enforced new constraints this time;
3321 * if the enforelax call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3322 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3331 /** calls enforcing method of constraint handler for LP solution for all constraints added after last
3354 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3376 assert(conshdlr->lastenfolpresult == SCIP_FEASIBLE || conshdlr->lastenfolpresult == SCIP_INFEASIBLE
3379 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3380 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3387 assert(conshdlr->lastenfolpresult == SCIP_INFEASIBLE || conshdlr->lastenfolpresult == SCIP_SEPARATED);
3392 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3422 SCIPsetDebugMsg(set, "enforcing constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
3423 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, lpchanged ? "new" : "old");
3444 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3445 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3446 * external method; to avoid this, these changes will be buffered and processed after the method call
3454 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3494 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP solutions returned invalid result <%d>\n",
3499 /* if the same LP solution was already enforced at this node, we only enforced new constraints this time;
3500 * if the enfolp call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3501 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3517 SCIP_Bool* success, /**< pointer to store whether constraint handler successfully found a variable */
3518 SCIP_Bool* infeasible /**< pointer to store whether the current node was detected to be infeasible */
3530 SCIP_CALL( conshdlr->consgetdivebdchgs(set->scip, conshdlr, diveset, sol, success, infeasible) );
3536 /** calls enforcing method of constraint handler for pseudo solution for all constraints added after last
3547 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
3560 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3594 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3595 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3606 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3634 SCIPsetDebugMsg(set, "enforcing constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, objinfeasible=%u)\n",
3635 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, pschanged ? "new" : "old", objinfeasible);
3653 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3654 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3655 * external method; to avoid this, these changes will be buffered and processed after the method call
3663 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, objinfeasible, result) );
3677 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions was skipped, even though the solution was not objective-infeasible\n",
3683 /* A constraint handler might return SCIP_DIDNOTRUN and not check any constraints in case objinfeasible was
3717 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
3722 /* if the same pseudo solution was already enforced at this node, we only enforced new constraints this time;
3723 * if the enfops call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3724 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3732 * Even if nothing is enforced, the solution might still be infeasible due to violating lower bound.
3750 SCIP_Bool checklprows, /**< Do constraints represented by rows in the current LP have to be checked? */
3768 SCIPsetDebugMsg(set, "checking %d constraints of handler <%s>\n", conshdlr->ncheckconss, conshdlr->name);
3770 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3771 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3772 * external method; to avoid this, these changes will be buffered and processed after the method call
3780 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, conshdlr->checkconss, conshdlr->ncheckconss,
3796 SCIPerrorMessage("feasibility check of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name, *result);
3825 || (0 <= conshdlr->lastnusefulpropconss && conshdlr->lastnusefulpropconss <= conshdlr->nusefulpropconss));
3847 if( !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount && conshdlr->nmarkedpropconss == 0 )
3849 /* all constraints that were not yet propagated on the new domains must be useful constraints, which means,
3879 SCIPsetDebugMsg(set, "propagating constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, %d useful)\n",
3881 !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount ? "old" : "new", nusefulconss);
3898 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3899 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3900 * external method; to avoid this, these changes will be buffered and processed after the method call
3915 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, conss, nconss, nusefulconss, nmarkedpropconss, proptiming, result) );
3956 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
3964 SCIPsetDebugMsg(set, "propagation method of constraint handler <%s> was delayed\n", conshdlr->name);
3992 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
4020 SCIPsetDebugMsg(set, "presolving %d constraints of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4060 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4061 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4062 * external method; to avoid this, these changes will be buffered and processed after the method call
4070 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, conshdlr->conss, conshdlr->nactiveconss, nrounds, timing,
4102 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
4112 SCIPsetDebugMsg(set, "after presolving %d constraints left of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4133 /* during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4134 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4135 * external method; to avoid this, these changes will be buffered and processed after the method call
4149 /** locks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4164 /** unlocks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4182 )
4192 )
4202 )
4224 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
4225 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
4227 SCIP_Bool delaysepa /**< should separation method be delayed, if other separators found cuts? */
4241 /** sets both the propagation callback and the propagation frequency of the constraint handler */
4245 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
4246 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
4247 SCIP_PROPTIMING timingmask /**< positions in the node solving loop where propagators should be executed */
4274 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
4322 SCIP_DECL_CONSINITSOL((*consinitsol)) /**< solving process initialization method of constraint handler */
4333 SCIP_DECL_CONSEXITSOL ((*consexitsol)) /**< solving process deinitialization method of constraint handler */
4344 SCIP_DECL_CONSINITPRE((*consinitpre)) /**< preprocessing initialization method of constraint handler */
4355 SCIP_DECL_CONSEXITPRE((*consexitpre)) /**< preprocessing deinitialization method of constraint handler */
4367 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
4368 SCIP_PRESOLTIMING presoltiming /**< timing mask of the constraint handler's presolving method */
4376 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
4381 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
4403 /** sets method of constraint handler to transform constraint data into data belonging to the transformed problem */
4406 SCIP_DECL_CONSTRANS ((*constrans)) /**< transform constraint data into data belonging to the transformed problem */
4414 /** sets method of constraint handler to initialize LP with relaxations of "initial" constraints */
4417 SCIP_DECL_CONSINITLP ((*consinitlp)) /**< initialize LP with relaxations of "initial" constraints */
4538 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)) /**< constraint handler diving solution enforcement method */
4546 /** gets array with constraints of constraint handler; the first SCIPconshdlrGetNActiveConss() entries are the active
4547 * constraints, the last SCIPconshdlrGetNConss() - SCIPconshdlrGetNActiveConss() constraints are deactivated
4549 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4554 )
4564 )
4574 )
4583 * @attention Usually, there should be no need to access this array. Use this only if you are absolutely sure what you are doing.
4587 )
4597 )
4607 )
4617 )
4626 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4631 )
4641 )
4651 )
4660 SCIP_CONSHDLR* conshdlr, /**< the constraint handler for which all clocks should be enabled or disabled */
4681 )
4691 )
4701 )
4711 )
4721 )
4731 )
4741 )
4748 /** gets time in seconds used for propagation in this constraint handler during strong branching */
4751 )
4761 )
4771 )
4781 )
4791 )
4801 )
4811 )
4821 )
4831 )
4841 )
4851 )
4861 )
4871 )
4881 )
4891 )
4901 )
4911 )
4921 )
4928 /** gets maximum number of active constraints of constraint handler existing at the same time */
4931 )
4941 )
4951 )
4961 )
4971 )
4981 )
4988 /** gets number of holes added to domains of variables in presolving method of constraint handler */
4991 )
5001 )
5011 )
5021 )
5031 )
5041 )
5048 /** gets number of times the presolving method of the constraint handler was called and tried to find reductions */
5051 )
5061 )
5071 )
5081 )
5091 )
5101 )
5108 /** gets frequency of constraint handler for eager evaluations in separation, propagation and enforcement */
5111 )
5121 )
5131 )
5141 )
5151 )
5161 )
5171 )
5181 )
5191 )
5201 )
5211 )
5233 )