Scippy

    SCIP

    Solving Constraint Integer Programs

    Detailed Description

    separator for cuts generated by Reformulation-Linearization-Technique (RLT)

    Author
    Fabian Wegscheider
    Ksenia Bestuzheva

    Definition in file sepa_rlt.c.

    #include <assert.h>
    #include <string.h>
    #include "scip/sepa_rlt.h"
    #include "scip/cons_nonlinear.h"
    #include "scip/pub_lp.h"
    #include "scip/expr_pow.h"
    #include "scip/nlhdlr_bilinear.h"
    #include "scip/cutsel_hybrid.h"

    Go to the source code of this file.

    Data Structures

    struct  HashData
     
    struct  AdjacentVarData
     
    struct  RLT_SimpleRow
     

    Macros

    #define SEPA_NAME   "rlt"
     
    #define SEPA_DESC   "reformulation-linearization-technique separator"
     
    #define SEPA_PRIORITY   10
     
    #define SEPA_FREQ   0
     
    #define SEPA_MAXBOUNDDIST   1.0
     
    #define SEPA_USESSUBSCIP   FALSE
     
    #define SEPA_DELAY   FALSE
     
    #define DEFAULT_MAXUNKNOWNTERMS   0
     
    #define DEFAULT_MAXUSEDVARS   100
     
    #define DEFAULT_MAXNCUTS   -1
     
    #define DEFAULT_MAXROUNDS   1
     
    #define DEFAULT_MAXROUNDSROOT   10
     
    #define DEFAULT_ONLYEQROWS   FALSE
     
    #define DEFAULT_ONLYCONTROWS   FALSE
     
    #define DEFAULT_ONLYORIGINAL   TRUE
     
    #define DEFAULT_USEINSUBSCIP   FALSE
     
    #define DEFAULT_USEPROJECTION   FALSE
     
    #define DEFAULT_DETECTHIDDEN   FALSE
     
    #define DEFAULT_HIDDENRLT   FALSE
     
    #define DEFAULT_ADDTOPOOL   TRUE
     
    #define DEFAULT_GOODSCORE   1.0
     
    #define DEFAULT_BADSCORE   0.5
     
    #define DEFAULT_OBJPARALWEIGHT   0.0
     
    #define DEFAULT_EFFICACYWEIGHT   1.0
     
    #define DEFAULT_DIRCUTOFFDISTWEIGHT   0.0
     
    #define DEFAULT_GOODMAXPARALL   0.1
     
    #define DEFAULT_MAXPARALL   0.1
     
    #define MAXVARBOUND   1e+5
     

    Typedefs

    typedef struct HashData HASHDATA
     
    typedef struct AdjacentVarData ADJACENTVARDATA
     
    typedef struct RLT_SimpleRow RLT_SIMPLEROW
     

    Functions

    static SCIP_DECL_HASHKEYEQ (hashdataKeyEqConss)
     
    static SCIP_DECL_HASHKEYVAL (hashdataKeyValConss)
     
    static SCIP_RETCODE addAdjacentVars (SCIP *scip, SCIP_HASHMAP *adjvarmap, SCIP_VAR **vars)
     
    static SCIP_VAR ** getAdjacentVars (SCIP_HASHMAP *adjvarmap, SCIP_VAR *var, int *nadjacentvars)
     
    static void clearVarAdjacency (SCIP *scip, SCIP_HASHMAP *adjvarmap)
     
    static SCIP_RETCODE freeSepaData (SCIP *scip, SCIP_SEPADATA *sepadata)
     
    static SCIP_RETCODE getOriginalRows (SCIP *scip, SCIP_ROW ***rows, int *nrows)
     
    static SCIP_RETCODE storeSuitableRows (SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata, SCIP_ROW **prob_rows, SCIP_ROW **rows, int *nrows, SCIP_HASHMAP *row_to_pos, SCIP_Bool allowlocal)
     
    static SCIP_RETCODE ensureVarsSize (SCIP *scip, SCIP_SEPADATA *sepadata, int n)
     
    static SCIP_RETCODE addProductVars (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_VAR *x, SCIP_VAR *y, SCIP_HASHMAP *varmap, int nlocks)
     
    static SCIP_RETCODE extractProducts (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_VAR **vars_xwy, SCIP_Real *coefs1, SCIP_Real *coefs2, SCIP_Real d1, SCIP_Real d2, SCIP_SIDETYPE sidetype1, SCIP_SIDETYPE sidetype2, SCIP_HASHMAP *varmap, SCIP_Bool f)
     
    static void implBndToBigM (SCIP *scip, SCIP_VAR **vars_xwy, int binvarpos, int implvarpos, SCIP_BOUNDTYPE bndtype, SCIP_Bool binval, SCIP_Real implbnd, SCIP_Real *coefs, SCIP_Real *side)
     
    static SCIP_RETCODE detectProductsImplbnd (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_Real *coefs1, SCIP_VAR **vars_xwy, SCIP_Real side1, SCIP_SIDETYPE sidetype1, int binvarpos, int implvarpos, SCIP_HASHMAP *varmap, SCIP_Bool f)
     
    static SCIP_RETCODE detectProductsClique (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_Real *coefs1, SCIP_VAR **vars_xwy, SCIP_Real side1, SCIP_SIDETYPE sidetype1, int varpos1, int varpos2, SCIP_HASHMAP *varmap, SCIP_Bool f)
     
    static SCIP_RETCODE detectProductsUnconditional (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_ROW **rows, int *row_list, SCIP_HASHTABLE *hashtable, SCIP_Real *coefs1, SCIP_VAR **vars_xwy, SCIP_Real side1, SCIP_SIDETYPE sidetype1, int varpos1, int varpos2, SCIP_HASHMAP *varmap, SCIP_Bool f)
     
    static SCIP_RETCODE fillRelationTables (SCIP *scip, SCIP_ROW **prob_rows, int nrows, SCIP_HASHTABLE *hashtable2, SCIP_HASHTABLE *hashtable3, SCIP_HASHMAP *vars_in_2rels, int *row_list)
     
    static SCIP_RETCODE detectHiddenProducts (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_HASHMAP *varmap)
     
    static SCIP_RETCODE createSepaData (SCIP *scip, SCIP_SEPADATA *sepadata)
     
    static void getBestEstimators (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_SOL *sol, int *bestunderestimators, int *bestoverestimators)
     
    static SCIP_RETCODE isAcceptableRow (SCIP_SEPADATA *sepadata, SCIP_ROW *row, SCIP_VAR *var, int *currentnunknown, SCIP_Bool *acceptable)
     
    static void addAuxexprCoefs (SCIP_VAR *var1, SCIP_VAR *var2, SCIP_CONSNONLINEAR_AUXEXPR *auxexpr, SCIP_Real coef, SCIP_Real *coefaux, SCIP_Real *coef1, SCIP_Real *coef2, SCIP_Real *cst)
     
    static SCIP_RETCODE addRltTerm (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_SOL *sol, int *bestunderest, int *bestoverest, SCIP_ROW *cut, SCIP_VAR *var, SCIP_VAR *colvar, SCIP_Real coef, SCIP_Bool uselb, SCIP_Bool uselhs, SCIP_Bool local, SCIP_Bool computeEqCut, SCIP_Real *coefvar, SCIP_Real *cst, SCIP_Bool *success)
     
    static SCIP_RETCODE computeRltCut (SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata, SCIP_ROW **cut, SCIP_ROW *row, RLT_SIMPLEROW *projrow, SCIP_SOL *sol, int *bestunderest, int *bestoverest, SCIP_VAR *var, SCIP_Bool *success, SCIP_Bool uselb, SCIP_Bool uselhs, SCIP_Bool local, SCIP_Bool computeEqCut, SCIP_Bool useprojrow)
     
    static SCIP_RETCODE createProjRow (SCIP *scip, RLT_SIMPLEROW *simplerow, SCIP_ROW *row, SCIP_SOL *sol, SCIP_Bool local)
     
    static void freeProjRow (SCIP *scip, RLT_SIMPLEROW *simplerow)
     
    static SCIP_RETCODE createProjRows (SCIP *scip, SCIP_ROW **rows, int nrows, SCIP_SOL *sol, RLT_SIMPLEROW **projrows, SCIP_Bool local, SCIP_Bool *allcst)
     
    static void freeProjRows (SCIP *scip, RLT_SIMPLEROW **projrows, int nrows)
     
    static void addRowMark (int ridx, SCIP_Real a, SCIP_Bool violatedbelow, SCIP_Bool violatedabove, int *row_idcs, unsigned int *row_marks, int *nmarked)
     
    static SCIP_RETCODE markRowsXj (SCIP *scip, SCIP_SEPADATA *sepadata, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, int j, SCIP_Bool local, SCIP_HASHMAP *row_to_pos, int *bestunderest, int *bestoverest, unsigned int *row_marks, int *row_idcs, int *nmarked)
     
    static SCIP_RETCODE separateMcCormickImplicit (SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata, SCIP_SOL *sol, int *bestunderestimators, int *bestoverestimators, SCIP_RESULT *result)
     
    static SCIP_RETCODE separateRltCuts (SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, SCIP_HASHMAP *row_to_pos, RLT_SIMPLEROW *projrows, SCIP_ROW **rows, int nrows, SCIP_Bool allowlocal, int *bestunderestimators, int *bestoverestimators, SCIP_RESULT *result)
     
    static SCIP_DECL_SEPACOPY (sepaCopyRlt)
     
    static SCIP_DECL_SEPAFREE (sepaFreeRlt)
     
    static SCIP_DECL_SEPAEXITSOL (sepaExitsolRlt)
     
    static SCIP_DECL_SEPAEXECLP (sepaExeclpRlt)
     
    SCIP_RETCODE SCIPincludeSepaRlt (SCIP *scip)
     

    Macro Definition Documentation

    ◆ SEPA_NAME

    #define SEPA_NAME   "rlt"

    Definition at line 51 of file sepa_rlt.c.

    ◆ SEPA_DESC

    #define SEPA_DESC   "reformulation-linearization-technique separator"

    Definition at line 52 of file sepa_rlt.c.

    ◆ SEPA_PRIORITY

    #define SEPA_PRIORITY   10

    priority for separation

    Definition at line 53 of file sepa_rlt.c.

    ◆ SEPA_FREQ

    #define SEPA_FREQ   0

    frequency for separating cuts; zero means to separate only in the root node

    Definition at line 54 of file sepa_rlt.c.

    ◆ SEPA_MAXBOUNDDIST

    #define SEPA_MAXBOUNDDIST   1.0

    maximal relative distance from the current node's dual bound to primal bound compared to best node's dual bound for applying separation.

    Definition at line 56 of file sepa_rlt.c.

    ◆ SEPA_USESSUBSCIP

    #define SEPA_USESSUBSCIP   FALSE

    does the separator use a secondary SCIP instance?

    Definition at line 57 of file sepa_rlt.c.

    ◆ SEPA_DELAY

    #define SEPA_DELAY   FALSE

    should separation method be delayed, if other separators found cuts?

    Definition at line 58 of file sepa_rlt.c.

    ◆ DEFAULT_MAXUNKNOWNTERMS

    #define DEFAULT_MAXUNKNOWNTERMS   0

    maximum number of unknown bilinear terms a row can have to be used

    Definition at line 60 of file sepa_rlt.c.

    ◆ DEFAULT_MAXUSEDVARS

    #define DEFAULT_MAXUSEDVARS   100

    maximum number of variables that will be used to compute rlt cuts

    Definition at line 61 of file sepa_rlt.c.

    ◆ DEFAULT_MAXNCUTS

    #define DEFAULT_MAXNCUTS   -1

    maximum number of cuts that will be added per round

    Definition at line 62 of file sepa_rlt.c.

    ◆ DEFAULT_MAXROUNDS

    #define DEFAULT_MAXROUNDS   1

    maximum number of separation rounds per node (-1: unlimited)

    Definition at line 63 of file sepa_rlt.c.

    ◆ DEFAULT_MAXROUNDSROOT

    #define DEFAULT_MAXROUNDSROOT   10

    maximum number of separation rounds in the root node (-1: unlimited)

    Definition at line 64 of file sepa_rlt.c.

    ◆ DEFAULT_ONLYEQROWS

    #define DEFAULT_ONLYEQROWS   FALSE

    whether only equality rows should be used for rlt cuts

    Definition at line 65 of file sepa_rlt.c.

    ◆ DEFAULT_ONLYCONTROWS

    #define DEFAULT_ONLYCONTROWS   FALSE

    whether only continuous rows should be used for rlt cuts

    Definition at line 66 of file sepa_rlt.c.

    ◆ DEFAULT_ONLYORIGINAL

    #define DEFAULT_ONLYORIGINAL   TRUE

    whether only original variables and rows should be used for rlt cuts

    Definition at line 67 of file sepa_rlt.c.

    ◆ DEFAULT_USEINSUBSCIP

    #define DEFAULT_USEINSUBSCIP   FALSE

    whether the separator should also be used in sub-scips

    Definition at line 68 of file sepa_rlt.c.

    ◆ DEFAULT_USEPROJECTION

    #define DEFAULT_USEPROJECTION   FALSE

    whether the separator should first check projected rows

    Definition at line 69 of file sepa_rlt.c.

    ◆ DEFAULT_DETECTHIDDEN

    #define DEFAULT_DETECTHIDDEN   FALSE

    whether implicit products should be detected and separated by McCormick

    Definition at line 70 of file sepa_rlt.c.

    ◆ DEFAULT_HIDDENRLT

    #define DEFAULT_HIDDENRLT   FALSE

    whether RLT cuts should be added for hidden products

    Definition at line 71 of file sepa_rlt.c.

    ◆ DEFAULT_ADDTOPOOL

    #define DEFAULT_ADDTOPOOL   TRUE

    whether globally valid RLT cuts are added to the global cut pool

    Definition at line 72 of file sepa_rlt.c.

    ◆ DEFAULT_GOODSCORE

    #define DEFAULT_GOODSCORE   1.0

    threshold for score of cut relative to best score to be considered good, so that less strict filtering is applied

    Definition at line 75 of file sepa_rlt.c.

    ◆ DEFAULT_BADSCORE

    #define DEFAULT_BADSCORE   0.5

    threshold for score of cut relative to best score to be discarded

    Definition at line 76 of file sepa_rlt.c.

    ◆ DEFAULT_OBJPARALWEIGHT

    #define DEFAULT_OBJPARALWEIGHT   0.0

    weight of objective parallelism in cut score calculation

    Definition at line 77 of file sepa_rlt.c.

    ◆ DEFAULT_EFFICACYWEIGHT

    #define DEFAULT_EFFICACYWEIGHT   1.0

    weight of efficacy in cut score calculation

    Definition at line 78 of file sepa_rlt.c.

    ◆ DEFAULT_DIRCUTOFFDISTWEIGHT

    #define DEFAULT_DIRCUTOFFDISTWEIGHT   0.0

    weight of directed cutoff distance in cut score calculation

    Definition at line 79 of file sepa_rlt.c.

    ◆ DEFAULT_GOODMAXPARALL

    #define DEFAULT_GOODMAXPARALL   0.1

    maximum parallelism for good cuts

    Definition at line 80 of file sepa_rlt.c.

    ◆ DEFAULT_MAXPARALL

    #define DEFAULT_MAXPARALL   0.1

    maximum parallelism for non-good cuts

    Definition at line 81 of file sepa_rlt.c.

    ◆ MAXVARBOUND

    #define MAXVARBOUND   1e+5

    maximum allowed variable bound for computing an RLT-cut

    Definition at line 83 of file sepa_rlt.c.

    Typedef Documentation

    ◆ HASHDATA

    typedef struct HashData HASHDATA

    Definition at line 97 of file sepa_rlt.c.

    ◆ ADJACENTVARDATA

    Definition at line 108 of file sepa_rlt.c.

    ◆ RLT_SIMPLEROW

    typedef struct RLT_SimpleRow RLT_SIMPLEROW

    Definition at line 167 of file sepa_rlt.c.

    Function Documentation

    ◆ SCIP_DECL_HASHKEYEQ()

    static SCIP_DECL_HASHKEYEQ ( hashdataKeyEqConss  )
    static

    returns TRUE iff both keys are equal

    two variable pairs/triples are equal if the variables are equal

    Definition at line 178 of file sepa_rlt.c.

    References FALSE, HashData::firstrow, HashData::nvars, SCIPvarCompare(), TRUE, and HashData::vars.

    ◆ SCIP_DECL_HASHKEYVAL()

    static SCIP_DECL_HASHKEYVAL ( hashdataKeyValConss  )
    static

    returns the hash value of the key

    Definition at line 210 of file sepa_rlt.c.

    References MAX, MAX3, MIN, MIN3, NULL, HashData::nvars, SCIPhashFour, SCIPvarGetIndex(), and HashData::vars.

    ◆ addAdjacentVars()

    static SCIP_RETCODE addAdjacentVars ( SCIP scip,
    SCIP_HASHMAP adjvarmap,
    SCIP_VAR **  vars 
    )
    static

    store a pair of adjacent variables

    Parameters
    scipSCIP data structure
    adjvarmaphashmap mapping variables to their ADJACENTVARDATAs
    varsvariable pair to be stored

    Definition at line 241 of file sepa_rlt.c.

    References AdjacentVarData::adjacentvars, AdjacentVarData::nadjacentvars, NULL, AdjacentVarData::sadjacentvars, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIPallocBlockMemoryArray, SCIPallocClearBlockMemory, SCIPensureBlockMemoryArray, SCIPhashmapGetImage(), SCIPhashmapInsert(), SCIPsortedvecFindPtr(), SCIPvarGetIndex(), and RLT_SimpleRow::vars.

    Referenced by addProductVars(), and fillRelationTables().

    ◆ getAdjacentVars()

    static SCIP_VAR ** getAdjacentVars ( SCIP_HASHMAP adjvarmap,
    SCIP_VAR var,
    int *  nadjacentvars 
    )
    static

    returns the array of adjacent variables for a given variable

    Parameters
    adjvarmaphashmap mapping variables to their ADJACENTVARDATAs
    varvariable
    nadjacentvarsbuffer to store the number of variables in the returned array

    Definition at line 315 of file sepa_rlt.c.

    References AdjacentVarData::adjacentvars, AdjacentVarData::nadjacentvars, NULL, SCIPhashmapGetImage(), and SCIPvarGetIndex().

    Referenced by detectHiddenProducts(), and markRowsXj().

    ◆ clearVarAdjacency()

    static void clearVarAdjacency ( SCIP scip,
    SCIP_HASHMAP adjvarmap 
    )
    static

    frees all ADJACENTVARDATAs stored in a hashmap

    Parameters
    scipSCIP data structure
    adjvarmaphashmap mapping variables to their ADJACENTVARDATAs

    Definition at line 338 of file sepa_rlt.c.

    References AdjacentVarData::adjacentvars, NULL, AdjacentVarData::sadjacentvars, SCIPfreeBlockMemory, SCIPfreeBlockMemoryArray, SCIPhashmapEntryGetImage(), SCIPhashmapGetEntry(), and SCIPhashmapGetNEntries().

    Referenced by detectHiddenProducts(), and freeSepaData().

    ◆ freeSepaData()

    static SCIP_RETCODE freeSepaData ( SCIP scip,
    SCIP_SEPADATA sepadata 
    )
    static

    free separator data

    Parameters
    scipSCIP data structure
    sepadataseparation data

    Definition at line 368 of file sepa_rlt.c.

    References clearVarAdjacency(), FALSE, NULL, SCIP_CALL, SCIP_OKAY, SCIPfreeBlockMemoryArray, SCIPhashmapFree(), and SCIPreleaseVar().

    Referenced by SCIP_DECL_SEPAEXITSOL().

    ◆ getOriginalRows()

    static SCIP_RETCODE getOriginalRows ( SCIP scip,
    SCIP_ROW ***  rows,
    int *  nrows 
    )
    static

    creates and returns rows of original linear constraints

    Parameters
    scipSCIP data structure
    rowsbuffer to store the rows
    nrowsbuffer to store the number of linear rows

    Definition at line 412 of file sepa_rlt.c.

    References NULL, SCIP_CALL, SCIP_OKAY, SCIPallocBufferArray, SCIPconsGetRow(), SCIPgetConss(), and SCIPgetNConss().

    Referenced by detectHiddenProducts(), and SCIP_DECL_SEPAEXECLP().

    ◆ storeSuitableRows()

    static SCIP_RETCODE storeSuitableRows ( SCIP scip,
    SCIP_SEPA sepa,
    SCIP_SEPADATA sepadata,
    SCIP_ROW **  prob_rows,
    SCIP_ROW **  rows,
    int *  nrows,
    SCIP_HASHMAP row_to_pos,
    SCIP_Bool  allowlocal 
    )
    static

    fills an array of rows suitable for RLT cut generation

    Parameters
    scipSCIP data structure
    sepaseparator
    sepadataseparator data
    prob_rowsproblem rows
    rowsan array to be filled with suitable rows
    nrowsbuffer to store the number of suitable rows
    row_to_poshashmap linking row indices to positions in rows
    allowlocalare local rows allowed?

    Definition at line 449 of file sepa_rlt.c.

    References FALSE, r, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIPcolIsIntegral(), SCIPhashmapSetImageInt(), SCIPisEQ(), SCIProwGetCols(), SCIProwGetIndex(), SCIProwGetLhs(), SCIProwGetNNonz(), SCIProwGetOriginSepa(), SCIProwGetRhs(), SCIProwIsLocal(), and TRUE.

    Referenced by SCIP_DECL_SEPAEXECLP().

    ◆ ensureVarsSize()

    static SCIP_RETCODE ensureVarsSize ( SCIP scip,
    SCIP_SEPADATA sepadata,
    int  n 
    )
    static

    make sure that the arrays in sepadata are large enough to store information on n variables

    Parameters
    scipSCIP data structure
    sepadataseparator data
    nnumber of variables that we need to store

    Definition at line 518 of file sepa_rlt.c.

    References SCIP_CALL, SCIP_OKAY, SCIPcalcMemGrowSize(), and SCIPreallocBlockMemoryArray.

    Referenced by addProductVars().

    ◆ addProductVars()

    static SCIP_RETCODE addProductVars ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_VAR x,
    SCIP_VAR y,
    SCIP_HASHMAP varmap,
    int  nlocks 
    )
    static

    saves variables x and y to separator data and stores information about their connection

    variables must be captured separately

    Parameters
    scipSCIP data structure
    sepadataseparator data
    xx variable
    yy variable
    varmaphashmap linking var index to position
    nlocksnumber of locks

    Definition at line 548 of file sepa_rlt.c.

    References addAdjacentVars(), ensureVarsSize(), MIN, NULL, SCIP_CALL, SCIP_OKAY, SCIPblkmem(), SCIPgetNVars(), SCIPhashmapCreate(), SCIPhashmapGetImageInt(), SCIPhashmapInsertInt(), SCIPvarGetIndex(), RLT_SimpleRow::vars, x, and y.

    Referenced by createSepaData(), and extractProducts().

    ◆ extractProducts()

    static SCIP_RETCODE extractProducts ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_VAR **  vars_xwy,
    SCIP_Real coefs1,
    SCIP_Real coefs2,
    SCIP_Real  d1,
    SCIP_Real  d2,
    SCIP_SIDETYPE  sidetype1,
    SCIP_SIDETYPE  sidetype2,
    SCIP_HASHMAP varmap,
    SCIP_Bool  f 
    )
    static

    extract a bilinear product from two linear relations, if possible

    First, the two given rows are brought to the form:

    \[ a_1x + b_1w + c_1y \leq/\geq d_1,\\ a_2x + b_2w + c_2y \leq/\geq d_2, \]

    where \( a_1a_2 \leq 0 \) and the first implied relation is enabled when \( x = 1 \) and the second when \( x = 0 \), and \( b_1, b_2 > 0 \), the product relation can be written as:

    \[ \frac{b_1b_2w + (b_2(a_1 - d_1) + b_1d_2)x + b_1c_2y - b_1d_2}{b_1c_2 - c_1b_2} \leq/\geq xy. \]

    The inequality sign in the product relation is similar to that in the given linear relations if \( b_1c_2 - c_1b_2 > 0 \) and opposite if \( b_1c_2 - c_1b_2 > 0 \).

    To obtain this formula, the given relations are first multiplied by scaling factors \( \alpha \) and \( \beta \), which is necessary in order for the solution to always exist, and written as implications:

    \begin{align} x = 1 & ~\Rightarrow~ \alpha b_1w + \alpha c_1y \leq/\geq \alpha(d_1 - a_1), \\ x = 0 & ~\Rightarrow~ \beta b_2w + \beta c_2y \leq/\geq \beta d_2. \end{align}

    Then a linear system is solved which ensures that the coefficients of the two implications of the product relation are equal to the corresponding coefficients in the linear relations. If the product relation is written as:

    \[ Ax + Bw + Cy + D \leq/\geq xy, \]

    then the system is

    \[ B = \alpha b_1, ~C - 1 = \alpha c_1, ~D+A = \alpha(a_1-d_1),\\ B = \beta b_2, ~C = \beta c_2, ~D = -\beta d_2. \]

    Parameters
    scipSCIP data structure
    sepadataseparator data
    vars_xwy3 variables involved in the inequalities in the order x,w,y
    coefs1coefficients of the first inequality (always implied, i.e. has x)
    coefs2coefficients of the second inequality (can be unconditional)
    d1side of the first inequality
    d2side of the second inequality
    sidetype1side type (lhs or rls) in the first inequality
    sidetype2side type (lhs or rhs) in the second inequality
    varmapvariable map
    fthe first relation is an implication x == f

    Definition at line 664 of file sepa_rlt.c.

    References addProductVars(), SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIP_SIDETYPE_LEFT, SCIP_SIDETYPE_RIGHT, SCIP_VARTYPE_BINARY, SCIPdebugMsg, SCIPinsertBilinearTermImplicitNonlinear(), SCIPisRelEQ(), SCIPswapReals(), SCIPvarGetName(), SCIPvarGetType(), w, x, and y.

    Referenced by detectHiddenProducts(), detectProductsClique(), detectProductsImplbnd(), and detectProductsUnconditional().

    ◆ implBndToBigM()

    static void implBndToBigM ( SCIP scip,
    SCIP_VAR **  vars_xwy,
    int  binvarpos,
    int  implvarpos,
    SCIP_BOUNDTYPE  bndtype,
    SCIP_Bool  binval,
    SCIP_Real  implbnd,
    SCIP_Real coefs,
    SCIP_Real side 
    )
    static

    convert an implied bound: binvar = binvalimplvar ≤/≥ implbnd into a big-M constraint

    Parameters
    scipSCIP data structure
    vars_xwyvariables in order x,w,y
    binvarposposition of binvar in vars_xwy
    implvarposposition of implvar in vars_xwy
    bndtypetype of implied bound
    binvalvalue of binvar which implies the bound
    implbndvalue of the implied bound
    coefscoefficients of the big-M constraint
    sideside of the big-M constraint

    Definition at line 811 of file sepa_rlt.c.

    References RLT_SimpleRow::coefs, NULL, SCIP_BOUNDTYPE_LOWER, SCIP_Real, SCIPdebugMsg, SCIPvarGetLbGlobal(), and SCIPvarGetUbGlobal().

    Referenced by detectHiddenProducts(), and detectProductsImplbnd().

    ◆ detectProductsImplbnd()

    static SCIP_RETCODE detectProductsImplbnd ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_Real coefs1,
    SCIP_VAR **  vars_xwy,
    SCIP_Real  side1,
    SCIP_SIDETYPE  sidetype1,
    int  binvarpos,
    int  implvarpos,
    SCIP_HASHMAP varmap,
    SCIP_Bool  f 
    )
    static

    extract products from a relation given by coefs1, vars, side1 and sidetype1 and implied bounds of the form binvar = !fimplvar ≥/≤ implbnd

    Parameters
    scipSCIP data structure
    sepadataseparator data
    coefs1coefficients of the first linear relation
    vars_xwyvariables in the order x, w, y
    side1side of the first relation
    sidetype1is the left or right hand side given for the first relation?
    binvarposposition of the indicator variable in the vars_xwy array
    implvarposposition of the variable that is bounded
    varmapvariable map
    fthe value of x that activates the first relation

    Definition at line 859 of file sepa_rlt.c.

    References extractProducts(), implBndToBigM(), SCIP_Bool, SCIP_BOUNDTYPE_LOWER, SCIP_BOUNDTYPE_UPPER, SCIP_CALL, SCIP_INVALID, SCIP_OKAY, SCIP_Real, SCIP_SIDETYPE_LEFT, SCIP_SIDETYPE_RIGHT, SCIP_VARTYPE_BINARY, SCIPvarGetImplicVarBounds(), and SCIPvarGetType().

    Referenced by detectHiddenProducts().

    ◆ detectProductsClique()

    static SCIP_RETCODE detectProductsClique ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_Real coefs1,
    SCIP_VAR **  vars_xwy,
    SCIP_Real  side1,
    SCIP_SIDETYPE  sidetype1,
    int  varpos1,
    int  varpos2,
    SCIP_HASHMAP varmap,
    SCIP_Bool  f 
    )
    static

    extract products from a relation given by coefs1, vars_xwy, side1 and sidetype1 and cliques containing vars_xwy[varpos1] and vars_xwy[varpos2]

    Parameters
    scipSCIP data structure
    sepadataseparator data
    coefs1coefficients of the first linear relation
    vars_xwyvariables of the first relation in the order x, w, y
    side1side of the first relation
    sidetype1is the left or right hand side given for the first relation?
    varpos1position of the first variable in the vars_xwy array
    varpos2position of the second variable in the vars_xwy array
    varmapvariable map
    fthe value of x that activates the first relation

    Definition at line 925 of file sepa_rlt.c.

    References extractProducts(), FALSE, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIP_SIDETYPE_RIGHT, SCIP_VARTYPE_BINARY, SCIPdebugMsg, SCIPvarGetName(), SCIPvarGetType(), SCIPvarsHaveCommonClique(), and TRUE.

    Referenced by detectHiddenProducts().

    ◆ detectProductsUnconditional()

    static SCIP_RETCODE detectProductsUnconditional ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_ROW **  rows,
    int *  row_list,
    SCIP_HASHTABLE hashtable,
    SCIP_Real coefs1,
    SCIP_VAR **  vars_xwy,
    SCIP_Real  side1,
    SCIP_SIDETYPE  sidetype1,
    int  varpos1,
    int  varpos2,
    SCIP_HASHMAP varmap,
    SCIP_Bool  f 
    )
    static

    extract products from a relation given by coefs1, vars, side1 and sidetype1 and unconditional relations (inequalities with 2 nonzeros) containing vars[varpos1] and vars[varpos2]

    Parameters
    scipSCIP data structure
    sepadataseparator data
    rowsproblem rows
    row_listlinked list of rows corresponding to 2 or 3 var sets
    hashtablehashtable storing unconditional relations
    coefs1coefficients of the first linear relation
    vars_xwyvariables of the first relation in the order x, w, y
    side1side of the first relation
    sidetype1is the left or right hand side given for the first relation?
    varpos1position of the first unconditional variable in the vars_xwy array
    varpos2position of the second unconditional variable in the vars_xwy array
    varmapvariable map
    fthe value of x that activates the first relation

    Definition at line 998 of file sepa_rlt.c.

    References extractProducts(), HashData::firstrow, NULL, HashData::nvars, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIP_SIDETYPE_LEFT, SCIP_SIDETYPE_RIGHT, SCIPcolGetVar(), SCIPdebugMsg, SCIPhashtableRetrieve(), SCIPisInfinity(), SCIProwGetCols(), SCIProwGetConstant(), SCIProwGetLhs(), SCIProwGetNNonz(), SCIProwGetRhs(), SCIProwGetVals(), SCIPvarGetIndex(), and HashData::vars.

    Referenced by detectHiddenProducts().

    ◆ fillRelationTables()

    static SCIP_RETCODE fillRelationTables ( SCIP scip,
    SCIP_ROW **  prob_rows,
    int  nrows,
    SCIP_HASHTABLE hashtable2,
    SCIP_HASHTABLE hashtable3,
    SCIP_HASHMAP vars_in_2rels,
    int *  row_list 
    )
    static

    finds and stores implied relations (x = f ⇒ ay + bw ≤ c, f can be 0 or 1) and 2-variable relations

    Fills the following:

    • An array of variables that participate in two variable relations; for each such variable, ADJACENTVARDATA containing an array of variables that participate in two variable relations together with it; and a hashmap mapping variables to ADJACENTVARDATAs.
    • Hashtables storing hashdata objects with the two or three variables and the position of the first row in the prob_rows array, which in combination with the linked list (described below) will allow access to all rows that depend only on the corresponding variables.
    • Linked lists of row indices. Each list corresponds to a pair or triple of variables and contains positions of rows which depend only on those variables. All lists are stored in row_list, an array of length nrows, which is possible because each row belongs to at most one list. The array indices of row_list represent the positions of rows in prob_rows, and a value in the row_list array represents the next index in the list (-1 if there is no next list element). The first index of each list is stored in one of the hashdata objects as firstrow.
    Parameters
    scipSCIP data structure
    prob_rowslinear rows of the problem
    nrowsnumber of rows
    hashtable2hashtable to store 2-variable relations
    hashtable3hashtable to store implied relations
    vars_in_2relsconnections between variables that appear in 2-variable relations
    row_listlinked lists of row positions for each 2 or 3 variable set

    Definition at line 1102 of file sepa_rlt.c.

    References addAdjacentVars(), HashData::firstrow, HashData::nrows, NULL, HashData::nvars, r, SCIP_CALL, SCIP_OKAY, SCIP_VARTYPE_BINARY, SCIPallocBuffer, SCIPcolGetVar(), SCIPdebugMsg, SCIPhashtableInsert(), SCIPhashtableRetrieve(), SCIProwGetCols(), SCIProwGetName(), SCIProwGetNNonz(), SCIPvarGetType(), and HashData::vars.

    Referenced by detectHiddenProducts().

    ◆ detectHiddenProducts()

    static SCIP_RETCODE detectHiddenProducts ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_HASHMAP varmap 
    )
    static

    ◆ createSepaData()

    ◆ getBestEstimators()

    static void getBestEstimators ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_SOL sol,
    int *  bestunderestimators,
    int *  bestoverestimators 
    )
    static

    get the positions of the most violated auxiliary under- and overestimators for each product

    -1 means no relation with given product is violated

    Parameters
    scipSCIP data structure
    sepadataseparator data
    solsolution at which to evaluate the expressions
    bestunderestimatorsarray of indices of best underestimators for each term
    bestoverestimatorsarray of indices of best overestimators for each term

    Definition at line 1729 of file sepa_rlt.c.

    References SCIP_ConsNonlinear_BilinTerm::exprs, SCIP_ConsNonlinear_BilinTerm::nauxexprs, NULL, SCIP_ConsNonlinear_Auxexpr::overestimate, SCIP_Real, SCIPevalBilinAuxExprNonlinear(), SCIPgetBilinTermsNonlinear(), SCIPgetNBilinTermsNonlinear(), SCIPgetSolVal(), SCIPisFeasGT(), SCIP_ConsNonlinear_Auxexpr::underestimate, x, and y.

    Referenced by SCIP_DECL_SEPAEXECLP().

    ◆ isAcceptableRow()

    static SCIP_RETCODE isAcceptableRow ( SCIP_SEPADATA sepadata,
    SCIP_ROW row,
    SCIP_VAR var,
    int *  currentnunknown,
    SCIP_Bool acceptable 
    )
    static

    tests if a row contains too many unknown bilinear terms w.r.t. the parameters

    Parameters
    sepadataseparation data
    rowthe row to be tested
    varthe variable that is to be multiplied with row
    currentnunknownbuffer to store number of unknown terms in current row if acceptable
    acceptablebuffer to store the result

    Definition at line 1786 of file sepa_rlt.c.

    References SCIP_ConsNonlinear_BilinTerm::aux, SCIP_ConsNonlinear_BilinTerm::nauxexprs, NULL, SCIP_OKAY, SCIPcolGetVar(), SCIPgetBilinTermIdxNonlinear(), SCIPgetBilinTermsNonlinear(), SCIProwGetCols(), SCIProwGetNNonz(), and SCIP_ConsNonlinear_BilinTerm::var.

    Referenced by separateRltCuts().

    ◆ addAuxexprCoefs()

    static void addAuxexprCoefs ( SCIP_VAR var1,
    SCIP_VAR var2,
    SCIP_CONSNONLINEAR_AUXEXPR auxexpr,
    SCIP_Real  coef,
    SCIP_Real coefaux,
    SCIP_Real coef1,
    SCIP_Real coef2,
    SCIP_Real cst 
    )
    static

    adds coefficients and constant of an auxiliary expression

    the variables the pointers are pointing to must already be initialized

    Parameters
    var1first product variable
    var2second product variable
    auxexprauxiliary expression to be added
    coefcoefficient of the auxiliary expression
    coefauxpointer to add the coefficient of the auxiliary variable
    coef1pointer to add the coefficient of the first variable
    coef2pointer to add the coefficient of the second variable
    cstpointer to add the constant

    Definition at line 1832 of file sepa_rlt.c.

    References SCIP_ConsNonlinear_Auxexpr::auxvar, SCIP_ConsNonlinear_Auxexpr::coefs, SCIP_ConsNonlinear_Auxexpr::cst, RLT_SimpleRow::cst, NULL, and SCIPvarCompare().

    Referenced by addRltTerm(), and separateMcCormickImplicit().

    ◆ addRltTerm()

    static SCIP_RETCODE addRltTerm ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_SOL sol,
    int *  bestunderest,
    int *  bestoverest,
    SCIP_ROW cut,
    SCIP_VAR var,
    SCIP_VAR colvar,
    SCIP_Real  coef,
    SCIP_Bool  uselb,
    SCIP_Bool  uselhs,
    SCIP_Bool  local,
    SCIP_Bool  computeEqCut,
    SCIP_Real coefvar,
    SCIP_Real cst,
    SCIP_Bool success 
    )
    static

    add a linear term coef*colvar multiplied by a bound factor (var - lb(var)) or (ub(var) - var)

    adds the linear term with colvar to cut and updates coefvar and cst

    Parameters
    scipSCIP data structure
    sepadataseparator data
    solthe point to be separated (can be NULL)
    bestunderestpositions of most violated underestimators for each product term
    bestoverestpositions of most violated overestimators for each product term
    cutcut to which the term is to be added
    varmultiplier variable
    colvarrow variable to be multiplied
    coefcoefficient of the bilinear term
    uselbwhether we multiply with (var - lb) or (ub - var)
    uselhswhether to create a cut for the lhs or rhs
    localwhether local or global cuts should be computed
    computeEqCutwhether conditions are fulfilled to compute equality cuts
    coefvarcoefficient of var
    cstbuffer to store the constant part of the cut
    successbuffer to store whether cut was updated successfully

    Definition at line 1873 of file sepa_rlt.c.

    References addAuxexprCoefs(), SCIP_ConsNonlinear_BilinTerm::aux, SCIP_ConsNonlinear_Auxexpr::auxvar, RLT_SimpleRow::cst, SCIP_ConsNonlinear_BilinTerm::exprs, FALSE, MAX, MAXVARBOUND, MIN, NULL, REALABS, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIP_VARTYPE_BINARY, SCIPaddBilinMcCormick(), SCIPaddSquareLinearization(), SCIPaddSquareSecant(), SCIPaddVarToRow(), SCIPcliqueHasVar(), SCIPdebugMsg, SCIPgetBilinTermIdxNonlinear(), SCIPgetBilinTermsNonlinear(), SCIPgetSolVal(), SCIPisInfinity(), SCIPisZero(), SCIPvarGetCliques(), SCIPvarGetLbGlobal(), SCIPvarGetLbLocal(), SCIPvarGetName(), SCIPvarGetNCliques(), SCIPvarGetType(), SCIPvarGetUbGlobal(), SCIPvarGetUbLocal(), SCIPvarIsIntegral(), TRUE, and SCIP_ConsNonlinear_BilinTerm::var.

    Referenced by computeRltCut().

    ◆ computeRltCut()

    static SCIP_RETCODE computeRltCut ( SCIP scip,
    SCIP_SEPA sepa,
    SCIP_SEPADATA sepadata,
    SCIP_ROW **  cut,
    SCIP_ROW row,
    RLT_SIMPLEROW projrow,
    SCIP_SOL sol,
    int *  bestunderest,
    int *  bestoverest,
    SCIP_VAR var,
    SCIP_Bool success,
    SCIP_Bool  uselb,
    SCIP_Bool  uselhs,
    SCIP_Bool  local,
    SCIP_Bool  computeEqCut,
    SCIP_Bool  useprojrow 
    )
    static

    creates the RLT cut formed by multiplying a given row with (x - lb) or (ub - x)

    In detail:

    • The row is multiplied either with (x - lb(x)) or with (ub(x) - x), depending on parameter uselb, or by x if this is an equality cut
    • The (inequality) cut is computed either for lhs or rhs, depending on parameter uselhs.
    • Terms for which no auxiliary variable and no clique relation exists are replaced by either McCormick, secants, or gradient linearization cuts.
    Parameters
    scipSCIP data structure
    sepaseparator
    sepadataseparation data
    cutbuffer to store the cut
    rowthe row that is used for the rlt cut (NULL if using projected row)
    projrowprojected row that is used for the rlt cut (NULL if using row)
    solthe point to be separated (can be NULL)
    bestunderestpositions of most violated underestimators for each product term
    bestoverestpositions of most violated overestimators for each product term
    varthe variable that is used for the rlt cuts
    successbuffer to store whether cut was created successfully
    uselbwhether we multiply with (var - lb) or (ub - var)
    uselhswhether to create a cut for the lhs or rhs
    localwhether local or global cuts should be computed
    computeEqCutwhether conditions are fulfilled to compute equality cuts
    useprojrowwhether to use projected row instead of normal row

    Definition at line 2113 of file sepa_rlt.c.

    References addRltTerm(), RLT_SimpleRow::coefs, RLT_SimpleRow::cst, FALSE, RLT_SimpleRow::lhs, MAXVARBOUND, RLT_SimpleRow::name, RLT_SimpleRow::nnonz, NULL, REALABS, RLT_SimpleRow::rhs, SCIP_CALL, SCIP_LONGINT_FORMAT, SCIP_MAXSTRLEN, SCIP_OKAY, SCIP_Real, SCIPaddVarToRow(), SCIPcacheRowExtensions(), SCIPchgRowLhs(), SCIPchgRowRhs(), SCIPcolGetVar(), SCIPcreateEmptyRowSepa(), SCIPdebugMsg, SCIPflushRowExtensions(), SCIPgetDepth(), SCIPgetNLPs(), SCIPinfinity(), SCIPisEQ(), SCIPisInfinity(), SCIPprintRow(), SCIProwGetCols(), SCIProwGetConstant(), SCIProwGetLhs(), SCIProwGetName(), SCIProwGetNNonz(), SCIProwGetRhs(), SCIProwGetVals(), SCIPsnprintf(), SCIPvarGetLbGlobal(), SCIPvarGetLbLocal(), SCIPvarGetName(), SCIPvarGetUbGlobal(), SCIPvarGetUbLocal(), TRUE, and RLT_SimpleRow::vars.

    Referenced by separateRltCuts().

    ◆ createProjRow()

    static SCIP_RETCODE createProjRow ( SCIP scip,
    RLT_SIMPLEROW simplerow,
    SCIP_ROW row,
    SCIP_SOL sol,
    SCIP_Bool  local 
    )
    static

    store a row projected by fixing all variables that are at bound at sol; the result is a simplified row

    Parameters
    scipSCIP data structure
    simplerowpointer to the simplified row
    rowrow to be projected
    solthe point to be separated (can be NULL)
    localwhether local bounds should be checked

    Definition at line 2258 of file sepa_rlt.c.

    References RLT_SimpleRow::coefs, RLT_SimpleRow::cst, RLT_SimpleRow::lhs, RLT_SimpleRow::name, RLT_SimpleRow::nnonz, NULL, RLT_SimpleRow::rhs, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIPcalcMemGrowSize(), SCIPcolGetVar(), SCIPduplicateBlockMemoryArray, SCIPgetSolVal(), SCIPisFeasEQ(), SCIPisInfinity(), SCIPreallocBufferArray, SCIProwGetCols(), SCIProwGetConstant(), SCIProwGetLhs(), SCIProwGetName(), SCIProwGetNNonz(), SCIProwGetRhs(), SCIProwGetVals(), SCIPvarGetLbGlobal(), SCIPvarGetLbLocal(), SCIPvarGetUbGlobal(), SCIPvarGetUbLocal(), RLT_SimpleRow::size, and RLT_SimpleRow::vars.

    Referenced by createProjRows().

    ◆ freeProjRow()

    static void freeProjRow ( SCIP scip,
    RLT_SIMPLEROW simplerow 
    )
    static

    free the projected row

    Parameters
    scipSCIP data structure
    simplerowsimplified row to be freed

    Definition at line 2322 of file sepa_rlt.c.

    References RLT_SimpleRow::coefs, RLT_SimpleRow::name, NULL, SCIPfreeBlockMemoryArray, SCIPfreeBufferArray, RLT_SimpleRow::size, and RLT_SimpleRow::vars.

    Referenced by freeProjRows().

    ◆ createProjRows()

    static SCIP_RETCODE createProjRows ( SCIP scip,
    SCIP_ROW **  rows,
    int  nrows,
    SCIP_SOL sol,
    RLT_SIMPLEROW **  projrows,
    SCIP_Bool  local,
    SCIP_Bool allcst 
    )
    static

    creates the projected problem

    All variables that are at their bounds at the current solution are added to left and/or right hand sides as constant values.

    Parameters
    scipSCIP data structure
    rowsproblem rows
    nrowsnumber of rows
    solthe point to be separated (can be NULL)
    projrowsthe projected rows to be filled
    localare local cuts allowed?
    allcstbuffer to store whether all projected rows have only constants

    Definition at line 2346 of file sepa_rlt.c.

    References createProjRow(), FALSE, RLT_SimpleRow::nnonz, NULL, SCIP_CALL, SCIP_OKAY, SCIPallocBufferArray, and TRUE.

    Referenced by SCIP_DECL_SEPAEXECLP().

    ◆ freeProjRows()

    static void freeProjRows ( SCIP scip,
    RLT_SIMPLEROW **  projrows,
    int  nrows 
    )
    static

    frees the projected rows

    Parameters
    scipSCIP data structure
    projrowsthe projected LP
    nrowsnumber of rows in projrows

    Definition at line 2430 of file sepa_rlt.c.

    References freeProjRow(), and SCIPfreeBufferArray.

    Referenced by SCIP_DECL_SEPAEXECLP().

    ◆ addRowMark()

    static void addRowMark ( int  ridx,
    SCIP_Real  a,
    SCIP_Bool  violatedbelow,
    SCIP_Bool  violatedabove,
    int *  row_idcs,
    unsigned int *  row_marks,
    int *  nmarked 
    )
    static

    mark a row for rlt cut selection

    depending on the sign of the coefficient and violation, set or update mark which cut is required:

    • 1 - cuts for axy < aw case,
    • 2 - cuts for axy > aw case,
    • 3 - cuts for both cases
    Parameters
    ridxrow index
    acoefficient of x in the row
    violatedbelowwhether the relation auxexpr <= xy is violated
    violatedabovewhether the relation xy <= auxexpr is violated
    row_idcssparse array with indices of marked rows
    row_markssparse array to store the marks
    nmarkednumber of marked rows

    Definition at line 2452 of file sepa_rlt.c.

    References a, SCIP_Bool, and SCIPsortedvecFindInt().

    Referenced by markRowsXj().

    ◆ markRowsXj()

    static SCIP_RETCODE markRowsXj ( SCIP scip,
    SCIP_SEPADATA sepadata,
    SCIP_CONSHDLR conshdlr,
    SCIP_SOL sol,
    int  j,
    SCIP_Bool  local,
    SCIP_HASHMAP row_to_pos,
    int *  bestunderest,
    int *  bestoverest,
    unsigned int *  row_marks,
    int *  row_idcs,
    int *  nmarked 
    )
    static

    mark all rows that should be multiplied by xj

    Parameters
    scipSCIP data structure
    sepadataseparator data
    conshdlrnonlinear constraint handler
    solpoint to be separated (can be NULL)
    jindex of the multiplier variable in sepadata
    localare local cuts allowed?
    row_to_poshashmap linking row indices to positions in array
    bestunderestpositions of most violated underestimators for each product term
    bestoverestpositions of most violated overestimators for each product term
    row_markssparse array storing the row marks
    row_idcssparse array storing the marked row positions
    nmarkednumber of marked rows

    Definition at line 2499 of file sepa_rlt.c.

    References a, addRowMark(), SCIP_ConsNonlinear_BilinTerm::existing, SCIP_ConsNonlinear_BilinTerm::exprs, FALSE, getAdjacentVars(), NULL, r, SCIP_Bool, SCIP_OKAY, SCIP_Real, SCIP_VARSTATUS_COLUMN, SCIPcolGetNNonz(), SCIPcolGetRows(), SCIPcolGetVals(), SCIPdebugMsg, SCIPevalBilinAuxExprNonlinear(), SCIPgetBilinTermIdxNonlinear(), SCIPgetBilinTermsNonlinear(), SCIPgetNBilinTermsNonlinear(), SCIPgetSolVal(), SCIPhashmapExists(), SCIPisFeasEQ(), SCIPisFeasPositive(), SCIProwGetIndex(), SCIPvarGetCol(), SCIPvarGetLbGlobal(), SCIPvarGetLbLocal(), SCIPvarGetName(), SCIPvarGetStatus(), SCIPvarGetUbGlobal(), SCIPvarGetUbLocal(), TRUE, SCIP_ConsNonlinear_BilinTerm::var, x, and y.

    Referenced by separateRltCuts().

    ◆ separateMcCormickImplicit()

    static SCIP_RETCODE separateMcCormickImplicit ( SCIP scip,
    SCIP_SEPA sepa,
    SCIP_SEPADATA sepadata,
    SCIP_SOL sol,
    int *  bestunderestimators,
    int *  bestoverestimators,
    SCIP_RESULT result 
    )
    static

    ◆ separateRltCuts()

    static SCIP_RETCODE separateRltCuts ( SCIP scip,
    SCIP_SEPA sepa,
    SCIP_SEPADATA sepadata,
    SCIP_CONSHDLR conshdlr,
    SCIP_SOL sol,
    SCIP_HASHMAP row_to_pos,
    RLT_SIMPLEROW projrows,
    SCIP_ROW **  rows,
    int  nrows,
    SCIP_Bool  allowlocal,
    int *  bestunderestimators,
    int *  bestoverestimators,
    SCIP_RESULT result 
    )
    static

    builds and adds the RLT cuts

    Parameters
    scipSCIP data structure
    sepaseparator
    sepadataseparator data
    conshdlrnonlinear constraint handler
    solthe point to be separated (can be NULL)
    row_to_poshashmap linking row indices to positions in array
    projrowsprojected rows
    rowsproblem rows
    nrowsnumber of problem rows
    allowlocalare local cuts allowed?
    bestunderestimatorsindices of auxiliary underestimators with largest violation in sol
    bestoverestimatorsindices of auxiliary overestimators with largest violation in sol
    resultbuffer to store whether separation was successful

    Definition at line 2823 of file sepa_rlt.c.

    References computeRltCut(), FALSE, isAcceptableRow(), markRowsXj(), RLT_SimpleRow::nnonz, NULL, r, SCIP_Bool, SCIP_CALL, SCIP_CUTOFF, SCIP_DIDNOTFIND, SCIP_OKAY, SCIP_SEPARATED, SCIPaddPoolCut(), SCIPaddRow(), SCIPallocBufferArray, SCIPallocCleanBufferArray, SCIPcalcMemGrowSize(), SCIPdebugMsg, SCIPfreeBufferArray, SCIPfreeBufferArrayNull, SCIPfreeCleanBufferArray, SCIPgetRowFeasibility(), SCIPhashmapExists(), SCIPhashmapGetImageInt(), SCIPisEQ(), SCIPisFeasNegative(), SCIPisFeasPositive(), SCIPprintRow(), SCIPreallocBufferArray, SCIPreleaseRow(), SCIProwGetIndex(), SCIProwGetLhs(), SCIProwGetName(), SCIProwGetRhs(), SCIProwIsLocal(), SCIPselectCutsHybrid(), SCIPvarGetName(), and TRUE.

    Referenced by SCIP_DECL_SEPAEXECLP().

    ◆ SCIP_DECL_SEPACOPY()

    static SCIP_DECL_SEPACOPY ( sepaCopyRlt  )
    static

    copy method for separator plugins (called when SCIP copies plugins)

    Definition at line 3069 of file sepa_rlt.c.

    References NULL, SCIP_CALL, SCIP_OKAY, SCIPincludeSepaRlt(), SCIPsepaGetName(), and SEPA_NAME.

    ◆ SCIP_DECL_SEPAFREE()

    static SCIP_DECL_SEPAFREE ( sepaFreeRlt  )
    static

    destructor of separator to free user data (called when SCIP is exiting)

    Definition at line 3083 of file sepa_rlt.c.

    References NULL, SCIP_OKAY, SCIPfreeBlockMemory, SCIPsepaGetData(), SCIPsepaGetName(), SCIPsepaSetData(), and SEPA_NAME.

    ◆ SCIP_DECL_SEPAEXITSOL()

    static SCIP_DECL_SEPAEXITSOL ( sepaExitsolRlt  )
    static

    solving process deinitialization method of separator (called before branch and bound process data is freed)

    Definition at line 3102 of file sepa_rlt.c.

    References freeSepaData(), NULL, SCIP_CALL, SCIP_OKAY, SCIPsepaGetData(), SCIPsepaGetName(), and SEPA_NAME.

    ◆ SCIP_DECL_SEPAEXECLP()