Scippy

    SCIP

    Solving Constraint Integer Programs

    expr_var.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
    7/* */
    8/* Licensed under the Apache License, Version 2.0 (the "License"); */
    9/* you may not use this file except in compliance with the License. */
    10/* You may obtain a copy of the License at */
    11/* */
    12/* http://www.apache.org/licenses/LICENSE-2.0 */
    13/* */
    14/* Unless required by applicable law or agreed to in writing, software */
    15/* distributed under the License is distributed on an "AS IS" BASIS, */
    16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
    17/* See the License for the specific language governing permissions and */
    18/* limitations under the License. */
    19/* */
    20/* You should have received a copy of the Apache-2.0 license */
    21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
    22/* */
    23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    24
    25/**@file expr_var.c
    26 * @ingroup DEFPLUGINS_EXPR
    27 * @brief variable expression handler
    28 * @author Stefan Vigerske
    29 * @author Benjamin Mueller
    30 * @author Felipe Serrano
    31 */
    32
    33/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    34
    35#include <string.h>
    36#include "scip/expr_var.h"
    37#include "scip/expr_sum.h"
    38
    39#ifdef NDEBUG
    40#undef SCIPgetVarExprVar
    41#endif
    42
    43#define EXPRHDLR_NAME "var"
    44#define EXPRHDLR_DESC "SCIP variable expression"
    45#define EXPRHDLR_PRECEDENCE 0
    46#define EXPRHDLR_HASHKEY SCIPcalcFibHash(22153.0)
    47
    48/** translate from one value of infinity to another
    49 *
    50 * if val is >= infty1, then give infty2, else give val
    51 */
    52#define infty2infty(infty1, infty2, val) ((val) >= (infty1) ? (infty2) : (val))
    53
    54
    55/** simplifies a variable expression
    56 *
    57 * We replace the variable when fixed by its value.
    58 * If a variable is fixed, (multi)aggregated or more generally, inactive, we replace it with its active counterpart
    59 *
    60 * Implementation note:
    61 * - we follow the general approach of the simplify, where we replace the var expression for its
    62 * simplified expression only in the current parent. So if we see that there is any performance issue in the simplify
    63 * we might have to revisit this decision.
    64 * - we build the sum expression by appending variable expressions one at a time. This may be
    65 * speed-up if we allocate memory for all the variable expressions and build the sum directly.
    66 */
    67static
    69{ /*lint --e{715}*/
    70 SCIP_VAR* var;
    71 SCIP_VAR** vars;
    72 SCIP_Real* coefs;
    73 SCIP_Real constant;
    74 int nvars;
    75 int varssize;
    76 int i;
    77 SCIP_EXPR* sumexpr;
    78
    79 assert(expr != NULL);
    80 assert(simplifiedexpr != NULL);
    81
    82 var = SCIPgetVarExprVar(expr);
    83 assert(var != NULL);
    84
    85 /* if var is active then there is nothing to simplify */
    86 if( SCIPvarIsActive(var) )
    87 {
    88 *simplifiedexpr = expr;
    89 /* we have to capture it, since it must simulate a "normal" simplified call in which a new expression is created */
    90 SCIPcaptureExpr(*simplifiedexpr);
    91 return SCIP_OKAY;
    92 }
    93
    94 /* var is not active; obtain active representation var = constant + sum coefs_i vars_i */
    95 varssize = 5;
    96 SCIP_CALL( SCIPallocBufferArray(scip, &vars, varssize) );
    97 SCIP_CALL( SCIPallocBufferArray(scip, &coefs, varssize) );
    98
    99 vars[0] = var;
    100 coefs[0] = 1.0;
    101 constant = 0.0;
    102 nvars = 1;
    103 if( !SCIPvarIsOriginal(var) )
    104 {
    105 int requsize;
    106
    107 SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, coefs, &nvars, varssize, &constant, &requsize) );
    108
    109 if( requsize > varssize )
    110 {
    111 SCIP_CALL( SCIPreallocBufferArray(scip, &vars, requsize) );
    112 SCIP_CALL( SCIPreallocBufferArray(scip, &coefs, requsize) );
    113 varssize = requsize;
    114 SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, coefs, &nvars, varssize, &constant, &requsize) );
    115 assert(requsize <= varssize);
    116 }
    117 assert(requsize == nvars);
    118 }
    119
    120 /* create expression for constant + sum coefs_i vars_i */
    121 SCIP_CALL( SCIPcreateExprSum(scip, &sumexpr, 0, NULL, NULL, constant, ownercreate, ownercreatedata) );
    122
    123 for( i = 0; i < nvars; ++i )
    124 {
    125 SCIP_EXPR* child;
    126
    127 SCIP_CALL( SCIPcreateExprVar(scip, &child, vars[i], ownercreate, ownercreatedata) );
    128 SCIP_CALL( SCIPappendExprSumExpr(scip, sumexpr, child, coefs[i]) );
    129 SCIP_CALL( SCIPreleaseExpr(scip, &child) );
    130 }
    131
    132 /* simplify since it might not really be a sum */
    133 SCIP_CALL( SCIPcallExprSimplify(scip, sumexpr, simplifiedexpr, ownercreate, ownercreatedata) );
    134
    135#ifdef SCIP_DEBUG
    136 SCIPinfoMessage(scip, NULL, "expr_var simplify: <%s> := ", SCIPvarGetName(var));
    137 SCIPprintExpr(scip, *simplifiedexpr, NULL);
    138 SCIPinfoMessage(scip, NULL, "\n");
    139#endif
    140
    141 /* we cannot handle fixings to infinity at the moment (TODO we should) */
    142 assert(!SCIPisInfinity(scip, REALABS(constant)));
    143
    144 /* release no longer used sumexpr */
    145 SCIP_CALL( SCIPreleaseExpr(scip, &sumexpr) );
    146
    147 /* free memory */
    148 SCIPfreeBufferArray(scip, &coefs);
    150
    151 return SCIP_OKAY;
    152}
    153
    154/** the order of two variable is given by their indices
    155 *
    156 * @note this is affected by permutations in the problem
    157 */
    158static
    160{ /*lint --e{715}*/
    161 int index1;
    162 int index2;
    163
    164 index1 = SCIPvarGetIndex(SCIPgetVarExprVar(expr1));
    165 index2 = SCIPvarGetIndex(SCIPgetVarExprVar(expr2));
    166
    167 return index1 < index2 ? -1 : index1 == index2 ? 0 : 1;
    168}
    169
    170/** expression handler copy callback */
    171static
    173{ /*lint --e{715}*/
    175
    176 return SCIP_OKAY;
    177}
    178
    179/** expression data copy callback */
    180static
    182{ /*lint --e{715}*/
    183 SCIP_VAR* var;
    184
    185 assert(targetexprdata != NULL);
    186 assert(sourceexpr != NULL);
    187
    188 /* copying into a different SCIP should be handled on the SCIPexprCopy() level (via mapexpr) */
    189 assert(targetscip == sourcescip);
    190
    191 var = SCIPgetVarExprVar(sourceexpr);
    192 assert(var != NULL);
    193
    194 *targetexprdata = (SCIP_EXPRDATA*)var;
    195
    196 SCIP_CALL( SCIPcaptureVar(targetscip, var) );
    197
    198 return SCIP_OKAY;
    199}
    200
    201/** expression data free callback */
    202static
    204{ /*lint --e{715}*/
    205 SCIP_EXPRDATA* exprdata;
    206
    207 assert(expr != NULL);
    208
    209 exprdata = SCIPexprGetData(expr);
    210 assert(exprdata != NULL);
    211
    212 SCIP_CALL( SCIPreleaseVar(scip, (SCIP_VAR**)&exprdata) );
    213
    214 SCIPexprSetData(expr, NULL);
    215
    216 return SCIP_OKAY;
    217}
    218
    219/** expression print callback */
    220static
    222{ /*lint --e{715}*/
    223 assert(expr != NULL);
    224 assert(SCIPgetVarExprVar(expr) != NULL);
    225
    226 if( stage == SCIP_EXPRITER_ENTEREXPR )
    227 {
    229 }
    230
    231 return SCIP_OKAY;
    232}
    233
    234/** expression point evaluation callback */
    235static
    237{ /*lint --e{715}*/
    238 assert(expr != NULL);
    239 assert(SCIPgetVarExprVar(expr) != NULL);
    240
    241 *val = SCIPgetSolVal(scip, sol, SCIPgetVarExprVar(expr));
    242
    243 return SCIP_OKAY;
    244}
    245
    246/** expression backward derivative evaluation callback */
    247static
    249{ /*lint --e{715}*/
    250 /* this should never happen because variable expressions do not have children */
    251 return SCIP_INVALIDCALL;
    252}
    253
    254/** expression forward derivative evaluation callback */
    255static
    257{ /*lint --e{715}*/
    258 assert(expr != NULL);
    259 assert(SCIPgetVarExprVar(expr) != NULL);
    260
    261 *dot = SCIPgetSolVal(scip, direction, SCIPgetVarExprVar(expr));
    262
    263 return SCIP_OKAY;
    264}
    265
    266/** expression derivative evaluation callback */
    267static
    269{ /*lint --e{715}*/
    270 /* this should never happen because variable expressions do not have children */
    271 return SCIP_INVALIDCALL;
    272}
    273
    274/** expression interval evaluation callback */
    275static
    277{ /*lint --e{715}*/
    278 SCIP_VAR* var;
    279
    280 assert(expr != NULL);
    281
    282 var = SCIPgetVarExprVar(expr);
    283 assert(var != NULL);
    284
    285 if( intevalvar != NULL )
    286 *interval = intevalvar(scip, var, intevalvardata);
    287 else
    288 {
    289 SCIP_Real lb;
    290 SCIP_Real ub;
    291
    292 lb = SCIPvarGetLbLocal(var);
    293 ub = SCIPvarGetUbLocal(var);
    294
    295 SCIPintervalSetBounds(interval, /*lint !e666*/
    296 -infty2infty(SCIPinfinity(scip), SCIP_INTERVAL_INFINITY, -lb), /*lint !e666*/
    298 }
    299
    300 return SCIP_OKAY;
    301}
    302
    303/** variable hash callback */
    304static
    306{ /*lint --e{715}*/
    307 SCIP_VAR* var;
    308
    309 assert(scip != NULL);
    310 assert(expr != NULL);
    311 assert(SCIPexprGetNChildren(expr) == 0);
    312 assert(hashkey != NULL);
    313
    314 var = SCIPgetVarExprVar(expr);
    315 assert(var != NULL);
    316
    317 *hashkey = EXPRHDLR_HASHKEY;
    318 *hashkey ^= SCIPcalcFibHash((SCIP_Real)SCIPvarGetIndex(var));
    319
    320 return SCIP_OKAY;
    321}
    322
    323/** expression curvature detection callback */
    324static
    326{ /*lint --e{715}*/
    327 assert(scip != NULL);
    328 assert(expr != NULL);
    329 assert(success != NULL);
    330 assert(SCIPexprGetNChildren(expr) == 0);
    331
    332 /* x -> x is linear, convex, and concave */
    333 *success = TRUE;
    334
    335 return SCIP_OKAY;
    336}
    337
    338/** expression monotonicity detection callback */
    339static
    341{ /*lint --e{715}*/
    342 assert(scip != NULL);
    343 assert(expr != NULL);
    344 assert(result != NULL);
    345 assert(SCIPexprGetNChildren(expr) == 0);
    346
    347 *result = SCIP_MONOTONE_INC;
    348
    349 return SCIP_OKAY;
    350}
    351
    352/** expression integrality detection callback */
    353static
    355{ /*lint --e{715}*/
    356 assert(scip != NULL);
    357 assert(expr != NULL);
    358 assert(integrality != NULL);
    359
    360 SCIP_VAR* var = SCIPgetVarExprVar(expr);
    361
    362 if( !SCIPvarIsIntegral(var) )
    363 *integrality = SCIP_IMPLINTTYPE_NONE;
    365 *integrality = SCIP_IMPLINTTYPE_WEAK;
    366 else
    367 *integrality = SCIP_IMPLINTTYPE_STRONG;
    368
    369 return SCIP_OKAY;
    370}
    371
    372/** creates the handler for variable expression and includes it into SCIP */
    374 SCIP* scip /**< SCIP data structure */
    375 )
    376{
    377 SCIP_EXPRHDLR* exprhdlr;
    378
    380 assert(exprhdlr != NULL);
    381
    382 SCIPexprhdlrSetCopyFreeHdlr(exprhdlr, copyhdlrVar, NULL);
    383 SCIPexprhdlrSetCopyFreeData(exprhdlr, copydataVar, freedataVar);
    384 SCIPexprhdlrSetSimplify(exprhdlr, simplifyVar);
    385 SCIPexprhdlrSetCompare(exprhdlr, compareVar);
    386 SCIPexprhdlrSetPrint(exprhdlr, printVar);
    387 SCIPexprhdlrSetIntEval(exprhdlr, intevalVar);
    388 SCIPexprhdlrSetHash(exprhdlr, hashVar);
    389 SCIPexprhdlrSetDiff(exprhdlr, bwdiffVar, fwdiffVar, bwfwdiffVar);
    390 SCIPexprhdlrSetCurvature(exprhdlr, curvatureVar);
    391 SCIPexprhdlrSetMonotonicity(exprhdlr, monotonicityVar);
    392 SCIPexprhdlrSetIntegrality(exprhdlr, integralityVar);
    393
    394 return SCIP_OKAY;
    395}
    396
    397/** creates a variable expression */
    399 SCIP* scip, /**< SCIP data structure */
    400 SCIP_EXPR** expr, /**< pointer where to store expression */
    401 SCIP_VAR* var, /**< variable to be stored */
    402 SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), /**< function to call to create ownerdata */
    403 void* ownercreatedata /**< data to pass to ownercreate */
    404 )
    405{
    406 SCIP_EXPRDATA* exprdata;
    407
    408 assert(expr != NULL);
    409 assert(var != NULL);
    410
    411 /* capture the variable so that it doesn't disappear while the expr still points to it */
    413
    414 exprdata = (SCIP_EXPRDATA*)var;
    415
    416 SCIP_CALL( SCIPcreateExpr(scip, expr, SCIPgetExprhdlrVar(scip), exprdata, 0, NULL, ownercreate, ownercreatedata) );
    417
    418 return SCIP_OKAY;
    419}
    420
    421/* from pub_expr.h */
    422
    423/** gets the variable of a variable expression */
    425 SCIP_EXPR* expr /**< variable expression */
    426 )
    427{
    428 assert(expr != NULL);
    429 assert(strcmp(SCIPexprhdlrGetName(SCIPexprGetHdlr(expr)), EXPRHDLR_NAME) == 0);
    430 assert(SCIPexprGetData(expr) != NULL);
    431
    432 return (SCIP_VAR*)SCIPexprGetData(expr);
    433}
    #define NULL
    Definition: def.h:248
    #define SCIP_INTERVAL_INFINITY
    Definition: def.h:180
    #define SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define REALABS(x)
    Definition: def.h:182
    #define SCIP_CALL(x)
    Definition: def.h:355
    sum expression handler
    static SCIP_DECL_EXPRPRINT(printVar)
    Definition: expr_var.c:221
    static SCIP_DECL_EXPRCOPYDATA(copydataVar)
    Definition: expr_var.c:181
    #define EXPRHDLR_HASHKEY
    Definition: expr_var.c:46
    static SCIP_DECL_EXPREVAL(evalVar)
    Definition: expr_var.c:236
    static SCIP_DECL_EXPRSIMPLIFY(simplifyVar)
    Definition: expr_var.c:68
    #define EXPRHDLR_NAME
    Definition: expr_var.c:43
    static SCIP_DECL_EXPRCOMPARE(compareVar)
    Definition: expr_var.c:159
    static SCIP_DECL_EXPRBWFWDIFF(bwfwdiffVar)
    Definition: expr_var.c:268
    static SCIP_DECL_EXPRCURVATURE(curvatureVar)
    Definition: expr_var.c:325
    #define infty2infty(infty1, infty2, val)
    Definition: expr_var.c:52
    static SCIP_DECL_EXPRFREEDATA(freedataVar)
    Definition: expr_var.c:203
    static SCIP_DECL_EXPRHASH(hashVar)
    Definition: expr_var.c:305
    static SCIP_DECL_EXPRMONOTONICITY(monotonicityVar)
    Definition: expr_var.c:340
    static SCIP_DECL_EXPRCOPYHDLR(copyhdlrVar)
    Definition: expr_var.c:172
    static SCIP_DECL_EXPRBWDIFF(bwdiffVar)
    Definition: expr_var.c:248
    #define EXPRHDLR_DESC
    Definition: expr_var.c:44
    #define EXPRHDLR_PRECEDENCE
    Definition: expr_var.c:45
    static SCIP_DECL_EXPRINTEGRALITY(integralityVar)
    Definition: expr_var.c:354
    static SCIP_DECL_EXPRINTEVAL(intevalVar)
    Definition: expr_var.c:276
    static SCIP_DECL_EXPRFWDIFF(fwdiffVar)
    Definition: expr_var.c:256
    variable expression handler
    SCIP_RETCODE SCIPcreateExprVar(SCIP *scip, SCIP_EXPR **expr, SCIP_VAR *var, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
    Definition: expr_var.c:398
    SCIP_RETCODE SCIPappendExprSumExpr(SCIP *scip, SCIP_EXPR *expr, SCIP_EXPR *child, SCIP_Real childcoef)
    Definition: expr_sum.c:1154
    SCIP_RETCODE SCIPcreateExprSum(SCIP *scip, SCIP_EXPR **expr, int nchildren, SCIP_EXPR **children, SCIP_Real *coefficients, SCIP_Real constant, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
    Definition: expr_sum.c:1117
    SCIP_RETCODE SCIPincludeExprhdlrVar(SCIP *scip)
    Definition: expr_var.c:373
    void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
    Definition: scip_message.c:208
    unsigned int SCIPcalcFibHash(SCIP_Real v)
    Definition: misc.c:10462
    const char * SCIPexprhdlrGetName(SCIP_EXPRHDLR *exprhdlr)
    Definition: expr.c:545
    void SCIPexprhdlrSetIntegrality(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRINTEGRALITY((*integrality)))
    Definition: expr.c:440
    void SCIPexprhdlrSetCopyFreeData(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOPYDATA((*copydata)), SCIP_DECL_EXPRFREEDATA((*freedata)))
    Definition: expr.c:383
    void SCIPexprhdlrSetPrint(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRPRINT((*print)))
    Definition: expr.c:396
    void SCIPexprhdlrSetHash(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRHASH((*hash)))
    Definition: expr.c:451
    void SCIPexprhdlrSetCopyFreeHdlr(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOPYHDLR((*copyhdlr)), SCIP_DECL_EXPRFREEHDLR((*freehdlr)))
    Definition: expr.c:370
    void SCIPexprhdlrSetDiff(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRBWDIFF((*bwdiff)), SCIP_DECL_EXPRFWDIFF((*fwdiff)), SCIP_DECL_EXPRBWFWDIFF((*bwfwdiff)))
    Definition: expr.c:473
    SCIP_EXPRHDLR * SCIPgetExprhdlrVar(SCIP *scip)
    Definition: scip_expr.c:906
    void SCIPexprhdlrSetMonotonicity(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRMONOTONICITY((*monotonicity)))
    Definition: expr.c:429
    void SCIPexprhdlrSetIntEval(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRINTEVAL((*inteval)))
    Definition: expr.c:488
    void SCIPexprhdlrSetCurvature(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCURVATURE((*curvature)))
    Definition: expr.c:418
    SCIP_RETCODE SCIPincludeExprhdlr(SCIP *scip, SCIP_EXPRHDLR **exprhdlr, const char *name, const char *desc, unsigned int precedence, SCIP_DECL_EXPREVAL((*eval)), SCIP_EXPRHDLRDATA *data)
    Definition: scip_expr.c:847
    void SCIPexprhdlrSetCompare(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOMPARE((*compare)))
    Definition: expr.c:462
    void SCIPexprhdlrSetSimplify(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRSIMPLIFY((*simplify)))
    Definition: expr.c:499
    SCIP_RETCODE SCIPcreateExpr(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPRHDLR *exprhdlr, SCIP_EXPRDATA *exprdata, int nchildren, SCIP_EXPR **children, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
    Definition: scip_expr.c:1000
    void SCIPexprSetData(SCIP_EXPR *expr, SCIP_EXPRDATA *exprdata)
    Definition: expr.c:3920
    int SCIPexprGetNChildren(SCIP_EXPR *expr)
    Definition: expr.c:3872
    SCIP_RETCODE SCIPreleaseExpr(SCIP *scip, SCIP_EXPR **expr)
    Definition: scip_expr.c:1443
    SCIP_EXPRDATA * SCIPexprGetData(SCIP_EXPR *expr)
    Definition: expr.c:3905
    SCIP_RETCODE SCIPprintExpr(SCIP *scip, SCIP_EXPR *expr, FILE *file)
    Definition: scip_expr.c:1512
    SCIP_VAR * SCIPgetVarExprVar(SCIP_EXPR *expr)
    Definition: expr_var.c:424
    void SCIPcaptureExpr(SCIP_EXPR *expr)
    Definition: scip_expr.c:1435
    SCIP_EXPRHDLR * SCIPexprGetHdlr(SCIP_EXPR *expr)
    Definition: expr.c:3895
    void SCIPintervalSetBounds(SCIP_INTERVAL *resultant, SCIP_Real inf, SCIP_Real sup)
    #define SCIPallocBufferArray(scip, ptr, num)
    Definition: scip_mem.h:124
    #define SCIPreallocBufferArray(scip, ptr, num)
    Definition: scip_mem.h:128
    #define SCIPfreeBufferArray(scip, ptr)
    Definition: scip_mem.h:136
    SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
    Definition: scip_sol.c:1765
    SCIP_Real SCIPinfinity(SCIP *scip)
    SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPvarIsActive(SCIP_VAR *var)
    Definition: var.c:23642
    SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
    Definition: var.c:24268
    int SCIPvarGetIndex(SCIP_VAR *var)
    Definition: var.c:23652
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23267
    SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
    Definition: scip_var.c:1887
    SCIP_RETCODE SCIPgetProbvarLinearSum(SCIP *scip, SCIP_VAR **vars, SCIP_Real *scalars, int *nvars, int varssize, SCIP_Real *constant, int *requiredsize)
    Definition: scip_var.c:2378
    SCIP_Bool SCIPvarIsIntegral(SCIP_VAR *var)
    Definition: var.c:23490
    SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
    Definition: var.c:24234
    SCIP_Bool SCIPvarIsOriginal(SCIP_VAR *var)
    Definition: var.c:23417
    SCIP_IMPLINTTYPE SCIPvarGetImplType(SCIP_VAR *var)
    Definition: var.c:23463
    SCIP_RETCODE SCIPcaptureVar(SCIP *scip, SCIP_VAR *var)
    Definition: scip_var.c:1853
    #define SCIP_DECL_EXPR_OWNERCREATE(x)
    Definition: type_expr.h:143
    struct SCIP_ExprData SCIP_EXPRDATA
    Definition: type_expr.h:54
    @ SCIP_MONOTONE_INC
    Definition: type_expr.h:72
    #define SCIP_EXPRITER_ENTEREXPR
    Definition: type_expr.h:694
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_INVALIDCALL
    Definition: type_retcode.h:51
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    @ SCIP_IMPLINTTYPE_NONE
    Definition: type_var.h:90
    @ SCIP_IMPLINTTYPE_STRONG
    Definition: type_var.h:106
    @ SCIP_IMPLINTTYPE_WEAK
    Definition: type_var.h:91