85 #define PROP_NAME "vbounds" 86 #define PROP_DESC "propagates variable upper and lower bounds" 87 #define PROP_TIMING SCIP_PROPTIMING_BEFORELP | SCIP_PROPTIMING_AFTERLPLOOP 88 #define PROP_PRIORITY 3000000 90 #define PROP_DELAY FALSE 92 #define PROP_PRESOL_PRIORITY -90000 93 #define PROP_PRESOLTIMING SCIP_PRESOLTIMING_MEDIUM | SCIP_PRESOLTIMING_EXHAUSTIVE 94 #define PROP_PRESOL_MAXROUNDS -1 103 #define EVENTHDLR_NAME "vbounds" 104 #define EVENTHDLR_DESC "bound change event handler for for vbounds propagator" 113 #define DEFAULT_USEBDWIDENING TRUE 114 #define DEFAULT_USEIMPLICS FALSE 115 #define DEFAULT_USECLIQUES FALSE 116 #define DEFAULT_USEVBOUNDS TRUE 117 #define DEFAULT_DOTOPOSORT TRUE 118 #define DEFAULT_SORTCLIQUES FALSE 119 #define DEFAULT_DETECTCYCLES FALSE 120 #define DEFAULT_MINNEWCLIQUES 0.1 121 #define DEFAULT_MAXCLIQUESMEDIUM 50.0 123 #define DEFAULT_MAXCLIQUESEXHAUSTIVE 100.0 139 #define getLbIndex(idx) (2*(idx)) 140 #define getUbIndex(idx) (2*(idx)+1) 141 #define getVarIndex(idx) ((idx)/2) 142 #define getBoundtype(idx) (((idx) % 2 == 0) ? SCIP_BOUNDTYPE_LOWER : SCIP_BOUNDTYPE_UPPER) 143 #define isIndexLowerbound(idx) ((idx) % 2 == 0) 144 #define getBoundString(lower) ((lower) ? "lb" : "ub") 145 #define getBoundtypeString(type) ((type) == SCIP_BOUNDTYPE_LOWER ? "lower" : "upper") 146 #define indexGetBoundString(idx) (getBoundString(isIndexLowerbound(idx))) 147 #define getOtherBoundIndex(idx) ((idx) + 1 - 2 * ((idx) % 2)) 168 int** vboundboundedidx;
179 int lastpresolncliques;
203 unsigned int boundtype:1;
208 typedef struct InferInfo INFERINFO;
218 inferinfo.val.asint = i;
229 return inferinfo.val.asint;
249 return (
int) inferinfo.val.asbits.pos;
262 assert((
int)boundtype >= 0 && (
int)boundtype <= 1);
265 inferinfo.val.asbits.pos = (
unsigned int) pos;
266 inferinfo.val.asbits.boundtype = (
unsigned int) boundtype;
305 propdata->vars = NULL;
306 propdata->varhashmap = NULL;
307 propdata->topoorder = NULL;
308 propdata->vboundboundedidx = NULL;
309 propdata->vboundcoefs = NULL;
310 propdata->vboundconstants = NULL;
311 propdata->nvbounds = NULL;
312 propdata->vboundsize = NULL;
313 propdata->nbounds = 0;
314 propdata->initialized =
FALSE;
333 assert(scip != NULL);
334 assert(propdata != NULL);
335 assert(propdata->vars != NULL);
336 assert(propdata->topoorder != NULL);
339 eventhdlr = propdata->eventhdlr;
340 assert(eventhdlr != NULL);
342 vars = propdata->vars;
343 nbounds = propdata->nbounds;
346 for( v = 0; v < nbounds; ++v )
348 idx = propdata->topoorder[v];
349 assert(idx >= 0 && idx < nbounds);
360 propdata->topoorder[v] = -1;
392 assert(propdata != NULL);
394 eventhdlr = propdata->eventhdlr;
395 assert(eventhdlr != NULL);
397 vars = propdata->vars;
398 nbounds = propdata->nbounds;
400 for( v = 0; v < nbounds; ++v )
402 idx = propdata->topoorder[v];
407 assert(idx >= 0 && idx < nbounds);
424 #define INITMEMSIZE 5 439 assert(scip != NULL);
440 assert(propdata != NULL);
442 if( propdata->vboundsize[startidx] == 0 )
451 else if( propdata->nvbounds[startidx] >= propdata->vboundsize[startidx] )
454 propdata->vboundsize[startidx] =
SCIPcalcMemGrowSize(scip, propdata->nvbounds[startidx] + 1);
455 assert(propdata->nvbounds[startidx] < propdata->vboundsize[startidx]);
462 nvbounds = propdata->nvbounds[startidx];
463 propdata->vboundboundedidx[startidx][nvbounds] = endidx;
464 propdata->vboundcoefs[startidx][nvbounds] = coef;
465 propdata->vboundconstants[startidx][nvbounds] = constant;
466 (propdata->nvbounds[startidx])++;
477 int idx1 = (int)(
size_t)elem1;
478 int idx2 = (int)(
size_t)elem2;
515 assert(scip != NULL);
516 assert(propdata != NULL);
518 vars = propdata->vars;
521 cycleidx = dfsstack[stacksize - 1];
537 for( j = stacksize - 2; dfsstack[j] != startidx && j >= 0; --j ){};
540 for( ; j < stacksize - 1; ++j )
546 ntmpimpls = (propdata->useimplics ?
SCIPvarGetNImpls(currvar, currlower) : 0);
551 if( stacknextedge[j] <= 0 )
554 #if defined(SCIP_DEBUG) || defined(SCIP_MORE_DEBUG) 574 if( currlower != nextlower )
577 constant = -constant + 1.0;
585 #if defined(SCIP_DEBUG) || defined(SCIP_MORE_DEBUG) 586 if( stacknextedge[j] == 0 )
593 assert(stacknextedge[j] <= -2);
595 k = -stacknextedge[j] - 2;
597 assert(k < ntmpcliques);
605 for( v = 0; v < ncliquevars; ++v )
611 #ifdef SCIP_MORE_DEBUG 612 for( v = 0; v < ncliquevars; ++v )
614 if( cliquevars[v] == vars[
getVarIndex(dfsstack[j+1])] && cliquevals[v] == !nextlower )
617 assert(v < ncliquevars);
620 SCIPdebugMsg(scip,
"%s(%s) -- (*%g + %g)[clique(<%s%s>,<%s%s>,...)] --> %s(%s)\n",
622 (currlower != nextlower ? -1.0 : 1.0),
623 (currlower != nextlower ? 1.0 : 0.0),
633 else if( stacknextedge[j] <= ntmpimpls )
644 k = stacknextedge[j] - 1;
659 newconstant = implbounds[k];
676 newconstant = implbounds[k];
680 coef = coef * newcoef;
681 constant = constant * newcoef + newconstant;
685 newcoef, newconstant,
691 assert(stacknextedge[j] > ntmpimpls);
693 k = stacknextedge[j] - ntmpimpls - 1;
694 assert(k < propdata->nvbounds[dfsstack[j]]);
695 assert(propdata->vboundboundedidx[dfsstack[j]][k] == dfsstack[j+1]);
699 propdata->vboundcoefs[dfsstack[j]][k], propdata->vboundconstants[dfsstack[j]][k],
702 coef = coef * propdata->vboundcoefs[dfsstack[j]][k];
703 constant = constant * propdata->vboundcoefs[dfsstack[j]][k] + propdata->vboundconstants[dfsstack[j]][k];
707 SCIPdebugMsg(scip,
"==> %s(%s) -- (*%g + %g) --> %s(%s)\n",
729 SCIPdebugMsg(scip,
"-> infeasible aggregated variable bound relation 0 >= %g\n", constant);
734 SCIPdebugMsg(scip,
"-> infeasible aggregated variable bound relation 0 <= %g\n", constant);
742 newbound = constant / (1.0 - coef);
796 int visitedflag = (propdata->detectcycles ?
ACTIVE :
VISITED);
798 assert(startnode >= 0);
799 assert(startnode < propdata->nbounds);
800 assert(visited != NULL);
801 assert(visited[startnode] == 0);
802 assert(dfsstack != NULL);
803 assert(dfsnodes != NULL);
804 assert(ndfsnodes != NULL);
805 assert(infeasible != NULL);
809 vars = propdata->vars;
812 dfsstack[0] = startnode;
813 stacknextedge[0] = 0;
818 while( stacksize > 0 )
821 curridx = dfsstack[stacksize - 1];
824 assert((visited[curridx] != 0) == (stacknextedge[stacksize - 1] != 0));
825 visited[curridx] = visitedflag;
836 if( propdata->sortcliques && propdata->usecliques && stacknextedge[stacksize - 1] == 0 )
837 stacknextedge[stacksize - 1] = -1;
842 if( propdata->sortcliques && propdata->usecliques && stacknextedge[stacksize - 1] < 0 )
854 assert(stacknextedge[stacksize - 1] == -1 || -stacknextedge[stacksize - 1] - 1 <= ncliques);
857 for( j = -stacknextedge[stacksize - 1] - 1; j < ncliques; ++j )
867 for( i = 0; i < ncliquevars; ++i )
869 if( cliquevars[i] == startvar )
885 dfsstack[stacksize] = idx;
886 stacknextedge[stacksize - 1] = -j - 2;
889 visited[idx] ==
ACTIVE, infeasible) );
896 if( idx >= 0 && !visited[idx] )
910 assert(!visited[idx]);
911 assert(j < ncliques);
917 dfsstack[stacksize] = idx;
918 stacknextedge[stacksize] = 0;
919 stacknextedge[stacksize - 1] = -j - 2;
921 assert(stacksize <= propdata->nbounds);
929 stacknextedge[stacksize - 1] = 0;
932 assert(stacknextedge[stacksize - 1] >= 0);
935 if( propdata->useimplics )
939 if( stacknextedge[stacksize - 1] < nimpls )
950 for( i = stacknextedge[stacksize - 1]; i < nimpls; ++i )
961 if( propdata->usecliques && !propdata->sortcliques && implids[i] < 0 )
975 dfsstack[stacksize] = idx;
976 stacknextedge[stacksize - 1] = i + 1;
979 visited[idx] ==
ACTIVE, infeasible) );
986 if( idx >= 0 && !visited[idx] )
993 assert(!visited[idx]);
999 dfsstack[stacksize] = idx;
1000 stacknextedge[stacksize] = 0;
1001 stacknextedge[stacksize - 1] = i + 1;
1003 assert(stacksize <= propdata->nbounds);
1010 stacknextedge[stacksize - 1] = nimpls;
1014 assert(stacknextedge[stacksize - 1] >= nimpls);
1017 if( propdata->usevbounds )
1023 nvbounds = propdata->nvbounds[curridx];
1024 vboundidx = propdata->vboundboundedidx[curridx];
1027 for( i = stacknextedge[stacksize - 1] - nimpls; i < nvbounds; ++i )
1037 dfsstack[stacksize] = idx;
1038 stacknextedge[stacksize - 1] = nimpls + i + 1;
1044 visited[idx] ==
ACTIVE, infeasible) );
1061 assert(!visited[idx]);
1067 dfsstack[stacksize] = idx;
1068 stacknextedge[stacksize] = 0;
1069 stacknextedge[stacksize - 1] = nimpls + i + 1;
1071 assert(stacksize <= propdata->nbounds);
1085 dfsnodes[(*ndfsnodes)] = curridx;
1086 assert(visited[curridx] == visitedflag);
1109 assert(scip != NULL);
1110 assert(propdata != NULL);
1111 assert(infeasible != NULL);
1113 nbounds = propdata->nbounds;
1125 for( i = 0; i < nbounds && !(*infeasible); ++i )
1129 SCIP_CALL(
dfs(scip, propdata, i, visited, dfsstack, stacknextedge, propdata->topoorder, &nsortednodes, infeasible) );
1132 assert((nsortednodes == nbounds) || (*infeasible));
1157 assert(scip != NULL);
1158 assert(prop != NULL);
1159 assert(infeasible != NULL);
1163 assert(propdata != NULL);
1164 assert(!propdata->initialized);
1170 nbounds = 2 * nvars;
1172 *infeasible =
FALSE;
1175 propdata->nbounds = nbounds;
1180 propdata->initialized =
TRUE;
1193 for( v = 0; v < nvars; ++v )
1211 for( v = 0; v < nbounds; ++v )
1213 propdata->topoorder[v] = v;
1214 propdata->vboundboundedidx[v] = NULL;
1215 propdata->vboundcoefs[v] = NULL;
1216 propdata->vboundconstants[v] = NULL;
1217 propdata->nvbounds[v] = 0;
1218 propdata->vboundsize[v] = 0;
1222 for( v = 0; v < nbounds; ++v )
1252 for( n = 0; n < nvbvars; ++n )
1260 constant = constants[n];
1261 assert(vbvar != NULL);
1265 assert(vbvar != NULL);
1275 assert(startidx >= 0);
1285 SCIPdebugMsg(scip,
"varbound <%s> %s %g * <%s> + %g not added to propagator data due to reverse implication\n",
1293 SCIPdebugMsg(scip,
"varbound <%s> %s %g * <%s> + %g added to propagator data\n",
1302 if( propdata->dotoposort )
1324 assert(propdata != NULL);
1327 SCIPdebugMsg(scip,
" -> add %s bound of variable <%s> as reason\n",
1386 relaxedbd = (inferlb - 1.0 + 2*
SCIPfeastol(scip) - constant) / coef;
1388 relaxedbd = (inferlb - constant) / coef;
1418 assert(scip != NULL);
1419 assert(propdata != NULL);
1420 assert(infervar != NULL);
1430 if( canwide && propdata->usebdwidening )
1435 SCIPdebugMsg(scip,
"try to create conflict using bound widening order: inference variable, variable bound variable\n");
1445 relaxedub = inferlb - 1.0;
1457 relaxedub = relaxedub + 1.0;
1501 relaxedbd = (inferub + 1.0 - 2*
SCIPfeastol(scip) - constant) / coef;
1503 relaxedbd = (inferub - constant) / coef;
1532 assert(scip != NULL);
1533 assert(propdata != NULL);
1534 assert(infervar != NULL);
1544 if( canwide && propdata->usebdwidening )
1549 SCIPdebugMsg(scip,
"try to create conflict using bound widening order: inference variable, variable bound variable\n");
1559 relaxedlb = inferub + 1.0;
1571 relaxedlb = relaxedlb - 1.0;
1623 INFERINFO inferinfo;
1628 assert(scip != NULL);
1629 assert(prop != NULL);
1630 assert(propdata != NULL);
1631 assert(var != NULL);
1632 assert(nchgbds != NULL);
1633 assert(result != NULL);
1661 SCIPdebugMsg(scip,
"tightening%s lower bound of variable <%s> to %g due the %s bound of variable <%s> led to infeasibility\n",
1676 else if( tightened )
1678 SCIPdebugMsg(scip,
"tightened%s lower bound of variable <%s> to %g due the %s bound of variable <%s>\n",
1707 INFERINFO inferinfo;
1712 assert(scip != NULL);
1713 assert(prop != NULL);
1714 assert(propdata != NULL);
1715 assert(var != NULL);
1716 assert(nchgbds != NULL);
1717 assert(result != NULL);
1745 SCIPdebugMsg(scip,
"tightening%s upper bound of variable <%s> to %g due the %s bound of variable <%s> led to infeasibility\n",
1760 else if( tightened )
1762 SCIPdebugMsg(scip,
"tightened%s upper bound of variable <%s> to %g due the %s bound of variable <%s>\n",
1794 assert(scip != NULL);
1795 assert(prop != NULL);
1796 assert(result != NULL);
1805 assert(propdata != NULL);
1808 if( !propdata->initialized )
1820 assert(propdata->nbounds == 0 || propdata->propqueue != NULL);
1822 vars = propdata->vars;
1823 nbounds = propdata->nbounds;
1834 for( v = nbounds - 1; v >= 0; --v )
1836 idx = propdata->topoorder[v];
1837 if( idx != -1 && !propdata->inqueue[v] )
1845 propdata->inqueue[v] =
TRUE;
1868 assert(propdata->inqueue[topopos]);
1869 startpos = propdata->topoorder[topopos];
1870 assert(startpos >= 0);
1871 propdata->inqueue[topopos] =
FALSE;
1878 global =
SCIPisEQ(scip, startbound, globalbound);
1880 SCIPdebugMsg(scip,
"propagate new %s bound of %g of variable <%s>:\n",
1890 if( lower != (startbound > 0.5) )
1894 if( propdata->useimplics )
1916 for( n = 0; n < nimplvars; ++n )
1921 if( implids[n] < 0 )
1933 starttype, force, 0.0, 0.0,
FALSE, &nchgbds, result) );
1938 starttype, force, 0.0, 0.0,
FALSE, &nchgbds, result) );
1948 if( propdata->usecliques )
1965 for( j = 0; j < ncliques; ++j )
1976 for( n = 0; n < ncliquevars; ++n )
1978 if( cliquevars[n] == startvar )
1986 force, 0.0, 0.0,
FALSE, &nchgbds, result) );
1992 force, 0.0, 0.0,
FALSE, &nchgbds, result) );
2003 if( propdata->usevbounds )
2011 for( n = 0; n < propdata->nvbounds[startpos]; ++n )
2013 boundedvar = vars[
getVarIndex(propdata->vboundboundedidx[startpos][n])];
2014 coef = propdata->vboundcoefs[startpos][n];
2015 constant = propdata->vboundconstants[startpos][n];
2018 newbound = startbound * coef + constant;
2023 SCIP_CALL(
tightenVarLb(scip, prop, propdata, boundedvar, newbound, global, startvar, starttype, force,
2024 coef, constant,
TRUE, &nchgbds, result) );
2028 SCIP_CALL(
tightenVarUb(scip, prop, propdata, boundedvar, newbound, global, startvar, starttype, force,
2029 coef, constant,
TRUE, &nchgbds, result) );
2038 SCIPdebugMsg(scip,
"tightened %d variable bounds\n", nchgbds);
2058 assert(scip != NULL);
2059 assert(prop != NULL);
2090 assert(propdata != NULL);
2092 propdata->lastpresolncliques = 0;
2105 assert(propdata != NULL);
2108 if( propdata->initialized )
2114 for( v = 0; v < propdata->nbounds; ++v )
2117 if( propdata->vboundsize[v] > 0 )
2176 int* stacknextclique,
2178 int* stacknextcliquevar,
2182 int* cliquefirstentry,
2185 int* cliquecurrentexit,
2198 int label = *startindex;
2204 assert(startnode >= 0);
2206 assert(nodeindex != NULL);
2207 assert(nodeindex[startnode] == 0);
2208 assert(nodelowlink != NULL);
2209 assert(nodelowlink[startnode] == 0);
2210 assert(dfsstack != NULL);
2211 assert(stacknextclique != NULL);
2212 assert(infeasible != NULL);
2214 *infeasible =
FALSE;
2219 dfsstack[0] = startnode;
2220 stacknextclique[0] = 0;
2221 stacknextcliquevar[0] = 0;
2222 predstackidx[0] = -1;
2232 while( stacksize > 0 )
2242 curridx = dfsstack[currstackidx];
2243 assert(nodelowlink[curridx] <= nodeindex[curridx]);
2249 if( nodeindex[curridx] == 0 )
2251 assert(!nodeonstack[curridx]);
2252 assert(stacknextclique[currstackidx] == 0);
2253 assert(stacknextcliquevar[currstackidx] == 0);
2254 nodeonstack[curridx] = 1;
2255 nodeindex[curridx] = label;
2256 nodelowlink[curridx] = label;
2266 for( j = 0; j < ncliques; ++j )
2277 SCIPdebugMsg(scip,
"clique %d [%d vars, stacksize: %d]...\n", clqidx, ncliquevars, stacksize);
2278 for(
int v = 0; v < ncliquevars; ++v )
2290 assert(stacknextclique[currstackidx] > 0 || stacknextcliquevar[currstackidx] > 0);
2291 assert(nodeindex[curridx] < label);
2293 assert(stacknextclique[currstackidx] >= 0);
2300 for( j = stacknextclique[currstackidx]; j < ncliques; ++j )
2314 if( stacknextcliquevar[currstackidx] == 0 )
2317 SCIPdebugMsg(scip,
"clique %d [%d vars, stacksize: %d]...\n", clqidx, ncliquevars, stacksize);
2318 for(
int v = 0; v < ncliquevars; ++v )
2325 if( cliquefirstentry[clqidx] == 0 )
2327 cliquefirstentry[clqidx] = curridx + 1;
2331 int cliquefirstentryidx = (cliquefirstentry[clqidx] > 0 ? cliquefirstentry[clqidx] : -cliquefirstentry[clqidx]) - 1;
2332 int infeasnode = -1;
2333 assert(cliquefirstentryidx != curridx);
2340 if( nodeonstack[cliquefirstentryidx] && !nodeinfeasible[cliquefirstentryidx] )
2344 infeasnode = cliquefirstentryidx;
2349 else if( nodeindex[cliquefirstentryidx] >= *startindex && !nodeinfeasible[startnode] )
2353 infeasnode = startnode;
2357 if( infeasnode >= 0 )
2365 infeasnodes[*ninfeasnodes] = infeasnode;
2366 nodeinfeasible[infeasnode] =
TRUE;
2372 if( cliquecurrentexit[clqidx] > 0
2374 && nodeonstack[cliquecurrentexit[clqidx] - 1]
2375 && nodeindex[cliquecurrentexit[clqidx] - 1] < nodelowlink[curridx] )
2377 nodelowlink[curridx] = nodeindex[cliquecurrentexit[clqidx] - 1];
2383 else if( cliquefirstentry[clqidx] > 0 )
2386 SCIPdebugMsg(scip,
"entering clique %d a second time\n", clqidx);
2391 if( nodeindex[idx] == 0 )
2394 else if( nodeonstack[idx] && nodeindex[idx] < nodelowlink[curridx] )
2395 nodelowlink[curridx] = nodeindex[idx];
2398 cliquefirstentry[clqidx] = -cliquefirstentry[clqidx];
2403 SCIPdebugMsg(scip,
"skip clique %d: visited more than twice already!\n", clqidx);
2406 stacknextcliquevar[currstackidx] = ncliquevars;
2411 for( i = stacknextcliquevar[currstackidx]; i < ncliquevars; ++i )
2413 if( cliquevars[i] == startvar )
2426 if( nodeindex[idx] == 0 )
2428 assert(!nodeonstack[idx]);
2429 stacknextcliquevar[currstackidx] = i + 1;
2433 else if( nodeonstack[idx] && nodeindex[idx] < nodelowlink[curridx] )
2435 nodelowlink[curridx] = nodeindex[idx];
2440 if( stacknextcliquevar[currstackidx] < ncliquevars )
2441 stacknextclique[currstackidx] = j;
2444 stacknextclique[currstackidx] = j + 1;
2445 stacknextcliquevar[currstackidx] = 0;
2451 assert(i == ncliquevars);
2452 stacknextclique[currstackidx] = j + 1;
2453 stacknextcliquevar[currstackidx] = 0;
2456 assert(found || j == ncliques);
2457 assert(found || stacknextclique[currstackidx] == ncliques);
2463 int infeasnode = -1;
2466 assert(!nodeonstack[idx]);
2467 assert(j < ncliques);
2468 assert(clqidx >= 0);
2473 if( nodeonstack[otheridx] && !nodeinfeasible[otheridx] )
2477 infeasnode = otheridx;
2482 else if( nodeindex[otheridx] >= *startindex && !nodeinfeasible[startnode] )
2486 infeasnode = startnode;
2489 if( infeasnode >= 0 )
2496 infeasnodes[*ninfeasnodes] = infeasnode;
2497 nodeinfeasible[infeasnode] =
TRUE;
2505 dfsstack[stacksize] = idx;
2506 stacknextclique[stacksize] = 0;
2507 stacknextcliquevar[stacksize] = 0;
2508 cliquecurrentexit[clqidx] = idx + 1;
2509 predstackidx[stacksize] = currstackidx;
2510 currstackidx = stacksize;
2520 assert(stacknextclique[currstackidx] == ncliques);
2525 if( nodelowlink[curridx] == nodeindex[curridx] )
2528 if( dfsstack[stacksize-1] != curridx )
2530 int sccvarspos = sccstarts[*nsccs];
2537 idx = dfsstack[stacksize];
2538 nodeonstack[idx] = 0;
2539 sccvars[sccvarspos] = idx;
2547 while( idx != curridx );
2550 sccstarts[*nsccs] = sccvarspos;
2559 idx = dfsstack[stacksize];
2560 nodeonstack[idx] = 0;
2561 assert(nodeindex[idx] > 0);
2565 if( topoorder != NULL && (stacksize > 0 || label > *startindex + 1) )
2567 topoorder[*nordered] = curridx;
2574 idx = dfsstack[predstackidx[currstackidx]];
2575 nodelowlink[idx] = MIN(nodelowlink[idx], nodelowlink[curridx]);
2576 currstackidx = predstackidx[currstackidx];
2580 *startindex = label;
2606 assert(scip != NULL);
2607 assert(vars != NULL);
2608 assert(infeasible != NULL);
2611 if( !(*infeasible) && ninfeasnodes > 0 )
2613 for( i = 0; i < ninfeasnodes; ++i )
2619 assert(nodeinfeasible[infeasnodes[i]]);
2620 nodeinfeasible[infeasnodes[i]] =
FALSE;
2624 SCIPdebugMsg(scip,
"fix <%s>[%d] to %g: inf=%d, fixed=%d\n",
2625 SCIPvarGetName(var), infeasnodes[i], lower ? 0.0 : 1.0, *infeasible, fixed);
2639 assert((*infeasible) || i == ninfeasnodes);
2642 for( ; i < ninfeasnodes; ++i )
2644 assert(nodeinfeasible[infeasnodes[i]]);
2645 nodeinfeasible[infeasnodes[i]] =
FALSE;
2648 if( !(*infeasible) && nsccs > 0 )
2651 for( i = 0; i < nsccs; ++i )
2659 assert(sccstarts[i] < sccstarts[i+1] - 1);
2662 startvar = vars[
getVarIndex(sccvars[sccstarts[i]])];
2665 for( v = sccstarts[i] + 1; v < sccstarts[i+1]; ++v )
2674 infeasible, &redundant, &aggregated) );
2676 SCIPdebugMsg(scip,
"aggregate <%s> + %g <%s> = %g: inf=%d, red=%d, aggr=%d\n",
2679 *infeasible, redundant, aggregated);
2713 int* stacknextclique;
2714 int* stacknextcliquevar;
2718 int* cliquefirstentry;
2719 int* cliquecurrentexit;
2736 assert(scip != NULL);
2739 assert(propdata != NULL);
2753 if( ncliques > propdata->maxcliquesexhaustive *
SCIPgetNBinVars(scip) )
2763 nbounds = 2 * nbinvars;
2798 for( i = 0; i < nbounds && !infeasible; ++i )
2800 if( nodeindex[i] == 0 )
2802 SCIP_CALL(
tarjan(scip, i, &startindex, nodeonstack, nodeindex, nodelowlink, nodeinfeasible,
2803 dfsstack, predstackidx, stacknextclique, stacknextcliquevar, topoorder, &nordered,
2804 cliquefirstentry, cliquecurrentexit, sccvars, sccstarts, &nsccs,
2805 infeasnodes, &ninfeasnodes, &infeasible) );
2808 assert(nordered <= nbounds);
2811 if( ninfeasnodes > 0 || nsccs > 0 )
2814 sccvars, sccstarts, nsccs, &infeasible, nfixedvars, naggrvars, result) );
2818 if( !infeasible && nordered > 0 )
2823 assert(nordered > 1);
2851 for( i = nordered - 1; i >= 0 && !infeasible; --i )
2855 assert(topoorder[i] < nbounds);
2864 if( nodeindex[startpos] == 0 )
2866 SCIP_CALL(
tarjan(scip, startpos, &startindex, nodeonstack, nodeindex, nodelowlink, nodeinfeasible,
2867 dfsstack, predstackidx, stacknextclique, stacknextcliquevar, NULL, NULL,
2868 cliquefirstentry, cliquecurrentexit, sccvars, sccstarts, &nsccs,
2869 infeasnodes, &ninfeasnodes, &infeasible) );
2875 if( ninfeasnodes > 0 || nsccs > 0 )
2878 sccvars, sccstarts, nsccs, &infeasible, nfixedvars, naggrvars, result) );
2888 for( i = 0; i < nbounds; ++i )
2890 assert(nodeinfeasible[i] ==
FALSE);
2945 assert(propdata != NULL);
2950 assert(pos < propdata->nbounds);
2952 vars = propdata->vars;
2953 assert(vars != NULL);
2955 assert(startvar != NULL);
2956 assert(startvar != infervar);
2958 SCIPdebugMsg(scip,
"explain %s bound change of variable <%s>\n",
2963 int* vboundboundedidx;
2970 nvbounds = propdata->nvbounds[pos];
2971 vboundboundedidx = propdata->vboundboundedidx[pos];
2974 assert(inferidx >= 0);
2976 for( b = 0; b < nvbounds; ++b )
2978 if( vboundboundedidx[b] == inferidx )
2981 assert(b < nvbounds);
2983 coef = propdata->vboundcoefs[pos][b];
2984 constant = propdata->vboundconstants[pos][b];
3020 assert(eventhdlr != NULL);
3023 assert(propdata != NULL);
3025 idx = (int) (
size_t) eventdata;
3045 if( !propdata->inqueue[idx] )
3048 propdata->inqueue[idx] =
TRUE;
3078 propExecVbounds, propdata) );
3079 assert(prop != NULL);
3095 "propagating/" PROP_NAME "/usebdwidening",
"should bound widening be used to initialize conflict analysis?",
3098 "propagating/" PROP_NAME "/useimplics",
"should implications be propagated?",
3101 "propagating/" PROP_NAME "/usecliques",
"should cliques be propagated?",
3104 "propagating/" PROP_NAME "/usevbounds",
"should vbounds be propagated?",
3107 "propagating/" PROP_NAME "/dotoposort",
"should the bounds be topologically sorted in advance?",
3110 "propagating/" PROP_NAME "/sortcliques",
"should cliques be regarded for the topological sort?",
3113 "propagating/" PROP_NAME "/detectcycles",
"should cycles in the variable bound graph be identified?",
3116 "propagating/" PROP_NAME "/minnewcliques",
"minimum percentage of new cliques to trigger another clique table analysis",
3119 "maximum number of cliques per variable to run clique table analysis in medium presolving",
3122 "maximum number of cliques per variable to run clique table analysis in exhaustive presolving",
3137 assert(prop != NULL);
3140 assert(propdata != NULL);
3155 assert(prop != NULL);
enum SCIP_Result SCIP_RESULT
#define PROP_PRESOL_MAXROUNDS
SCIP_RETCODE SCIPsetPropPresol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPPRESOL((*proppresol)), int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming)
static void resetPropdata(SCIP_PROPDATA *propdata)
#define DEFAULT_MAXCLIQUESEXHAUSTIVE
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
enum SCIP_BoundType SCIP_BOUNDTYPE
int SCIPpqueueNElems(SCIP_PQUEUE *pqueue)
#define PROP_PRESOL_PRIORITY
static SCIP_RETCODE addVbound(SCIP *scip, SCIP_PROPDATA *propdata, int startidx, int endidx, SCIP_Real coef, SCIP_Real constant)
SCIP_Bool SCIPinRepropagation(SCIP *scip)
SCIP_Real * SCIPvarGetVlbCoefs(SCIP_VAR *var)
#define DEFAULT_USEBDWIDENING
static SCIP_RETCODE resolvePropagation(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx)
SCIP_Real SCIPfeastol(SCIP *scip)
SCIP_VAR ** SCIPcliqueGetVars(SCIP_CLIQUE *clique)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_Real SCIPgetVarUbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
SCIP_STAGE SCIPgetStage(SCIP *scip)
static SCIP_Real computeRelaxedLowerbound(SCIP *scip, SCIP_VAR *var, SCIP_Real inferlb, SCIP_Real coef, SCIP_Real constant)
SCIP_Real SCIPgetVarLbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
static SCIP_RETCODE dropEvents(SCIP *scip, SCIP_PROPDATA *propdata)
#define DEFAULT_USECLIQUES
static SCIP_RETCODE analyzeConflictUpperbound(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *infervar, SCIP_Real inferub, SCIP_VAR *vbdvar, SCIP_BOUNDTYPE boundtype, SCIP_Real coef, SCIP_Real constant, SCIP_Bool canwide)
SCIP_RETCODE SCIPcatchVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
int SCIPvarGetNVlbs(SCIP_VAR *var)
#define SCIPallocClearBufferArray(scip, ptr, num)
SCIP_PROP * SCIPfindProp(SCIP *scip, const char *name)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
#define PROP_PRESOLTIMING
int SCIPcalcMemGrowSize(SCIP *scip, int num)
SCIP_Bool SCIPisPositive(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_CLIQUE ** SCIPvarGetCliques(SCIP_VAR *var, SCIP_Bool varfixing)
SCIP_RETCODE SCIPinferVarLbProp(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_PROP *inferprop, int inferinfo, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA
SCIP_Bool SCIPisFeasNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
int SCIPcliqueGetIndex(SCIP_CLIQUE *clique)
SCIP_Real SCIPadjustedVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real ub)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
#define DEFAULT_SORTCLIQUES
#define DEFAULT_MAXCLIQUESMEDIUM
SCIP_RETCODE SCIPcutoffNode(SCIP *scip, SCIP_NODE *node)
SCIP_Bool SCIPvarHasImplic(SCIP_VAR *var, SCIP_Bool varfixing, SCIP_VAR *implvar, SCIP_BOUNDTYPE impltype)
SCIP_Real SCIPgetConflictVarUb(SCIP *scip, SCIP_VAR *var)
enum SCIP_Retcode SCIP_RETCODE
SCIP_Bool SCIPcliqueIsEquation(SCIP_CLIQUE *clique)
SCIP_RETCODE SCIPaddConflictUb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx)
int SCIPvarGetNVubs(SCIP_VAR *var)
int SCIPvarGetProbindex(SCIP_VAR *var)
#define SCIP_EVENTTYPE_GLBCHANGED
static SCIP_DECL_PROPINITPRE(propInitpreVbounds)
SCIP_RETCODE SCIPaddConflictRelaxedLb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedlb)
static SCIP_DECL_PROPCOPY(propCopyVbounds)
SCIP_RETCODE SCIPinitConflictAnalysis(SCIP *scip, SCIP_CONFTYPE conftype, SCIP_Bool iscutoffinvolved)
SCIP_RETCODE SCIPtightenVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
#define SCIPfreeBlockMemory(scip, ptr)
void SCIPpqueueFree(SCIP_PQUEUE **pqueue)
static SCIP_BOUNDTYPE inferInfoGetBoundtype(INFERINFO inferinfo)
SCIP_VAR ** SCIPvarGetVlbVars(SCIP_VAR *var)
#define SCIPduplicateBufferArray(scip, ptr, source, num)
static SCIP_RETCODE analyzeConflictLowerbound(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *infervar, SCIP_Real inferlb, SCIP_VAR *vbdvar, SCIP_BOUNDTYPE boundtype, SCIP_Real coef, SCIP_Real constant, SCIP_Bool canwide)
void * SCIPhashmapGetImage(SCIP_HASHMAP *hashmap, void *origin)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
#define SCIPfreeBufferArray(scip, ptr)
SCIP_Real SCIPadjustedVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real lb)
#define isIndexLowerbound(idx)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_NODE * SCIPgetRootNode(SCIP *scip)
static int inferInfoToInt(INFERINFO inferinfo)
#define SCIPdebugMsgPrint
int SCIPvarGetNCliques(SCIP_VAR *var, SCIP_Bool varfixing)
int SCIPgetNContVars(SCIP *scip)
SCIP_RETCODE SCIPaddConflictLb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx)
SCIP_RETCODE SCIPincludePropVbounds(SCIP *scip)
int * SCIPvarGetImplIds(SCIP_VAR *var, SCIP_Bool varfixing)
static SCIP_RETCODE tightenVarLb(SCIP *scip, SCIP_PROP *prop, SCIP_PROPDATA *propdata, SCIP_VAR *var, SCIP_Real newlb, SCIP_Bool global, SCIP_VAR *vbdvar, SCIP_BOUNDTYPE boundtype, SCIP_Bool force, SCIP_Real coef, SCIP_Real constant, SCIP_Bool canwide, int *nchgbds, SCIP_RESULT *result)
#define DEFAULT_USEIMPLICS
const char * SCIPgetProbName(SCIP *scip)
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
SCIP_Bool SCIPisConflictAnalysisApplicable(SCIP *scip)
static SCIP_Real computeRelaxedUpperbound(SCIP *scip, SCIP_VAR *var, SCIP_Real inferub, SCIP_Real coef, SCIP_Real constant)
#define SCIPallocCleanBufferArray(scip, ptr, num)
variable upper and lower bound propagator
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
SCIP_Real SCIPeventGetNewbound(SCIP_EVENT *event)
#define SCIP_PRESOLTIMING_MEDIUM
static SCIP_DECL_EVENTEXEC(eventExecVbound)
#define indexGetBoundString(idx)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPexecPropVbounds(SCIP *scip, SCIP_Bool force, SCIP_RESULT *result)
SCIP_RETCODE SCIPgetProbvarSum(SCIP *scip, SCIP_VAR **var, SCIP_Real *scalar, SCIP_Real *constant)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
SCIP_Real SCIPgetConflictVarLb(SCIP *scip, SCIP_VAR *var)
SCIP_Real * SCIPvarGetVubConstants(SCIP_VAR *var)
struct SCIP_EventData SCIP_EVENTDATA
const char * SCIPvarGetName(SCIP_VAR *var)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
SCIP_RETCODE SCIPtightenVarLbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
static int varGetUbIndex(SCIP_PROPDATA *propdata, SCIP_VAR *var)
#define SCIP_EVENTTYPE_LBTIGHTENED
SCIP_Real * SCIPvarGetVlbConstants(SCIP_VAR *var)
SCIP_RETCODE SCIPinferVarUbProp(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_PROP *inferprop, int inferinfo, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
static INFERINFO intToInferInfo(int i)
#define DEFAULT_DOTOPOSORT
SCIP_Real * SCIPvarGetVubCoefs(SCIP_VAR *var)
static SCIP_DECL_PROPEXEC(propExecVbounds)
void * SCIPpqueueRemove(SCIP_PQUEUE *pqueue)
static SCIP_DECL_PROPEXITSOL(propExitsolVbounds)
static SCIP_RETCODE initData(SCIP *scip, SCIP_PROP *prop, SCIP_Bool *infeasible)
static int inferInfoGetPos(INFERINFO inferinfo)
#define SCIPallocBufferArray(scip, ptr, num)
SCIP_BOUNDTYPE * SCIPvarGetImplTypes(SCIP_VAR *var, SCIP_Bool varfixing)
SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
SCIP_EVENTTYPE SCIPeventGetType(SCIP_EVENT *event)
int SCIPgetNCliquesCreated(SCIP *scip)
#define getBoundtype(idx)
int SCIPvarGetNImpls(SCIP_VAR *var, SCIP_Bool varfixing)
static SCIP_RETCODE applyFixingsAndAggregations(SCIP *scip, SCIP_VAR **vars, int *infeasnodes, int ninfeasnodes, SCIP_Shortbool *nodeinfeasible, int *sccvars, int *sccstarts, int nsccs, SCIP_Bool *infeasible, int *nfixedvars, int *naggrvars, SCIP_RESULT *result)
SCIP_RETCODE SCIPaddConflictRelaxedUb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedub)
SCIP_Bool * SCIPcliqueGetValues(SCIP_CLIQUE *clique)
static SCIP_RETCODE dfs(SCIP *scip, SCIP_PROPDATA *propdata, int startnode, int *visited, int *dfsstack, int *stacknextedge, int *dfsnodes, int *ndfsnodes, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPsetPropCopy(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPCOPY((*propcopy)))
SCIP_RETCODE SCIPdropVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
static SCIP_RETCODE extractCycle(SCIP *scip, SCIP_PROPDATA *propdata, int *dfsstack, int *stacknextedge, int stacksize, SCIP_Bool samebound, SCIP_Bool *infeasible)
#define SCIPfreeMemoryArray(scip, ptr)
SCIP_RETCODE SCIPfixVar(SCIP *scip, SCIP_VAR *var, SCIP_Real fixedval, SCIP_Bool *infeasible, SCIP_Bool *fixed)
#define SCIPreallocMemoryArray(scip, ptr, newnum)
#define SCIP_EVENTTYPE_UBTIGHTENED
SCIP_Real * SCIPvarGetImplBounds(SCIP_VAR *var, SCIP_Bool varfixing)
SCIP_RETCODE SCIPsetPropExitsol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPEXITSOL((*propexitsol)))
int SCIPgetNBinVars(SCIP *scip)
const char * SCIPpropGetName(SCIP_PROP *prop)
int SCIPgetNVars(SCIP *scip)
static SCIP_RETCODE relaxVbdvar(SCIP *scip, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd)
#define getBoundString(lower)
SCIP_VAR ** SCIPvarGetImplVars(SCIP_VAR *var, SCIP_Bool varfixing)
static int varGetLbIndex(SCIP_PROPDATA *propdata, SCIP_VAR *var)
#define DEFAULT_MINNEWCLIQUES
static SCIP_RETCODE tarjan(SCIP *scip, int startnode, int *startindex, SCIP_Shortbool *nodeonstack, int *nodeindex, int *nodelowlink, SCIP_Shortbool *nodeinfeasible, int *dfsstack, int *predstackidx, int *stacknextclique, int *stacknextcliquevar, int *topoorder, int *nordered, int *cliquefirstentry, int *cliquecurrentexit, int *sccvars, int *sccstarts, int *nsccs, int *infeasnodes, int *ninfeasnodes, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPsetPropResprop(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPRESPROP((*propresprop)))
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
static INFERINFO getInferInfo(int pos, SCIP_BOUNDTYPE boundtype)
SCIP_RETCODE SCIPpqueueInsert(SCIP_PQUEUE *pqueue, void *elem)
static SCIP_RETCODE tightenVarUb(SCIP *scip, SCIP_PROP *prop, SCIP_PROPDATA *propdata, SCIP_VAR *var, SCIP_Real newub, SCIP_Bool global, SCIP_VAR *vbdvar, SCIP_BOUNDTYPE boundtype, SCIP_Bool force, SCIP_Real coef, SCIP_Real constant, SCIP_Bool canwide, int *nchgbds, SCIP_RESULT *result)
static SCIP_RETCODE catchEvents(SCIP *scip, SCIP_PROPDATA *propdata)
SCIP_RETCODE SCIPpqueueCreate(SCIP_PQUEUE **pqueue, int initsize, SCIP_Real sizefac, SCIP_DECL_SORTPTRCOMP((*ptrcomp)))
SCIP_Real SCIPgetHugeValue(SCIP *scip)
#define getOtherBoundIndex(idx)
int SCIPgetNCliques(SCIP *scip)
SCIP_Bool SCIPisFeasPositive(SCIP *scip, SCIP_Real val)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
SCIP_RETCODE SCIPaggregateVars(SCIP *scip, SCIP_VAR *varx, SCIP_VAR *vary, SCIP_Real scalarx, SCIP_Real scalary, SCIP_Real rhs, SCIP_Bool *infeasible, SCIP_Bool *redundant, SCIP_Bool *aggregated)
#define getBoundtypeString(type)
#define SCIPfreeCleanBufferArray(scip, ptr)
static SCIP_DECL_PROPPRESOL(propPresolVbounds)
struct SCIP_PropData SCIP_PROPDATA
#define DEFAULT_USEVBOUNDS
SCIP_RETCODE SCIPsetPropFree(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPFREE((*propfree)))
SCIP_VAR ** SCIPvarGetVubVars(SCIP_VAR *var)
SCIP_PROPDATA * SCIPpropGetData(SCIP_PROP *prop)
void SCIPpropSetData(SCIP_PROP *prop, SCIP_PROPDATA *propdata)
static SCIP_RETCODE propagateVbounds(SCIP *scip, SCIP_PROP *prop, SCIP_Bool force, SCIP_RESULT *result)
#define DEFAULT_DETECTCYCLES
static SCIP_DECL_SORTPTRCOMP(compVarboundIndices)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
int SCIPcliqueGetNVars(SCIP_CLIQUE *clique)
SCIP_RETCODE SCIPtightenVarUbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_RETCODE SCIPhashmapInsert(SCIP_HASHMAP *hashmap, void *origin, void *image)
#define BMSclearMemoryArray(ptr, num)
static SCIP_DECL_PROPRESPROP(propRespropVbounds)
#define SCIP_EVENTTYPE_GUBCHANGED
SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr)
SCIP_RETCODE SCIPsetPropInitpre(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPINITPRE((*propinitpre)))
SCIP_RETCODE SCIPcleanupCliques(SCIP *scip, SCIP_Bool *infeasible)
SCIP_Bool SCIPvarIsIntegral(SCIP_VAR *var)
SCIP_Bool SCIPisPropagatedVbounds(SCIP *scip)
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 SCIPanalyzeConflict(SCIP *scip, int validdepth, SCIP_Bool *success)
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_Bool SCIPvarIsActive(SCIP_VAR *var)
static SCIP_RETCODE topologicalSort(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPincludePropBasic(SCIP *scip, SCIP_PROP **propptr, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, SCIP_DECL_PROPEXEC((*propexec)), SCIP_PROPDATA *propdata)
static SCIP_DECL_PROPFREE(propFreeVbounds)