61#define PROP_NAME "nlobbt"
62#define PROP_DESC "propagator template"
63#define PROP_PRIORITY -1100000
65#define PROP_DELAY TRUE
66#define PROP_TIMING SCIP_PROPTIMING_AFTERLPLOOP
68#define DEFAULT_MINNONCONVEXFRAC 0.20
69#define DEFAULT_MINLINEARFRAC 0.02
70#define DEFAULT_FEASTOLFAC 0.01
71#define DEFAULT_RELOBJTOLFAC 0.01
72#define DEFAULT_ADDLPROWS TRUE
73#define DEFAULT_ITLIMITFACTOR 2.0
75#define DEFAULT_NLPITERLIMIT 500
76#define DEFAULT_NLPTIMELIMIT 0.0
77#define DEFAULT_NLPVERLEVEL 0
78#define DEFAULT_RANDSEED 79
102 SCIP_Longint lastnode;
106 SCIP_Real nlptimelimit;
110 SCIP_Real feastolfac;
111 SCIP_Real relobjtolfac;
112 SCIP_Real minnonconvexfrac;
113 SCIP_Real minlinearfrac;
115 SCIP_Real itlimitfactor;
132 if( propdata->nlpiprob !=
NULL )
140 SCIP_CALL( SCIPfreeNlpiProblem(
scip, propdata->nlpi, &propdata->nlpiprob) );
142 propdata->nlpinvars = 0;
144 assert(propdata->nlpinvars == 0);
146 propdata->skipprop =
FALSE;
147 propdata->currpos = 0;
148 propdata->lastnode = -1;
161 int nnonconvexnlrows;
169 nnonconvexnlrows = 0;
173 for(
i = 0;
i < nnlrows; ++
i )
200 SCIPdebugMsg(
scip,
"nconvex=%d nnonconvex=%d nlinear=%d\n", nconvexnlrows, nnonconvexnlrows, nlinearnlrows);
202 return nconvexnlrows > 0
203 && nnonconvexnlrows > 0
204 && (
SCIPisGE(
scip, (SCIP_Real)nconvexnlrows, nnonconvexnlrows * propdata->minnonconvexfrac))
205 && (
SCIPisGE(
scip, (SCIP_Real)nconvexnlrows, nlinearnlrows * propdata->minlinearfrac));
218 assert(propdata->currpos >= 0 && propdata->currpos < propdata->nlpinvars);
225 for(
i = propdata->currpos + 1;
i < propdata->nlpinvars; ++
i )
235 var = propdata->nlpivars[
i];
274 SCIP_Real cutoffbound
293 SCIP_CALL( SCIPgetNlpiSolution(
scip, propdata->nlpi, propdata->nlpiprob, &primal, &dual, &
alpha, &beta,
NULL) );
306 for(
i = 0;
i < propdata->nlpinvars; ++
i )
310 lvbvars[nlvbvars] = propdata->nlpivars[
i];
311 lvbcoefs[nlvbvars] = beta[
i] -
alpha[
i];
314 constant += (
alpha[
i] - beta[
i]) * primal[
i];
322 constant += mu * cutoffbound;
380 if( timelimit <= 0.0 )
386 if( propdata->nlptimelimit > 0.0 )
387 timelimit =
MIN(propdata->nlptimelimit, timelimit);
388 iterlimit = propdata->nlpiterlimit > 0 ? propdata->nlpiterlimit : INT_MAX;
397 propdata->nlscore[propdata->currpos]);
398 SCIP_CALL( SCIPsolveNlpiParam(
scip, propdata->nlpi, propdata->nlpiprob, *nlpparam) );
399 SCIPdebugMsg(
scip,
"NLP solstat = %d\n", SCIPgetNlpiSolstat(
scip, propdata->nlpi, propdata->nlpiprob));
402 SCIP_CALL( SCIPgetNlpiStatistics(
scip, propdata->nlpi, propdata->nlpiprob, &propdata->nlpstatistics) );
403 *nlpiter = propdata->nlpstatistics.niterations;
404 SCIPdebugMsg(
scip,
"iterations %d time %g\n", *nlpiter, propdata->nlpstatistics.totaltime);
416 SCIP_Bool infeasible;
450 SCIP_CALL( SCIPchgNlpiVarBounds(
scip, propdata->nlpi, propdata->nlpiprob, 1, &
varidx, &lb, &ub) );
483 assert(!propdata->skipprop);
492 propdata->skipprop =
TRUE;
499 if( propdata->itlimitfactor > 0.0 )
502 nlpiterleft = INT_MAX;
512 if( propdata->nlpiprob ==
NULL )
530 for(
i = 0;
i < propdata->nlpinvars; ++
i )
555 if( propdata->currpos == 0 )
557 SCIPsortDownRealIntPtr(propdata->nlscore, propdata->status, (
void**)propdata->nlpivars, propdata->nlpinvars);
561 nlpparam.
feastol *= propdata->feastolfac;
563 nlpparam.
verblevel = (
unsigned short)propdata->nlpverblevel;
566 while( propdata->currpos < propdata->nlpinvars
568 &&
SCIPisGT(
scip, propdata->nlscore[propdata->currpos], 0.0)
576 var = propdata->nlpivars[propdata->currpos];
583 ++(propdata->currpos);
595 if( (propdata->status[propdata->currpos] &
SOLVEDLB) == 0 )
598 nlpiterleft -= iters;
605 nlpiterleft -= iters;
609 ++(propdata->currpos);
652 propdata->lastnode = -1;
709 propdata->currpos = 0;
738 propExecNlobbt, propdata) );
746 "factor for NLP feasibility tolerance",
750 "factor for NLP relative objective tolerance",
754 "(#convex nlrows)/(#nonconvex nlrows) threshold to apply propagator",
758 "minimum (#convex nlrows)/(#linear nlrows) threshold to apply propagator",
762 "should non-initial LP rows be used?",
766 "iteration limit of NLP solver; 0 for no limit",
770 "time limit of NLP solver; 0.0 for no limit",
774 "verbosity level of NLP solver",
778 "LP iteration limit for nlobbt will be this factor times total LP iterations in root node",
SCIP_Bool SCIPisStopped(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
int SCIPhashmapGetImageInt(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPgenVBoundAdd(SCIP *scip, SCIP_PROP *genvboundprop, SCIP_VAR **vars, SCIP_VAR *var, SCIP_Real *coefs, int ncoefs, SCIP_Real coefcutoffbound, SCIP_Real constant, SCIP_BOUNDTYPE boundtype)
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 SCIPgetRealParam(SCIP *scip, const char *name, SCIP_Real *value)
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_RETCODE SCIPincludePropNlobbt(SCIP *scip)
SCIP_Bool SCIPinDive(SCIP *scip)
SCIP_ROW ** SCIPgetLPRows(SCIP *scip)
int SCIPgetNLPRows(SCIP *scip)
SCIP_Bool SCIPallColsInLP(SCIP *scip)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
SCIP_RETCODE SCIPaddNlpiProblemRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2idx, SCIP_ROW **rows, int nrows)
SCIP_RETCODE SCIPupdateNlpiProblem(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2nlpiidx, SCIP_VAR **nlpivars, int nlpinvars, SCIP_Real cutoffbound)
SCIP_RETCODE SCIPcreateNlpiProblemFromNlRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **nlpiprob, const char *name, SCIP_NLROW **nlrows, int nnlrows, SCIP_HASHMAP *var2idx, SCIP_HASHMAP *nlrow2idx, SCIP_Real *nlscore, SCIP_Real cutoffbound, SCIP_Bool setobj, SCIP_Bool onlyconvex)
int SCIPgetNNlpis(SCIP *scip)
SCIP_NLPI ** SCIPgetNlpis(SCIP *scip)
SCIP_Bool SCIPisNLPConstructed(SCIP *scip)
int SCIPgetNNLPNlRows(SCIP *scip)
SCIP_NLROW ** SCIPgetNLPNlRows(SCIP *scip)
SCIP_Real SCIPnlrowGetRhs(SCIP_NLROW *nlrow)
SCIP_Real SCIPnlrowGetLhs(SCIP_NLROW *nlrow)
SCIP_EXPRCURV SCIPnlrowGetCurvature(SCIP_NLROW *nlrow)
SCIP_EXPR * SCIPnlrowGetExpr(SCIP_NLROW *nlrow)
SCIP_Longint SCIPnodeGetNumber(SCIP_NODE *node)
SCIP_Bool SCIPinProbing(SCIP *scip)
SCIP_PROP * SCIPfindProp(SCIP *scip, const char *name)
void SCIPpropSetData(SCIP_PROP *prop, SCIP_PROPDATA *propdata)
SCIP_PROPDATA * SCIPpropGetData(SCIP_PROP *prop)
SCIP_RETCODE SCIPsetPropExitsol(SCIP *scip, SCIP_PROP *prop,)
SCIP_RETCODE SCIPsetPropFree(SCIP *scip, SCIP_PROP *prop,)
SCIP_RETCODE SCIPsetPropInitsol(SCIP *scip, SCIP_PROP *prop,)
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)
SCIP_Longint SCIPgetNRootLPIterations(SCIP *scip)
SCIP_Real SCIPgetCutoffbound(SCIP *scip)
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfeastol(SCIP *scip)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPinRepropagation(SCIP *scip)
int SCIPgetDepth(SCIP *scip)
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_RETCODE SCIPtightenVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_Bool SCIPallowWeakDualReds(SCIP *scip)
SCIP_Real SCIPrandomGetReal(SCIP_RANDNUMGEN *randnumgen, SCIP_Real minrandval, SCIP_Real maxrandval)
void SCIPsortDownRealIntPtr(SCIP_Real *realarray, int *intarray, void **ptrarray, int len)
SCIPfreeRandom(scip, &heurdata->randnumgen)
SCIPcreateRandom(scip, &heurdata->randnumgen, DEFAULT_RANDSEED, TRUE))
assert(minobj< SCIPgetCutoffbound(scip))
memory allocation routines
#define BMSclearMemory(ptr)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
generalized variable bounds propagator
#define DEFAULT_FEASTOLFAC
#define DEFAULT_NLPVERLEVEL
#define DEFAULT_NLPTIMELIMIT
static SCIP_RETCODE applyNlobbt(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_RESULT *result)
#define DEFAULT_NLPITERLIMIT
static SCIP_RETCODE filterCands(SCIP *scip, SCIP_PROPDATA *propdata)
#define DEFAULT_ADDLPROWS
#define DEFAULT_ITLIMITFACTOR
static SCIP_RETCODE addGenVBound(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, int varidx, SCIP_BOUNDTYPE boundtype, SCIP_Real cutoffbound)
#define DEFAULT_RELOBJTOLFAC
#define DEFAULT_MINNONCONVEXFRAC
static SCIP_Bool isNlobbtApplicable(SCIP *scip, SCIP_PROPDATA *propdata)
static SCIP_RETCODE solveNlp(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, int varidx, SCIP_BOUNDTYPE boundtype, SCIP_NLPPARAM *nlpparam, int *nlpiter, SCIP_RESULT *result)
#define DEFAULT_MINLINEARFRAC
static SCIP_RETCODE propdataClear(SCIP *scip, SCIP_PROPDATA *propdata)
nonlinear OBBT propagator
public methods for message output
public data structures and miscellaneous methods
methods for sorting joint arrays of various types
public methods for NLP management
public methods for propagators
public methods for branch and bound tree
public methods for problem variables
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for nonlinear relaxation
public methods for NLPI solver interfaces
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for the probing mode
public methods for propagator plugins
public methods for random numbers
public methods for querying solving statistics
public methods for timing
public methods for the branch-and-bound tree
public methods for SCIP variables
enum SCIP_BoundType SCIP_BOUNDTYPE
#define SCIP_NLPPARAM_DEFAULT(scip)
@ SCIP_NLPSOLSTAT_FEASIBLE
#define SCIP_DECL_PROPINITSOL(x)
#define SCIP_DECL_PROPFREE(x)
#define SCIP_DECL_PROPEXITSOL(x)
struct SCIP_PropData SCIP_PROPDATA
#define SCIP_DECL_PROPEXEC(x)
enum SCIP_Result SCIP_RESULT
enum SCIP_Retcode SCIP_RETCODE