All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
prop_obbt.c
Go to the documentation of this file.
22 /**@todo if bound tightenings of other propagators are the reason for lpsolstat != SCIP_LPSOLSTAT_OPTIMAL, resolve LP */
23 /**@todo only run more than once in root node if primal bound improved or many cuts were added to the LP */
24 /**@todo filter bounds of a variable already if SCIPisLbBetter()/SCIPisUbBetter() would return FALSE */
30 /**@todo implement conflict resolving callback by calling public method of genvbounds propagator, since the reason are
31 * exactly the variable bounds with nonnegative reduced costs stored in the right-hand side of the generated
35 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
51 #define DEFAULT_CREATE_GENVBOUNDS TRUE /**< should obbt try to provide genvbounds if possible? */
52 #define DEFAULT_FILTERING_NORM TRUE /**< should coefficients in filtering be normalized w.r.t. the
54 #define DEFAULT_APPLY_FILTERROUNDS FALSE /**< try to filter bounds in so-called filter rounds by solving
56 #define DEFAULT_DUALFEASTOL 1e-9 /**< feasibility tolerance for reduced costs used in obbt; this value
58 #define DEFAULT_CONDITIONLIMIT -1.0 /**< maximum condition limit used in LP solver (-1.0: no limit) */
61 #define DEFAULT_ITLIMITFACTOR 5.0 /**< multiple of root node LP iterations used as total LP iteration
149 SCIPwarningMessage(scip, " error while solving LP in obbt propagator; LP solve terminated with code <%d>\n", retcode);
150 SCIPwarningMessage(scip, " this does not affect the remaining solution procedure --> continue\n");
224 /* create objective cutoff row; set local flag to FALSE since primal cutoff is globally valid */
226 SCIP_CALL( SCIPcreateEmptyRowUnspec(scip, &row, rowname, -SCIPinfinity(scip), SCIPgetCutoffbound(scip), FALSE, FALSE, FALSE) );
258 SCIP_Longint nolditerations, /**< iterations count at the beginning of the corresponding function */
284 /** returns the objective coefficient for a variable's bound that will be chosen during filtering */
348 SCIPdebugMessage("can't filter using existing lp solution since it was not solved to optimality\n");
368 /* bound is tight; since this holds for all fixed variables, those are filtered here automatically */
495 * 1.) Try first to filter lower bounds of interesting variables, whose bounds are not already filtered
524 * 2.) Now try to filter the remaining upper bounds of interesting variables, whose bounds are not already filtered
685 * where z is the current cutoff bound. Let (mu, nu, gamma, alpha, beta) >= 0 be the optimal solution of the dual of
706 * that holds for all primal feasible points with objective value at least cutoff_bound. Therefore, the latter
779 /* we need at least one nonzero coefficient or a nonzero dual multiplier for the objective cutoff */
827 SCIP_CALL( SCIPgenVBoundAdd(scip, propdata->genvboundprop, genvboundvars, xi, genvboundcoefs, ncoefs,
893 for( obbtround = 1; boundsleft && (propdata->maxlookahead == -1 || obbtround <= propdata->maxlookahead)
936 SCIP_CALL( SCIPchgVarObjDive(scip, var, (bound->boundtype == SCIP_BOUNDTYPE_LOWER) ? 1.0 : -1.0 ) );
1053 hasconditionlimit = (SCIPgetRealParam(scip, "lp/conditionlimit", &oldconditionlimit) == SCIP_OKAY);
1056 SCIPwarningMessage(scip, "obbt propagator could not set condition limit in LP solver - running without\n");
1058 else if( propdata->conditionlimit > 0.0 && (oldconditionlimit < 0.0 || propdata->conditionlimit < oldconditionlimit) )
1123 score = (unsigned int) ( nlcount > 0 ? (OBBT_SCOREBASE * nlcount * ( OBBT_SCOREBASE - 1 )) / maxnlcount : 0 );
1185 SCIPdebugPrintf(" %s bound of <%s>, scoreval=%u\n", bound->boundtype == SCIP_BOUNDTYPE_LOWER ? "lower" : "upper",
1327 propdata->bounds[bdidx]->score = getScore(scip, propdata->bounds[bdidx], nlcount[i], maxnlcount);
1338 propdata->bounds[bdidx]->score = getScore(scip, propdata->bounds[bdidx], nlcount[i], maxnlcount);
1381 /** solving process initialization method of propagator (called when branch and bound process is about to begin) */
1403 propdata->genvboundprop = propdata->creategenvbounds ? SCIPfindProp(scip, GENVBOUND_PROP_NAME) : NULL;
1405 SCIPdebugMessage("creating genvbounds: %s\n", propdata->genvboundprop != NULL ? "true" : "false");
1423 if( SCIPgetStage(scip) != SCIP_STAGE_SOLVING || SCIPinRepropagation(scip) || SCIPinProbing(scip) )
1433 /* only run if LP all columns are in the LP, i.e., the LP is a relaxation; e.g., do not run if pricers are active
1471 if( SCIPgetDepth(scip) > 0 && SCIPnodeGetNumber(SCIPgetCurrentNode(scip)) == propdata->lastnode )
1476 SCIPdebugMessage("applying obbt for problem <%s> at depth %d\n", SCIPgetProbName(scip), SCIPgetDepth(scip));
1478 /* without an optimal LP solution we don't want to run; this may be because propagators with higher priority have
1481 if( SCIPgetLPSolstat(scip) != SCIP_LPSOLSTAT_OPTIMAL && SCIPgetLPSolstat(scip) != SCIP_LPSOLSTAT_UNBOUNDEDRAY )
1507 /** solving process deinitialization method of propagator (called before branch and bound process data is freed) */
1581 SCIP_CALL( SCIPincludePropBasic(scip, &prop, PROP_NAME, PROP_DESC, PROP_PRIORITY, PROP_FREQ, PROP_DELAY, PROP_TIMING,
1610 "multiple of root node LP iterations used as total LP iteration limit for obbt (<= 0: no limit )",
1611 &propdata->itlimitfactor, FALSE, DEFAULT_ITLIMITFACTOR, SCIP_REAL_MIN, SCIP_REAL_MAX, NULL, NULL) );
|