29 #define PROP_NAME "nlobbt" 30 #define PROP_DESC "propagator template" 31 #define PROP_PRIORITY -1100000 33 #define PROP_DELAY TRUE 34 #define PROP_TIMING SCIP_PROPTIMING_AFTERLPLOOP 36 #define DEFAULT_MINNONCONVEXFRAC 0.20 37 #define DEFAULT_MINLINEARFRAC 0.02 38 #define DEFAULT_FEASTOLFAC 0.01 39 #define DEFAULT_RELOBJTOLFAC 0.01 40 #define DEFAULT_ADDLPROWS TRUE 41 #define DEFAULT_ITLIMITFACTOR 2.0 43 #define DEFAULT_NLPITERLIMIT 500 44 #define DEFAULT_NLPTIMELIMIT 0.0 45 #define DEFAULT_NLPVERLEVEL 0 46 #define DEFAULT_RANDSEED 79 102 assert(propdata != NULL);
104 if( propdata->nlpiprob != NULL )
106 assert(propdata->nlpi != NULL);
114 propdata->nlpinvars = 0;
116 assert(propdata->nlpinvars == 0);
118 propdata->skipprop =
FALSE;
119 propdata->currpos = 0;
120 propdata->lastnode = -1;
133 int nnonconvexnlrows;
141 nnonconvexnlrows = 0;
145 for( i = 0; i < nnlrows; ++i )
172 SCIPdebugMsg(scip,
"nconvex=%d nnonconvex=%d nlinear=%d\n", nconvexnlrows, nnonconvexnlrows, nlinearnlrows);
174 return nconvexnlrows > 0
175 && nnonconvexnlrows > 0
176 && (
SCIPisGE(scip, (
SCIP_Real)nconvexnlrows, nnonconvexnlrows * propdata->minnonconvexfrac))
177 && (
SCIPisGE(scip, (
SCIP_Real)nconvexnlrows, nlinearnlrows * propdata->minlinearfrac));
190 assert(propdata->currpos >= 0 && propdata->currpos < propdata->nlpinvars);
194 assert(primal != NULL);
197 for( i = propdata->currpos + 1; i < propdata->nlpinvars; ++i )
204 if(
SCIPisLE(scip, propdata->nlscore[i], 0.0) )
207 var = propdata->nlpivars[i];
212 val = primal[varidx];
220 assert((propdata->status[i] & SOLVEDLB) != 0);
229 assert((propdata->status[i] & SOLVEDUB) != 0);
260 assert(propdata->genvboundprop != NULL);
262 assert(varidx >= 0 && varidx < propdata->nlpinvars);
278 for( i = 0; i < propdata->nlpinvars; ++i )
282 lvbvars[nlvbvars] = propdata->nlpivars[i];
283 lvbcoefs[nlvbvars] = beta[i] - alpha[i];
286 constant += (alpha[i] - beta[i]) * primal[i];
294 constant += mu * cutoffbound;
341 assert(varidx >= 0 && varidx < propdata->nlpinvars);
351 if( timelimit <= 0.0 )
357 if( propdata->nlptimelimit > 0.0 )
358 timelimit = MIN(propdata->nlptimelimit, timelimit);
359 iterlimit = propdata->nlpiterlimit > 0 ? propdata->nlpiterlimit : INT_MAX;
368 propdata->nlscore[propdata->currpos]);
373 assert(propdata->nlpstatistics != NULL);
391 if( propdata->genvboundprop != NULL &&
SCIPgetDepth(scip) == 0 )
453 assert(result != NULL);
454 assert(!propdata->skipprop);
462 SCIPdebugMsg(scip,
"nlobbt propagator is not applicable\n");
463 propdata->skipprop =
TRUE;
470 if( propdata->itlimitfactor > 0.0 )
473 nlpiterleft = INT_MAX;
476 if( propdata->nlpiprob != NULL &&
SCIPgetNVars(scip) != propdata->nlpinvars )
479 assert(propdata->nlpiprob == NULL);
483 if( propdata->nlpiprob == NULL )
489 assert(propdata->nlpi != NULL);
501 assert(propdata->randnumgen != NULL);
502 for( i = 0; i < propdata->nlpinvars; ++i )
521 assert(propdata->nlpiprob != NULL);
522 assert(propdata->var2nlpiidx != NULL);
523 assert(propdata->nlpivars != NULL);
524 assert(propdata->nlscore != NULL);
527 if( propdata->currpos == 0 )
529 SCIPsortDownRealIntPtr(propdata->nlscore, propdata->status, (
void**)propdata->nlpivars, propdata->nlpinvars);
540 while( propdata->currpos < propdata->nlpinvars
542 &&
SCIPisGT(scip, propdata->nlscore[propdata->currpos], 0.0)
550 var = propdata->nlpivars[propdata->currpos];
557 ++(propdata->currpos);
561 SCIPdebugMsg(scip,
"iterations left %d\n", nlpiterleft);
569 if( (propdata->status[propdata->currpos] &
SOLVEDLB) == 0 )
572 nlpiterleft -= iters;
579 nlpiterleft -= iters;
583 ++(propdata->currpos);
600 assert(propdata != NULL);
615 assert(scip != NULL);
616 assert(prop != NULL);
619 assert(propdata != NULL);
622 propdata->genvboundprop =
SCIPfindProp(scip,
"genvbounds");
627 propdata->lastnode = -1;
639 assert(propdata != NULL);
658 assert(propdata != NULL);
670 SCIPdebugMsg(scip,
"not all columns in LP, skipping obbt\n");
677 SCIPdebugMsg(scip,
"NLP not constructed, skipping nlobbt\n");
685 propdata->currpos = 0;
710 assert(propdata != NULL);
714 propExecNlobbt, propdata) );
715 assert(prop != NULL);
722 "factor for NLP feasibility tolerance",
726 "factor for NLP relative objective tolerance",
730 "(#convex nlrows)/(#nonconvex nlrows) threshold to apply propagator",
734 "minimum (#convex nlrows)/(#linear nlrows) threshold to apply propagator",
738 "should non-initial LP rows be used?",
742 "iteration limit of NLP solver; 0 for no limit",
746 "time limit of NLP solver; 0.0 for no limit",
750 "verbosity level of NLP solver",
754 "LP iteration limit for nlobbt will be this factor times total LP iterations in root node",
enum SCIP_Result SCIP_RESULT
void SCIPfreeRandom(SCIP *scip, SCIP_RANDNUMGEN **randnumgen)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
enum SCIP_BoundType SCIP_BOUNDTYPE
static SCIP_DECL_PROPINITSOL(propInitsolNlobbt)
SCIP_ROW ** SCIPgetLPRows(SCIP *scip)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPinRepropagation(SCIP *scip)
int SCIPgetNNLPNlRows(SCIP *scip)
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
SCIP_Longint SCIPgetNRootLPIterations(SCIP *scip)
SCIP_RETCODE SCIPnlpiGetStatistics(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_NLPSTATISTICS *statistics)
SCIP_Real SCIPfeastol(SCIP *scip)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
SCIP_Bool SCIPisNLPConstructed(SCIP *scip)
SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
static SCIP_DECL_PROPEXITSOL(propExitsolNlobbt)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
SCIP_Real SCIPgetCutoffbound(SCIP *scip)
SCIP_RETCODE SCIPcreateNlpiProb(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLROW **nlrows, int nnlrows, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2idx, SCIP_Real *nlscore, SCIP_Real cutoffbound, SCIP_Bool setobj, SCIP_Bool onlyconvex)
SCIP_PROP * SCIPfindProp(SCIP *scip, const char *name)
SCIP_RETCODE SCIPgetRealParam(SCIP *scip, const char *name, SCIP_Real *value)
SCIP_RETCODE SCIPcreateRandom(SCIP *scip, SCIP_RANDNUMGEN **randnumgen, unsigned int initialseed)
#define DEFAULT_FEASTOLFAC
void SCIPsortDownRealIntPtr(SCIP_Real *realarray, int *intarray, void **ptrarray, int len)
SCIP_Real SCIPnlpStatisticsGetTotalTime(SCIP_NLPSTATISTICS *statistics)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
internal methods for NLPI solver interfaces
static SCIP_RETCODE addGenVBound(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, int varidx, SCIP_BOUNDTYPE boundtype, SCIP_Real cutoffbound)
SCIP_RETCODE SCIPnlpiCreateProblem(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **problem, const char *name)
#define DEFAULT_MINLINEARFRAC
#define DEFAULT_NLPITERLIMIT
SCIP_RETCODE SCIPnlpiGetSolution(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_Real **primalvalues, SCIP_Real **consdualvalues, SCIP_Real **varlbdualvalues, SCIP_Real **varubdualvalues, SCIP_Real *objval)
SCIP_RETCODE SCIPincludePropNlobbt(SCIP *scip)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
SCIP_Real SCIPinfinity(SCIP *scip)
enum SCIP_Retcode SCIP_RETCODE
SCIP_Real SCIPnlrowGetRhs(SCIP_NLROW *nlrow)
SCIP_RETCODE SCIPtightenVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
#define SCIPfreeBlockMemory(scip, ptr)
SCIP_EXPRCURV SCIPnlrowGetCurvature(SCIP_NLROW *nlrow)
SCIP_RETCODE SCIPnlpiChgVarBounds(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int nvars, const int *indices, const SCIP_Real *lbs, const SCIP_Real *ubs)
void * SCIPhashmapGetImage(SCIP_HASHMAP *hashmap, void *origin)
void SCIPnlpStatisticsFree(BMS_BLKMEM *blkmem, SCIP_NLPSTATISTICS **statistics)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
#define DEFAULT_RELOBJTOLFAC
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_NLROW ** SCIPgetNLPNlRows(SCIP *scip)
static SCIP_RETCODE propdataClear(SCIP *scip, SCIP_PROPDATA *propdata)
int SCIPnlrowGetNQuadElems(SCIP_NLROW *nlrow)
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPnlpiSolve(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem)
SCIP_Longint SCIPnodeGetNumber(SCIP_NODE *node)
#define DEFAULT_NLPVERLEVEL
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
#define DEFAULT_NLPTIMELIMIT
static SCIP_RETCODE applyNlobbt(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_RESULT *result)
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)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
const char * SCIPvarGetName(SCIP_VAR *var)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
SCIP_RETCODE SCIPaddNlpiProbRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2idx, SCIP_ROW **rows, int nrows)
int SCIPgetNNlpis(SCIP *scip)
int SCIPgetNLPRows(SCIP *scip)
SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_NLPSOLSTAT SCIPnlpiGetSolstat(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem)
static SCIP_RETCODE solveNlp(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, int varidx, SCIP_BOUNDTYPE boundtype, int *nlpiter, SCIP_RESULT *result)
SCIP_RETCODE SCIPnlpiSetObjective(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, int nlins, const int *lininds, const SCIP_Real *linvals, int nquadelems, const SCIP_QUADELEM *quadelems, const int *exprvaridxs, const SCIP_EXPRTREE *exprtree, const SCIP_Real constant)
SCIP_RETCODE SCIPnlpiFreeProblem(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **problem)
#define SCIPallocBufferArray(scip, ptr, num)
SCIP_RETCODE SCIPupdateNlpiProb(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2nlpiidx, SCIP_VAR **nlpivars, int nlpinvars, SCIP_Real cutoffbound)
int SCIPgetDepth(SCIP *scip)
SCIP_RETCODE SCIPnlpiSetIntPar(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_NLPPARAM type, int ival)
nonlinear OBBT propagator
#define DEFAULT_ITLIMITFACTOR
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
#define BMSclearMemory(ptr)
SCIP_RETCODE SCIPsetPropExitsol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPEXITSOL((*propexitsol)))
SCIP_Real SCIPrandomGetReal(SCIP_RANDNUMGEN *randnumgen, SCIP_Real minrandval, SCIP_Real maxrandval)
SCIP_Bool SCIPinProbing(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_EXPRTREE * SCIPnlrowGetExprtree(SCIP_NLROW *nlrow)
SCIP_Bool SCIPinDive(SCIP *scip)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
static SCIP_RETCODE filterCands(SCIP *scip, SCIP_PROPDATA *propdata)
SCIP_RETCODE SCIPnlpStatisticsCreate(BMS_BLKMEM *blkmem, SCIP_NLPSTATISTICS **statistics)
static SCIP_DECL_PROPEXEC(propExecNlobbt)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
SCIP_RETCODE SCIPsetPropInitsol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPINITSOL((*propinitsol)))
struct SCIP_PropData SCIP_PROPDATA
SCIP_Bool SCIPisStopped(SCIP *scip)
SCIP_RETCODE SCIPsetPropFree(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPFREE((*propfree)))
SCIP_PROPDATA * SCIPpropGetData(SCIP_PROP *prop)
void SCIPpropSetData(SCIP_PROP *prop, SCIP_PROPDATA *propdata)
int SCIPnlpStatisticsGetNIterations(SCIP_NLPSTATISTICS *statistics)
SCIP_Bool SCIPallColsInLP(SCIP *scip)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
#define DEFAULT_MINNONCONVEXFRAC
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_NLPI ** SCIPgetNlpis(SCIP *scip)
#define DEFAULT_ADDLPROWS
SCIP_Real SCIPnlrowGetLhs(SCIP_NLROW *nlrow)
static SCIP_DECL_PROPFREE(propFreeNlobbt)
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)
static SCIP_Bool isNlobbtApplicable(SCIP *scip, SCIP_PROPDATA *propdata)
SCIP_Bool SCIPallowObjProp(SCIP *scip)
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)
generalized variable bounds propagator
SCIP_RETCODE SCIPnlpiSetRealPar(SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *problem, SCIP_NLPPARAM type, SCIP_Real dval)
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)