SCIP Doxygen Documentation
Loading...
Searching...
No Matches
sepa_intobj.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-2026 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 sepa_intobj.c
26 * @ingroup DEFPLUGINS_SEPA
27 * @brief integer objective value separator
28 * @author Tobias Achterberg
29 * @author Timo Berthold
30 */
31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32
33#include "scip/pub_event.h"
34#include "scip/pub_lp.h"
35#include "scip/pub_message.h"
36#include "scip/pub_sepa.h"
37#include "scip/pub_var.h"
38#include "scip/scip_branch.h"
39#include "scip/scip_cut.h"
40#include "scip/scip_event.h"
41#include "scip/scip_general.h"
42#include "scip/scip_lp.h"
43#include "scip/scip_message.h"
44#include "scip/scip_mem.h"
45#include "scip/scip_numerics.h"
46#include "scip/scip_prob.h"
47#include "scip/scip_probing.h"
48#include "scip/scip_sepa.h"
49#include "scip/scip_sol.h"
51#include "scip/scip_var.h"
52#include "scip/sepa_intobj.h"
53#include <string.h>
54
55
56#define SEPA_NAME "intobj"
57#define SEPA_DESC "integer objective value separator"
58#define SEPA_PRIORITY -100
59#define SEPA_FREQ -1
60#define SEPA_MAXBOUNDDIST 0.0
61#define SEPA_USESSUBSCIP FALSE /**< does the separator use a secondary SCIP instance? */
62#define SEPA_DELAY FALSE /**< should separation method be delayed, if other separators found cuts? */
63
64#define EVENTHDLR_NAME "intobj"
65#define EVENTHDLR_DESC "objective change event handler for integer objective value separator"
66
67
68/*
69 * Data structures
70 */
71
72/** separator data */
73struct SCIP_SepaData
74{
75 SCIP_ROW* objrow; /**< objective value inequality */
76 SCIP_VAR* objvar; /**< objective value variable */
77 SCIP_Real setoff; /**< setoff of the inequality */
78};
79
80
81/*
82 * Local methods
83 */
84
85/** creates separator data */
86static
88 SCIP* scip, /**< SCIP data structure */
89 SCIP_SEPADATA** sepadata /**< pointer to store separator data */
90 )
91{
93
95 (*sepadata)->objrow = NULL;
96 (*sepadata)->objvar = NULL;
97 (*sepadata)->setoff = 0.0;
98
99 return SCIP_OKAY;
100}
101
102/** frees separator data */
103static
105 SCIP* scip, /**< SCIP data structure */
106 SCIP_SEPADATA** sepadata /**< pointer to separator data */
107 )
108{
109 assert(sepadata != NULL);
110 assert(*sepadata != NULL);
111 assert((*sepadata)->objrow == NULL);
112 assert((*sepadata)->objvar == NULL);
113
115
116 return SCIP_OKAY;
117}
118
119/** creates the objective value inequality and the objective value variable, if not yet existing */
120static
122 SCIP* scip, /**< SCIP data structure */
123 SCIP_SEPA* sepa, /**< separator */
124 SCIP_SEPADATA* sepadata /**< separator data */
125 )
126{
127 assert(sepadata != NULL);
128
129 if( sepadata->objrow == NULL )
130 {
131 SCIP_VAR** vars;
133 SCIP_Real intobjval;
134 int nvars;
135 int v;
136 SCIP_Bool attendobjvarbound;
137
138 attendobjvarbound = FALSE;
139 /* create and add objective value variable */
140 if( sepadata->objvar == NULL )
141 {
145 SCIP_CALL( SCIPaddVar(scip, sepadata->objvar) );
147 }
148 else
149 attendobjvarbound = TRUE;
150
151 /* get problem variables */
154
155 /* create objective value inequality */
156 if( attendobjvarbound )
158 else
159 intobjval = SCIPceil(scip, SCIPgetLowerbound(scip));
160 SCIP_CALL( SCIPcreateEmptyRowSepa(scip, &sepadata->objrow, sepa, "objrow", intobjval, SCIPinfinity(scip),
162 sepadata->setoff = intobjval;
163
165 for( v = 0; v < nvars; ++v )
166 {
167 obj = SCIPvarGetObj(vars[v]);
168 if( !SCIPisZero(scip, obj) )
169 {
170 SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, vars[v], obj) );
171 }
172 }
173 SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, sepadata->objvar, -1.0) );
175
176 SCIPdebugMsg(scip, "created objective value row: ");
178 }
179
180 return SCIP_OKAY;
181}
182
183/** searches and adds integral objective cuts that separate the given primal solution */
184static
186 SCIP* scip, /**< SCIP data structure */
187 SCIP_SEPA* sepa, /**< the intobj separator */
188 SCIP_SOL* sol, /**< the solution that should be separated, or NULL for LP solution */
189 SCIP_RESULT* result /**< pointer to store the result */
190 )
191{
194 SCIP_Real intbound;
195 SCIP_Bool infeasible;
196 SCIP_Bool tightened;
197
198 assert(result != NULL);
200
201 /* if the objective value may be fractional, we cannot do anything */
202 if( !SCIPisObjIntegral(scip) )
203 return SCIP_OKAY;
204
206
207 /* if the current objective value is integral, there is no integral objective value cut */
208 if( sol == NULL )
210 else
213 return SCIP_OKAY;
214
216 assert(sepadata != NULL);
217
218 /* the objective value is fractional: create the objective value inequality, if not yet existing */
220
221 /* adjust the bounds of the objective value variable */
222 intbound = SCIPceil(scip, objval) - sepadata->setoff;
223 SCIP_CALL( SCIPtightenVarLb(scip, sepadata->objvar, intbound, FALSE, &infeasible, &tightened) );
224 SCIPdebugMsg(scip, "new objective variable lower bound: <%s>[%g,%g]\n",
226
227 /* add the objective value inequality as a cut to the LP */
228 if( infeasible )
230 else
231 {
232 if( !SCIProwIsInLP(sepadata->objrow) )
233 {
234 SCIP_CALL( SCIPaddRow(scip, sepadata->objrow, FALSE, &infeasible) );
235 }
236 if ( infeasible )
238 else if ( tightened )
240 else
242 }
243
244 return SCIP_OKAY;
245}
246
247
248/*
249 * Callback methods of separator
250 */
251
252/** copy method for separator plugins (called when SCIP copies plugins) */
253static
254SCIP_DECL_SEPACOPY(sepaCopyIntobj)
255{ /*lint --e{715}*/
256 assert(scip != NULL);
257 assert(sepa != NULL);
258 assert(strcmp(SCIPsepaGetName(sepa), SEPA_NAME) == 0);
259
260 /* call inclusion method of constraint handler */
262
263 return SCIP_OKAY;
264}
265
266/** destructor of separator to free user data (called when SCIP is exiting) */
267static
268SCIP_DECL_SEPAFREE(sepaFreeIntobj)
269{ /*lint --e{715}*/
271
272 /* free separator data */
274 assert(sepadata != NULL);
275
277
278 SCIPsepaSetData(sepa, NULL);
279
280 return SCIP_OKAY;
281}
282
283
284/** solving process deinitialization method of separator (called before branch and bound process data is freed) */
285static
286SCIP_DECL_SEPAEXITSOL(sepaExitsolIntobj)
287{ /*lint --e{715}*/
289
291 assert(sepadata != NULL);
292
293 /* release objective row */
294 if( sepadata->objrow != NULL )
295 {
297 }
298
299 /* release objective variable */
300 if( sepadata->objvar != NULL )
301 {
302 /* remove locks in createObjRow() */
305 }
306
307 return SCIP_OKAY;
308}
309
310
311/** LP solution separation method of separator */
312static
313SCIP_DECL_SEPAEXECLP(sepaExeclpIntobj)
314{ /*lint --e{715}*/
316
317 /* only call separator, if we are not close to terminating */
318 if( SCIPisStopped(scip) )
319 return SCIP_OKAY;
320
321 /* only call separator, if an optimal LP solution is at hand */
323 return SCIP_OKAY;
324
325 /* only call separator, if there are fractional variables */
326 if( SCIPgetNLPBranchCands(scip) == 0 )
327 return SCIP_OKAY;
328
329 /* only call separator if not in probing with changed objective function
330 * this separator did not track objective changes anymore
331 */
333 return SCIP_OKAY;
334
336
337 return SCIP_OKAY;
338}
339
340
341/** arbitrary primal solution separation method of separator */
342static
343SCIP_DECL_SEPAEXECSOL(sepaExecsolIntobj)
344{ /*lint --e{715}*/
346
347 /* only call separator, if we are not close to terminating */
348 if( SCIPisStopped(scip) )
349 return SCIP_OKAY;
350
351 /* only call separator, if there can be no feasible integral objective value at least as good */
353 return SCIP_OKAY;
354
356
357 return SCIP_OKAY;
358}
359
360
361/*
362 * event handler for catching newly added variables
363 */
364
365
366/** initialization method of event handler (called after problem was transformed) */
367static
368SCIP_DECL_EVENTINIT(eventInitIntobj)
369{ /*lint --e{715}*/
371
372 return SCIP_OKAY;
373}
374
375/** deinitialization method of event handler (called before transformed problem is freed) */
376static
377SCIP_DECL_EVENTEXIT(eventExitIntobj)
378{ /*lint --e{715}*/
380
381 return SCIP_OKAY;
382}
383
384
385/** execution method of objective change event handler */
386static
387SCIP_DECL_EVENTEXEC(eventExecIntobj)
388{ /*lint --e{715}*/
389 SCIP_EVENTHDLRDATA* eventhdlrdata;
391 SCIP_VAR* var;
392 SCIP_Real objdelta;
393
394 eventhdlrdata = SCIPeventhdlrGetData(eventhdlr);
395 sepadata = (SCIP_SEPADATA*)eventhdlrdata;
396 assert(sepadata != NULL);
398
399 /* we don't have anything to do, if the objective value inequality doesn't yet exist */
400 if( sepadata->objrow == NULL )
401 return SCIP_OKAY;
402
403 var = SCIPeventGetVar(event);
404 SCIPdebugMsg(scip, "variable <%s> with obj=%g was added to the problem\n", SCIPvarGetName(var), SCIPvarGetObj(var));
405
406 objdelta = SCIPvarGetObj(var);
407 if( !SCIPisZero(scip, objdelta) )
408 {
410 }
411
412 return SCIP_OKAY;
413}
414
415
416/*
417 * separator specific interface methods
418 */
419
420/** creates the integer objective value separator and includes it in SCIP */
422 SCIP* scip /**< SCIP data structure */
423 )
424{
426 SCIP_EVENTHDLRDATA* eventhdlrdata;
427 SCIP_SEPA* sepa;
428 SCIP_EVENTHDLR* eventhdlr;
429
430 /* create intobj separator data */
432
433 /* include separator */
436 sepaExeclpIntobj, sepaExecsolIntobj,
437 sepadata) );
438
439 assert(sepa != NULL);
440
441 /* set non-NULL pointers to callback methods */
442 SCIP_CALL( SCIPsetSepaCopy(scip, sepa, sepaCopyIntobj) );
443 SCIP_CALL( SCIPsetSepaFree(scip, sepa, sepaFreeIntobj) );
444 SCIP_CALL( SCIPsetSepaExitsol(scip, sepa, sepaExitsolIntobj) );
445
446 /* include event handler for objective change events */
447 eventhdlr = NULL;
448 eventhdlrdata = (SCIP_EVENTHDLRDATA*)sepadata;
450 eventExecIntobj, eventhdlrdata) );
451 assert(eventhdlr != NULL);
452
453 SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitIntobj) );
454 SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitIntobj) );
455
456 return SCIP_OKAY;
457}
#define EVENTHDLR_NAME
#define EVENTHDLR_DESC
#define NULL
Definition def.h:255
#define SCIP_Bool
Definition def.h:98
#define SCIP_Real
Definition def.h:163
#define TRUE
Definition def.h:100
#define FALSE
Definition def.h:101
#define SCIP_CALL(x)
Definition def.h:362
SCIP_Bool SCIPisStopped(SCIP *scip)
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
Definition scip_prob.c:1907
int SCIPgetNVars(SCIP *scip)
Definition scip_prob.c:2246
SCIP_VAR ** SCIPgetVars(SCIP *scip)
Definition scip_prob.c:2201
SCIP_Bool SCIPallVarsInProb(SCIP *scip)
Definition scip_prob.c:3247
SCIP_Bool SCIPisObjIntegral(SCIP *scip)
Definition scip_prob.c:1801
SCIP_Real SCIPgetLocalLowerbound(SCIP *scip)
Definition scip_prob.c:4178
#define SCIPdebugMsg
int SCIPgetNLPBranchCands(SCIP *scip)
SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
Definition scip_cut.c:225
SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
Definition scip_event.c:111
SCIP_RETCODE SCIPsetEventhdlrExit(SCIP *scip, SCIP_EVENTHDLR *eventhdlr,)
Definition scip_event.c:185
SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr)
Definition event.c:406
SCIP_RETCODE SCIPsetEventhdlrInit(SCIP *scip, SCIP_EVENTHDLR *eventhdlr,)
Definition scip_event.c:171
SCIP_EVENTTYPE SCIPeventGetType(SCIP_EVENT *event)
Definition event.c:1194
SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
Definition event.c:1217
SCIP_RETCODE SCIPcatchEvent(SCIP *scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
Definition scip_event.c:293
SCIP_RETCODE SCIPdropEvent(SCIP *scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
Definition scip_event.c:333
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
Definition scip_lp.c:174
SCIP_Real SCIPgetLPObjval(SCIP *scip)
Definition scip_lp.c:253
#define SCIPfreeBlockMemory(scip, ptr)
Definition scip_mem.h:108
#define SCIPallocBlockMemory(scip, ptr)
Definition scip_mem.h:89
SCIP_Bool SCIPisObjChangedProbing(SCIP *scip)
SCIP_RETCODE SCIPcacheRowExtensions(SCIP *scip, SCIP_ROW *row)
Definition scip_lp.c:1581
SCIP_RETCODE SCIPflushRowExtensions(SCIP *scip, SCIP_ROW *row)
Definition scip_lp.c:1604
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
Definition scip_lp.c:1646
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
Definition scip_lp.c:2176
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
Definition scip_lp.c:1508
SCIP_RETCODE SCIPcreateEmptyRowSepa(SCIP *scip, SCIP_ROW **row, SCIP_SEPA *sepa, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
Definition scip_lp.c:1429
SCIP_Bool SCIProwIsInLP(SCIP_ROW *row)
Definition lp.c:17917
SCIP_RETCODE SCIPincludeSepaBasic(SCIP *scip, SCIP_SEPA **sepa, const char *name, const char *desc, int priority, int freq, SCIP_Real maxbounddist, SCIP_Bool usessubscip, SCIP_Bool delay, SCIP_DECL_SEPAEXECLP((*sepaexeclp)), SCIP_DECL_SEPAEXECSOL((*sepaexecsol)), SCIP_SEPADATA *sepadata)
Definition scip_sepa.c:115
SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa,)
Definition scip_sepa.c:173
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
Definition sepa.c:746
SCIP_RETCODE SCIPsetSepaExitsol(SCIP *scip, SCIP_SEPA *sepa,)
Definition scip_sepa.c:237
SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
Definition sepa.c:636
void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
Definition sepa.c:646
SCIP_RETCODE SCIPsetSepaCopy(SCIP *scip, SCIP_SEPA *sepa,)
Definition scip_sepa.c:157
SCIP_Real SCIPgetSolTransObj(SCIP *scip, SCIP_SOL *sol)
Definition scip_sol.c:2005
SCIP_Real SCIPgetLowerbound(SCIP *scip)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
Definition scip_var.c:6401
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
Definition var.c:24268
SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
Definition var.c:23900
void SCIPvarMarkRelaxationOnly(SCIP_VAR *var)
Definition var.c:23618
SCIP_RETCODE SCIPaddVarLocksType(SCIP *scip, SCIP_VAR *var, SCIP_LOCKTYPE locktype, int nlocksdown, int nlocksup)
Definition scip_var.c:5118
SCIP_RETCODE SCIPcreateVarImpl(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_IMPLINTTYPE impltype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
Definition scip_var.c:225
const char * SCIPvarGetName(SCIP_VAR *var)
Definition var.c:23267
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
Definition scip_var.c:1887
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
Definition var.c:24234
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
Definition var.c:24120
SCIP_RETCODE SCIPincludeSepaIntobj(SCIP *scip)
return SCIP_OKAY
SCIP_Real objval
static SCIP_SOL * sol
SCIP_Real obj
assert(minobj< SCIPgetCutoffbound(scip))
int nvars
SCIP_VAR * var
static SCIP_VAR ** vars
public methods for managing events
public methods for LP management
public methods for message output
#define SCIPdebug(x)
Definition pub_message.h:93
public methods for separators
public methods for problem variables
public methods for branching rule plugins and branching
public methods for cuts and aggregation rows
public methods for event handler plugins and event handlers
general public methods
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for global and local (sub)problems
public methods for the probing mode
public methods for separator plugins
public methods for solutions
public methods for querying solving statistics
public methods for SCIP variables
#define SEPA_PRIORITY
#define SEPA_DELAY
#define SEPA_DESC
#define SEPA_USESSUBSCIP
#define SEPA_MAXBOUNDDIST
#define SEPA_FREQ
#define SEPA_NAME
static SCIP_RETCODE sepadataCreate(SCIP *scip, SCIP_SEPADATA **sepadata)
Definition sepa_intobj.c:87
static SCIP_RETCODE separateCuts(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
static SCIP_RETCODE sepadataFree(SCIP *scip, SCIP_SEPADATA **sepadata)
static SCIP_RETCODE createObjRow(SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
integer objective value separator
struct SCIP_Eventhdlr SCIP_EVENTHDLR
Definition type_event.h:159
#define SCIP_DECL_EVENTEXIT(x)
Definition type_event.h:213
struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA
Definition type_event.h:160
#define SCIP_DECL_EVENTEXEC(x)
Definition type_event.h:259
#define SCIP_DECL_EVENTINIT(x)
Definition type_event.h:205
#define SCIP_EVENTTYPE_VARADDED
Definition type_event.h:70
struct SCIP_Row SCIP_ROW
Definition type_lp.h:105
@ SCIP_LPSOLSTAT_OPTIMAL
Definition type_lp.h:44
@ SCIP_DIDNOTRUN
Definition type_result.h:42
@ SCIP_CUTOFF
Definition type_result.h:48
@ SCIP_REDUCEDDOM
Definition type_result.h:51
@ SCIP_DIDNOTFIND
Definition type_result.h:44
@ SCIP_SEPARATED
Definition type_result.h:49
enum SCIP_Result SCIP_RESULT
Definition type_result.h:61
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_SepaData SCIP_SEPADATA
Definition type_sepa.h:52
#define SCIP_DECL_SEPAEXECSOL(x)
Definition type_sepa.h:166
#define SCIP_DECL_SEPAEXECLP(x)
Definition type_sepa.h:136
#define SCIP_DECL_SEPAFREE(x)
Definition type_sepa.h:69
#define SCIP_DECL_SEPAEXITSOL(x)
Definition type_sepa.h:107
struct SCIP_Sepa SCIP_SEPA
Definition type_sepa.h:51
#define SCIP_DECL_SEPACOPY(x)
Definition type_sepa.h:61
struct SCIP_Sol SCIP_SOL
Definition type_sol.h:57
struct SCIP_Var SCIP_VAR
Definition type_var.h:166
@ SCIP_IMPLINTTYPE_WEAK
Definition type_var.h:91
@ SCIP_VARTYPE_CONTINUOUS
Definition type_var.h:71
@ SCIP_LOCKTYPE_MODEL
Definition type_var.h:141