56#define NLHDLR_NAME "soc"
57#define NLHDLR_DESC "nonlinear handler for second-order cone structures"
58#define NLHDLR_DETECTPRIORITY 100
59#define NLHDLR_ENFOPRIORITY 100
60#define DEFAULT_MINCUTEFFICACY 1e-5
61#define DEFAULT_COMPEIGENVALUES TRUE
108struct SCIP_NlhdlrExprData
112 SCIP_Real* transcoefs;
124 SCIP_Real* disvarvals;
127struct SCIP_NlhdlrData
129 SCIP_Real mincutefficacy;
130 SCIP_Bool compeigenvalues;
149 nterms = nlhdlrexprdata->nterms;
157 startidx = nlhdlrexprdata->termbegins[
i];
160 if( startidx == nlhdlrexprdata->termbegins[
i + 1] )
162 assert(nlhdlrexprdata->offsets[
i] != 0.0);
171 for(
j = startidx;
j < nlhdlrexprdata->termbegins[
i + 1]; ++
j )
173 if( nlhdlrexprdata->transcoefs[
j] != 1.0 )
185 if( nlhdlrexprdata->offsets[
i] != 0.0 )
196 for(
j = nlhdlrexprdata->termbegins[
nterms-1];
j < nlhdlrexprdata->termbegins[
nterms]; ++
j )
198 if( nlhdlrexprdata->transcoefs[
j] != 1.0 )
207 if( nlhdlrexprdata->offsets[
nterms-1] != 0.0 )
228 ndisvars = nlhdlrexprdata->nterms - 1;
261 if( nlhdlrexprdata->disvars ==
NULL )
264 ndisvars = nlhdlrexprdata->nterms - 1;
300 nterms = nlhdlrexprdata->nterms;
301 beta = nlhdlrexprdata->offsets[
nterms - 1];
317 for(
i = nlhdlrexprdata->termbegins[
nterms - 1];
i < nlhdlrexprdata->termbegins[
nterms]; ++
i )
325 coef = -nlhdlrexprdata->transcoefs[
i];
339 SCIP_Real* transcoefs,
364 (*nlhdlrexprdata)->nvars =
nvars;
365 (*nlhdlrexprdata)->nterms =
nterms;
367 (*nlhdlrexprdata)->disrow =
NULL;
368 (*nlhdlrexprdata)->disvars =
NULL;
370 (*nlhdlrexprdata)->varvals =
NULL;
371 (*nlhdlrexprdata)->disvarvals =
NULL;
374 SCIPdebugMsg(
scip,
"created nlhdlr data for the following soc expression:\n");
397 ntranscoefs = (*nlhdlrexprdata)->termbegins[(*nlhdlrexprdata)->nterms];
425 for(
i = 0;
i < nlhdlrexprdata->nvars; ++
i )
429 nlhdlrexprdata->varvals[
i] =
SCIPround(
scip, nlhdlrexprdata->varvals[
i]);
433 if( nlhdlrexprdata->disvarvals !=
NULL )
434 for(
i = 0;
i < nlhdlrexprdata->nterms - 1; ++
i )
438 nlhdlrexprdata->disvarvals[
i] =
SCIPround(
scip, nlhdlrexprdata->disvarvals[
i]);
457 result = nlhdlrexprdata->offsets[
k];
459 for(
i = nlhdlrexprdata->termbegins[
k];
i < nlhdlrexprdata->termbegins[
k + 1]; ++
i )
460 result += nlhdlrexprdata->transcoefs[
i] * nlhdlrexprdata->varvals[nlhdlrexprdata->transcoefsidx[
i]];
500 SCIP_Real mincutviolation,
504 SCIP_Real* transcoefs;
523 vars = nlhdlrexprdata->vars;
524 transcoefs = nlhdlrexprdata->transcoefs;
525 transcoefsidx = nlhdlrexprdata->transcoefsidx;
526 termbegins = nlhdlrexprdata->termbegins;
527 nterms = nlhdlrexprdata->nterms;
538 if( nlhdlrexprdata->offsets[
i] != 0.0 )
575 for(
i = termbegins[
j];
i < termbegins[
j + 1]; ++
i )
634 SCIP_Real mincutviolation,
640 SCIP_Real* transcoefs;
661 vars = nlhdlrexprdata->vars;
662 disvars = nlhdlrexprdata->disvars;
663 transcoefs = nlhdlrexprdata->transcoefs;
664 transcoefsidx = nlhdlrexprdata->transcoefsidx;
665 termbegins = nlhdlrexprdata->termbegins;
666 nterms = nlhdlrexprdata->nterms;
682 if(
fvalue <= mincutviolation )
723 constant +=
cutcoef * nlhdlrexprdata->varvals[transcoefsidx[
i]];
738 constant +=
cutcoef * nlhdlrexprdata->varvals[transcoefsidx[
i]];
801 SCIPdebugMsg(
scip,
"generated row for SOC, efficacy=%g, minefficacy=%g, allowweakcuts=%u\n",
807 SCIP_Bool infeasible;
811#ifdef SCIP_CONSNONLINEAR_ROWNOTREMOVABLE
901 for(
i = nchildren - 1;
i >= 0; --
i )
920 assert(*nexprs < 2 * nchildren);
933 assert(*nexprs < 2 * nchildren);
955 assert(*nexprs < 2 * nchildren);
966 assert(*nexprs < 2 * nchildren);
1015 for(
i = 0;
i < nchildren; ++
i )
1025 assert(0 <= varpos && varpos < nexprs);
1034 assert(0 <= varpos && varpos < nexprs);
1047 assert(0 <= varpos && varpos < nexprs);
1059 assert(0 <= varpos && varpos < nexprs);
1079 SCIP_Real* transcoefs,
1312 SCIP_Real* transcoefs;
1373 for(
i = 0;
i < nchildren; ++
i )
1436 for(
i = 0;
i < nchildren; ++
i )
1467 if( constant > 0.0 )
1479 transcoefsidx[
i] =
i;
1486 if( constant > 0.0 )
1494 offsets[
nterms - 1] = 0.0;
1496 transcoefs[
nterms - 2] = 1.0;
1505 offsets[
nterms - 1] = 0.0;
1507 transcoefs[
nterms - 1] = 1.0;
1515 for(
i = 0;
i < nchildren; ++
i )
1551 SCIPdebugMsg(
scip,
"found SOC structure for expression %p\n", (
void*)expr);
1595 SCIP_Real* offsets =
NULL;
1596 SCIP_Real* transcoefs =
NULL;
1597 int* transcoefsidx =
NULL;
1598 int* termbegins =
NULL;
1647 for(
i = 0;
i < nchildren; ++
i )
1768 for(
i = 0;
i < nchildren; ++
i )
1865 for(
i = 0;
i < nchildren; ++
i )
2005 SCIPdebugMsg(
scip,
"found SOC structure for expression %p\n %g <= ", (
void*)expr, lhs);
2064 SCIP_Real* transcoefs;
2067 SCIP_Real* lincoefs;
2110 transcoefsidx =
NULL;
2152 SCIPdebugMsg(
scip,
"Failed to compute eigenvalues and eigenvectors for expression:\n");
2271 SCIPdebugMsg(
scip,
"found SOC structure for expression %p\n%f <= ", (
void*)expr, lhs);
2419#define nlhdlrInitSoc NULL
2434#define nlhdlrExitSoc NULL
2494 assert(nlhdlrexprdata->transcoefsidx !=
NULL);
2495 assert(nlhdlrexprdata->nterms > 1);
2506 for(
i = 0;
i < nlhdlrexprdata->nterms - 1; ++
i )
2514 assert(*auxvalue >= 0.0);
2517 *auxvalue =
sqrt(*auxvalue);
2534 for(
i = 0;
i < nchildren; ++
i )
2593 if( nlhdlrexprdata->nterms > 3 )
2598#ifdef WITH_DEBUG_SOLUTION
2608 for(
i = 0;
i < nlhdlrexprdata->nvars; ++
i )
2619 nterms = nlhdlrexprdata->nterms;
2625 ndisvars = nlhdlrexprdata->nterms - 1;
2659 if( nlhdlrexprdata->nterms == 2 )
2673 for(
i = nlhdlrexprdata->termbegins[0];
i < nlhdlrexprdata->termbegins[1]; ++
i )
2674 norm +=
SQR(nlhdlrexprdata->transcoefs[
i]);
2682 for(
i = nlhdlrexprdata->termbegins[0];
i < nlhdlrexprdata->termbegins[1]; ++
i )
2683 nlhdlrexprdata->varvals[nlhdlrexprdata->transcoefsidx[
i]] = nlhdlrexprdata->transcoefs[
i] / norm * (
plusminus1 - nlhdlrexprdata->offsets[0]);
2709 else if( nlhdlrexprdata->nterms == 3 && nlhdlrexprdata->termbegins[0] != nlhdlrexprdata->termbegins[1] )
2736 static const SCIP_Real
refpoints[3][2] = { {-1.0, 0.0}, {1.0, 1.0}, {1.0, -1.0} };
2737 SCIP_Real
v1i,
v1j = 0.0;
2738 SCIP_Real
v2i,
v2j = 0.0;
2745 i = nlhdlrexprdata->transcoefsidx[nlhdlrexprdata->termbegins[0]];
2746 v1i = nlhdlrexprdata->transcoefs[nlhdlrexprdata->termbegins[0]];
2749 v2zero = nlhdlrexprdata->termbegins[1] == nlhdlrexprdata->termbegins[2];
2753 if( !
v2zero &&
SCIPsortedvecFindInt(nlhdlrexprdata->transcoefsidx + nlhdlrexprdata->termbegins[1],
i, nlhdlrexprdata->termbegins[2] - nlhdlrexprdata->termbegins[1], &pos) )
2755 assert(nlhdlrexprdata->transcoefsidx[nlhdlrexprdata->termbegins[1] + pos] ==
i);
2756 v2i = nlhdlrexprdata->transcoefs[nlhdlrexprdata->termbegins[1] + pos];
2760 for(
k = nlhdlrexprdata->termbegins[1];
k < nlhdlrexprdata->termbegins[2]; ++
k )
2764 if( nlhdlrexprdata->transcoefsidx[
k] ==
i )
2769 if(
SCIPsortedvecFindInt(nlhdlrexprdata->transcoefsidx + nlhdlrexprdata->termbegins[0], nlhdlrexprdata->transcoefsidx[
k], nlhdlrexprdata->termbegins[1] - nlhdlrexprdata->termbegins[0], &pos) )
2771 assert(nlhdlrexprdata->transcoefsidx[nlhdlrexprdata->termbegins[0] + pos] == nlhdlrexprdata->transcoefsidx[
k]);
2772 v1j = nlhdlrexprdata->transcoefs[nlhdlrexprdata->termbegins[0] + pos];
2775 v2j = nlhdlrexprdata->transcoefs[
k];
2780 j = nlhdlrexprdata->transcoefsidx[
k];
2807 nlhdlrexprdata->varvals[
i] = (
c -
v1j * nlhdlrexprdata->varvals[
j]) /
v1i;
2816 nlhdlrexprdata->varvals[
i] =
c /
v1i;
2849 else if( nlhdlrexprdata->nterms == 3 )
2864 for(
i = nlhdlrexprdata->termbegins[1];
i < nlhdlrexprdata->termbegins[2]; ++
i )
2865 norm +=
SQR(nlhdlrexprdata->transcoefs[
i]);
2873 for(
i = nlhdlrexprdata->termbegins[1];
i < nlhdlrexprdata->termbegins[2]; ++
i )
2874 nlhdlrexprdata->varvals[nlhdlrexprdata->transcoefsidx[
i]] = nlhdlrexprdata->transcoefs[
i] / norm * (
plusminus1 - nlhdlrexprdata->offsets[1]);
2914 static const SCIP_Real
refpoints[3][2] = { {-0.5, 0.0}, {0.5, 1.0}, {0.5, -1.0} };
2928 for(
k = 0;
k < nlhdlrexprdata->nterms - 1; ++
k )
2930 vkzero = nlhdlrexprdata->termbegins[
k+1] == nlhdlrexprdata->termbegins[
k];
2935 for(
i = nlhdlrexprdata->termbegins[
k];
i < nlhdlrexprdata->termbegins[
k+1]; ++
i )
2936 norm +=
SQR(nlhdlrexprdata->transcoefs[
i]);
2944 for(
i = nlhdlrexprdata->termbegins[
k];
i < nlhdlrexprdata->termbegins[
k+1]; ++
i )
2945 nlhdlrexprdata->varvals[nlhdlrexprdata->transcoefsidx[
i]] = nlhdlrexprdata->transcoefs[
i] / norm * (
refpoints[
point][0] - nlhdlrexprdata->offsets[
k]);
2988 if( nlhdlrexprdata->disrow !=
NULL )
3007 SCIP_Bool infeasible;
3010 assert(nlhdlrexprdata->nterms < 4 || nlhdlrexprdata->disrow !=
NULL);
3011 assert(nlhdlrexprdata->nterms > 1);
3029 if( nlhdlrexprdata->nterms < 4 )
3056 SCIPdebugMsg(
scip,
"added disaggregation row to LP, cutoff=%u\n", infeasible);
3094 assert(nlhdlrexprdata->nterms < 4 || nlhdlrexprdata->disrow !=
NULL);
3095 assert(nlhdlrexprdata->nterms > 1);
3106 if( nlhdlrexprdata->nterms < 4 )
3123 for(
k = 0;
k < nlhdlrexprdata->nterms - 1; ++
k )
3171 "Minimum efficacy which a cut needs in order to be added.",
3175 "Should Eigenvalue computations be done to detect complex cases in quadratic constraints?",
3207 SCIP_Bool compeigenvalues,
3212 SCIP_Real** offsets,
3213 SCIP_Real** transcoefs,
3214 int** transcoefsidx,
3234 nlhdlrdata.compeigenvalues = compeigenvalues;
3246 for(
i = 0;
i < nlhdlrexprdata->nvars; ++
i )
3261 for(
i = 0;
i < nlhdlrexprdata->nvars; ++
i )
3267 *offsets = nlhdlrexprdata->offsets;
3268 *transcoefs = nlhdlrexprdata->transcoefs;
3269 *transcoefsidx = nlhdlrexprdata->transcoefsidx;
3270 *termbegins = nlhdlrexprdata->termbegins;
3271 *
nvars = nlhdlrexprdata->nvars;
3272 *
nterms = nlhdlrexprdata->nterms;
3277 if( nlhdlrexprdata !=
NULL )
3284 *transcoefsidx =
NULL;
3297 SCIP_Real** offsets,
3298 SCIP_Real** transcoefs,
3299 int** transcoefsidx,
constraint handler for nonlinear constraints specified by algebraic expressions
#define SCIPdebugGetSolVal(scip, var, val)
#define SCIPdebugAddSolVal(scip, var, val)
#define SCIP_LONGINT_FORMAT
power and signed power expression handlers
variable expression handler
unsigned int SCIPgetExprNAuxvarUsesNonlinear(SCIP_EXPR *expr)
int SCIPgetExprNLocksPosNonlinear(SCIP_EXPR *expr)
SCIP_VAR * SCIPgetExprAuxVarNonlinear(SCIP_EXPR *expr)
SCIP_EXPR * SCIPgetExprNonlinear(SCIP_CONS *cons)
SCIP_Real SCIPgetRhsNonlinear(SCIP_CONS *cons)
int SCIPgetExprNLocksNegNonlinear(SCIP_EXPR *expr)
SCIP_RETCODE SCIPregisterExprUsageNonlinear(SCIP *scip, SCIP_EXPR *expr, SCIP_Bool useauxvar, SCIP_Bool useactivityforprop, SCIP_Bool useactivityforsepabelow, SCIP_Bool useactivityforsepaabove)
SCIP_Real SCIPgetLhsNonlinear(SCIP_CONS *cons)
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
int SCIPhashmapGetImageInt(SCIP_HASHMAP *hashmap, void *origin)
int SCIPhashmapGetNElements(SCIP_HASHMAP *hashmap)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapInsertInt(SCIP_HASHMAP *hashmap, void *origin, int image)
void SCIPhashsetFree(SCIP_HASHSET **hashset, BMS_BLKMEM *blkmem)
SCIP_Bool SCIPhashsetExists(SCIP_HASHSET *hashset, void *element)
int SCIPhashsetGetNElements(SCIP_HASHSET *hashset)
SCIP_RETCODE SCIPhashsetInsert(SCIP_HASHSET *hashset, BMS_BLKMEM *blkmem, void *element)
SCIP_RETCODE SCIPhashsetCreate(SCIP_HASHSET **hashset, BMS_BLKMEM *blkmem, int size)
SCIP_RETCODE SCIPhashsetRemove(SCIP_HASHSET *hashset, void *element)
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
void SCIPfreeSOCArraysNonlinear(SCIP *scip, SCIP_VAR ***vars, SCIP_Real **offsets, SCIP_Real **transcoefs, int **transcoefsidx, int **termbegins, int nvars, int nterms)
SCIP_RETCODE SCIPisSOCNonlinear(SCIP *scip, SCIP_CONS *cons, SCIP_Bool compeigenvalues, SCIP_Bool *success, SCIP_SIDETYPE *sidetype, SCIP_VAR ***vars, SCIP_Real **offsets, SCIP_Real **transcoefs, int **transcoefsidx, int **termbegins, int *nvars, int *nterms)
SCIP_RETCODE SCIPincludeNlhdlrSoc(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 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)
void SCIPswapReals(SCIP_Real *value1, SCIP_Real *value2)
SCIP_RETCODE SCIPaddPoolCut(SCIP *scip, SCIP_ROW *row)
SCIP_Real SCIPgetCutEfficacy(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
SCIP_Bool SCIPisCutApplicable(SCIP *scip, SCIP_ROW *cut)
SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
int SCIPexprGetNChildren(SCIP_EXPR *expr)
SCIP_Real SCIPgetExponentExprPow(SCIP_EXPR *expr)
SCIP_Bool SCIPisExprProduct(SCIP *scip, SCIP_EXPR *expr)
SCIP_Bool SCIPisExprSum(SCIP *scip, SCIP_EXPR *expr)
SCIP_Real * SCIPgetCoefsExprSum(SCIP_EXPR *expr)
SCIP_Bool SCIPisExprVar(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPprintExpr(SCIP *scip, SCIP_EXPR *expr, FILE *file)
SCIP_Bool SCIPisExprPower(SCIP *scip, SCIP_EXPR *expr)
SCIP_EXPR ** SCIPexprGetChildren(SCIP_EXPR *expr)
SCIP_Real SCIPgetConstantExprSum(SCIP_EXPR *expr)
SCIP_VAR * SCIPgetVarExprVar(SCIP_EXPR *expr)
SCIP_INTERVAL SCIPexprGetActivity(SCIP_EXPR *expr)
SCIP_RETCODE SCIPdismantleExpr(SCIP *scip, FILE *file, SCIP_EXPR *expr)
SCIP_RETCODE SCIPevalExprActivity(SCIP *scip, SCIP_EXPR *expr)
SCIP_Real SCIPgetLPFeastol(SCIP *scip)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
#define SCIPallocClearBlockMemory(scip, ptr)
BMS_BUFMEM * SCIPbuffer(SCIP *scip)
#define SCIPallocClearBufferArray(scip, ptr, num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPduplicateBufferArray(scip, ptr, source, num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
#define SCIPfreeBufferArrayNull(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
void SCIPnlhdlrSetInitExit(SCIP_NLHDLR *nlhdlr, SCIP_DECL_NLHDLRINIT((*init)),)
SCIP_NLHDLRDATA * SCIPnlhdlrGetData(SCIP_NLHDLR *nlhdlr)
void SCIPnlhdlrSetFreeExprData(SCIP_NLHDLR *nlhdlr,)
const char * SCIPnlhdlrGetName(SCIP_NLHDLR *nlhdlr)
void SCIPnlhdlrSetSollinearize(SCIP_NLHDLR *nlhdlr,)
void SCIPnlhdlrSetSepa(SCIP_NLHDLR *nlhdlr, SCIP_DECL_NLHDLRINITSEPA((*initsepa)), SCIP_DECL_NLHDLRENFO((*enfo)), SCIP_DECL_NLHDLRESTIMATE((*estimate)),)
void SCIPnlhdlrSetFreeHdlrData(SCIP_NLHDLR *nlhdlr,)
void SCIPnlhdlrSetCopyHdlr(SCIP_NLHDLR *nlhdlr,)
SCIP_RETCODE SCIPincludeNlhdlrNonlinear(SCIP *scip, SCIP_NLHDLR **nlhdlr, const char *name, const char *desc, int detectpriority, int enfopriority, SCIP_DECL_NLHDLRDETECT((*detect)), SCIP_DECL_NLHDLREVALAUX((*evalaux)), SCIP_NLHDLRDATA *nlhdlrdata)
SCIP_RETCODE SCIPcreateEmptyRowConshdlr(SCIP *scip, SCIP_ROW **row, SCIP_CONSHDLR *conshdlr, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
SCIP_Real SCIPgetRowSolFeasibility(SCIP *scip, SCIP_ROW *row, SCIP_SOL *sol)
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
void SCIPmarkRowNotRemovableLocal(SCIP *scip, SCIP_ROW *row)
SCIP_Bool SCIProwIsInLP(SCIP_ROW *row)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
SCIP_Longint SCIPgetNLPs(SCIP *scip)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisPositive(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPround(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPgetHugeValue(SCIP *scip)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
void SCIPvarMarkRelaxationOnly(SCIP_VAR *var)
SCIP_RETCODE SCIPaddVarLocksType(SCIP *scip, SCIP_VAR *var, SCIP_LOCKTYPE locktype, int nlocksdown, int nlocksup)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
SCIP_RETCODE SCIPcreateVarBasic(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype)
SCIP_RETCODE SCIPcleanupRowprep2(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_Real maxcoefbound, SCIP_Bool *success)
SCIP_RETCODE SCIPensureRowprepSize(SCIP *scip, SCIP_ROWPREP *rowprep, int size)
SCIP_Real SCIPgetRowprepViolation(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_Bool *reliable)
char * SCIProwprepGetName(SCIP_ROWPREP *rowprep)
SCIP_Bool SCIProwprepIsLocal(SCIP_ROWPREP *rowprep)
SCIP_RETCODE SCIPaddRowprepTerm(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_VAR *var, SCIP_Real coef)
SCIP_RETCODE SCIPgetRowprepRowCons(SCIP *scip, SCIP_ROW **row, SCIP_ROWPREP *rowprep, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateRowprep(SCIP *scip, SCIP_ROWPREP **rowprep, SCIP_SIDETYPE sidetype, SCIP_Bool local)
int SCIProwprepGetNVars(SCIP_ROWPREP *rowprep)
void SCIProwprepAddSide(SCIP_ROWPREP *rowprep, SCIP_Real side)
void SCIPfreeRowprep(SCIP *scip, SCIP_ROWPREP **rowprep)
SCIP_Bool SCIPsortedvecFindInt(int *intarray, int val, int len, int *pos)
int SCIPsnprintf(char *t, int len, const char *s,...)
assert(minobj< SCIPgetCutoffbound(scip))
static volatile int nterms
SCIP_Bool SCIPlapackIsAvailable(void)
SCIP_RETCODE SCIPlapackComputeEigenvalues(BMS_BUFMEM *bufmem, SCIP_Bool geteigenvectors, int N, SCIP_Real *a, SCIP_Real *w)
interface methods for lapack functions
#define BMSclearMemoryArray(ptr, num)
#define NLHDLR_DETECTPRIORITY
static SCIP_RETCODE addCutPool(SCIP *scip, SCIP_NLHDLRDATA *nlhdlrdata, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_CONS *cons)
static SCIP_RETCODE tryFillNlhdlrExprDataQuad(SCIP *scip, SCIP_EXPR **occurringexprs, SCIP_Real *eigvecmatrix, SCIP_Real *eigvals, SCIP_Real *bp, int nvars, int *termbegins, SCIP_Real *transcoefs, int *transcoefsidx, SCIP_Real *offsets, SCIP_Real *lhsconstant, int *nterms, SCIP_Bool *success)
#define NLHDLR_ENFOPRIORITY
static SCIP_RETCODE freeNlhdlrExprData(SCIP *scip, SCIP_NLHDLREXPRDATA **nlhdlrexprdata)
static void updateVarVals(SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_SOL *sol, SCIP_Bool roundtinyfrac)
static SCIP_RETCODE generateCutSolSOC(SCIP *scip, SCIP_ROWPREP **rowprep, SCIP_EXPR *expr, SCIP_CONS *cons, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_Real mincutviolation, SCIP_Real rhsval)
static SCIP_RETCODE createDisaggrRow(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_EXPR *expr, SCIP_NLHDLREXPRDATA *nlhdlrexprdata)
static SCIP_RETCODE detectSocNorm(SCIP *scip, SCIP_EXPR *expr, SCIP_NLHDLREXPRDATA **nlhdlrexprdata, SCIP_Bool *success)
static SCIP_RETCODE detectSOC(SCIP *scip, SCIP_NLHDLRDATA *nlhdlrdata, SCIP_EXPR *expr, SCIP_Real conslhs, SCIP_Real consrhs, SCIP_NLHDLREXPRDATA **nlhdlrexprdata, SCIP_Bool *enforcebelow, SCIP_Bool *success)
static SCIP_RETCODE checkAndCollectQuadratic(SCIP *scip, SCIP_EXPR *quadexpr, SCIP_HASHMAP *expr2idx, SCIP_EXPR **occurringexprs, int *nexprs, SCIP_Bool *success)
#define DEFAULT_MINCUTEFFICACY
#define DEFAULT_COMPEIGENVALUES
static SCIP_RETCODE createDisaggrVars(SCIP *scip, SCIP_EXPR *expr, SCIP_NLHDLREXPRDATA *nlhdlrexprdata)
static SCIP_RETCODE detectSocQuadraticComplex(SCIP *scip, SCIP_EXPR *expr, SCIP_Real conslhs, SCIP_Real consrhs, SCIP_NLHDLREXPRDATA **nlhdlrexprdata, SCIP_Bool *enforcebelow, SCIP_Bool *success)
static SCIP_RETCODE createNlhdlrExprData(SCIP *scip, SCIP_EXPR **vars, SCIP_Real *offsets, SCIP_Real *transcoefs, int *transcoefsidx, int *termbegins, int nvars, int nterms, SCIP_NLHDLREXPRDATA **nlhdlrexprdata)
static void buildQuadExprMatrix(SCIP *scip, SCIP_EXPR *quadexpr, SCIP_HASHMAP *expr2idx, int nexprs, SCIP_Real *quadmatrix, SCIP_Real *linvector)
static SCIP_RETCODE addCut(SCIP *scip, SCIP_NLHDLRDATA *nlhdlrdata, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_CONS *cons, SCIP_Bool allowweakcuts, SCIP_RESULT *result)
static SCIP_RETCODE freeDisaggrVars(SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata)
static SCIP_RETCODE generateCutSolDisagg(SCIP *scip, SCIP_ROWPREP **rowprep, SCIP_EXPR *expr, SCIP_CONS *cons, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, int disaggidx, SCIP_Real mincutviolation, SCIP_Real rhsval)
static SCIP_Real evalSingleTerm(SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, int k)
static SCIP_RETCODE detectSocQuadraticSimple(SCIP *scip, SCIP_EXPR *expr, SCIP_Real conslhs, SCIP_Real consrhs, SCIP_NLHDLREXPRDATA **nlhdlrexprdata, SCIP_Bool *enforcebelow, SCIP_Bool *success)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
public functions of nonlinear handlers of nonlinear constraints
enum SCIP_SideType SCIP_SIDETYPE
#define SCIP_NLHDLR_METHOD_SEPAABOVE
#define SCIP_DECL_NLHDLREVALAUX(x)
struct SCIP_NlhdlrData SCIP_NLHDLRDATA
#define SCIP_NLHDLR_METHOD_SEPABOTH
#define SCIP_DECL_NLHDLRCOPYHDLR(x)
#define SCIP_DECL_NLHDLRINIT(x)
#define SCIP_DECL_NLHDLRSOLLINEARIZE(x)
#define SCIP_DECL_NLHDLREXIT(x)
#define SCIP_DECL_NLHDLRFREEEXPRDATA(x)
#define SCIP_DECL_NLHDLRDETECT(x)
#define SCIP_DECL_NLHDLREXITSEPA(x)
#define SCIP_DECL_NLHDLRINITSEPA(x)
#define SCIP_DECL_NLHDLRFREEHDLRDATA(x)
struct SCIP_NlhdlrExprData SCIP_NLHDLREXPRDATA
#define SCIP_DECL_NLHDLRENFO(x)
#define SCIP_NLHDLR_METHOD_SEPABELOW
enum SCIP_Result SCIP_RESULT
enum SCIP_Retcode SCIP_RETCODE
@ SCIP_VARTYPE_CONTINUOUS