|
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
prop_vbounds.c
Go to the documentation of this file.
22 * This propagator uses global bound information provided by SCIP to deduce global and local bound changes.
25 * - cliques (set of binary variables, each with a corresponding value, of which at most one variable can get the value)
26 * - variable lower/upper bounds (bounds of arbitrary variables that depend linearly on the value of another variable)
28 * The propagator does not look at a variable in whole, but at one point in time only handles one specific bound (lower
29 * or upper) of a variable and deduces changes for lower or upper bounds of other variables. The concept is as follows:
33 * Implications and cliques are stored in a way such that given a variable and its new value, we can access all bound
34 * changes that can be deduced from setting the variable to that value. However, for variable bounds, this currently
35 * does not hold, they are only stored in the other direction, i.e. for a bound of a given variable, we have a list
36 * of all other bounds of variables that directly influence the bound of the given variable and a linear function
38 * For the propagation, we need the other direction, thus we store it in the propagator data when the branch-and-bound
43 * We compute a topological order of the bounds of variables. This is needed to define an order in which we will
44 * regard bounds of variables in the propagation process in order to avoid unneccessarily regarding the same variable
45 * bound multiple times because it was changed in the meantime when propagating another bound of a variable.
46 * Therefore, we implictly regard a directed graph, in which each node corresponds to a bound of a variable and there
47 * exists a directed edge from one node to another, if the bound corresponding to the former node influences the
48 * bound corresponding to the latter node. This is done by iteratively running a DFS until all nodes were visited.
49 * Note that there might be cycles in the graph, which are randomly broken, so the order is only almost topological.
53 * For each bound of a variable, which can trigger bound changes of other variables, the propagator catches all
54 * events informing about a global change of the bound or a local toghtening of the bound. The event handler
55 * then adds the bound of the variable to a priority queue, with the key in the priority queue corresponding
60 * As long as there are bounds contained in the priority queue, the propagator pops one bound from the queue, which
61 * is the one most at the beginning of the topological sort, so it should not be influenced by propagating other
62 * bounds currently contained in the queue. Starting at this bound, all implication, clique, and variable bound
63 * information is used to deduce tigther bounds for other variables and change the bounds, if a tighter one is found.
64 * These bound changes trigger an event that will lead to adding the corresponding bound to the priority queue,
65 * if it is not contained, yet. The process is iterated until the priority queue contains no more bounds.
68 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
85 #define PROP_DELAY FALSE /**< should propagation method be delayed, if other propagators found reductions? */
104 #define DEFAULT_USEBDWIDENING TRUE /**< should bound widening be used to initialize conflict analysis? */
117 * The propagator works on indices representing a bound of a variable. This index will be called bound index in the
118 * following. For a given active variable with problem index i (note that active variables have problem indices
119 * between 0 and nactivevariable - 1), the bound index of its lower bound is 2*i, the bound index of its upper
120 * bound is 2*i + 1. The other way around, a given bound index i corresponds to the variable with problem index
122 * The following macros can be used to convert bound index into variable problem index and boundtype and vice versa.
143 SCIP_VAR** vars; /**< array containing all variable which are considered within the propagator */
154 SCIP_Real** vboundcoefs; /**< array storing for each bound index the coefficients in the variable
157 SCIP_Real** vboundconstants; /**< array storing for each bound index the constants in the variable
162 int nbounds; /**< number of bounds of variables regarded (two times number of active variables) */
163 SCIP_PQUEUE* propqueue; /**< priority queue to handle the bounds of variables that were changed and have to be propagated */
164 SCIP_Bool* inqueue; /**< boolean array to store whether a bound of a variable is already contained in propqueue */
261 assert(SCIPhashmapExists(propdata->varhashmap, var) == ((size_t)SCIPhashmapGetImage(propdata->varhashmap, var) > 0));
273 assert(SCIPhashmapExists(propdata->varhashmap, var) == ((size_t)SCIPhashmapGetImage(propdata->varhashmap, var) > 0));
337 if( propdata->nvbounds[idx] == 0 && SCIPvarGetNImpls(var, lower) == 0 && SCIPvarGetNCliques(var, lower) == 0 )
349 SCIP_CALL( SCIPcatchVarEvent(scip, var, eventtype, eventhdlr, (SCIP_EVENTDATA*) (size_t) v, NULL) ); /*lint !e571*/
398 SCIP_CALL( SCIPdropVarEvent(scip, var, eventtype, eventhdlr, (SCIP_EVENTDATA*) (size_t) v, -1) ); /*lint !e571*/
427 SCIP_CALL( SCIPreallocMemoryArray(scip, &propdata->vboundboundedidx[startidx], propdata->vboundsize[startidx]) ); /*lint !e866*/
428 SCIP_CALL( SCIPreallocMemoryArray(scip, &propdata->vboundcoefs[startidx], propdata->vboundsize[startidx]) ); /*lint !e866*/
429 SCIP_CALL( SCIPreallocMemoryArray(scip, &propdata->vboundconstants[startidx], propdata->vboundsize[startidx]) ); /*lint !e866*/
437 SCIP_CALL( SCIPreallocMemoryArray(scip, &propdata->vboundboundedidx[startidx], propdata->vboundsize[startidx]) ); /*lint !e866*/
438 SCIP_CALL( SCIPreallocMemoryArray(scip, &propdata->vboundcoefs[startidx], propdata->vboundsize[startidx]) ); /*lint !e866*/
439 SCIP_CALL( SCIPreallocMemoryArray(scip, &propdata->vboundconstants[startidx], propdata->vboundsize[startidx]) ); /*lint !e866*/
452 /** comparison method for two indices in the topoorder array, preferring higher indices because the order is reverse
464 /** performs depth-first-search in the implicitly given directed graph from the given start index */
506 /* we run until no more bounds indices are on the stack, i.e. all changed bounds were propagated */
524 /* stacknextedge is negative, if the last visited edge from the current node belongs to a clique;
573 /* we stopped because we found an unhandled node and not because we reached the end of the list */
619 /* it might happen that implications point to inactive variables (normally, those are removed when a
620 * variable becomes inactive, but in some cases, it cannot be done), we have to ignore these variables
625 /* implication is just a shortcut, so we dont regard it now, because will later go the long way, anyway;
631 idx = (impltypes[i] == SCIP_BOUNDTYPE_LOWER ? varGetLbIndex(propdata, implvars[i]) : varGetUbIndex(propdata, implvars[i]));
638 /* we stopped because we found an unhandled node and not because we reached the end of the list */
686 /* we stopped because we found an unhandled node and not because we reached the end of the list */
710 SCIPdebugMessage("topoorder[%d] = %s(%s)\n", *ndfsnodes, getBoundString(lower), SCIPvarGetName(startvar));
749 /* while there are unvisited nodes, run dfs starting from one of these nodes; the dfs orders are stored in the
750 * topoorder array, later dfs calls are just appended after the stacks of previous dfs calls, which gives us a
757 SCIP_CALL( dfs(scip, propdata, i, propdata->inqueue, dfsstack, stacknextedge, propdata->topoorder, &nsortednodes) );
812 /* we need to copy the variable since this array is the basis of the propagator and the corresponding variable array
816 SCIP_CALL( SCIPhashmapCreate(&propdata->varhashmap, SCIPblkmem(scip), SCIPcalcHashtableSize(5 * nvars)) );
820 SCIP_CALL( SCIPhashmapInsert(propdata->varhashmap, propdata->vars[v], (void*)(size_t)(v + 1)) );
895 /* if the coefficient is positive, the type of bound is the same for the bounded and the bounding variable */
903 * However, it might happen that vbvar was integer when the variable bound was added, but was converted
904 * to a binary variable later during presolving when its upper bound was changed to 1. In this case,
910 SCIPdebugMessage("varbound <%s> %s %g * <%s> + %g not added to propagator data due to reverse implication\n",
946 SCIP_BDCHGIDX* bdchgidx /**< the index of the bound change, representing the point of time where the change took place, or NULL for the current local bounds */
972 /** relaxes bound of give variable as long as the given inference bound still leads to a cutoff and add that bound
980 SCIP_BDCHGIDX* bdchgidx, /**< the index of the bound change, representing the point of time where the change took place, or NULL for the current local bounds */
997 /** compute the relaxed bound which is sufficient to propagate the inference lower bound of given variable */
1014 /* check the computed relaxed lower/upper bound is a proper reason for the inference bound which has to be explained */
1021 /** analyzes an infeasibility which was reached by updating the lower bound of the inference variable above its upper
1034 SCIP_Bool canwide /**< can bound widening be used (for vbounds) or not (for inplications or cliques) */
1040 assert(SCIPisEQ(scip, SCIPvarGetUbLocal(infervar), SCIPvarGetUbAtIndex(infervar, NULL, FALSE)));
1041 assert(SCIPisEQ(scip, SCIPvarGetUbAtIndex(infervar, NULL, TRUE), SCIPvarGetUbAtIndex(infervar, NULL, FALSE)));
1054 SCIPdebugMessage("try to create conflict using bound widening order: inference variable, variable bound variable\n");
1056 /* initialize conflict analysis, and add all variables of infeasible constraint to conflict candidate queue */
1080 /* compute the relaxed bound which is sufficient to propagate the inference lower bound of given variable */
1091 /* initialize conflict analysis, and add all variables of infeasible constraint to conflict candidate queue */
1107 /** compute the relaxed bound which is sufficient to propagate the inference upper bound of given variable */
1124 /* check the computed relaxed lower/upper bound is a proper reason for the inference bound which has to be explained */
1130 /** analyzes an infeasibility which was reached by updating the upper bound of the inference variable below its lower
1143 SCIP_Bool canwide /**< can bound widening be used (for vbounds) or not (for inplications or cliques) */
1149 assert(SCIPisEQ(scip, SCIPvarGetLbLocal(infervar), SCIPvarGetLbAtIndex(infervar, NULL, FALSE)));
1150 assert(SCIPisEQ(scip, SCIPvarGetLbAtIndex(infervar, NULL, TRUE), SCIPvarGetLbAtIndex(infervar, NULL, FALSE)));
1163 SCIPdebugMessage("try to create conflict using bound widening order: inference variable, variable bound variable\n");
1165 /* initialize conflict analysis, and add all variables of infeasible constraint to conflict candidate queue */
1189 /* compute the relaxed bound which is sufficient to propagate the inference upper bound of given variable */
1200 /* initialize conflict analysis, and add all variables of infeasible constraint to conflict candidate queue */
1233 SCIP_Bool canwide, /**< can bound widening be used (for vbounds) or not (for inplications or cliques) */
1265 inferinfo = getInferInfo(boundtype == SCIP_BOUNDTYPE_LOWER ? varGetLbIndex(propdata, vbdvar) : varGetUbIndex(propdata, vbdvar), boundtype);
1267 SCIP_CALL( SCIPinferVarLbProp(scip, var, newlb, prop, inferInfoToInt(inferinfo), force, &infeasible, &tightened) );
1272 /* the infeasible results comes from the fact that the new lower bound lies above the current upper bound */
1276 SCIPdebugMessage("tightening%s lower bound of variable <%s> to %g due the %s bound of variable <%s> led to infeasibility\n",
1277 (global ? " global" : ""), SCIPvarGetName(var), newlb, getBoundtypeString(boundtype), SCIPvarGetName(vbdvar));
1287 SCIP_CALL( analyzeConflictLowerbound(scip, propdata, var, newlb, vbdvar, boundtype, coef, constant, canwide) );
1293 SCIPdebugMessage("tightened%s lower bound of variable <%s> to %g due the %s bound of variable <%s>\n",
1294 (global ? " global" : ""), SCIPvarGetName(var), newlb, getBoundtypeString(boundtype), SCIPvarGetName(vbdvar));
1317 SCIP_Bool canwide, /**< can bound widening be used (for vbounds) or not (for inplications or cliques) */
1349 inferinfo = getInferInfo(boundtype == SCIP_BOUNDTYPE_LOWER ? varGetLbIndex(propdata, vbdvar) : varGetUbIndex(propdata, vbdvar), boundtype);
1351 SCIP_CALL( SCIPinferVarUbProp(scip, var, newub, prop, inferInfoToInt(inferinfo), force, &infeasible, &tightened) );
1356 /* the infeasible results comes from the fact that the new upper bound lies below the current lower bound */
1360 SCIPdebugMessage("tightening%s upper bound of variable <%s> to %g due the %s bound of variable <%s> led to infeasibility\n",
1361 (global ? " global" : ""), SCIPvarGetName(var), newub, getBoundtypeString(boundtype), SCIPvarGetName(vbdvar));
1371 SCIP_CALL( analyzeConflictUpperbound(scip, propdata, var, newub, vbdvar, boundtype, coef, constant, canwide) );
1377 SCIPdebugMessage("tightened%s upper bound of variable <%s> to %g due the %s bound of variable <%s>\n",
1378 (global ? " global" : ""), SCIPvarGetName(var), newub, getBoundtypeString(boundtype), SCIPvarGetName(vbdvar));
1415 /* we do not run the propagator in presolving, because we want to avoid doing the expensive creation of the graph twice */
1451 SCIP_CALL( SCIPpqueueInsert(propdata->propqueue, (void*)(size_t)(v + 1)) ); /*lint !e571 !e776*/
1458 /* return if no bound changes are in the priority queue (no changed bounds to handle since last propagation) */
1467 SCIPdebugMessage("varbound propagator: %d elements in the propagation queue\n", SCIPpqueueNElems(propdata->propqueue));
1469 /* get variable bound of highest priority from priority queue and try to deduce bound changes for other variables;
1496 /* we only propagate binary variables if the lower bound changed to 1.0 or the upper bound changed to 0.0 */
1505 /* if the lower bound of the startvar was changed, it was fixed to 1.0, otherwise it was fixed to 0.0;
1531 /* it might happen that implications point to inactive variables (normally, those are removed when a
1532 * variable becomes inactive, but in some cases, it cannot be done), we have to ignore these variables
1559 /* if the lower bound of the startvar was changed, it was fixed to 1.0, otherwise it was fixed to 0.0;
1630 SCIP_CALL( tightenVarLb(scip, prop, propdata, boundedvar, newbound, global, startvar, starttype, force,
1635 SCIP_CALL( tightenVarUb(scip, prop, propdata, boundedvar, newbound, global, startvar, starttype, force,
1690 /** solving process deinitialization method of propagator (called before branch and bound process data is freed) */
1795 inferidx = boundtype == SCIP_BOUNDTYPE_LOWER ? varGetLbIndex(propdata, infervar) : varGetUbIndex(propdata, infervar);
1809 /* compute the relaxed bound which is sufficient to propagate the inference bound of given variable */
1850 SCIPdebugMessage("eventexec (type=%u): try to add sort index %d: %s(%s) to priority queue\n", SCIPeventGetType(event),
1854 if( SCIPeventGetType(event) == SCIP_EVENTTYPE_GUBCHANGED && SCIPvarIsBinary(SCIPeventGetVar(event))
1858 if( SCIPeventGetType(event) == SCIP_EVENTTYPE_GLBCHANGED && SCIPvarIsBinary(SCIPeventGetVar(event))
1863 assert(SCIPvarGetType(propdata->vars[getVarIndex(propdata->topoorder[idx])]) != SCIP_VARTYPE_BINARY
1869 SCIP_CALL( SCIPpqueueInsert(propdata->propqueue, (void*)(size_t)(idx + 1)) ); /*lint !e571 !e776*/
1899 SCIP_CALL( SCIPincludePropBasic(scip, &prop, PROP_NAME, PROP_DESC, PROP_PRIORITY, PROP_FREQ, PROP_DELAY, PROP_TIMING,
1910 SCIP_CALL( SCIPincludeEventhdlrBasic(scip, &propdata->eventhdlr, EVENTHDLR_NAME, EVENTHDLR_DESC,
1914 "propagating/"PROP_NAME"/usebdwidening", "should bound widening be used to initialize conflict analysis?",
1935 /** returns TRUE if the propagator has the status that all variable lower and upper bounds are propgated */
SCIP_VAR ** SCIPvarGetImplVars(SCIP_VAR *var, SCIP_Bool varfixing) Definition: var.c:16679 SCIP_RETCODE SCIPsetPropExitsol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPEXITSOL((*propexitsol))) Definition: scip.c:6747 static SCIP_RETCODE addVbound(SCIP *scip, SCIP_PROPDATA *propdata, int startidx, int endidx, SCIP_Real coef, SCIP_Real constant) Definition: prop_vbounds.c:408 Definition: type_result.h:33 Definition: struct_var.h:97 static SCIP_RETCODE resolvePropagation(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx) Definition: prop_vbounds.c:941 static SCIP_Real computeRelaxedLowerbound(SCIP *scip, SCIP_VAR *var, SCIP_Real inferlb, SCIP_Real coef, SCIP_Real constant) Definition: prop_vbounds.c:999 Definition: struct_scip.h:52 static SCIP_RETCODE dropEvents(SCIP *scip, SCIP_PROPDATA *propdata) Definition: prop_vbounds.c:358 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) Definition: prop_vbounds.c:1134 SCIP_CLIQUE ** SCIPvarGetCliques(SCIP_VAR *var, SCIP_Bool varfixing) Definition: var.c:16748 Definition: struct_misc.h:63 Definition: type_result.h:49 Definition: struct_var.h:196 SCIP_Bool SCIPisConflictAnalysisApplicable(SCIP *scip) Definition: scip.c:22044 SCIP_RETCODE SCIPgetProbvarSum(SCIP *scip, SCIP_VAR **var, SCIP_Real *scalar, SCIP_Real *constant) Definition: scip.c:15670 SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize) Definition: misc.c:1864 SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata) Definition: scip.c:7209 Definition: type_var.h:53 SCIP_RETCODE SCIPsetPropCopy(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPCOPY((*propcopy))) Definition: scip.c:6667 SCIP_Bool SCIPvarHasImplic(SCIP_VAR *var, SCIP_Bool varfixing, SCIP_VAR *implvar, SCIP_BOUNDTYPE impltype) Definition: var.c:10413 SCIP_Real SCIPvarGetLbAtIndex(SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after) Definition: var.c:15141 static SCIP_BOUNDTYPE inferInfoGetBoundtype(INFERINFO inferinfo) Definition: prop_vbounds.c:213 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) Definition: scip.c:18890 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) Definition: prop_vbounds.c:1025 void * SCIPhashmapGetImage(SCIP_HASHMAP *hashmap, void *origin) Definition: misc.c:1923 static SCIP_RETCODE dfs(SCIP *scip, SCIP_PROPDATA *propdata, int startnode, SCIP_Bool *visited, int *dfsstack, int *stacknextedge, int *dfsnodes, int *ndfsnodes) Definition: prop_vbounds.c:466 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) Definition: prop_vbounds.c:1219 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) Definition: scip.c:3388 SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin) Definition: misc.c:1966 static SCIP_Real computeRelaxedUpperbound(SCIP *scip, SCIP_VAR *var, SCIP_Real inferub, SCIP_Real coef, SCIP_Real constant) Definition: prop_vbounds.c:1109 SCIP_RETCODE SCIPanalyzeConflict(SCIP *scip, int validdepth, SCIP_Bool *success) Definition: scip.c:22393 variable upper and lower bound propagator SCIP_RETCODE SCIPcatchVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos) Definition: scip.c:33378 Definition: struct_misc.h:101 SCIP_RETCODE SCIPincludePropVbounds(SCIP *scip) Definition: prop_vbounds.c:1885 Definition: type_result.h:35 SCIP_Real SCIPvarGetUbAtIndex(SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after) Definition: var.c:15233 Definition: type_lp.h:47 SCIP_Real SCIPadjustedVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real ub) Definition: scip.c:17898 SCIP_BOUNDTYPE * SCIPvarGetImplTypes(SCIP_VAR *var, SCIP_Bool varfixing) Definition: var.c:16694 static int varGetUbIndex(SCIP_PROPDATA *propdata, SCIP_VAR *var) Definition: prop_vbounds.c:268 Definition: type_retcode.h:33 SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr) Definition: event.c:288 Definition: type_result.h:42 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) Definition: scip.c:18993 static SCIP_DECL_PROPEXITSOL(propExitsolVbounds) Definition: prop_vbounds.c:1692 Definition: struct_prop.h:36 SCIP_RETCODE SCIPtightenVarLbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened) Definition: scip.c:19198 SCIP_RETCODE SCIPsetPropResprop(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPRESPROP((*propresprop))) Definition: scip.c:6830 SCIP_RETCODE SCIPsetPropFree(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPFREE((*propfree))) Definition: scip.c:6683 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) Definition: scip.c:6630 SCIP_RETCODE SCIPaddConflictLb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx) Definition: scip.c:22093 Definition: type_set.h:38 SCIP_RETCODE SCIPaddConflictRelaxedLb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedlb) Definition: scip.c:22125 SCIP_RETCODE SCIPdropVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos) Definition: scip.c:33424 static SCIP_RETCODE relaxVbdvar(SCIP *scip, SCIP_VAR *var, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd) Definition: prop_vbounds.c:976 static int varGetLbIndex(SCIP_PROPDATA *propdata, SCIP_VAR *var) Definition: prop_vbounds.c:256 static SCIP_RETCODE topologicalSort(SCIP *scip, SCIP_PROPDATA *propdata) Definition: prop_vbounds.c:723 static INFERINFO getInferInfo(int pos, SCIP_BOUNDTYPE boundtype) Definition: prop_vbounds.c:233 SCIP_RETCODE SCIPpqueueInsert(SCIP_PQUEUE *pqueue, void *elem) Definition: misc.c:798 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) Definition: prop_vbounds.c:1303 static SCIP_RETCODE catchEvents(SCIP *scip, SCIP_PROPDATA *propdata) Definition: prop_vbounds.c:298 SCIP_RETCODE SCIPpqueueCreate(SCIP_PQUEUE **pqueue, int initsize, SCIP_Real sizefac, SCIP_DECL_SORTPTRCOMP((*ptrcomp))) Definition: misc.c:752 Definition: type_lp.h:48 SCIP_RETCODE SCIPtightenVarUbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened) Definition: scip.c:19308 SCIP_Real SCIPgetConflictVarLb(SCIP *scip, SCIP_VAR *var) Definition: scip.c:22343 Definition: struct_implics.h:66 #define SCIPduplicateBlockMemoryArray(scip, ptr, source, num) Definition: scip.h:19198 SCIP_RETCODE SCIPexecPropVbounds(SCIP *scip, SCIP_Bool force, SCIP_RESULT *result) Definition: prop_vbounds.c:1953 SCIP_RETCODE SCIPaddConflictRelaxedUb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedub) Definition: scip.c:22189 static SCIP_RETCODE propagateVbounds(SCIP *scip, SCIP_PROP *prop, SCIP_Bool force, SCIP_RESULT *result) Definition: prop_vbounds.c:1387 SCIP_Real SCIPadjustedVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real lb) Definition: scip.c:17866 static SCIP_DECL_SORTPTRCOMP(compVarboundIndices) Definition: prop_vbounds.c:456 Definition: type_set.h:42 SCIP_Real * SCIPvarGetImplBounds(SCIP_VAR *var, SCIP_Bool varfixing) Definition: var.c:16708 SCIP_RETCODE SCIPaddConflictUb(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx) Definition: scip.c:22156 SCIP_RETCODE SCIPhashmapInsert(SCIP_HASHMAP *hashmap, void *origin, void *image) Definition: misc.c:1901 static SCIP_DECL_PROPRESPROP(propRespropVbounds) Definition: prop_vbounds.c:1758 Definition: type_retcode.h:43 SCIP_Real SCIPgetConflictVarUb(SCIP *scip, SCIP_VAR *var) Definition: scip.c:22365 Definition: type_result.h:39 Definition: struct_event.h:185 |