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;
2318 if( conshdlrdata->varhash !=
NULL )
2344 for(
c = 0;
c < nconss; ++
c )
2356 if( consdata->rowub !=
NULL )
2360 if( consdata->rowlb !=
NULL )
2367 if( conshdlrdata->varhash !=
NULL )
2399 for( j = 0; j < (*consdata)->nvars; ++j )
2402 (*consdata)->indvars[j], &(*consdata)->eventdatas[j]) );
2407 if( (*consdata)->weights !=
NULL )
2418 if( (*consdata)->rowub !=
NULL )
2422 if( (*consdata)->rowlb !=
NULL )
2442 if ( conshdlrdata->varhash !=
NULL )
2476 assert(sourcedata->nvars > 0);
2477 assert(sourcedata->nvars <= sourcedata->maxvars);
2482 consdata->cons =
NULL;
2483 consdata->nvars = sourcedata->nvars;
2484 consdata->maxvars = sourcedata->nvars;
2485 consdata->cardval = sourcedata->cardval;
2486 consdata->rowub =
NULL;
2487 consdata->rowlb =
NULL;
2488 consdata->eventdatascurrent =
NULL;
2489 consdata->neventdatascurrent = 0;
2490 consdata->ntreatnonzeros = 0;
2498 if( sourcedata->weights !=
NULL )
2503 consdata->weights =
NULL;
2505 for( j = 0; j < sourcedata->nvars; ++j )
2507 assert(sourcedata->vars[j] != 0);
2508 assert(sourcedata->indvars[j] != 0);
2514 ++(consdata->ntreatnonzeros);
2526 consdata->cons = *targetcons;
2530 for( j = 0; j < consdata->nvars; ++j )
2533 consdata->vars[j], consdata->indvars[j], j, &consdata->eventdatas[j]) );
2540 SCIPdebugMsg(
scip,
"constraint <%s> has %d variables fixed to be nonzero, allthough the constraint allows \
2541 only %d nonzero variables\n",
SCIPconsGetName(*targetcons), consdata->ntreatnonzeros, consdata->cardval);
2568 SCIPdebug( oldnfixedvars = *nfixedvars; )
2570 SCIPdebug( oldnupgdconss = *nupgdconss; )
2574 if( nrounds == 0 || nnewfixedvars > 0 || nnewaggrvars > 0 )
2584 for(
c = 0;
c < nconss; ++
c )
2597 assert(consdata->nvars >= 0);
2598 assert(consdata->nvars <= consdata->maxvars);
2603 ndelconss, nupgdconss, nfixedvars, &nremovedvars) );
2616 (*nchgcoefs) += nremovedvars;
2619 "and upgraded %d constraints.\n", *nfixedvars - oldnfixedvars, nremovedvars, *ndelconss - oldndelconss,
2620 *nupgdconss - oldnupgdconss); )
2734 for(
c = 0;
c < nconss; ++
c )
2745 cardval = consdata->cardval;
2749 for( j = 0; j < consdata->nvars; ++j )
2769 for( l = 0; l < consdata->nvars; ++l )
2811 for(
c = 0;
c < nconss; ++
c )
2833 if( nchgdomain > 0 )
2872 vars = consdata->vars;
2873 indvars = consdata->indvars;
2874 nvars = consdata->nvars;
2877 for( j = 0; j <
nvars; ++j )
2882 indvar = indvars[j];
2919 for( j = 0; j < consdata->nvars; ++j )
2925 if( consdata->indvars[j] !=
NULL )
2932 if( consdata->weights ==
NULL )
2953 const char* consname;
2977 nvars = sourceconsdata->nvars;
2982 sourcevars = sourceconsdata->vars;
2984 sourceindvars = sourceconsdata->indvars;
2986 sourceweights = sourceconsdata->weights;
3011 targetweights, initial,
separate, enforce, check,
propagate, local, dynamic, removable, stickingatnode) );
3044 SCIP_CALL(
SCIPcreateConsCardinality(
scip, cons, name, 0,
NULL, 0,
NULL,
NULL, initial,
separate, enforce, check,
propagate, local, dynamic, removable, stickingatnode) );
3063 while( *t !=
'\0' && *t !=
'(' && *t !=
'[' )
3068 SCIPerrorMessage(
"Syntax error: expected opening '[' or '(' at input: %s\n", s);
3082 if( indvar ==
NULL )
3084 SCIPerrorMessage(
"Syntax error: expected indicator variable name at input: %s\n", s);
3113 weight = strtod(s, &t);
3151 if( *success && *s ==
'<' && *(s+1) ==
'=' )
3158 cardval = (int)strtod(s, &t);
3162 SCIPerrorMessage(
"Syntax error during parsing of the cardinality restriction value: %s\n", s);
3184 if( varssize < 2 * consdata->
nvars )
3193 for (v = 0; v < consdata->nvars; ++v)
3195 vars[cnt++] = consdata->vars[v];
3196 vars[cnt++] = consdata->indvars[v];
3213 (*nvars) = 2 * consdata->nvars;
3240 nconsvars = consdata->nvars;
3251 for(
i = 0;
i < nconsvars; ++
i )
3257 vars[0] = consdata->vars[
i];
3278 else if( nlocvars == 1 )
3286 vars[0] = consdata->indvars[
i];
3307 else if( nlocvars == 1 )
3345 nconsvars = consdata->nvars;
3356 for(
i = 0;
i < nconsvars; ++
i )
3361 vars[0] = consdata->vars[
i];
3387 for( j = 0; j < nlocvars; ++j )
3401 else if( nlocvars == 1 )
3409 allownegation =
TRUE;
3428 vars[0] = consdata->indvars[
i];
3449 else if( nlocvars == 1 )
3488 consdata = eventdata->consdata;
3490 assert(0 <= consdata->ntreatnonzeros && consdata->ntreatnonzeros <= consdata->nvars);
3501 if( ( eventdata->varmarked &&
var == eventdata->var) || ( eventdata->indvarmarked &&
var == eventdata->indvar) )
3505 for(
i = 0;
i < consdata->neventdatascurrent; ++
i )
3507 if(
var == consdata->eventvarscurrent[
i] )
3543 if(
var == eventdata->indvar )
3549 ++(consdata->ntreatnonzeros);
3551 --(consdata->ntreatnonzeros);
3554 assert(oldbound == 1.0 && newbound == 0.0 );
3557 consdata->eventdatascurrent[consdata->neventdatascurrent] = eventdata;
3558 consdata->eventvarscurrent[consdata->neventdatascurrent] =
var;
3559 ++consdata->neventdatascurrent;
3560 eventdata->indvarmarked =
TRUE;
3561 assert(consdata->neventdatascurrent <= 4 * consdata->maxvars);
3564 assert(0 <= consdata->ntreatnonzeros && consdata->ntreatnonzeros <= consdata->nvars);
3569 if(
var == eventdata->var && ! eventdata->varmarked )
3577 consdata->eventdatascurrent[consdata->neventdatascurrent] = eventdata;
3578 consdata->eventvarscurrent[consdata->neventdatascurrent] =
var;
3579 ++consdata->neventdatascurrent;
3580 eventdata->varmarked =
TRUE;
3581 assert(consdata->neventdatascurrent <= 4 * consdata->maxvars );
3591 consdata->eventdatascurrent[consdata->neventdatascurrent] = eventdata;
3592 consdata->eventvarscurrent[consdata->neventdatascurrent] =
var;
3593 ++consdata->neventdatascurrent;
3594 eventdata->varmarked =
TRUE;
3595 assert(consdata->neventdatascurrent <= 4 * consdata->maxvars );
3600 assert(0 <= consdata->ntreatnonzeros && consdata->ntreatnonzeros <= consdata->nvars);
3602 SCIPdebugMsg(
scip,
"event exec cons <%s>: changed %s bound of variable <%s> from %g to %g (ntreatnonzeros: %d).\n",
3604 oldbound, newbound, consdata->ntreatnonzeros);
3621 conshdlrdata->eventhdlr =
NULL;
3622 conshdlrdata->varhash =
NULL;
3626 eventExecCardinality,
NULL) );
3627 if( conshdlrdata->eventhdlr ==
NULL )
3629 SCIPerrorMessage(
"event handler for cardinality constraints not found.\n");
3636 consEnfolpCardinality, consEnfopsCardinality, consCheckCardinality, consLockCardinality, conshdlrdata) );
3662 "whether to use balanced instead of unbalanced branching",
3666 "maximum depth for using balanced branching (-1: no limit)",
3670 "determines that balanced branching is only used if the branching cut off value "
3671 "w.r.t. the current LP solution is greater than a given value",
3732 for (v = 0; v <
nvars; ++v)
3739 if( conshdlr ==
NULL )
3746 if( indvars !=
NULL )
3748 for( v = 0; v <
nvars; ++v )
3767 consdata->cons =
NULL;
3768 consdata->vars =
NULL;
3769 consdata->indvars =
NULL;
3770 consdata->eventdatas =
NULL;
3771 consdata->nvars =
nvars;
3772 consdata->cardval = cardval;
3773 consdata->maxvars =
nvars;
3774 consdata->rowub =
NULL;
3775 consdata->rowlb =
NULL;
3776 consdata->eventdatascurrent =
NULL;
3777 consdata->eventvarscurrent =
NULL;
3778 consdata->neventdatascurrent = 0;
3779 consdata->ntreatnonzeros = transformed ? 0 : -1;
3780 consdata->weights =
NULL;
3788 if( indvars !=
NULL )
3794 if( conshdlrdata->varhash ==
NULL )
3801 for( v = 0; v <
nvars; ++v )
3818 consdata->indvars[v] = implvar;
3828 consdata->indvars[v] =
var;
3846 if( weights !=
NULL )
3861 SCIP_CALL(
SCIPcreateCons(
scip, cons, name, conshdlr, consdata, initial,
separate, enforce, check,
propagate,
3862 local, modifiable, dynamic, removable, stickingatnode) );
3864 consdata->cons = *cons;
3868 for( v =
nvars - 1; v >= 0; --v )
3883 consdata->indvars[v], v, transformed, &consdata->eventdatas[v]) );
3884 assert(! transformed || consdata->eventdatas[v] !=
NULL);
3911 SCIP_CALL(
SCIPcreateConsCardinality(
scip, cons, name,
nvars,
vars, cardval, indvars, weights,
TRUE,
TRUE,
TRUE,
TRUE,
3934 SCIPdebugMsg(
scip,
"modify right hand side of cardinality constraint from <%i> to <%i>\n", consdata->cardval, cardval);
3937 consdata->cardval = cardval;
4024 return consdata->nvars;
4043 return consdata->vars;
4062 return consdata->cardval;
4081 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_STRINGEQ(name, reference, retcode)
#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