All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cons.c
Go to the documentation of this file.
22 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
45 #define AGERESETAVG_INIT 1000.0 /**< initial value of the exponentially decaying weighted sum for ages */
47 #define AGERESETAVG_DECAY 0.0005 /**< weight of a new addend in the exponentially decyaing sum */
48 #define AGERESETAVG_AGELIMIT 2.0 /**< in dynamic setting, a constraint is deleted if its age exceeds the
50 #define AGERESETAVG_OBSOLETEAGE 1.8 /**< in dynamic setting, a constraint is marked obsolete if its age exceeds the
304 assert(conshdlr->propconss[c]->markpropagate || (conshdlr->propconss[c]->obsolete == (c >= conshdlr->nusefulpropconss)));
330 /** updates the exponentially decaying weighted age average for age resets after a constraint age was reset */
355 || (set->cons_agelimit == 0 && cons->age > AGERESETAVG_AGELIMIT * conshdlrGetAgeresetavg(cons->conshdlr))));
370 || (set->cons_obsoleteage == 0 && cons->age > AGERESETAVG_OBSOLETEAGE * conshdlrGetAgeresetavg(cons->conshdlr))));
373 /** marks constraint to be obsolete; it will be moved to the last part of the constraint arrays, such that
446 * thus, we have to reset the enforcement counters in order to enforce all constraints again, especially
448 * this case should occur almost never, because a constraint that was not enforced in the last enforcement
449 * is a newly added one, and it is very unlikely that this constraint will become obsolete before the next
451 * this reset is not performed for separation and propagation, because they are not vital for correctness
471 /* in case the constraint is marked to be propagated, we do not move it in the propconss array since the first
501 * it will be moved to the first part of the constraint arrays, such that it is checked, enforced, separated,
528 assert(conshdlr->nusefulcheckconss <= cons->checkconsspos && cons->checkconsspos < conshdlr->ncheckconss);
546 assert(conshdlr->nusefulsepaconss <= cons->sepaconsspos && cons->sepaconsspos < conshdlr->nsepaconss);
561 assert(conshdlr->nusefulenfoconss <= cons->enfoconsspos && cons->enfoconsspos < conshdlr->nenfoconss);
574 /* in case the constraint is marked to be propagated, we do not move it in the propconss array since the first
580 assert(conshdlr->nusefulpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->npropconss);
602 * @note the propagation array is divided into three parts in contrast to the other constraint arrays;
603 * the first part contains constraints which were marked to be propagated (independently of its age)
604 * the second part contains the useful (non-obsolete) constraints which are not marked to be propagated
607 * @note if a constraint gets marked for propagation we put it into the first part regardless of its age
623 /* it may happen that the constraint is deleted while updates are delayed: in this case we just return */
632 /* propagation of the constraint is globally or locally disabled, so we do not have to move the constraint in the
642 /* if the constraint is obsolete, we need to move it first to the non-obsolete part of the array */
645 assert(conshdlr->nusefulpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->npropconss);
658 assert(conshdlr->nmarkedpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->nusefulpropconss);
676 * @note the propagation array is divided into three parts in contrast to the other constraint arrays;
677 * the first part contains constraints which were marked to be propagated (independently of its age)
678 * the second part contains the useful (non-obsolete) constraints which are not marked to be propagated
681 * @note if a constraint gets unmarked for propagation, it is put into the right part depending on its age
697 /* it may happen that the constraint is deleted while updates are delayed: in this case we just return */
706 /* propagation of the constraint is globally or locally disabled, so we do not have to move the constraint in the
717 /* first, move the constraint out of the first part to the second part of the constraint array */
996 /* we have to make sure that even this obsolete constraint is enforced in the next enforcement call;
997 * if the same LP or pseudo solution is enforced again, only the newly added useful constraints are
999 * enforced again; this is not needed for separation and propagation, because they are not vital for correctness
1046 /* if the constraint that moved to the free position was a newly added constraint and not enforced in the last
1048 * this check is not performed for separation and propagation, because they are not vital for correctness
1096 conshdlr->checkconss[conshdlr->ncheckconss] = conshdlr->checkconss[conshdlr->nusefulcheckconss];
1192 /* if the constraint is marked to be propagated, we have to move it to the first part of the array */
1195 /* temporarily unmark the constraint to be propagated, such that we can use the method below */
1226 /* unmark constraint to be propagated; this will move the constraint to the obsolete or non-obsolete part of the
1282 SCIPdebugMessage("enable separation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1310 SCIPdebugMessage("disable separation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1342 SCIPdebugMessage("enable propagation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1370 SCIPdebugMessage("disable propagation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1411 SCIPdebugMessage("enable constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1473 SCIPdebugMessage("disable constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1520 int depth, /**< depth in the tree where the activation takes place, or -1 for global problem */
1566 /* add constraint to the initconss array if the constraint is initial and added to the focus node */
1613 SCIPdebugMessage("deactivate constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1666 * recent obsolete check constraints will be moved to the last positions in the sepa-, enfo-, check-, and prop-arrays;
1667 * recent useful constraints will be moved to the first positions in the sepa-, enfo-, check-, and prop-arrays;
1668 * constraints which were recently marked to be propagated are moved to the first positions in the prop-array;
1689 SCIPdebugMessage("processing %d constraints that have to be updated in constraint handler <%s>\n",
1705 SCIPdebugMessage(" -> 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",
1728 SCIP_CALL( conshdlrActivateCons(conshdlr, set, stat, cons, cons->activedepth, cons->updateactfocus) );
1804 /* nothing to do here: the constraint is freed, when it is released from the updateconss array */
1864 /** marks constraint handler to delay all constraint updates until the next conshdlrProcessUpdates() call */
1892 SCIPdebugMessage("constraint updates of constraint handler <%s> will be processed immediately (count:%d)\n",
1921 SCIPdebugMessage("constraint <%s> of age %g has to be updated in constraint handler <%s> (consdata=%p)\n",
1970 SCIPdebugMessage("including constraint handler %s in subscip %p\n", SCIPconshdlrGetName(conshdlr), (void*)set->scip);
1987 int checkpriority, /**< priority of the constraint handler for checking feasibility (and propagation) */
1988 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
1989 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
1990 int eagerfreq, /**< frequency for using all instead of only the useful constraints in separation,
1992 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
1993 SCIP_Bool delaysepa, /**< should separation method be delayed, if other separators found cuts? */
1994 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
1995 SCIP_Bool delaypresol, /**< should presolving method be delayed, if other presolvers found reductions? */
1996 SCIP_Bool needscons, /**< should the constraint handler be skipped, if no constraints are available? */
1997 SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagation method of constraint handlers should be executed */
1998 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
2002 SCIP_DECL_CONSINITPRE ((*consinitpre)), /**< presolving initialization method of constraint handler */
2003 SCIP_DECL_CONSEXITPRE ((*consexitpre)), /**< presolving deinitialization method of constraint handler */
2004 SCIP_DECL_CONSINITSOL ((*consinitsol)), /**< solving process initialization method of constraint handler */
2005 SCIP_DECL_CONSEXITSOL ((*consexitsol)), /**< solving process deinitialization method of constraint handler */
2007 SCIP_DECL_CONSTRANS ((*constrans)), /**< transform constraint data into data belonging to the transformed problem */
2008 SCIP_DECL_CONSINITLP ((*consinitlp)), /**< initialize LP with relaxations of "initial" constraints */
2010 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
2204 (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);
2206 (int*)(&(*conshdlr)->timingmask), TRUE, timingmask, (int) SCIP_PROPTIMING_BEFORELP, (int) SCIP_PROPTIMING_ALWAYS, NULL, NULL) ); /*lint !e713*/
2210 "frequency for using all instead of only the useful constraints in separation, propagation and enforcement (-1: never, 0: only in first evaluation)",
2367 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2368 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2369 * external method; to avoid this, these changes will be buffered and processed after the method call
2416 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2417 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2418 * external method; to avoid this, these changes will be buffered and processed after the method call
2481 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2482 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2483 * external method; to avoid this, these changes will be buffered and processed after the method call
2500 /* after a restart the LP is empty but the initial constraints are not included in the initialconss array anymore;
2501 * we have to put them back into this array in order to obtain the correct initial root relaxation
2510 /**@todo should only active constraints be added to the initconss array? at least cons->active is asserted in
2528 assert(conshdlr->conss[c]->deleted || conshdlr->conss[c]->initial == (conshdlr->conss[c]->initconsspos >= 0));
2558 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2559 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2560 * external method; to avoid this, these changes will be buffered and processed after the method call
2602 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2603 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2604 * external method; to avoid this, these changes will be buffered and processed after the method call
2639 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2640 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2641 * external method; to avoid this, these changes will be buffered and processed after the method call
2649 SCIP_CALL( conshdlr->consexitsol(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss, restart) );
2661 /** calls LP initialization method of constraint handler to separate all initial active constraints */
2668 SCIP_Bool initkeptconss /**< Also initialize constraints which are valid at a more global node,
2684 SCIPdebugMessage("initializing LP with %d initial constraints of handler <%s> (ninitconss=%d, kept=%d, initkept=%u)\n",
2685 initkeptconss ? conshdlr->ninitconss : conshdlr->ninitconss - conshdlr->ninitconsskept, conshdlr->name,
2688 /* no constraints to initialize (or only kept constraints which do not need to be initialized this time) -> return */
2689 if( conshdlr->ninitconss == 0 || (!initkeptconss && conshdlr->ninitconss == conshdlr->ninitconsskept) )
2692 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2693 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2694 * external method; to avoid this, these changes will be buffered and processed after the method call
2705 /* add all kept initial constraints which are currently active to the second part of the initconss array */
2706 /* @todo keep track of where a constraint was already initialized (e.g., in the conssetchg)? */
2719 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &conshdlr->initconss[conshdlr->ninitconsskept],
2783 || (0 <= conshdlr->lastnusefulsepaconss && conshdlr->lastnusefulsepaconss <= conshdlr->nusefulsepaconss));
2804 /* all constraints that were not yet separated on the new LP solution must be useful constraints, which means,
2833 SCIPdebugMessage("separating constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
2854 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2855 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2856 * external method; to avoid this, these changes will be buffered and processed after the method call
2902 SCIPerrorMessage("LP separation method of constraint handler <%s> returned invalid result <%d>\n",
2910 SCIPdebugMessage("LP separation method of constraint handler <%s> was delayed\n", conshdlr->name);
2985 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2986 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2987 * external method; to avoid this, these changes will be buffered and processed after the method call
2996 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, conss, nconss, nusefulconss, sol, result) );
3029 SCIPerrorMessage("SOL separation method of constraint handler <%s> returned invalid result <%d>\n",
3037 SCIPdebugMessage("SOL separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3048 /** calls enforcing method of constraint handler for LP solution for all constraints added after last
3071 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3093 assert(conshdlr->lastenfolpresult == SCIP_FEASIBLE || conshdlr->lastenfolpresult == SCIP_INFEASIBLE
3096 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3097 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3104 assert(conshdlr->lastenfolpresult == SCIP_INFEASIBLE || conshdlr->lastenfolpresult == SCIP_SEPARATED);
3109 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3139 SCIPdebugMessage("enforcing constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
3140 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, lpchanged ? "new" : "old");
3161 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3162 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3163 * external method; to avoid this, these changes will be buffered and processed after the method call
3171 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3211 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP solutions returned invalid result <%d>\n",
3216 /* if the same LP solution was already enforced at this node, we only enforced new constraints this time;
3217 * if the enfolp call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3218 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3228 /** calls enforcing method of constraint handler for pseudo solution for all constraints added after last
3239 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
3252 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3286 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3287 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3298 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3326 SCIPdebugMessage("enforcing constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, objinfeasible=%u)\n",
3327 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, pschanged ? "new" : "old", objinfeasible);
3345 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3346 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3347 * external method; to avoid this, these changes will be buffered and processed after the method call
3355 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, objinfeasible, result) );
3369 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions was skipped, even though the solution was not objective-infeasible\n",
3375 /* A constraint handler might return SCIP_DIDNOTRUN and not check any constraints in case objinfeasible was
3409 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
3414 /* if the same pseudo solution was already enforced at this node, we only enforced new constraints this time;
3415 * if the enfops call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3416 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3451 SCIPdebugMessage("checking %d constraints of handler <%s>\n", conshdlr->ncheckconss, conshdlr->name);
3453 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3454 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3455 * external method; to avoid this, these changes will be buffered and processed after the method call
3463 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, conshdlr->checkconss, conshdlr->ncheckconss,
3482 SCIPerrorMessage("feasibility check of constraint handler <%s> returned invalid result <%d>\n",
3512 || (0 <= conshdlr->lastnusefulpropconss && conshdlr->lastnusefulpropconss <= conshdlr->nusefulpropconss));
3538 /* all constraints that were not yet propagated on the new domains must be useful constraints, which means,
3566 SCIPdebugMessage("propagating constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, %d useful)\n",
3568 !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount ? "old" : "new", nusefulconss);
3585 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3586 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3587 * external method; to avoid this, these changes will be buffered and processed after the method call
3599 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, conss, nconss, nusefulconss, nmarkedpropconss, proptiming, result) );
3639 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
3647 SCIPdebugMessage("propagation method of constraint handler <%s> was delayed\n", conshdlr->name);
3675 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
3701 && (conshdlr->maxprerounds == -1 || nrounds < conshdlr->maxprerounds || conshdlr->presolwasdelayed) )
3703 SCIPdebugMessage("presolving %d constraints of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
3743 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3744 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3745 * external method; to avoid this, these changes will be buffered and processed after the method call
3753 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, conshdlr->conss, conshdlr->nactiveconss, nrounds,
3785 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
3796 SCIPdebugMessage("presolving method of constraint handler <%s> was delayed\n", conshdlr->name);
3800 SCIPdebugMessage("after presolving %d constraints left of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
3824 /* during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3825 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3826 * external method; to avoid this, these changes will be buffered and processed after the method call
3840 /** locks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
3855 /** unlocks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
3915 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
3916 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
3918 SCIP_Bool delaysepa /**< should separation method be delayed, if other separators found cuts? */
3932 /** sets both the propagation callback and the propagation frequency of the constraint handler */
3936 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
3937 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
3938 SCIP_PROPTIMING timingmask /**< positions in the node solving loop where propagators should be executed */
3954 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
4002 SCIP_DECL_CONSINITSOL((*consinitsol)) /**< solving process initialization method of constraint handler */
4013 SCIP_DECL_CONSEXITSOL ((*consexitsol)) /**< solving process deinitialization method of constraint handler */
4024 SCIP_DECL_CONSINITPRE((*consinitpre)) /**< preprocessing initialization method of constraint handler */
4035 SCIP_DECL_CONSEXITPRE((*consexitpre)) /**< preprocessing deinitialization method of constraint handler */
4047 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
4048 SCIP_Bool delaypresol /**< should presolving method be delayed, if other presolvers found reductions? */
4069 /** sets method of constraint handler to transform constraint data into data belonging to the transformed problem */
4072 SCIP_DECL_CONSTRANS ((*constrans)) /**< transform constraint data into data belonging to the transformed problem */
4080 /** sets method of constraint handler to initialize LP with relaxations of "initial" constraints */
4083 SCIP_DECL_CONSINITLP ((*consinitlp)) /**< initialize LP with relaxations of "initial" constraints */
4201 /** gets array with constraints of constraint handler; the first SCIPconshdlrGetNActiveConss() entries are the active
4202 * constraints, the last SCIPconshdlrGetNConss() - SCIPconshdlrGetNActiveConss() constraints are deactivated
4204 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4268 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4350 /** gets time in seconds used for propagation in this constraint handler during strong branching */
4520 /** gets maximum number of active constraints of constraint handler existing at the same time */
4580 /** gets number of holes added to domains of variables in presolving method of constraint handler */
4640 /** gets number of times the presolving method of the constraint handler was called and tried to find reductions */
4700 /** gets frequency of constraint handler for eager evaluations in separation, propagation and enforcement */
4904 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->addedconss, (*conssetchg)->addedconsssize);
4905 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->disabledconss, (*conssetchg)->disabledconsssize);
4928 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->addedconss, conssetchg->addedconsssize, newsize) );
4952 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->disabledconss, conssetchg->disabledconsssize, newsize) );
4960 /** adds constraint addition to constraint set changes, and captures constraint; activates constraint if the
4984 SCIP_CALL( conssetchgEnsureAddedconssSize(*conssetchg, blkmem, set, (*conssetchg)->naddedconss+1) );
5000 /* remember, that this constraint set change data was responsible for the constraint's addition */
5026 SCIP_CALL( conssetchgEnsureDisabledconssSize(*conssetchg, blkmem, set, (*conssetchg)->ndisabledconss+1) );
5036 /** deactivates, deletes, and releases constraint from the addedconss array of the constraint set change data */
5054 SCIPdebugMessage("delete added constraint <%s> at position %d from constraint set change data\n", cons->name, arraypos);
5066 /* we want to keep the order of the constraint additions: move all subsequent constraints one slot to the front */
5082 /** deletes and releases deactivated constraint from the disabledconss array of the constraint set change data */
5095 SCIPdebugMessage("delete disabled constraint <%s> at position %d from constraint set change data\n",
5101 /* we want to keep the order of the constraint disablings: move all subsequent constraints one slot to the front */
5128 SCIPdebugMessage("applying constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5139 /* if constraint is already active, or if constraint is globally deleted, it can be removed from addedconss array */
5157 /* remember, that this constraint set change data was responsible for the constraint's addition */
5176 SCIPdebugMessage("constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5179 /* release and remove constraint from the disabledconss array, the empty slot is now used by the next constraint
5213 SCIPdebugMessage("undoing constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5223 /* If the constraint is inactive, we can permanently remove it from the disabledconss array. It was deactivated
5224 * in the subtree of the current node but not reactivated on the switching way back to the current node, which
5225 * means, the deactivation was more global (i.e. valid on a higher level node) than the current node and the
5227 * If the constraint is already enabled, we need not to do anything. This may happen on a path A -> B,
5228 * if the constraint is disabled at node B, and while processing the subtree of B, it is also disabled at
5229 * the more global node A. Then on the switching path back to A, the constraint is enabled at node B (which is
5230 * actually wrong, since it now should be disabled in the whole subtree of A, but we cannot know this), and
5231 * again enabled at node A (where enabling is ignored). If afterwards, a subnode of B is processed, the
5236 SCIPdebugMessage("constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5259 /* If the constraint is already deactivated, we need not to do anything. This may happen on a path A -> B,
5260 * if the constraint is added at node B, and while processing the subtree of B, it is also added at
5261 * the more global node A. Then on the switching path back to A, the node is deactivated at node B (which is
5262 * actually wrong, since it now should be active in the whole subtree of A, but we cannot know this), and
5263 * again deactivated at node A (where deactivation is ignored). If afterwards, a subnode of B is processed, the
5264 * switching activates the constraint in node A, and the activation is then removed from node B.
5285 /** applies constraint set change to the global problem and deletes the constraint set change data */
5303 SCIPdebugMessage("moving constraint set changes at %p to global problem: %d constraint additions, %d constraint disablings\n",
5306 /* apply constraint additions to the global problem (loop backwards, because then conssetchgDelAddedCons() is
5318 /* because we first have to delete the constraint, we have to capture it in order to not loose it */
5335 /* apply constraint disablings to the global problem (loop backwards, because then conssetchgDelDisabledCons() is
5374 /** creates and captures a constraint, and inserts it into the conss array of its constraint handler
5376 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, a LP or pseudo solution
5378 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
5406 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
5408 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
5425 SCIPerrorMessage("cannot create constraint <%s> of type [%s] - constraint handler does not need constraints\n",
5516 /** copies source constraint of source SCIP into the target constraint for the target SCIP, using the variable map for
5517 * mapping the variables of the source SCIP to the variables of the target SCIP; if the copying process was successful
5520 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, a LP or pseudo solution
5522 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
5528 const char* name, /**< name of constraint, or NULL if the name of the source constraint should be used */
5532 SCIP_HASHMAP* varmap, /**< a SCIP_HASHMAP mapping variables of the source SCIP to corresponding
5534 SCIP_HASHMAP* consmap, /**< a hashmap to store the mapping of source constraints to the corresponding
5544 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup? */
5545 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
5560 /* if constraint handler does not support copying, success will return false. Constraints handlers have to actively set this to true. */
5565 SCIP_CALL( sourceconshdlr->conscopy(set->scip, cons, name, sourcescip, sourceconshdlr, sourcecons, varmap, consmap,
5566 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, global, success) );
5571 SCIPwarningMessage(scip, "constraint handler <%s> doesn't support copying constraints\n", sourceconshdlr->name);
5578 /** parses constraint information (in cip format) out of a string; if the parsing process was successful a constraint is
5581 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
5583 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
5609 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
5611 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
5632 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint handler name.\n");
5657 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find colon ':' after constraint name.\n");
5673 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> doesn't exist in SCIP data structure\n", conshdlrname);
5680 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> does not support parsing constraints\n", conshdlrname);
5685 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, success) );
5734 if( (*cons)->conshdlr->consdelete != NULL && (*cons)->consdata != NULL && (*cons)->deleteconsdata )
5736 SCIP_CALL( (*cons)->conshdlr->consdelete(set->scip, (*cons)->conshdlr, *cons, &(*cons)->consdata) );
5775 SCIPdebugMessage("capture constraint <%s> with nuses=%d, cons pointer %p\n", cons->name, cons->nuses, (void*)cons);
5794 SCIPdebugMessage("release constraint <%s> with nuses=%d, cons pointer %p\n", (*cons)->name, (*cons)->nuses, (void*)(*cons));
5843 SCIPmessageFPrintInfo(messagehdlr, file, "constraint handler <%s> doesn't support printing constraint;\n", conshdlr->name);
5850 * If the number of variables is greater than the available slots in the variable array, nothing happens except that
5851 * the success point is set to FALSE. With the method SCIPconsGetNVars() it is possible to get the number of variables
5856 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
5863 int varssize, /**< available slots in vars array which is needed to check if the array is large enough */
5890 * @note The success pointer indicates if the contraint handler was able to return the number of variables
5892 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
5899 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the number of variables */
5924 /** globally removes constraint from all subproblems; removes constraint from the constraint set change data of the
5980 /** gets and captures transformed constraint of a given original constraint; if the constraint is not yet transformed,
6009 SCIP_CALL( origcons->conshdlr->constrans(set->scip, origcons->conshdlr, origcons, transcons) );
6014 SCIP_CALL( SCIPconsCreate(transcons, blkmem, set, origcons->name, origcons->conshdlr, origcons->consdata, origcons->initial,
6016 origcons->local, origcons->modifiable, origcons->dynamic, origcons->removable, origcons->stickingatnode,
6289 /** gets associated transformed constraint of an original constraint, or NULL if no associated transformed constraint
6306 int depth, /**< depth in the tree where the constraint activation takes place, or -1 for global problem */
6326 SCIPdebugMessage("delayed activation of constraint <%s> in constraint handler <%s> (depth %d)\n",
6378 /** enables constraint's separation, enforcing, and propagation capabilities or marks them to be enabled in next update */
6391 if( !cons->active || cons->updatedeactivate || cons->updateenable || (cons->enabled && !cons->updatedisable) )
6411 /** disables constraint's separation, enforcing, and propagation capabilities or marks them to be disabled in next update */
6475 /** disables constraint's separation capabilities or marks them to be disabled in next update */
6503 /** enables constraint's propagation capabilities or marks them to be enabled in next update */
6533 /** disables constraint's propagation capabilities or marks them to be disabled in next update */
6629 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
6687 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
6708 * if it was obsolete, makes constraint useful again or marks constraint to be made useful again in next update
6721 SCIPdebugMessage("resetting age %g of constraint <%s> of handler <%s>\n", cons->age, cons->name, cons->conshdlr->name);
6745 /** adds an active constraint to the propagation queue(if not already marked for propagation) of corresponding
6771 /** returns first constraint from propagation queue(if not empty) of given constraint handler */
6782 /** removes constraint from propagation queue(if not empty) of given constraint handler and unmarks constraint to be
6807 /** resolves the given conflicting bound, that was deduced by the given constraint, by putting all "reason" bounds
6808 * leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
6809 * SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
6819 SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
6845 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, inferboundtype, bdchgidx,
6857 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
6864 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> is not implemented\n",
6872 /** adds given values to lock status of the constraint and updates the rounding locks of the involved variables */
6907 /* lock the variables, if the constraint switched from unlocked to locked or from locked to unlocked */
6910 SCIP_CALL( cons->conshdlr->conslock(set->scip, cons->conshdlr, cons, updlockpos, updlockneg) );
6940 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, &cons, 1, sol, checkintegrality, checklprows, printreason, result) );
6945 SCIPerrorMessage("feasibility check of constraint handler <%s> on constraint <%s> returned invalid result <%d>\n",
6957 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
6958 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
6975 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, &cons, 1, 1, solinfeasible, objinfeasible, result) );
6987 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
7001 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7029 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP returned invalid result <%d>\n",
7096 SCIPerrorMessage("separation method of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name,
7139 SCIPerrorMessage("separation method of constraint handler for arbitrary primal solution <%s> returned invalid result <%d>\n",
7179 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
7193 int inferinfo, /**< the user information passed to the corresponding SCIPinferVarLbCons() or SCIPinferVarUbCons() call */
7195 SCIP_BDCHGIDX* bdchgidx, /**< the index of the bound change, representing the point of time where the change took place */
7215 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, boundtype, bdchgidx, relaxedbd, result) );
7221 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7235 int nnewfixedvars, /**< number of variables fixed since the last call to the presolving method */
7236 int nnewaggrvars, /**< number of variables aggregated since the last call to the presolving method */
7237 int nnewchgvartypes, /**< number of variable type changes since the last call to the presolving method */
7238 int nnewchgbds, /**< number of variable bounds tightened since the last call to the presolving method */
7239 int nnewholes, /**< number of domain holes added since the last call to the presolving method */
7240 int nnewdelconss, /**< number of deleted constraints since the last call to the presolving method */
7241 int nnewaddconss, /**< number of added constraints since the last call to the presolving method */
7242 int nnewupgdconss, /**< number of upgraded constraints since the last call to the presolving method */
7243 int nnewchgcoefs, /**< number of changed coefficients since the last call to the presolving method */
7244 int nnewchgsides, /**< number of changed left or right hand sides since the last call to the presolving method */
7246 int* naggrvars, /**< pointer to count total number of variables aggregated of all presolvers */
7247 int* nchgvartypes, /**< pointer to count total number of variable type changes of all presolvers */
7248 int* nchgbds, /**< pointer to count total number of variable bounds tightened of all presolvers */
7252 int* nupgdconss, /**< pointer to count total number of upgraded constraints of all presolvers */
7253 int* nchgcoefs, /**< pointer to count total number of changed coefficients of all presolvers */
7254 int* nchgsides, /**< pointer to count total number of changed left/right hand sides of all presolvers */
7281 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, &cons, 1, nrounds, nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds,
7282 nnewholes, nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides, nfixedvars, naggrvars, nchgvartypes,
7293 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
7419 BMScopyMemoryArray(conshdlr->storedpropconss, conshdlr->propconss, conshdlr->nmarkedpropconss);
7480 assert(conshdlr->nmarkedpropconss + ndisabled >= conshdlr->storednmarkedpropconss || (conshdlrAreUpdatesDelayed(conshdlr) && conshdlr->nupdateconss + ndisabled >= conshdlr->storednmarkedpropconss));
7590 /** for an active constraint, returns the depth in the tree at which the constraint was activated */
7611 /** returns the depth in the tree at which the constraint is valid; returns INT_MAX, if the constraint is local
7789 /** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
7799 /** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
7859 /** returns TRUE iff roundings for variables in constraint or in constraint's negation are locked */
|