80#define CONSHDLR_NAME "cardinality"
81#define CONSHDLR_DESC "cardinality constraint handler"
82#define CONSHDLR_SEPAPRIORITY 10
83#define CONSHDLR_ENFOPRIORITY 100
84#define CONSHDLR_CHECKPRIORITY -10
85#define CONSHDLR_SEPAFREQ 10
86#define CONSHDLR_PROPFREQ 1
87#define CONSHDLR_EAGERFREQ 100
89#define CONSHDLR_MAXPREROUNDS -1
91#define CONSHDLR_DELAYSEPA FALSE
92#define CONSHDLR_DELAYPROP FALSE
93#define CONSHDLR_NEEDSCONS TRUE
95#define CONSHDLR_PROP_TIMING SCIP_PROPTIMING_BEFORELP
96#define CONSHDLR_PRESOLTIMING SCIP_PRESOLTIMING_FAST
99#define DEFAULT_BRANCHBALANCED FALSE
100#define DEFAULT_BALANCEDDEPTH 20
101#define DEFAULT_BALANCEDCUTOFF 2.0
105#define EVENTHDLR_NAME "cardinality"
106#define EVENTHDLR_DESC "bound change event handler for cardinality constraints"
108#define EVENTHDLR_EVENT_TYPE (SCIP_EVENTTYPE_BOUNDCHANGED | SCIP_EVENTTYPE_GBDCHANGED)
122 int neventdatascurrent;
133struct SCIP_ConshdlrData
150 unsigned int varmarked:1;
151 unsigned int indvarmarked:1;
175 (*eventdata)->consdata = consdata;
176 (*eventdata)->var =
var;
177 (*eventdata)->indvar = indvar;
178 (*eventdata)->varmarked =
FALSE;
179 (*eventdata)->indvarmarked =
FALSE;
180 (*eventdata)->pos = (
unsigned int)pos;
250 SCIP_CALL(
SCIPcreateConsLinear(
scip, &cons,
"branch", 1, &
var, &val, 0.0, 0.0,
TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
316 for(
i = 0;
i < naggrvars; ++
i )
321 allnonnegative =
FALSE;
329 for(
i = 0;
i < naggrvars; ++
i )
335 *tightened = *tightened || fixed;
400 assert(consdata->nvars <= consdata->maxvars);
402 if( num > consdata->maxvars )
413 if ( reserveweights )
417 consdata->maxvars = newsize;
419 assert(num <= consdata->maxvars);
461 assert(consdata->ntreatnonzeros >= 0);
464 ++consdata->ntreatnonzeros;
514 if( consdata->weights ==
NULL && consdata->maxvars > 0 )
516 SCIPerrorMessage(
"cannot add variable to cardinality constraint <%s> that does not contain weights.\n",
524 if( conshdlrdata->varhash ==
NULL )
581 assert(consdata->maxvars >= consdata->nvars+1);
584 for( pos = consdata->nvars; pos >= 1; --pos )
587 if( consdata->weights[pos-1] > weight )
589 consdata->vars[pos] = consdata->vars[pos-1];
590 consdata->indvars[pos] = consdata->indvars[pos-1];
591 consdata->eventdatas[pos] = consdata->eventdatas[pos-1];
592 consdata->weights[pos] = consdata->weights[pos-1];
594 if( consdata->eventdatas[pos] !=
NULL )
596 consdata->eventdatas[pos]->pos = (
unsigned int)pos;
609 consdata->vars[pos] =
var;
610 consdata->indvars[pos] = indvar;
611 consdata->eventdatas[pos] = eventdata;
612 consdata->weights[pos] = weight;
643 if( conshdlrdata->varhash ==
NULL )
706 consdata->vars[consdata->nvars] =
var;
707 consdata->indvars[consdata->nvars] = indvar;
708 consdata->eventdatas[consdata->nvars] = eventdata;
710 if( consdata->weights !=
NULL && consdata->nvars > 0 )
711 consdata->weights[consdata->nvars] = consdata->weights[consdata->nvars-1] + 1.0;
714 assert(consdata->weights !=
NULL || consdata->nvars > 0);
738 &consdata->eventdatas[pos]) );
743 --(consdata->ntreatnonzeros);
746 for( j = pos; j < consdata->nvars-1; ++j )
748 consdata->vars[j] = consdata->vars[j+1];
749 consdata->indvars[j] = consdata->indvars[j+1];
750 consdata->eventdatas[j] = consdata->eventdatas[j+1];
751 if( consdata->weights !=
NULL )
752 consdata->weights[j] = consdata->weights[j+1];
754 consdata->eventdatas[j]->pos = (
unsigned int)j;
778 for(
c = 0;
c < nconss; ++
c )
788 nvars = consdata->nvars;
789 vars = consdata->vars;
790 indvars = consdata->indvars;
792 for( j = 0; j <
nvars; ++j )
818 eventdatas = consdata->eventdatas;
819 nvars = consdata->nvars;
822 for( j = 0; j <
nvars; ++j )
826 eventdata = eventdatas[j];
827 eventdata->varmarked =
FALSE;
828 eventdata->indvarmarked =
FALSE;
881 consdata->neventdatascurrent = 0;
885 allvarsbinary =
TRUE;
886 vars = consdata->vars;
887 indvars = consdata->indvars;
890 while ( j < consdata->
nvars )
922 &consdata->eventdatas[j]) );
924 &consdata->eventdatas[j]) );
932 consdata->eventdatas[j]->var =
var;
988 SCIPdebugMsg(
scip,
"deleting variable <%s> from constraint <%s>, since it may be treated as nonzero.\n",
990 --(consdata->cardval);
994 else if( indub < 0.5 )
1021 allvarsbinary =
FALSE;
1028 if( consdata->cardval < 0 )
1030 SCIPdebugMsg(
scip,
"The problem is infeasible: more variables have bounds that keep them from being 0 than allowed.\n");
1036 else if( consdata->cardval == 0 )
1039 for( j = 0; j < consdata->nvars; ++j )
1056 if( consdata->nvars <= consdata->cardval )
1058 SCIPdebugMsg(
scip,
"Deleting cardinality constraint <%s> with <%d> variables and cardinality value <%d>.\n",
1077 for( j = 0; j < consdata->nvars; ++j )
1139 if( consdata->ntreatnonzeros > consdata->cardval )
1141 SCIPdebugMsg(
scip,
"the node is infeasible, more than %d variables are fixed to be nonzero.\n", consdata->cardval);
1149 if( consdata->ntreatnonzeros == consdata->cardval )
1162 nvars = consdata->nvars;
1163 vars = consdata->vars;
1164 indvars = consdata->indvars;
1170 for( j = 0; j <
nvars; ++j )
1193 SCIPdebugMsg(
scip,
"the node is infeasible, more than %d variables are fixed to be nonzero.\n",
1203 SCIPdebugMsg(
scip,
"fixed variable <%s> to 0, since constraint <%s> with cardinality value %d is \
1208 allvarfixed =
FALSE;
1212 assert(cnt == consdata->ntreatnonzeros);
1215 if( *nchgdomain > 0 )
1231 if( consdata->neventdatascurrent > 0 )
1238 neventdatas = consdata->neventdatascurrent;
1239 eventvars = consdata->eventvarscurrent;
1240 eventdatas = consdata->eventdatascurrent;
1243 for( j = 0; j < neventdatas; ++j )
1250 eventdata = eventdatas[j];
1255 assert(
var == eventdata->var ||
var == eventdata->indvar);
1259 if( eventdata->indvar ==
var )
1261 assert(eventdata->indvarmarked);
1268 implvar = eventdata->var;
1278 SCIPdebugMsg(
scip,
"the node is infeasible, indicator variable %s is fixed to zero although implied "
1288 SCIPdebugMsg(
scip,
"fixed variable <%s> to 0, since indicator variable %s is 0.\n",
1294 eventdata->indvarmarked =
FALSE;
1300 assert(eventdata->varmarked);
1307 indvar = eventdata->indvar;
1316 SCIPdebugMsg(
scip,
"the node is infeasible, implied variable %s is fixed to nonzero "
1324 SCIPdebugMsg(
scip,
"fixed variable <%s> to 1.0, since implied variable %s is nonzero.\n",
1329 eventdata->varmarked =
FALSE;
1333 consdata->neventdatascurrent = 0;
1362 SCIPdebugMsg(
scip,
"apply unbalanced branching on variable <%s> of constraint <%s>.\n",
1379 assert(branchnnonzero + 1 <= cardval);
1380 if( branchnnonzero + 1 == cardval )
1392 for( j = 0; j <
nvars; ++j )
1417 for( j = 0; j <
nvars; ++j )
1479 SCIPerrorMessage(
"balanced branching is only possible if separation frequency of constraint handler is 1.\n");
1494 nbuffer =
nvars-branchnnonzero;
1499 for( j = 0; j <
nvars; ++j )
1514 weight1 += val * (
SCIP_Real) (j - (nnonzero + nzero));
1516 branchindvars[nbranchvars] = indvars[j];
1517 branchvars[nbranchvars++] =
var;
1528 assert(nnonzero == branchnnonzero);
1531 assert(cnt >= cardval-nnonzero);
1533 w = weight1/weight2;
1536 assert(0 <= ind && ind < nbranchvars-1);
1539 for( j = 0; j <= ind; ++j )
1556 for( j = ind+1; j < nbranchvars; ++j )
1575 newcardval = cardval - nnonzero;
1576 splitval1 = sum1 + (
SCIP_Real)newcardval - sum2 - 1.0;
1578 splitval1 =
MAX(splitval1, 0);
1579 assert((
int)splitval1 >= 0);
1580 assert((
int)splitval1 <=
MIN(newcardval-1, ind));
1582 splitval2 -= splitval1;
1590 branchnnonzero, branchpos) );
1612 for( j = 0; j <= ind; ++j )
1622 for( j = 0; j <= ind; ++j )
1655 for( j = ind+1; j < nbranchvars; ++j )
1660 assert(nbranchvars - (ind + 1) > 0);
1666 for( j = ind+1; j < nbranchvars; ++j )
1679 for( j = ind+1; j < nbranchvars; ++j )
1681 branchvars[cnt] = branchvars[j];
1682 branchindvars[cnt++] = branchindvars[j];
1684 assert(cnt == nbranchvars - (ind + 1));
1763 branchnnonzero = -1;
1774 for(
c = 0;
c < nconss; ++
c )
1797 nvars = consdata->nvars;
1798 vars = consdata->vars;
1799 indvars = consdata->indvars;
1800 cardval = consdata->cardval;
1809 SCIPdebugMsg(
scip,
"propagating <%s> in enforcing (cutoff: %u, domain reductions: %d).\n",
1816 if( nchgdomain > 0 )
1827 for( j = 0; j <
nvars; ++j )
1882 if( nnonzero > cardval )
1884 SCIPdebugMsg(
scip,
"Detected cut off: constraint <%s> has %d many variables that can be treated as nonzero, \
1885 although only %d many are feasible.\n",
SCIPconsGetName(cons), nnonzero, cardval);
1890 else if( cnt > 0 && nnonzero + 1 > cardval )
1895 for( v = 0; v <
nvars; ++v )
1919 if( cnt > cardval - nnonzero && weight > maxweight )
1923 branchnnonzero = nnonzero;
1925 branchallneg = allneg;
1926 branchallpos = allpos;
1931 if( branchcons ==
NULL )
1945 assert(branchnnonzero >= 0);
1951 nvars = consdata->nvars;
1952 vars = consdata->vars;
1953 indvars = consdata->indvars;
1954 cardval = consdata->cardval;
1958 if( conshdlrdata->branchbalanced && !
SCIPisFeasNegative(
scip, maxweight) && ( branchallneg || branchallpos )
1959 && (conshdlrdata->balanceddepth == -1 ||
SCIPgetDepth(
scip) <= conshdlrdata->balanceddepth)
1962 branchbalanced =
TRUE;
1966 if( branchbalanced )
1968 SCIP_CALL(
branchBalancedCardinality(
scip, conshdlr,
sol, branchcons,
vars, indvars,
nvars, cardval, branchnnonzero, branchpos,
1969 conshdlrdata->balancedcutoff) );
2028 nvars = consdata->nvars;
2038 cardval = consdata->cardval;
2039 for( j = 0; j <
nvars; ++j )
2056 vars[cnt] = consdata->vars[j];
2057 vals[cnt++] = 1.0/val;
2080 cardval = consdata->cardval;
2081 for( j = 0; j <
nvars; ++j )
2098 vars[cnt] = consdata->vars[j];
2099 vals[cnt++] = 1.0/val;
2146 for(
c = nconss-1;
c >= 0; --
c )
2172 if( consdata->rowub ==
NULL || consdata->rowlb ==
NULL )
2175 (consdata->rowlb ==
NULL) ? &consdata->rowlb :
NULL,
2176 (consdata->rowub ==
NULL) ? &consdata->rowub :
NULL) );
2178 rowub = consdata->rowub;
2179 rowlb = consdata->rowlb;
2316 if( conshdlrdata->varhash !=
NULL )
2341 for(
c = 0;
c < nconss; ++
c )
2353 if( consdata->rowub !=
NULL )
2357 if( consdata->rowlb !=
NULL )
2364 if( conshdlrdata->varhash !=
NULL )
2395 for( j = 0; j < (*consdata)->nvars; ++j )
2398 (*consdata)->indvars[j], &(*consdata)->eventdatas[j]) );
2403 if( (*consdata)->weights !=
NULL )
2414 if( (*consdata)->rowub !=
NULL )
2418 if( (*consdata)->rowlb !=
NULL )
2438 if ( conshdlrdata->varhash !=
NULL )
2471 assert(sourcedata->nvars > 0);
2472 assert(sourcedata->nvars <= sourcedata->maxvars);
2477 consdata->cons =
NULL;
2478 consdata->nvars = sourcedata->nvars;
2479 consdata->maxvars = sourcedata->nvars;
2480 consdata->cardval = sourcedata->cardval;
2481 consdata->rowub =
NULL;
2482 consdata->rowlb =
NULL;
2483 consdata->eventdatascurrent =
NULL;
2484 consdata->neventdatascurrent = 0;
2485 consdata->ntreatnonzeros = 0;
2493 if( sourcedata->weights !=
NULL )
2498 consdata->weights =
NULL;
2500 for( j = 0; j < sourcedata->nvars; ++j )
2502 assert(sourcedata->vars[j] != 0);
2503 assert(sourcedata->indvars[j] != 0);
2509 ++(consdata->ntreatnonzeros);
2521 consdata->cons = *targetcons;
2525 for( j = 0; j < consdata->nvars; ++j )
2528 consdata->vars[j], consdata->indvars[j], j, &consdata->eventdatas[j]) );
2535 SCIPdebugMsg(
scip,
"constraint <%s> has %d variables fixed to be nonzero, allthough the constraint allows \
2536 only %d nonzero variables\n",
SCIPconsGetName(*targetcons), consdata->ntreatnonzeros, consdata->cardval);
2562 SCIPdebug( oldnfixedvars = *nfixedvars; )
2564 SCIPdebug( oldnupgdconss = *nupgdconss; )
2568 if( nrounds == 0 || nnewfixedvars > 0 || nnewaggrvars > 0 )
2578 for(
c = 0;
c < nconss; ++
c )
2591 assert(consdata->nvars >= 0);
2592 assert(consdata->nvars <= consdata->maxvars);
2597 ndelconss, nupgdconss, nfixedvars, &nremovedvars) );
2610 (*nchgcoefs) += nremovedvars;
2613 "and upgraded %d constraints.\n", *nfixedvars - oldnfixedvars, nremovedvars, *ndelconss - oldndelconss,
2614 *nupgdconss - oldnupgdconss); )
2724 for(
c = 0;
c < nconss; ++
c )
2735 cardval = consdata->cardval;
2739 for( j = 0; j < consdata->nvars; ++j )
2759 for( l = 0; l < consdata->nvars; ++l )
2799 for(
c = 0;
c < nconss; ++
c )
2821 if( nchgdomain > 0 )
2859 vars = consdata->vars;
2860 indvars = consdata->indvars;
2861 nvars = consdata->nvars;
2864 for( j = 0; j <
nvars; ++j )
2869 indvar = indvars[j];
2905 for( j = 0; j < consdata->nvars; ++j )
2911 if( consdata->indvars[j] !=
NULL )
2918 if( consdata->weights ==
NULL )
2939 const char* consname;
2962 nvars = sourceconsdata->nvars;
2967 sourcevars = sourceconsdata->vars;
2969 sourceindvars = sourceconsdata->indvars;
2971 sourceweights = sourceconsdata->weights;
2996 targetweights, initial,
separate, enforce, check,
propagate, local, dynamic, removable, stickingatnode) );
3028 SCIP_CALL(
SCIPcreateConsCardinality(
scip, cons, name, 0,
NULL, 0,
NULL,
NULL, initial,
separate, enforce, check,
propagate, local, dynamic, removable, stickingatnode) );
3047 while( *t !=
'\0' && *t !=
'(' && *t !=
'[' )
3052 SCIPerrorMessage(
"Syntax error: expected opening '[' or '(' at input: %s\n", s);
3066 if( indvar ==
NULL )
3068 SCIPerrorMessage(
"Syntax error: expected indicator variable name at input: %s\n", s);
3097 weight = strtod(s, &t);
3135 if( *success && *s ==
'<' && *(s+1) ==
'=' )
3142 cardval = (int)strtod(s, &t);
3146 SCIPerrorMessage(
"Syntax error during parsing of the cardinality restriction value: %s\n", s);
3168 if( varssize < 2 * consdata->
nvars )
3177 for (v = 0; v < consdata->nvars; ++v)
3179 vars[cnt++] = consdata->vars[v];
3180 vars[cnt++] = consdata->indvars[v];
3197 (*nvars) = 2 * consdata->nvars;
3224 nconsvars = consdata->nvars;
3235 for(
i = 0;
i < nconsvars; ++
i )
3241 vars[0] = consdata->vars[
i];
3262 else if( nlocvars == 1 )
3270 vars[0] = consdata->indvars[
i];
3291 else if( nlocvars == 1 )
3329 nconsvars = consdata->nvars;
3340 for(
i = 0;
i < nconsvars; ++
i )
3345 vars[0] = consdata->vars[
i];
3371 for( j = 0; j < nlocvars; ++j )
3385 else if( nlocvars == 1 )
3393 allownegation =
TRUE;
3412 vars[0] = consdata->indvars[
i];
3433 else if( nlocvars == 1 )
3471 consdata = eventdata->consdata;
3473 assert(0 <= consdata->ntreatnonzeros && consdata->ntreatnonzeros <= consdata->nvars);
3484 if( ( eventdata->varmarked &&
var == eventdata->var) || ( eventdata->indvarmarked &&
var == eventdata->indvar) )
3488 for(
i = 0;
i < consdata->neventdatascurrent; ++
i )
3490 if(
var == consdata->eventvarscurrent[
i] )
3526 if(
var == eventdata->indvar )
3532 ++(consdata->ntreatnonzeros);
3534 --(consdata->ntreatnonzeros);
3537 assert(oldbound == 1.0 && newbound == 0.0 );
3540 consdata->eventdatascurrent[consdata->neventdatascurrent] = eventdata;
3541 consdata->eventvarscurrent[consdata->neventdatascurrent] =
var;
3542 ++consdata->neventdatascurrent;
3543 eventdata->indvarmarked =
TRUE;
3544 assert(consdata->neventdatascurrent <= 4 * consdata->maxvars);
3547 assert(0 <= consdata->ntreatnonzeros && consdata->ntreatnonzeros <= consdata->nvars);
3552 if(
var == eventdata->var && ! eventdata->varmarked )
3560 consdata->eventdatascurrent[consdata->neventdatascurrent] = eventdata;
3561 consdata->eventvarscurrent[consdata->neventdatascurrent] =
var;
3562 ++consdata->neventdatascurrent;
3563 eventdata->varmarked =
TRUE;
3564 assert(consdata->neventdatascurrent <= 4 * consdata->maxvars );
3574 consdata->eventdatascurrent[consdata->neventdatascurrent] = eventdata;
3575 consdata->eventvarscurrent[consdata->neventdatascurrent] =
var;
3576 ++consdata->neventdatascurrent;
3577 eventdata->varmarked =
TRUE;
3578 assert(consdata->neventdatascurrent <= 4 * consdata->maxvars );
3583 assert(0 <= consdata->ntreatnonzeros && consdata->ntreatnonzeros <= consdata->nvars);
3585 SCIPdebugMsg(
scip,
"event exec cons <%s>: changed %s bound of variable <%s> from %g to %g (ntreatnonzeros: %d).\n",
3587 oldbound, newbound, consdata->ntreatnonzeros);
3604 conshdlrdata->eventhdlr =
NULL;
3605 conshdlrdata->varhash =
NULL;
3609 eventExecCardinality,
NULL) );
3610 if( conshdlrdata->eventhdlr ==
NULL )
3612 SCIPerrorMessage(
"event handler for cardinality constraints not found.\n");
3619 consEnfolpCardinality, consEnfopsCardinality, consCheckCardinality, consLockCardinality, conshdlrdata) );
3645 "whether to use balanced instead of unbalanced branching",
3649 "maximum depth for using balanced branching (-1: no limit)",
3653 "determines that balanced branching is only used if the branching cut off value "
3654 "w.r.t. the current LP solution is greater than a given value",
3715 for (v = 0; v <
nvars; ++v)
3722 if( conshdlr ==
NULL )
3729 if( indvars !=
NULL )
3731 for( v = 0; v <
nvars; ++v )
3750 consdata->cons =
NULL;
3751 consdata->vars =
NULL;
3752 consdata->indvars =
NULL;
3753 consdata->eventdatas =
NULL;
3754 consdata->nvars =
nvars;
3755 consdata->cardval = cardval;
3756 consdata->maxvars =
nvars;
3757 consdata->rowub =
NULL;
3758 consdata->rowlb =
NULL;
3759 consdata->eventdatascurrent =
NULL;
3760 consdata->eventvarscurrent =
NULL;
3761 consdata->neventdatascurrent = 0;
3762 consdata->ntreatnonzeros = transformed ? 0 : -1;
3763 consdata->weights =
NULL;
3771 if( indvars !=
NULL )
3777 if( conshdlrdata->varhash ==
NULL )
3784 for( v = 0; v <
nvars; ++v )
3801 consdata->indvars[v] = implvar;
3811 consdata->indvars[v] =
var;
3829 if( weights !=
NULL )
3844 SCIP_CALL(
SCIPcreateCons(
scip, cons, name, conshdlr, consdata, initial,
separate, enforce, check,
propagate,
3845 local, modifiable, dynamic, removable, stickingatnode) );
3847 consdata->cons = *cons;
3851 for( v =
nvars - 1; v >= 0; --v )
3866 consdata->indvars[v], v, transformed, &consdata->eventdatas[v]) );
3867 assert(! transformed || consdata->eventdatas[v] !=
NULL);
3894 SCIP_CALL(
SCIPcreateConsCardinality(
scip, cons, name,
nvars,
vars, cardval, indvars, weights,
TRUE,
TRUE,
TRUE,
TRUE,
3921 SCIPdebugMsg(
scip,
"modify right hand side of cardinality constraint from <%i> to <%i>\n", consdata->cardval, cardval);
3924 consdata->cardval = cardval;
4022 return consdata->nvars;
4046 return consdata->vars;
4069 return consdata->cardval;
4093 return consdata->weights;
#define CONSHDLR_NEEDSCONS
#define CONSHDLR_SEPAFREQ
#define CONSHDLR_CHECKPRIORITY
#define CONSHDLR_PROP_TIMING
#define CONSHDLR_MAXPREROUNDS
#define CONSHDLR_SEPAPRIORITY
#define CONSHDLR_PROPFREQ
#define CONSHDLR_PRESOLTIMING
#define CONSHDLR_EAGERFREQ
#define CONSHDLR_ENFOPRIORITY
#define CONSHDLR_DELAYSEPA
#define CONSHDLR_DELAYPROP
static SCIP_RETCODE unlockVariableCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_VAR *indvar)
static SCIP_RETCODE consdataEnsurevarsSizeCardinality(SCIP *scip, SCIP_CONSDATA *consdata, int num, SCIP_Bool reserveweights)
static SCIP_RETCODE lockVariableCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_VAR *indvar)
static SCIP_RETCODE appendVarCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_CONSHDLRDATA *conshdlrdata, SCIP_VAR *var, SCIP_VAR *indvar)
static void consdataUnmarkEventdataVars(SCIP_CONSDATA *consdata)
static SCIP_RETCODE fixVariableZeroNode(SCIP *scip, SCIP_VAR *var, SCIP_NODE *node, SCIP_Bool *infeasible)
static SCIP_RETCODE generateRowCardinality(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons, SCIP_Bool local, SCIP_ROW **rowlb, SCIP_ROW **rowub)
static SCIP_RETCODE deleteVarCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_CONSDATA *consdata, SCIP_EVENTHDLR *eventhdlr, int pos)
static SCIP_RETCODE fixVariableZero(SCIP *scip, SCIP_VAR *var, SCIP_Bool *infeasible, SCIP_Bool *tightened)
static SCIP_RETCODE polishPrimalSolution(SCIP *scip, SCIP_CONS **conss, int nconss, SCIP_SOL *sol, SCIP_SOL *primsol)
static SCIP_RETCODE branchBalancedCardinality(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, SCIP_CONS *branchcons, SCIP_VAR **vars, SCIP_VAR **indvars, int nvars, int cardval, int branchnnonzero, int branchpos, SCIP_Real balancedcutoff)
#define DEFAULT_BALANCEDDEPTH
static SCIP_RETCODE initsepaBoundInequalityFromCardinality(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_CONS **conss, int nconss, SCIP_SOL *sol, SCIP_Bool solvedinitlp, int *ngen, SCIP_Bool *cutoff)
#define DEFAULT_BALANCEDCUTOFF
static SCIP_RETCODE enforceCardinality(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, int nconss, SCIP_CONS **conss, SCIP_RESULT *result)
static SCIP_RETCODE presolRoundCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_CONSDATA *consdata, SCIP_EVENTHDLR *eventhdlr, SCIP_Bool *cutoff, SCIP_Bool *success, int *ndelconss, int *nupgdconss, int *nfixedvars, int *nremovedvars)
#define DEFAULT_BRANCHBALANCED
static SCIP_RETCODE catchVarEventCardinality(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_CONSDATA *consdata, SCIP_VAR *var, SCIP_VAR *indvar, int pos, SCIP_EVENTDATA **eventdata)
static SCIP_RETCODE addVarCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_CONSHDLRDATA *conshdlrdata, SCIP_VAR *var, SCIP_VAR *indvar, SCIP_Real weight)
static SCIP_RETCODE separateCardinality(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, int nconss, SCIP_CONS **conss, SCIP_RESULT *result)
static SCIP_RETCODE handleNewVariableCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_CONSDATA *consdata, SCIP_CONSHDLRDATA *conshdlrdata, SCIP_VAR *var, SCIP_VAR *indvar, int pos, SCIP_Bool transformed, SCIP_EVENTDATA **eventdata)
#define EVENTHDLR_EVENT_TYPE
static SCIP_RETCODE propCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_CONSDATA *consdata, SCIP_Bool *cutoff, int *nchgdomain)
static SCIP_RETCODE dropVarEventCardinality(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_CONSDATA *consdata, SCIP_VAR *var, SCIP_VAR *indvar, SCIP_EVENTDATA **eventdata)
static SCIP_RETCODE branchUnbalancedCardinality(SCIP *scip, SCIP_SOL *sol, SCIP_CONS *branchcons, SCIP_VAR **vars, SCIP_VAR **indvars, int nvars, int cardval, int branchnnonzero, int branchpos)
constraint handler for cardinality constraints
Constraint handler for knapsack constraints of the form , x binary and .
Constraint handler for linear constraints in their most general form, .
#define SCIP_LONGINT_FORMAT
SCIP_Real * SCIPgetWeightsCardinality(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsCardinality(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, int cardval, SCIP_VAR **indvars, SCIP_Real *weights, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPcreateConsBasicCardinality(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, int cardval, SCIP_VAR **indvars, SCIP_Real *weights)
int SCIPgetCardvalCardinality(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPappendVarCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_VAR *indvar)
SCIP_RETCODE SCIPcreateConsKnapsack(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Longint *weights, SCIP_Longint capacity, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPaddVarCardinality(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_VAR *indvar, SCIP_Real weight)
int SCIPgetNVarsCardinality(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_VAR ** SCIPgetVarsCardinality(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPchgCardvalCardinality(SCIP *scip, SCIP_CONS *cons, int cardval)
SCIP_RETCODE SCIPincludeConshdlrCardinality(SCIP *scip)
SCIP_RETCODE SCIPgetVarCopy(SCIP *sourcescip, SCIP *targetscip, SCIP_VAR *sourcevar, SCIP_VAR **targetvar, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_Bool global, SCIP_Bool *success)
SCIP_Bool SCIPisTransformed(SCIP *scip)
SCIP_Bool SCIPisStopped(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
int SCIPgetNVars(SCIP *scip)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPdelCons(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNTotalVars(SCIP *scip)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
void * SCIPhashmapGetImage(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapInsert(SCIP_HASHMAP *hashmap, void *origin, void *image)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPdelConsLocal(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPaddConsNode(SCIP *scip, SCIP_NODE *node, SCIP_CONS *cons, SCIP_NODE *validnode)
SCIP_Real SCIPgetLocalTransEstimate(SCIP *scip)
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPaddRealParam(SCIP *scip, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_Real SCIPcalcNodeselPriority(SCIP *scip, SCIP_VAR *var, SCIP_BRANCHDIR branchdir, SCIP_Real targetvalue)
SCIP_Real SCIPcalcChildEstimate(SCIP *scip, SCIP_VAR *var, SCIP_Real targetvalue)
SCIP_Real SCIPcalcChildEstimateIncrease(SCIP *scip, SCIP_VAR *var, SCIP_Real varsol, SCIP_Real targetvalue)
SCIP_RETCODE SCIPcreateChild(SCIP *scip, SCIP_NODE **node, SCIP_Real nodeselprio, SCIP_Real estimate)
SCIP_RETCODE SCIPsetConshdlrFree(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrPresol(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRESOL((*conspresol)), int maxprerounds, SCIP_PRESOLTIMING presoltiming)
SCIP_RETCODE SCIPsetConshdlrSepa(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSSEPALP((*conssepalp)), SCIP_DECL_CONSSEPASOL((*conssepasol)), int sepafreq, int sepapriority, SCIP_Bool delaysepa)
SCIP_RETCODE SCIPsetConshdlrProp(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPROP((*consprop)), int propfreq, SCIP_Bool delayprop, SCIP_PROPTIMING proptiming)
SCIP_RETCODE SCIPsetConshdlrEnforelax(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPincludeConshdlrBasic(SCIP *scip, SCIP_CONSHDLR **conshdlrptr, const char *name, const char *desc, int enfopriority, int chckpriority, int eagerfreq, SCIP_Bool needscons, SCIP_DECL_CONSENFOLP((*consenfolp)), SCIP_DECL_CONSENFOPS((*consenfops)), SCIP_DECL_CONSCHECK((*conscheck)), SCIP_DECL_CONSLOCK((*conslock)), SCIP_CONSHDLRDATA *conshdlrdata)
SCIP_RETCODE SCIPsetConshdlrParse(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrGetVars(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrPrint(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrGetSignedPermsymGraph(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPsetConshdlrCopy(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)),)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
SCIP_RETCODE SCIPsetConshdlrGetPermsymGraph(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrDelete(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_CONSHDLRDATA * SCIPconshdlrGetData(SCIP_CONSHDLR *conshdlr)
int SCIPconshdlrGetSepaFreq(SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPsetConshdlrTrans(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrExitsol(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrInitlp(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrGetNVars(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_CONSDATA * SCIPconsGetData(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
SCIP_RETCODE SCIPprintCons(SCIP *scip, SCIP_CONS *cons, FILE *file)
SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsTransformed(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateCons(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_CONSHDLR *conshdlr, SCIP_CONSDATA *consdata, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsLocal(SCIP_CONS *cons)
const char * SCIPconsGetName(SCIP_CONS *cons)
SCIP_RETCODE SCIPresetConsAge(SCIP *scip, SCIP_CONS *cons)
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsStickingAtNode(SCIP_CONS *cons)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
SCIP_Bool SCIPisCutEfficacious(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
const char * SCIPeventhdlrGetName(SCIP_EVENTHDLR *eventhdlr)
SCIP_EVENTTYPE SCIPeventGetType(SCIP_EVENT *event)
SCIP_RETCODE SCIPcatchVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
SCIP_RETCODE SCIPdropVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
SCIP_Real SCIPeventGetOldbound(SCIP_EVENT *event)
SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
SCIP_Real SCIPeventGetNewbound(SCIP_EVENT *event)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
int SCIPcalcMemGrowSize(SCIP *scip, int num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPduplicateBufferArray(scip, ptr, source, num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
SCIP_Real SCIProwGetLhs(SCIP_ROW *row)
SCIP_Real SCIProwGetRhs(SCIP_ROW *row)
SCIP_RETCODE SCIPcreateEmptyRowCons(SCIP *scip, SCIP_ROW **row, SCIP_CONS *cons, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
SCIP_Bool SCIProwIsInLP(SCIP_ROW *row)
SCIP_RETCODE SCIPaddVarsToRow(SCIP *scip, SCIP_ROW *row, int nvars, SCIP_VAR **vars, SCIP_Real *vals)
SCIP_RETCODE SCIPcreateSolCopy(SCIP *scip, SCIP_SOL **sol, SCIP_SOL *sourcesol)
void SCIPupdateSolConsViolation(SCIP *scip, SCIP_SOL *sol, SCIP_Real absviol, SCIP_Real relviol)
SCIP_RETCODE SCIPtrySol(SCIP *scip, SCIP_SOL *sol, SCIP_Bool printreason, SCIP_Bool completely, SCIP_Bool checkbounds, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool *stored)
SCIP_RETCODE SCIPsetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var, SCIP_Real val)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisPositive(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasPositive(SCIP *scip, SCIP_Real val)
int SCIPgetDepth(SCIP *scip)
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
SCIP_RETCODE SCIPlockVarCons(SCIP *scip, SCIP_VAR *var, SCIP_CONS *cons, SCIP_Bool lockdown, SCIP_Bool lockup)
SCIP_Real SCIPvarGetMultaggrConstant(SCIP_VAR *var)
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
SCIP_RETCODE SCIPchgVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
SCIP_VARSTATUS SCIPvarGetStatus(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_Bool SCIPvarIsTransformed(SCIP_VAR *var)
SCIP_RETCODE SCIPchgVarUbNode(SCIP *scip, SCIP_NODE *node, SCIP_VAR *var, SCIP_Real newbound)
SCIP_RETCODE SCIPparseVarName(SCIP *scip, const char *str, SCIP_VAR **var, char **endptr)
SCIP_RETCODE SCIPgetProbvarSum(SCIP *scip, SCIP_VAR **var, SCIP_Real *scalar, SCIP_Real *constant)
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPaddVarLocksType(SCIP *scip, SCIP_VAR *var, SCIP_LOCKTYPE locktype, int nlocksdown, int nlocksup)
SCIP_RETCODE SCIPunlockVarCons(SCIP *scip, SCIP_VAR *var, SCIP_CONS *cons, SCIP_Bool lockdown, SCIP_Bool lockup)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
SCIP_RETCODE SCIPflattenVarAggregationGraph(SCIP *scip, SCIP_VAR *var)
SCIP_VAR ** SCIPvarGetMultaggrVars(SCIP_VAR *var)
int SCIPvarGetMultaggrNVars(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_RETCODE SCIPcreateVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPmarkDoNotMultaggrVar(SCIP *scip, SCIP_VAR *var)
SCIP_RETCODE SCIPfixVar(SCIP *scip, SCIP_VAR *var, SCIP_Real fixedval, SCIP_Bool *infeasible, SCIP_Bool *fixed)
SCIP_RETCODE SCIPchgVarLbNode(SCIP *scip, SCIP_NODE *node, SCIP_VAR *var, SCIP_Real newbound)
SCIP_RETCODE SCIPwriteVarName(SCIP *scip, FILE *file, SCIP_VAR *var, SCIP_Bool type)
SCIP_RETCODE SCIPgetTransformedVar(SCIP *scip, SCIP_VAR *var, SCIP_VAR **transvar)
SCIP_Bool SCIPallowStrongDualReds(SCIP *scip)
SCIP_Real * SCIPvarGetMultaggrScalars(SCIP_VAR *var)
void SCIPsortRealPtrPtr(SCIP_Real *realarray, void **ptrarray1, void **ptrarray2, int len)
int SCIPsnprintf(char *t, int len, const char *s,...)
SCIP_RETCODE SCIPskipSpace(char **s)
SCIP_RETCODE SCIPaddSymgraphEdge(SCIP *scip, SYM_GRAPH *graph, int first, int second, SCIP_Bool hasval, SCIP_Real val)
SCIP_RETCODE SCIPaddSymgraphOpnode(SCIP *scip, SYM_GRAPH *graph, int op, int *nodeidx)
SCIP_RETCODE SCIPgetSymActiveVariables(SCIP *scip, SYM_SYMTYPE symtype, SCIP_VAR ***vars, SCIP_Real **scalars, int *nvars, SCIP_Real *constant, SCIP_Bool transformed)
SCIP_RETCODE SCIPaddSymgraphValnode(SCIP *scip, SYM_GRAPH *graph, SCIP_Real val, int *nodeidx)
int SCIPgetSymgraphVarnodeidx(SCIP *scip, SYM_GRAPH *graph, SCIP_VAR *var)
SCIP_RETCODE SCIPaddSymgraphConsnode(SCIP *scip, SYM_GRAPH *graph, SCIP_CONS *cons, SCIP_Real lhs, SCIP_Real rhs, int *nodeidx)
SCIP_RETCODE SCIPaddSymgraphVarAggregation(SCIP *scip, SYM_GRAPH *graph, int rootidx, SCIP_VAR **vars, SCIP_Real *vals, int nvars, SCIP_Real constant)
int SCIPgetSymgraphNegatedVarnodeidx(SCIP *scip, SYM_GRAPH *graph, SCIP_VAR *var)
SCIPfreeSol(scip, &heurdata->sol))
assert(minobj< SCIPgetCutoffbound(scip))
static SCIP_Bool propagate
memory allocation routines
public methods for managing constraints
public methods for managing events
public methods for LP management
public methods for message output
public data structures and miscellaneous methods
methods for sorting joint arrays of various types
public methods for problem variables
public methods for branching rule plugins and branching
public methods for constraint handler plugins and constraints
public methods for problem copies
public methods for cuts and aggregation rows
public methods for event handler plugins and event handlers
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for solutions
public methods for querying solving statistics
public methods for the branch-and-bound tree
public methods for SCIP variables
static SCIP_RETCODE separate(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
Main separation function.
structs for symmetry computations
methods for dealing with symmetry detection graphs
#define SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH(x)
#define SCIP_DECL_CONSGETPERMSYMGRAPH(x)
#define SCIP_DECL_CONSENFOLP(x)
#define SCIP_DECL_CONSDELETE(x)
struct SCIP_Cons SCIP_CONS
#define SCIP_DECL_CONSGETVARS(x)
#define SCIP_DECL_CONSPRINT(x)
struct SCIP_ConshdlrData SCIP_CONSHDLRDATA
#define SCIP_DECL_CONSSEPALP(x)
#define SCIP_DECL_CONSENFORELAX(x)
#define SCIP_DECL_CONSPROP(x)
#define SCIP_DECL_CONSGETNVARS(x)
#define SCIP_DECL_CONSENFOPS(x)
#define SCIP_DECL_CONSPARSE(x)
#define SCIP_DECL_CONSTRANS(x)
#define SCIP_DECL_CONSPRESOL(x)
#define SCIP_DECL_CONSINITLP(x)
#define SCIP_DECL_CONSLOCK(x)
struct SCIP_Conshdlr SCIP_CONSHDLR
#define SCIP_DECL_CONSCOPY(x)
struct SCIP_ConsData SCIP_CONSDATA
#define SCIP_DECL_CONSCHECK(x)
#define SCIP_DECL_CONSHDLRCOPY(x)
#define SCIP_DECL_CONSEXITSOL(x)
#define SCIP_DECL_CONSFREE(x)
#define SCIP_DECL_CONSSEPASOL(x)
struct SCIP_Eventhdlr SCIP_EVENTHDLR
#define SCIP_EVENTTYPE_BOUNDCHANGED
#define SCIP_EVENTTYPE_GUBCHANGED
#define SCIP_EVENTTYPE_GBDCHANGED
struct SCIP_EventData SCIP_EVENTDATA
#define SCIP_EVENTTYPE_UBTIGHTENED
#define SCIP_DECL_EVENTEXEC(x)
#define SCIP_EVENTTYPE_LBRELAXED
#define SCIP_EVENTTYPE_GLBCHANGED
#define SCIP_EVENTTYPE_LBTIGHTENED
@ SCIP_BRANCHDIR_DOWNWARDS
struct SCIP_HashMap SCIP_HASHMAP
enum SCIP_Result SCIP_RESULT
enum SCIP_Retcode SCIP_RETCODE
@ SYM_CONSOPTYPE_CARD_TUPLE
struct SCIP_Node SCIP_NODE
@ SCIP_VARSTATUS_MULTAGGR