Scippy

SCIP

Solving Constraint Integer Programs

Detailed Description

signomial nonlinear handler

Author
Liding Xu

Definition in file nlhdlr_signomial.c.

Go to the source code of this file.

Data Structures

struct  VERTEXPOLYFUN_EVALDATA
 

Macros

#define NLHDLR_NAME   "signomial"
 
#define NLHDLR_DESC   "handler for signomial expressions"
 
#define NLHDLR_DETECTPRIORITY   30
 
#define NLHDLR_ENFOPRIORITY   30
 
#define NLHDLR_MAXNUNDERVARS   14
 
#define NLHDLR_MINCUTSCALE   1e-5
 

Functions

static void freeExprDataMem (SCIP *scip, SCIP_NLHDLREXPRDATA **nlhdlrexprdata, SCIP_Bool ispartial)
 
static void reformRowprep (SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_ROWPREP *rowprep, SCIP_Real mincutscale, SCIP_Bool *success)
 
static SCIP_RETCODE storeCaptureVars (SCIP *scip, SCIP_EXPR *expr, SCIP_NLHDLREXPRDATA *nlhdlrexprdata)
 
static void checkSignomialBounds (SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_Bool *isboxsignomial)
 
static SCIP_DECL_VERTEXPOLYFUN (nlhdlrExprEvalPower)
 
static SCIP_RETCODE estimateSpecialPower (SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_Bool sign, SCIP_Real multiplier, SCIP_Bool overestimate, SCIP_SOL *sol, SCIP_ROWPREP *rowprep, SCIP_Bool *isspecial, SCIP_Bool *success)
 
static SCIP_RETCODE underEstimatePower (SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_NLHDLR *nlhdlr, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_Bool sign, SCIP_Real multiplier, SCIP_SOL *sol, SCIP_Real targetvalue, SCIP_ROWPREP *rowprep, SCIP_Bool *success)
 
static SCIP_RETCODE overEstimatePower (SCIP *scip, SCIP_NLHDLREXPRDATA *nlhdlrexprdata, SCIP_Bool sign, SCIP_Real multiplier, SCIP_SOL *sol, SCIP_ROWPREP *rowprep, SCIP_Bool *success)
 
static SCIP_DECL_NLHDLRESTIMATE (nlhdlrEstimateSignomial)
 
static SCIP_DECL_NLHDLRDETECT (nlhdlrDetectSignomial)
 
static SCIP_DECL_NLHDLREVALAUX (nlhdlrEvalauxSignomial)
 
static SCIP_DECL_NLHDLRCOPYHDLR (nlhdlrCopyhdlrSignomial)
 
static SCIP_DECL_NLHDLRFREEHDLRDATA (nlhdlrFreehdlrDataSignomial)
 
static SCIP_DECL_NLHDLRFREEEXPRDATA (nlhdlrFreeExprDataSignomial)
 
SCIP_RETCODE SCIPincludeNlhdlrSignomial (SCIP *scip)
 

Macro Definition Documentation

◆ NLHDLR_NAME

#define NLHDLR_NAME   "signomial"

Definition at line 50 of file nlhdlr_signomial.c.

Referenced by SCIP_DECL_NLHDLRCOPYHDLR(), and SCIPincludeNlhdlrSignomial().

◆ NLHDLR_DESC

#define NLHDLR_DESC   "handler for signomial expressions"

Definition at line 51 of file nlhdlr_signomial.c.

Referenced by SCIPincludeNlhdlrSignomial().

◆ NLHDLR_DETECTPRIORITY

#define NLHDLR_DETECTPRIORITY   30

Definition at line 52 of file nlhdlr_signomial.c.

Referenced by SCIPincludeNlhdlrSignomial().

◆ NLHDLR_ENFOPRIORITY

#define NLHDLR_ENFOPRIORITY   30

Definition at line 53 of file nlhdlr_signomial.c.

Referenced by SCIPincludeNlhdlrSignomial().

