Scippy

SCIP

Solving Constraint Integer Programs

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-2018 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SCIP is distributed under the terms of the ZIB Academic License. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SCIP; see the file COPYING. If not email to scip@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file sepa_intobj.c
17  * @brief integer objective value separator
18  * @author Tobias Achterberg
19  * @author Timo Berthold
20  */
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22 
23 #include <assert.h>
24 #include <string.h>
25 
26 #include "scip/sepa_intobj.h"
27 
28 
29 #define SEPA_NAME "intobj"
30 #define SEPA_DESC "integer objective value separator"
31 #define SEPA_PRIORITY -100
32 #define SEPA_FREQ -1
33 #define SEPA_MAXBOUNDDIST 0.0
34 #define SEPA_USESSUBSCIP FALSE /**< does the separator use a secondary SCIP instance? */
35 #define SEPA_DELAY FALSE /**< should separation method be delayed, if other separators found cuts? */
36 
37 #define EVENTHDLR_NAME "intobj"
38 #define EVENTHDLR_DESC "objective change event handler for integer objective value separator"
39 
40 
41 /*
42  * Data structures
43  */
44 
45 /** separator data */
46 struct SCIP_SepaData
47 {
48  SCIP_ROW* objrow; /**< objective value inequality */
49  SCIP_VAR* objvar; /**< objective value variable */
50  SCIP_Real setoff; /**< setoff of the inequality */
51 };
52 
53 
54 /*
55  * Local methods
56  */
57 
58 /** creates separator data */
59 static
61  SCIP* scip, /**< SCIP data structure */
62  SCIP_SEPADATA** sepadata /**< pointer to store separator data */
63  )
64 {
65  assert(sepadata != NULL);
66 
67  SCIP_CALL( SCIPallocBlockMemory(scip, sepadata) );
68  (*sepadata)->objrow = NULL;
69  (*sepadata)->objvar = NULL;
70  (*sepadata)->setoff = 0.0;
71 
72  return SCIP_OKAY;
73 }
74 
75 /** frees separator data */
76 static
78  SCIP* scip, /**< SCIP data structure */
79  SCIP_SEPADATA** sepadata /**< pointer to separator data */
80  )
81 {
82  assert(sepadata != NULL);
83  assert(*sepadata != NULL);
84  assert((*sepadata)->objrow == NULL);
85  assert((*sepadata)->objvar == NULL);
86 
87  SCIPfreeBlockMemory(scip, sepadata);
88 
89  return SCIP_OKAY;
90 }
91 
92 /** creates the objective value inequality and the objective value variable, if not yet existing */
93 static
95  SCIP* scip, /**< SCIP data structure */
96  SCIP_SEPA* sepa, /**< separator */
97  SCIP_SEPADATA* sepadata /**< separator data */
98  )
99 {
100  assert(sepadata != NULL);
101 
102  if( sepadata->objrow == NULL )
103  {
104  SCIP_VAR** vars;
105  SCIP_Real obj;
106  SCIP_Real intobjval;
107  int nvars;
108  int v;
109  SCIP_Bool attendobjvarbound;
110 
111  attendobjvarbound = FALSE;
112  /* create and add objective value variable */
113  if( sepadata->objvar == NULL )
114  {
115  SCIP_CALL( SCIPcreateVar(scip, &sepadata->objvar, "objvar", -SCIPinfinity(scip), SCIPinfinity(scip), 0.0,
116  SCIP_VARTYPE_IMPLINT, FALSE, TRUE, NULL, NULL, NULL, NULL, NULL) );
117  SCIP_CALL( SCIPaddVar(scip, sepadata->objvar) );
118  SCIP_CALL( SCIPaddVarLocks(scip, sepadata->objvar, +1, +1) );
119  }
120  else
121  attendobjvarbound = TRUE;
122 
123  /* get problem variables */
124  vars = SCIPgetVars(scip);
125  nvars = SCIPgetNVars(scip);
126 
127  /* create objective value inequality */
128  if( attendobjvarbound )
129  intobjval = SCIPceil(scip, SCIPgetLowerbound(scip)) - SCIPvarGetLbGlobal(sepadata->objvar);
130  else
131  intobjval = SCIPceil(scip, SCIPgetLowerbound(scip));
132  SCIP_CALL( SCIPcreateEmptyRowSepa(scip, &sepadata->objrow, sepa, "objrow", intobjval, SCIPinfinity(scip),
133  FALSE, !SCIPallVarsInProb(scip), TRUE) );
134  sepadata->setoff = intobjval;
135 
136  SCIP_CALL( SCIPcacheRowExtensions(scip, sepadata->objrow) );
137  for( v = 0; v < nvars; ++v )
138  {
139  obj = SCIPvarGetObj(vars[v]);
140  if( !SCIPisZero(scip, obj) )
141  {
142  SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, vars[v], obj) );
143  }
144  }
145  SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, sepadata->objvar, -1.0) );
146  SCIP_CALL( SCIPflushRowExtensions(scip, sepadata->objrow) );
147 
148  SCIPdebugMsg(scip, "created objective value row: ");
149  SCIPdebug( SCIP_CALL( SCIPprintRow(scip, sepadata->objrow, NULL) ) );
150  }
151 
152  return SCIP_OKAY;
153 }
154 
155 /** searches and adds integral objective cuts that separate the given primal solution */
156 static
158  SCIP* scip, /**< SCIP data structure */
159  SCIP_SEPA* sepa, /**< the intobj separator */
160  SCIP_SOL* sol, /**< the solution that should be separated, or NULL for LP solution */
161  SCIP_RESULT* result /**< pointer to store the result */
162  )
163 {
164  SCIP_SEPADATA* sepadata;
165  SCIP_Real objval;
166  SCIP_Real intbound;
167  SCIP_Bool infeasible;
168  SCIP_Bool tightened;
169 
170  assert(result != NULL);
171  assert(*result == SCIP_DIDNOTRUN);
172 
173  /* if the objective value may be fractional, we cannot do anything */
174  if( !SCIPisObjIntegral(scip) )
175  return SCIP_OKAY;
176 
177  *result = SCIP_DIDNOTFIND;
178 
179  /* if the current objective value is integral, there is no integral objective value cut */
180  if( sol == NULL )
181  objval = SCIPgetLPObjval(scip);
182  else
183  objval = SCIPgetSolTransObj(scip, sol);
184  if( SCIPisFeasIntegral(scip, objval) )
185  return SCIP_OKAY;
186 
187  sepadata = SCIPsepaGetData(sepa);
188  assert(sepadata != NULL);
189 
190  /* the objective value is fractional: create the objective value inequality, if not yet existing */
191  SCIP_CALL( createObjRow(scip, sepa, sepadata) );
192 
193  /* adjust the bounds of the objective value variable */
194  intbound = SCIPceil(scip, objval) - sepadata->setoff;
195  SCIP_CALL( SCIPtightenVarLb(scip, sepadata->objvar, intbound, FALSE, &infeasible, &tightened) );
196  SCIPdebugMsg(scip, "new objective variable lower bound: <%s>[%g,%g]\n",
197  SCIPvarGetName(sepadata->objvar), SCIPvarGetLbLocal(sepadata->objvar), SCIPvarGetUbLocal(sepadata->objvar));
198 
199  /* add the objective value inequality as a cut to the LP */
200  if( infeasible )
201  *result = SCIP_CUTOFF;
202  else
203  {
204  if( !SCIProwIsInLP(sepadata->objrow) )
205  {
206  SCIP_CALL( SCIPaddRow(scip, sepadata->objrow, FALSE, &infeasible) );
207  }
208  if ( infeasible )
209  *result = SCIP_CUTOFF;
210  else if ( tightened )
211  *result = SCIP_REDUCEDDOM;
212  else
213  *result = SCIP_SEPARATED;
214  }
215 
216  return SCIP_OKAY;
217 }
218 
219 
220 /*
221  * Callback methods of separator
222  */
223 
224 /** copy method for separator plugins (called when SCIP copies plugins) */
225 static
226 SCIP_DECL_SEPACOPY(sepaCopyIntobj)
227 { /*lint --e{715}*/
228  assert(scip != NULL);
229  assert(sepa != NULL);
230  assert(strcmp(SCIPsepaGetName(sepa), SEPA_NAME) == 0);
231 
232  /* call inclusion method of constraint handler */
234 
235  return SCIP_OKAY;
236 }
237 
238 /** destructor of separator to free user data (called when SCIP is exiting) */
239 static
240 SCIP_DECL_SEPAFREE(sepaFreeIntobj)
241 { /*lint --e{715}*/
242  SCIP_SEPADATA* sepadata;
243 
244  /* free separator data */
245  sepadata = SCIPsepaGetData(sepa);
246  assert(sepadata != NULL);
247 
248  SCIP_CALL( sepadataFree(scip, &sepadata) );
249 
250  SCIPsepaSetData(sepa, NULL);
251 
252  return SCIP_OKAY;
253 }
254 
255 
256 /** deinitialization method of separator (called before transformed problem is freed) */
257 static
258 SCIP_DECL_SEPAEXIT(sepaExitIntobj)
259 { /*lint --e{715}*/
260  SCIP_SEPADATA* sepadata;
261 
262  sepadata = SCIPsepaGetData(sepa);
263  assert(sepadata != NULL);
264 
265  /* release objective variable */
266  if( sepadata->objvar != NULL )
267  {
268  SCIP_CALL( SCIPreleaseVar(scip, &sepadata->objvar) );
269  }
270 
271  return SCIP_OKAY;
272 }
273 
274 
275 /** solving process deinitialization method of separator (called before branch and bound process data is freed) */
276 static
277 SCIP_DECL_SEPAEXITSOL(sepaExitsolIntobj)
278 { /*lint --e{715}*/
279  SCIP_SEPADATA* sepadata;
280 
281  sepadata = SCIPsepaGetData(sepa);
282  assert(sepadata != NULL);
283 
284  /* release objective row */
285  if( sepadata->objrow != NULL )
286  {
287  SCIP_CALL( SCIPreleaseRow(scip, &sepadata->objrow) );
288  }
289 
290  return SCIP_OKAY;
291 }
292 
293 
294 /** LP solution separation method of separator */
295 static
296 SCIP_DECL_SEPAEXECLP(sepaExeclpIntobj)
297 { /*lint --e{715}*/
298 
299  *result = SCIP_DIDNOTRUN;
300 
301  /* only call separator, if we are not close to terminating */
302  if( SCIPisStopped(scip) )
303  return SCIP_OKAY;
304 
305  /* only call separator, if an optimal LP solution is at hand */
307  return SCIP_OKAY;
308 
309  /* only call separator, if there are fractional variables */
310  if( SCIPgetNLPBranchCands(scip) == 0 )
311  return SCIP_OKAY;
312 
313  SCIP_CALL( separateCuts(scip, sepa, NULL, result) );
314 
315  return SCIP_OKAY;
316 }
317 
318 
319 /** arbitrary primal solution separation method of separator */
320 static
321 SCIP_DECL_SEPAEXECSOL(sepaExecsolIntobj)
322 { /*lint --e{715}*/
323 
324  *result = SCIP_DIDNOTRUN;
325 
326  SCIP_CALL( separateCuts(scip, sepa, sol, result) );
327 
328  return SCIP_OKAY;
329 }
330 
331 
332 /*
333  * event handler for objective changes
334  */
335 
336 
337 /** initialization method of event handler (called after problem was transformed) */
338 static
339 SCIP_DECL_EVENTINIT(eventInitIntobj)
340 { /*lint --e{715}*/
342 
343  return SCIP_OKAY;
344 }
345 
346 /** deinitialization method of event handler (called before transformed problem is freed) */
347 static
348 SCIP_DECL_EVENTEXIT(eventExitIntobj)
349 { /*lint --e{715}*/
351 
352  return SCIP_OKAY;
353 }
354 
355 
356 /** execution method of objective change event handler */
357 static
358 SCIP_DECL_EVENTEXEC(eventExecIntobj)
359 { /*lint --e{715}*/
360  SCIP_EVENTHDLRDATA* eventhdlrdata;
361  SCIP_SEPADATA* sepadata;
362  SCIP_VAR* var;
363  SCIP_Real objdelta;
364 
365  eventhdlrdata = SCIPeventhdlrGetData(eventhdlr);
366  sepadata = (SCIP_SEPADATA*)eventhdlrdata;
367  assert(sepadata != NULL);
368 
369  /* we don't have anything to do, if the objective value inequality doesn't yet exist */
370  if( sepadata->objrow == NULL )
371  return SCIP_OKAY;
372 
373  var = SCIPeventGetVar(event);
374 
375  switch( SCIPeventGetType(event) )
376  {
378  SCIPdebugMsg(scip, "variable <%s> with obj=%g was added to the problem\n", SCIPvarGetName(var), SCIPvarGetObj(var));
379  objdelta = SCIPvarGetObj(var);
380  if( !SCIPisZero(scip, objdelta) )
381  {
382  SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, var, SCIPvarGetObj(var)) );
383  }
384  break;
385 
387  SCIPdebugMsg(scip, "variable <%s> changed objective value from %g to %g\n", SCIPvarGetName(var), SCIPeventGetOldobj(event), SCIPeventGetNewobj(event));
388  objdelta = SCIPeventGetNewobj(event) - SCIPeventGetOldobj(event);
389  SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, var, objdelta) );
390  break;
391 
392  default:
393  SCIPerrorMessage("invalid event type %x\n", SCIPeventGetType(event));
394  return SCIP_INVALIDDATA;
395  }
396 
397  return SCIP_OKAY;
398 }
399 
400 
401 /*
402  * separator specific interface methods
403  */
404 
405 /** creates the integer objective value separator and includes it in SCIP */
407  SCIP* scip /**< SCIP data structure */
408  )
409 {
410  SCIP_SEPADATA* sepadata;
411  SCIP_EVENTHDLRDATA* eventhdlrdata;
412  SCIP_SEPA* sepa;
413  SCIP_EVENTHDLR* eventhdlr;
414 
415  /* create intobj separator data */
416  SCIP_CALL( sepadataCreate(scip, &sepadata) );
417 
418  /* include separator */
421  sepaExeclpIntobj, sepaExecsolIntobj,
422  sepadata) );
423 
424  assert(sepa != NULL);
425 
426  /* set non-NULL pointers to callback methods */
427  SCIP_CALL( SCIPsetSepaCopy(scip, sepa, sepaCopyIntobj) );
428  SCIP_CALL( SCIPsetSepaFree(scip, sepa, sepaFreeIntobj) );
429  SCIP_CALL( SCIPsetSepaExit(scip, sepa, sepaExitIntobj) );
430  SCIP_CALL( SCIPsetSepaExitsol(scip, sepa, sepaExitsolIntobj) );
431 
432  /* include event handler for objective change events */
433  eventhdlr = NULL;
434  eventhdlrdata = (SCIP_EVENTHDLRDATA*)sepadata;
436  eventExecIntobj, eventhdlrdata) );
437  assert(eventhdlr != NULL);
438 
439  SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitIntobj) );
440  SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitIntobj) );
441 
442  return SCIP_OKAY;
443 }
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:52
static SCIP_RETCODE sepadataFree(SCIP *scip, SCIP_SEPADATA **sepadata)
Definition: sepa_intobj.c:77
#define SCIP_EVENTTYPE_OBJCHANGED
Definition: type_event.h:60
SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
Definition: scip.c:22523
SCIP_RETCODE SCIPcacheRowExtensions(SCIP *scip, SCIP_ROW *row)
Definition: scip.c:30613
#define EVENTHDLR_NAME
Definition: sepa_intobj.c:37
SCIP_RETCODE SCIPflushRowExtensions(SCIP *scip, SCIP_ROW *row)
Definition: scip.c:30636
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
Definition: var.c:17276
SCIP_RETCODE SCIPsetEventhdlrExit(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_DECL_EVENTEXIT((*eventexit)))
Definition: scip.c:8685
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
Definition: scip.c:30668
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
Definition: var.c:17332
static SCIP_DECL_SEPAEXIT(sepaExitIntobj)
Definition: sepa_intobj.c:258
SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
Definition: scip.c:8611
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
Definition: scip.c:18766
struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA
Definition: type_event.h:138
#define FALSE
Definition: def.h:64
SCIP_Real SCIPinfinity(SCIP *scip)
Definition: scip.c:47028
#define TRUE
Definition: def.h:63
#define SCIPdebug(x)
Definition: pub_message.h:74
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
Definition: sepa.c:646
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:53
SCIP_RETCODE SCIPaddVarLocks(SCIP *scip, SCIP_VAR *var, int nlocksdown, int nlocksup)
Definition: scip.c:21660
static SCIP_DECL_EVENTINIT(eventInitIntobj)
Definition: sepa_intobj.c:339
#define SCIPfreeBlockMemory(scip, ptr)
Definition: scip.h:22602
SCIP_Bool SCIPallVarsInProb(SCIP *scip)
Definition: scip.c:12564
#define SEPA_DESC
Definition: sepa_intobj.c:30
static SCIP_DECL_SEPACOPY(sepaCopyIntobj)
Definition: sepa_intobj.c:226
static SCIP_RETCODE separateCuts(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
Definition: sepa_intobj.c:157
#define SCIPallocBlockMemory(scip, ptr)
Definition: scip.h:22585
int SCIPgetNLPBranchCands(SCIP *scip)
Definition: scip.c:37034
#define SEPA_FREQ
Definition: sepa_intobj.c:32
SCIP_RETCODE SCIPsetSepaCopy(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPACOPY((*sepacopy)))
Definition: scip.c:7427
static SCIP_DECL_SEPAFREE(sepaFreeIntobj)
Definition: sepa_intobj.c:240
#define SCIPdebugMsg
Definition: scip.h:455
SCIP_RETCODE SCIPincludeSepaIntobj(SCIP *scip)
Definition: sepa_intobj.c:406
SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
Definition: sepa.c:557
SCIP_Bool SCIProwIsInLP(SCIP_ROW *row)
Definition: lp.c:16695
static SCIP_DECL_SEPAEXECSOL(sepaExecsolIntobj)
Definition: sepa_intobj.c:321
#define SEPA_NAME
Definition: sepa_intobj.c:29
static SCIP_DECL_EVENTEXIT(eventExitIntobj)
Definition: sepa_intobj.c:348
#define SEPA_PRIORITY
Definition: sepa_intobj.c:31
SCIP_Real SCIPeventGetOldobj(SCIP_EVENT *event)
Definition: event.c:1104
#define SCIPerrorMessage
Definition: pub_message.h:45
SCIP_RETCODE SCIPsetSepaExit(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAEXIT((*sepaexit)))
Definition: scip.c:7475
static SCIP_RETCODE createObjRow(SCIP *scip, SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
Definition: sepa_intobj.c:94
SCIP_RETCODE SCIPsetEventhdlrInit(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_DECL_EVENTINIT((*eventinit)))
Definition: scip.c:8671
const char * SCIPvarGetName(SCIP_VAR *var)
Definition: var.c:16662
SCIP_Real SCIPeventGetNewobj(SCIP_EVENT *event)
Definition: event.c:1121
void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
Definition: sepa.c:567
SCIP_Real SCIPgetSolTransObj(SCIP *scip, SCIP_SOL *sol)
Definition: scip.c:39041
#define SCIP_CALL(x)
Definition: def.h:350
SCIP_Real SCIPgetLowerbound(SCIP *scip)
Definition: scip.c:43277
SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
Definition: scip.c:34661
static SCIP_DECL_SEPAEXECLP(sepaExeclpIntobj)
Definition: sepa_intobj.c:296
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.c:7385
SCIP_RETCODE SCIPsetSepaExitsol(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAEXITSOL((*sepaexitsol)))
Definition: scip.c:7507
SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
Definition: event.c:982
#define SCIP_Bool
Definition: def.h:61
SCIP_RETCODE SCIPcatchEvent(SCIP *scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
Definition: scip.c:41158
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
Definition: scip.c:29293
SCIP_EVENTTYPE SCIPeventGetType(SCIP_EVENT *event)
Definition: event.c:959
#define SEPA_DELAY
Definition: sepa_intobj.c:35
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.c:30431
static SCIP_DECL_SEPAEXITSOL(sepaExitsolIntobj)
Definition: sepa_intobj.c:277
SCIP_RETCODE SCIPdropEvent(SCIP *scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
Definition: scip.c:41192
SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
Definition: var.c:17124
SCIP_RETCODE SCIPcreateVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, 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.c:17619
#define SEPA_USESSUBSCIP
Definition: sepa_intobj.c:34
static SCIP_RETCODE sepadataCreate(SCIP *scip, SCIP_SEPADATA **sepadata)
Definition: sepa_intobj.c:60
integer objective value separator
int SCIPgetNVars(SCIP *scip)
Definition: scip.c:11812
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
Definition: scip.c:30540
SCIP_Bool SCIPisObjIntegral(SCIP *scip)
Definition: scip.c:11386
SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAFREE((*sepafree)))
Definition: scip.c:7443
SCIP_Real SCIPgetLPObjval(SCIP *scip)
Definition: scip.c:29372
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
Definition: scip.c:11492
#define SEPA_MAXBOUNDDIST
Definition: sepa_intobj.c:33
SCIP_VAR ** SCIPgetVars(SCIP *scip)
Definition: scip.c:11767
#define SCIP_Real
Definition: def.h:149
SCIP_Bool SCIPisStopped(SCIP *scip)
Definition: scip.c:1145
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
Definition: scip.c:31160
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
Definition: scip.c:47076
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
Definition: var.c:17342
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
Definition: scip.c:47399
static SCIP_DECL_EVENTEXEC(eventExecIntobj)
Definition: sepa_intobj.c:358
SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
Definition: scip.c:47161
SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr)
Definition: event.c:288
#define EVENTHDLR_DESC
Definition: sepa_intobj.c:38
#define SCIP_EVENTTYPE_VARADDED
Definition: type_event.h:56
struct SCIP_SepaData SCIP_SEPADATA
Definition: type_sepa.h:38