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