◆ NLHDLR_MAXNUNDERVARS

#define NLHDLR_MAXNUNDERVARS   14

maximum number of variables when underestimating a concave power function (maximum: 14)

Definition at line 56 of file nlhdlr_signomial.c.

Referenced by SCIPincludeNlhdlrSignomial().

◆ NLHDLR_MINCUTSCALE

#define NLHDLR_MINCUTSCALE   1e-5

minimum scale factor when scaling a cut (minimum: 1e-6)

Definition at line 57 of file nlhdlr_signomial.c.

Referenced by SCIPincludeNlhdlrSignomial().

Function Documentation

◆ freeExprDataMem()

static void freeExprDataMem ( SCIP scip,
SCIP_NLHDLREXPRDATA **  nlhdlrexprdata,
SCIP_Bool  ispartial 
)
static

free the memory of expression data

Parameters
scipSCIP data structure
nlhdlrexprdataexpression data
ispartialfree the partially allocated memory or the fully allocated memory?

Definition at line 193 of file nlhdlr_signomial.c.

References NULL, SCIPfreeBlockMemory, SCIPfreeBlockMemoryArray, and SCIPfreeBlockMemoryArrayNull.

Referenced by SCIP_DECL_NLHDLRDETECT(), and SCIP_DECL_NLHDLRFREEEXPRDATA().

◆ reformRowprep()

static void reformRowprep ( SCIP scip,
SCIP_NLHDLREXPRDATA nlhdlrexprdata,
SCIP_ROWPREP rowprep,
SCIP_Real  mincutscale,
SCIP_Bool success 
)
static

reforms a rowprep to a standard form for nonlinear handlers

The input rowprep is of the form \( a_u u + a_v v + b \). If in the overestimate mode, then we relax \( t \le x^a \), i.e., \( 0 \le u^f - v^g \). This implies that \( t \) is in \( v = (v',t) \). Therefore, the valid inequality is \( 0 \le a_u u + a_v v + b \). As overestimate mode requires that \( t \) is in the left hand side, the coefficients of \( t \) must be made negative while keeping the sign of the inequality, we can show that \( a_t \le 0 \), so it suffices to divide the both sides by \( -a_t \ge 0\), which yields \( t \le (a_u u + a_v' v' + b) / -a_t \). A rowprep in standard form only contains an estimator of the expression and no auxvar. If in the underestimate mode, then we relax \( x^a \le t \), i.e., \( u^f - v^g \le 0 \). This implies that \( t \) is in \( v = (v',t) \). Therefore, the valid inequality is \( a_u u + a_v v + b \le 0 \). As overestimate mode requires that \( t \) is in the left hand side, the coefficients of \( t \) must be made negative while keeping the sign of the inequality, we can show that \( a_t \le 0 \), so it suffices to divide the both sides by \( -a_t \ge 0 \), which yields \( (a_u u + a_v' v' + b) / -a_t \le t \). A rowprep in standard form only contains an estimator of the expression and no auxvar.

Parameters
scipSCIP data structure
nlhdlrexprdataexpression data
rowprepcut to be reformulated
mincutscalemin scaling factor for the cut in rowprep
successpointer to store whether the reformulating was successful

Definition at line 231 of file nlhdlr_signomial.c.

References FALSE, NULL, SCIP_Real, SCIPisGT(), SCIPisZero(), SCIProwprepAddSide(), SCIProwprepGetCoefs(), SCIProwprepGetNVars(), SCIProwprepGetSide(), and SCIProwprepGetVars().

Referenced by SCIP_DECL_NLHDLRESTIMATE().

◆ storeCaptureVars()

static SCIP_RETCODE storeCaptureVars ( SCIP scip,
SCIP_EXPR expr,
SCIP_NLHDLREXPRDATA nlhdlrexprdata 
)
static

store and capture variables associated with the expression and its subexpressions

Parameters
scipSCIP data structure
exprexpression
nlhdlrexprdataexpression data

Definition at line 291 of file nlhdlr_signomial.c.

References NULL, SCIP_CALL, SCIP_OKAY, SCIPcaptureVar(), SCIPgetExprAuxVarNonlinear(), and TRUE.

Referenced by SCIP_DECL_NLHDLRESTIMATE().

◆ checkSignomialBounds()

static void checkSignomialBounds ( SCIP scip,
SCIP_NLHDLREXPRDATA nlhdlrexprdata,
SCIP_Bool isboxsignomial 
)
static

get bounds of variables x,t and check whether they are box constrained signomial variables

Parameters
scipSCIP data structure
nlhdlrexprdataexpression data
isboxsignomialbuffer to store whether variables are box constrained signomial variables

Definition at line 322 of file nlhdlr_signomial.c.

References FALSE, MAX, MIN, SCIP_Real, SCIPisEQ(), SCIPisInfinity(), SCIPisPositive(), SCIPvarGetLbLocal(), SCIPvarGetUbLocal(), and TRUE.

Referenced by SCIP_DECL_NLHDLRESTIMATE().

◆ SCIP_DECL_VERTEXPOLYFUN()

static SCIP_DECL_VERTEXPOLYFUN ( nlhdlrExprEvalPower  )
static

evaluate expression at solution w.r.t. auxiliary variables

Definition at line 365 of file nlhdlr_signomial.c.

References VERTEXPOLYFUN_EVALDATA::nlhdlrexprdata, VERTEXPOLYFUN_EVALDATA::nsignvars, NULL, VERTEXPOLYFUN_EVALDATA::scip, SCIP_Real, SCIPdebugMsg, and VERTEXPOLYFUN_EVALDATA::sign.

◆ estimateSpecialPower()

static SCIP_RETCODE estimateSpecialPower ( SCIP scip,
SCIP_NLHDLREXPRDATA nlhdlrexprdata,
SCIP_Bool  sign,
SCIP_Real  multiplier,
SCIP_Bool  overestimate,
SCIP_SOL sol,
SCIP_ROWPREP rowprep,
SCIP_Bool isspecial,
SCIP_Bool success 
)
static

determine whether a power function \( w^h \) is special and add an overunderestimator or underestimator to a given rowprep

\( w^h \) is special, if all variables are fixed, or it is a constant to estimate, a univariate power to estimate, or a bivariate power to underestimate. The estimator is multiplied by the multiplier and stored in the rowprep.

Parameters
scipSCIP data structure
nlhdlrexprdatanonlinear handler expression data
signthe sign of variables of the power function
multiplierthe multiplier of the estimator
overestimatewhether overestimate or underestimator the power function
solsolution \( w' \) to use in estimation
rowpreprowprep where to store estimator
isspecialbuffer to store whether this function is a special case
successbuffer to store whether successful

Definition at line 404 of file nlhdlr_signomial.c.

References FALSE, NULL, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIPaddRowprepTerm(), SCIPestimateRoot(), SCIPgetSolVal(), SCIPisRelEQ(), SCIProwprepAddConstant(), and TRUE.

Referenced by SCIP_DECL_NLHDLRESTIMATE().

◆ underEstimatePower()

static SCIP_RETCODE underEstimatePower ( SCIP scip,
SCIP_CONSHDLR conshdlr,
SCIP_NLHDLR nlhdlr,
SCIP_NLHDLREXPRDATA nlhdlrexprdata,
SCIP_Bool  sign,
SCIP_Real  multiplier,
SCIP_SOL sol,
SCIP_Real  targetvalue,
SCIP_ROWPREP rowprep,
SCIP_Bool success 
)
static

adds an underestimator for a multivariate concave power function \( w^h \) to a given rowprep

Calls SCIPcomputeFacetVertexPolyhedralNonlinear() for \( w^h \) and box set to local bounds of auxiliary variables. The estimator is multiplied by the multiplier and stored in the rowprep.

Parameters
scipSCIP data structure
conshdlrnonlinear constraint handler
nlhdlrnonlinear handler
nlhdlrexprdatanonlinear handler expression data
signthe sign of variables of the power function
multiplierthe multiplier of the estimator
solsolution \( w' \) to use
targetvaluea target value to achieve; if not reachable, then can give up early
rowpreprowprep where to store estimator
successbuffer to store whether successful

Definition at line 594 of file nlhdlr_signomial.c.

References FALSE, VERTEXPOLYFUN_EVALDATA::nlhdlrexprdata, VERTEXPOLYFUN_EVALDATA::nsignvars, NULL, VERTEXPOLYFUN_EVALDATA::scip, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIPaddRowprepTerm(), SCIPcomputeFacetVertexPolyhedralNonlinear(), SCIPdebugMsg, SCIPgetSolVal(), SCIProwprepAddConstant(), VERTEXPOLYFUN_EVALDATA::sign, and SCIP_RowPrep::vars.

Referenced by SCIP_DECL_NLHDLRESTIMATE().

◆ overEstimatePower()

static SCIP_RETCODE overEstimatePower ( SCIP scip,
SCIP_NLHDLREXPRDATA nlhdlrexprdata,
SCIP_Bool  sign,
SCIP_Real  multiplier,
SCIP_SOL sol,
SCIP_ROWPREP rowprep,
SCIP_Bool success 
)
static

adds an overestimator for a concave power function \( w^h \) to a given rowprep

The estimator is multiplied by the multiplier and stored in the rowprep.

Parameters
scipSCIP data structure
nlhdlrexprdatanonlinear handler expression data
signthe sign of variables of the power function
multiplierthe multiplier of the estimator
solsolution to use
rowpreprowprep where to store estimator
successbuffer to store whether successful

Definition at line 681 of file nlhdlr_signomial.c.

References FALSE, MAX, NULL, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIPaddRowprepTerm(), SCIPgetSolVal(), SCIProwprepAddConstant(), and TRUE.

Referenced by SCIP_DECL_NLHDLRESTIMATE().

◆ SCIP_DECL_NLHDLRESTIMATE()

◆ SCIP_DECL_NLHDLRDETECT()

◆ SCIP_DECL_NLHDLREVALAUX()

static SCIP_DECL_NLHDLREVALAUX ( nlhdlrEvalauxSignomial  )
static

auxiliary evaluation callback of nonlinear handler

Definition at line 1016 of file nlhdlr_signomial.c.

References NULL, SCIP_INVALID, SCIP_OKAY, SCIP_Real, SCIPgetExprAuxVarNonlinear(), SCIPgetSolVal(), and SCIPisPositive().

◆ SCIP_DECL_NLHDLRCOPYHDLR()

static SCIP_DECL_NLHDLRCOPYHDLR ( nlhdlrCopyhdlrSignomial  )
static

nonlinear handler copy callback

Definition at line 1047 of file nlhdlr_signomial.c.

References NLHDLR_NAME, NULL, SCIP_CALL, SCIP_OKAY, SCIPincludeNlhdlrSignomial(), and SCIPnlhdlrGetName().

◆ SCIP_DECL_NLHDLRFREEHDLRDATA()

static SCIP_DECL_NLHDLRFREEHDLRDATA ( nlhdlrFreehdlrDataSignomial  )
static

callback to free data of handler

Definition at line 1060 of file nlhdlr_signomial.c.

References NULL, SCIP_OKAY, and SCIPfreeBlockMemory.

◆ SCIP_DECL_NLHDLRFREEEXPRDATA()

static SCIP_DECL_NLHDLRFREEEXPRDATA ( nlhdlrFreeExprDataSignomial  )
static

callback to free expression specific data

Definition at line 1071 of file nlhdlr_signomial.c.

References FALSE, freeExprDataMem(), NULL, SCIP_CALL, SCIP_OKAY, SCIPreleaseExpr(), and SCIPreleaseVar().