Scippy

SCIP

Solving Constraint Integer Programs

sepa.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-2019 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 visit scip.zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file sepa.c
17  * @brief methods and datastructures for separators
18  * @author Tobias Achterberg
19  * @author Timo Berthold
20  */
21 
22 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
23 
24 #include <assert.h>
25 #include <string.h>
26 
27 #include "scip/def.h"
28 #include "scip/set.h"
29 #include "scip/stat.h"
30 #include "scip/clock.h"
31 #include "scip/paramset.h"
32 #include "scip/sepastore.h"
33 #include "scip/scip.h"
34 #include "scip/sepa.h"
35 #include "scip/pub_message.h"
36 #include "scip/pub_misc.h"
37 
38 #include "scip/struct_sepa.h"
39 
40 
41 /** compares two separators w. r. to their priority */
42 SCIP_DECL_SORTPTRCOMP(SCIPsepaComp)
43 { /*lint --e{715}*/
44  return ((SCIP_SEPA*)elem2)->priority - ((SCIP_SEPA*)elem1)->priority;
45 }
46 
47 /** comparison method for sorting separators w.r.t. to their name */
48 SCIP_DECL_SORTPTRCOMP(SCIPsepaCompName)
49 {
50  return strcmp(SCIPsepaGetName((SCIP_SEPA*)elem1), SCIPsepaGetName((SCIP_SEPA*)elem2));
51 }
52 
53 /** method to call, when the priority of a separator was changed */
54 static
55 SCIP_DECL_PARAMCHGD(paramChgdSepaPriority)
56 { /*lint --e{715}*/
57  SCIP_PARAMDATA* paramdata;
58 
59  paramdata = SCIPparamGetData(param);
60  assert(paramdata != NULL);
61 
62  /* use SCIPsetSepaPriority() to mark the sepas unsorted */
63  SCIP_CALL( SCIPsetSepaPriority(scip, (SCIP_SEPA*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
64 
65  return SCIP_OKAY;
66 }
67 
68 /** copies the given separator to a new scip */
70  SCIP_SEPA* sepa, /**< separator */
71  SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
72  )
73 {
74  assert(sepa != NULL);
75  assert(set != NULL);
76  assert(set->scip != NULL);
77 
78  if( sepa->sepacopy != NULL )
79  {
80  SCIPsetDebugMsg(set, "including separator %s in subscip %p\n", SCIPsepaGetName(sepa), (void*)set->scip);
81  SCIP_CALL( sepa->sepacopy(set->scip, sepa) );
82  }
83  return SCIP_OKAY;
84 }
85 
86 /** internal method for creating a separator */
87 static
89  SCIP_SEPA** sepa, /**< pointer to separator data structure */
90  SCIP_SET* set, /**< global SCIP settings */
91  SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
92  BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
93  const char* name, /**< name of separator */
94  const char* desc, /**< description of separator */
95  int priority, /**< priority of separator (>= 0: before, < 0: after constraint handlers) */
96  int freq, /**< frequency for calling separator */
97  SCIP_Real maxbounddist, /**< maximal relative distance from current node's dual bound to primal bound compared
98  * to best node's dual bound for applying separation */
99  SCIP_Bool usessubscip, /**< does the separator use a secondary SCIP instance? */
100  SCIP_Bool delay, /**< should separator be delayed, if other separators found cuts? */
101  SCIP_DECL_SEPACOPY ((*sepacopy)), /**< copy method of separator or NULL if you don't want to copy your plugin into sub-SCIPs */
102  SCIP_DECL_SEPAFREE ((*sepafree)), /**< destructor of separator */
103  SCIP_DECL_SEPAINIT ((*sepainit)), /**< initialize separator */
104  SCIP_DECL_SEPAEXIT ((*sepaexit)), /**< deinitialize separator */
105  SCIP_DECL_SEPAINITSOL ((*sepainitsol)), /**< solving process initialization method of separator */
106  SCIP_DECL_SEPAEXITSOL ((*sepaexitsol)), /**< solving process deinitialization method of separator */
107  SCIP_DECL_SEPAEXECLP ((*sepaexeclp)), /**< LP solution separation method of separator */
108  SCIP_DECL_SEPAEXECSOL ((*sepaexecsol)), /**< arbitrary primal solution separation method of separator */
109  SCIP_SEPADATA* sepadata /**< separator data */
110  )
111 {
112  char paramname[SCIP_MAXSTRLEN];
113  char paramdesc[SCIP_MAXSTRLEN];
114 
115  assert(sepa != NULL);
116  assert(name != NULL);
117  assert(desc != NULL);
118  assert(freq >= -1);
119  assert(0.0 <= maxbounddist && maxbounddist <= 1.0);
120  assert(sepaexeclp != NULL || sepaexecsol != NULL);
121 
122  SCIP_ALLOC( BMSallocMemory(sepa) );
123  BMSclearMemory(*sepa);
124 
125  SCIP_ALLOC( BMSduplicateMemoryArray(&(*sepa)->name, name, strlen(name)+1) );
126  SCIP_ALLOC( BMSduplicateMemoryArray(&(*sepa)->desc, desc, strlen(desc)+1) );
127  (*sepa)->priority = priority;
128  (*sepa)->freq = freq;
129  (*sepa)->maxbounddist = maxbounddist;
130  (*sepa)->usessubscip = usessubscip;
131  (*sepa)->sepacopy = sepacopy;
132  (*sepa)->sepafree = sepafree;
133  (*sepa)->sepainit = sepainit;
134  (*sepa)->sepaexit = sepaexit;
135  (*sepa)->sepainitsol = sepainitsol;
136  (*sepa)->sepaexitsol = sepaexitsol;
137  (*sepa)->sepaexeclp = sepaexeclp;
138  (*sepa)->sepaexecsol = sepaexecsol;
139  (*sepa)->sepadata = sepadata;
140  SCIP_CALL( SCIPclockCreate(&(*sepa)->setuptime, SCIP_CLOCKTYPE_DEFAULT) );
141  SCIP_CALL( SCIPclockCreate(&(*sepa)->sepaclock, SCIP_CLOCKTYPE_DEFAULT) );
142  (*sepa)->lastsepanode = -1;
143  (*sepa)->ncalls = 0;
144  (*sepa)->ncutoffs = 0;
145  (*sepa)->ncutsfound = 0;
146  (*sepa)->ncutsapplied = 0;
147  (*sepa)->nconssfound = 0;
148  (*sepa)->ndomredsfound = 0;
149  (*sepa)->ncallsatnode = 0;
150  (*sepa)->ncutsfoundatnode = 0;
151  (*sepa)->lpwasdelayed = FALSE;
152  (*sepa)->solwasdelayed = FALSE;
153  (*sepa)->initialized = FALSE;
154 
155  /* add parameters */
156  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "separating/%s/priority", name);
157  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of separator <%s>", name);
158  SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
159  &(*sepa)->priority, TRUE, priority, INT_MIN/4, INT_MAX/4,
160  paramChgdSepaPriority, (SCIP_PARAMDATA*)(*sepa)) ); /*lint !e740*/
161 
162  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "separating/%s/freq", name);
163  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "frequency for calling separator <%s> (-1: never, 0: only in root node)", name);
164  SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
165  &(*sepa)->freq, FALSE, freq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
166 
167  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "separating/%s/maxbounddist", name);
168  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "maximal relative distance from current node's dual bound to primal bound compared to best node's dual bound for applying separator <%s> (0.0: only on current best node, 1.0: on all nodes)",
169  name);
170  SCIP_CALL( SCIPsetAddRealParam(set, messagehdlr, blkmem, paramname, paramdesc,
171  &(*sepa)->maxbounddist, TRUE, maxbounddist, 0.0, 1.0, NULL, NULL) );
172 
173  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "separating/%s/delay", name);
174  SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
175  "should separator be delayed, if other separators found cuts?",
176  &(*sepa)->delay, TRUE, delay, NULL, NULL) ); /*lint !e740*/
177 
178  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "separating/%s/expbackoff", name);
179  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "base for exponential increase of frequency at which separator <%s> is called (1: call at each multiple of frequency)", name);
180  SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
181  &(*sepa)->expbackoff, TRUE, 4, 1, 100, NULL, NULL) ); /*lint !e740*/
182 
183  return SCIP_OKAY;
184 }
185 
186 /** creates a separator */
188  SCIP_SEPA** sepa, /**< pointer to separator data structure */
189  SCIP_SET* set, /**< global SCIP settings */
190  SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
191  BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
192  const char* name, /**< name of separator */
193  const char* desc, /**< description of separator */
194  int priority, /**< priority of separator (>= 0: before, < 0: after constraint handlers) */
195  int freq, /**< frequency for calling separator */
196  SCIP_Real maxbounddist, /**< maximal relative distance from current node's dual bound to primal bound compared
197  * to best node's dual bound for applying separation */
198  SCIP_Bool usessubscip, /**< does the separator use a secondary SCIP instance? */
199  SCIP_Bool delay, /**< should separator be delayed, if other separators found cuts? */
200  SCIP_DECL_SEPACOPY ((*sepacopy)), /**< copy method of separator or NULL if you don't want to copy your plugin into sub-SCIPs */
201  SCIP_DECL_SEPAFREE ((*sepafree)), /**< destructor of separator */
202  SCIP_DECL_SEPAINIT ((*sepainit)), /**< initialize separator */
203  SCIP_DECL_SEPAEXIT ((*sepaexit)), /**< deinitialize separator */
204  SCIP_DECL_SEPAINITSOL ((*sepainitsol)), /**< solving process initialization method of separator */
205  SCIP_DECL_SEPAEXITSOL ((*sepaexitsol)), /**< solving process deinitialization method of separator */
206  SCIP_DECL_SEPAEXECLP ((*sepaexeclp)), /**< LP solution separation method of separator */
207  SCIP_DECL_SEPAEXECSOL ((*sepaexecsol)), /**< arbitrary primal solution separation method of separator */
208  SCIP_SEPADATA* sepadata /**< separator data */
209  )
210 {
211  assert(sepa != NULL);
212  assert(name != NULL);
213  assert(desc != NULL);
214  assert(freq >= -1);
215  assert(0.0 <= maxbounddist && maxbounddist <= 1.0);
216  assert(sepaexeclp != NULL || sepaexecsol != NULL);
217 
218  SCIP_CALL_FINALLY( doSepaCreate(sepa, set, messagehdlr, blkmem, name, desc, priority, freq, maxbounddist,
219  usessubscip, delay, sepacopy, sepafree, sepainit, sepaexit, sepainitsol, sepaexitsol, sepaexeclp,
220  sepaexecsol, sepadata), (void) SCIPsepaFree(sepa, set) );
221 
222  return SCIP_OKAY;
223 }
224 
225 /** calls destructor and frees memory of separator */
227  SCIP_SEPA** sepa, /**< pointer to separator data structure */
228  SCIP_SET* set /**< global SCIP settings */
229  )
230 {
231  assert(sepa != NULL);
232  if( *sepa == NULL )
233  return SCIP_OKAY;
234  assert(!(*sepa)->initialized);
235  assert(set != NULL);
236 
237  /* call destructor of separator */
238  if( (*sepa)->sepafree != NULL )
239  {
240  SCIP_CALL( (*sepa)->sepafree(set->scip, *sepa) );
241  }
242 
243  SCIPclockFree(&(*sepa)->sepaclock);
244  SCIPclockFree(&(*sepa)->setuptime);
245  BMSfreeMemoryArrayNull(&(*sepa)->name);
246  BMSfreeMemoryArrayNull(&(*sepa)->desc);
247  BMSfreeMemory(sepa);
248 
249  return SCIP_OKAY;
250 }
251 
252 /** initializes separator */
254  SCIP_SEPA* sepa, /**< separator */
255  SCIP_SET* set /**< global SCIP settings */
256  )
257 {
258  assert(sepa != NULL);
259  assert(set != NULL);
260 
261  if( sepa->initialized )
262  {
263  SCIPerrorMessage("separator <%s> already initialized\n", sepa->name);
264  return SCIP_INVALIDCALL;
265  }
266 
267  if( set->misc_resetstat )
268  {
269  SCIPclockReset(sepa->setuptime);
270  SCIPclockReset(sepa->sepaclock);
271 
272  sepa->lastsepanode = -1;
273  sepa->ncalls = 0;
274  sepa->ncutoffs = 0;
275  sepa->ncutsfound = 0;
276  sepa->ncutsapplied = 0;
277  sepa->nconssfound = 0;
278  sepa->ndomredsfound = 0;
279  sepa->ncallsatnode = 0;
280  sepa->ncutsfoundatnode = 0;
281  sepa->lpwasdelayed = FALSE;
282  sepa->solwasdelayed = FALSE;
283  }
284 
285  if( sepa->sepainit != NULL )
286  {
287  /* start timing */
288  SCIPclockStart(sepa->setuptime, set);
289 
290  SCIP_CALL( sepa->sepainit(set->scip, sepa) );
291 
292  /* stop timing */
293  SCIPclockStop(sepa->setuptime, set);
294  }
295  sepa->initialized = TRUE;
296 
297  return SCIP_OKAY;
298 }
299 
300 /** calls exit method of separator */
302  SCIP_SEPA* sepa, /**< separator */
303  SCIP_SET* set /**< global SCIP settings */
304  )
305 {
306  assert(sepa != NULL);
307  assert(set != NULL);
308 
309  if( !sepa->initialized )
310  {
311  SCIPerrorMessage("separator <%s> not initialized\n", sepa->name);
312  return SCIP_INVALIDCALL;
313  }
314 
315  if( sepa->sepaexit != NULL )
316  {
317  /* start timing */
318  SCIPclockStart(sepa->setuptime, set);
319 
320  SCIP_CALL( sepa->sepaexit(set->scip, sepa) );
321 
322  /* stop timing */
323  SCIPclockStop(sepa->setuptime, set);
324  }
325  sepa->initialized = FALSE;
326 
327  return SCIP_OKAY;
328 }
329 
330 /** informs separator that the branch and bound process is being started */
332  SCIP_SEPA* sepa, /**< separator */
333  SCIP_SET* set /**< global SCIP settings */
334  )
335 {
336  assert(sepa != NULL);
337  assert(set != NULL);
338 
339  sepa->lpwasdelayed = FALSE;
340  sepa->solwasdelayed = FALSE;
341 
342  /* call solving process initialization method of separator */
343  if( sepa->sepainitsol != NULL )
344  {
345  /* start timing */
346  SCIPclockStart(sepa->setuptime, set);
347 
348  SCIP_CALL( sepa->sepainitsol(set->scip, sepa) );
349 
350  /* stop timing */
351  SCIPclockStop(sepa->setuptime, set);
352  }
353 
354  return SCIP_OKAY;
355 }
356 
357 /** informs separator that the branch and bound process data is being freed */
359  SCIP_SEPA* sepa, /**< separator */
360  SCIP_SET* set /**< global SCIP settings */
361  )
362 {
363  assert(sepa != NULL);
364  assert(set != NULL);
365 
366  /* call solving process deinitialization method of separator */
367  if( sepa->sepaexitsol != NULL )
368  {
369  /* start timing */
370  SCIPclockStart(sepa->setuptime, set);
371 
372  SCIP_CALL( sepa->sepaexitsol(set->scip, sepa) );
373 
374  /* stop timing */
375  SCIPclockStop(sepa->setuptime, set);
376  }
377 
378  return SCIP_OKAY;
379 }
380 
381 /** calls LP separation method of separator */
383  SCIP_SEPA* sepa, /**< separator */
384  SCIP_SET* set, /**< global SCIP settings */
385  SCIP_STAT* stat, /**< dynamic problem statistics */
386  SCIP_SEPASTORE* sepastore, /**< separation storage */
387  int depth, /**< depth of current node */
388  SCIP_Real bounddist, /**< current relative distance of local dual bound to global dual bound */
389  SCIP_Bool allowlocal, /**< should the separator be asked to separate local cuts */
390  SCIP_Bool execdelayed, /**< execute separator even if it is marked to be delayed */
391  SCIP_RESULT* result /**< pointer to store the result of the callback method */
392  )
393 {
394  assert(sepa != NULL);
395  assert(sepa->freq >= -1);
396  assert(0.0 <= sepa->maxbounddist && sepa->maxbounddist <= 1.0);
397  assert(0.0 <= bounddist && bounddist <= 1.0);
398  assert(set != NULL);
399  assert(set->scip != NULL);
400  assert(stat != NULL);
401  assert(depth >= 0);
402  assert(result != NULL);
403 
404  if( sepa->sepaexeclp != NULL && SCIPsetIsLE(set, bounddist, sepa->maxbounddist) &&
405  ( (depth == 0 && sepa->freq != -1) ||
406  (sepa->freq > 0 && depth % sepa->freq == 0 &&
407  (sepa->expbackoff == 1 || SCIPsetIsIntegral(set, LOG2(depth * (1.0 / sepa->freq)) / LOG2((SCIP_Real)sepa->expbackoff)))) ||
408  sepa->lpwasdelayed )
409  )
410  {
411  if( (!sepa->delay && !sepa->lpwasdelayed) || execdelayed )
412  {
413  SCIP_CUTPOOL* cutpool;
414  SCIP_CUTPOOL* delayedcutpool;
415  SCIP_Longint oldndomchgs;
416  SCIP_Longint oldnprobdomchgs;
417  int oldncuts;
418  int oldnactiveconss;
419  int ncutsfound;
420 
421  SCIPsetDebugMsg(set, "executing separator <%s> on LP solution\n", sepa->name);
422 
423  cutpool = SCIPgetGlobalCutpool(set->scip);
424  delayedcutpool = SCIPgetDelayedGlobalCutpool(set->scip);
425  oldndomchgs = stat->nboundchgs + stat->nholechgs;
426  oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
427  oldncuts = SCIPsepastoreGetNCuts(sepastore) + SCIPcutpoolGetNCuts(cutpool) + SCIPcutpoolGetNCuts(delayedcutpool);
428  oldnactiveconss = stat->nactiveconss;
429 
430  /* reset the statistics for current node */
431  if( sepa->lastsepanode != stat->ntotalnodes )
432  {
433  sepa->ncallsatnode = 0;
434  sepa->ncutsfoundatnode = 0;
435  }
436 
437  /* start timing */
438  SCIPclockStart(sepa->sepaclock, set);
439 
440  /* call external separation method */
441  SCIP_CALL( sepa->sepaexeclp(set->scip, sepa, result, allowlocal) );
442 
443  /* stop timing */
444  SCIPclockStop(sepa->sepaclock, set);
445 
446  /* update statistics */
447  if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
448  {
449  sepa->ncalls++;
450  sepa->ncallsatnode++;
451  sepa->lastsepanode = stat->ntotalnodes;
452  }
453  if( *result == SCIP_CUTOFF )
454  sepa->ncutoffs++;
455 
456  ncutsfound = SCIPsepastoreGetNCuts(sepastore) + SCIPcutpoolGetNCuts(cutpool) +
457  SCIPcutpoolGetNCuts(delayedcutpool) - oldncuts;
458 
459  sepa->ncutsfound += ncutsfound;
460  sepa->ncutsfoundatnode += ncutsfound;
461  sepa->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
462 
463  /* update domain reductions; therefore remove the domain
464  * reduction counts which were generated in probing mode */
465  sepa->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
466  sepa->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
467 
468  /* evaluate result */
469  if( *result != SCIP_CUTOFF
470  && *result != SCIP_CONSADDED
471  && *result != SCIP_REDUCEDDOM
472  && *result != SCIP_SEPARATED
473  && *result != SCIP_NEWROUND
474  && *result != SCIP_DIDNOTFIND
475  && *result != SCIP_DIDNOTRUN
476  && *result != SCIP_DELAYED )
477  {
478  SCIPerrorMessage("execution method of separator <%s> returned invalid result <%d>\n",
479  sepa->name, *result);
480  return SCIP_INVALIDRESULT;
481  }
482  }
483  else
484  {
485  SCIPsetDebugMsg(set, "separator <%s> was delayed\n", sepa->name);
486  *result = SCIP_DELAYED;
487  }
488 
489  /* remember whether separator was delayed */
490  sepa->lpwasdelayed = (*result == SCIP_DELAYED);
491  }
492  else
493  *result = SCIP_DIDNOTRUN;
494 
495  return SCIP_OKAY;
496 }
497 
498 /** calls primal solution separation method of separator */
500  SCIP_SEPA* sepa, /**< separator */
501  SCIP_SET* set, /**< global SCIP settings */
502  SCIP_STAT* stat, /**< dynamic problem statistics */
503  SCIP_SEPASTORE* sepastore, /**< separation storage */
504  SCIP_SOL* sol, /**< primal solution that should be separated */
505  int depth, /**< depth of current node */
506  SCIP_Bool allowlocal, /**< should the separator allow local cuts */
507  SCIP_Bool execdelayed, /**< execute separator even if it is marked to be delayed */
508  SCIP_RESULT* result /**< pointer to store the result of the callback method */
509  )
510 {
511  assert(sepa != NULL);
512  assert(sepa->freq >= -1);
513  assert(set != NULL);
514  assert(set->scip != NULL);
515  assert(stat != NULL);
516  assert(depth >= 0);
517  assert(result != NULL);
518 
519  if( sepa->sepaexecsol != NULL &&
520  ( (depth == 0 && sepa->freq != -1) ||
521  (sepa->freq > 0 && depth % sepa->freq == 0 &&
522  (sepa->expbackoff == 1 || SCIPsetIsIntegral(set, LOG2(depth * (1.0 / sepa->freq) / LOG2((SCIP_Real)sepa->expbackoff))))) ||
523  sepa->solwasdelayed )
524  )
525  {
526  if( (!sepa->delay && !sepa->solwasdelayed) || execdelayed )
527  {
528  SCIP_Longint oldndomchgs;
529  SCIP_Longint oldnprobdomchgs;
530  int oldncuts;
531  int oldnactiveconss;
532  int ncutsfound;
533 
534  SCIPsetDebugMsg(set, "executing separator <%s> on solution %p\n", sepa->name, (void*)sol);
535 
536  oldndomchgs = stat->nboundchgs + stat->nholechgs;
537  oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
538  oldncuts = SCIPsepastoreGetNCuts(sepastore);
539  oldnactiveconss = stat->nactiveconss;
540 
541  /* reset the statistics for current node */
542  if( sepa->lastsepanode != stat->ntotalnodes )
543  {
544  sepa->ncallsatnode = 0;
545  sepa->ncutsfoundatnode = 0;
546  }
547 
548  /* start timing */
549  SCIPclockStart(sepa->sepaclock, set);
550 
551  /* call external separation method */
552  SCIP_CALL( sepa->sepaexecsol(set->scip, sepa, sol, result, allowlocal) );
553 
554  /* stop timing */
555  SCIPclockStop(sepa->sepaclock, set);
556 
557  /* update statistics */
558  if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
559  {
560  sepa->ncalls++;
561  sepa->ncallsatnode++;
562  sepa->lastsepanode = stat->ntotalnodes;
563  }
564  if( *result == SCIP_CUTOFF )
565  sepa->ncutoffs++;
566  ncutsfound = SCIPsepastoreGetNCuts(sepastore) - oldncuts;
567  sepa->ncutsfound += ncutsfound;
568  sepa->ncutsfoundatnode += ncutsfound;
569  sepa->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
570 
571  /* update domain reductions; therefore remove the domain
572  * reduction counts which were generated in probing mode */
573  sepa->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
574  sepa->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
575 
576  /* evaluate result */
577  if( *result != SCIP_CUTOFF
578  && *result != SCIP_CONSADDED
579  && *result != SCIP_REDUCEDDOM
580  && *result != SCIP_SEPARATED
581  && *result != SCIP_NEWROUND
582  && *result != SCIP_DIDNOTFIND
583  && *result != SCIP_DIDNOTRUN
584  && *result != SCIP_DELAYED )
585  {
586  SCIPerrorMessage("execution method of separator <%s> returned invalid result <%d>\n",
587  sepa->name, *result);
588  return SCIP_INVALIDRESULT;
589  }
590  }
591  else
592  {
593  SCIPsetDebugMsg(set, "separator <%s> was delayed\n", sepa->name);
594  *result = SCIP_DELAYED;
595  }
596 
597  /* remember whether separator was delayed */
598  sepa->solwasdelayed = (*result == SCIP_DELAYED);
599  }
600  else
601  *result = SCIP_DIDNOTRUN;
602 
603  return SCIP_OKAY;
604 }
605 
606 /** gets user data of separator */
608  SCIP_SEPA* sepa /**< separator */
609  )
610 {
611  assert(sepa != NULL);
612 
613  return sepa->sepadata;
614 }
615 
616 /** sets user data of separator; user has to free old data in advance! */
618  SCIP_SEPA* sepa, /**< separator */
619  SCIP_SEPADATA* sepadata /**< new separator user data */
620  )
621 {
622  assert(sepa != NULL);
623 
624  sepa->sepadata = sepadata;
625 }
626 
627 /* new callback/method setter methods */
628 
629 /** sets copy method of separator */
631  SCIP_SEPA* sepa, /**< separator */
632  SCIP_DECL_SEPACOPY ((*sepacopy)) /**< copy method of separator or NULL if you don't want to copy your plugin into sub-SCIPs */
633  )
634 {
635  assert(sepa != NULL);
636 
637  sepa->sepacopy = sepacopy;
638 }
639 
640 /** sets destructor method of separator */
642  SCIP_SEPA* sepa, /**< separator */
643  SCIP_DECL_SEPAFREE ((*sepafree)) /**< destructor of separator */
644  )
645 {
646  assert(sepa != NULL);
647 
648  sepa->sepafree = sepafree;
649 }
650 
651 /** sets initialization method of separator */
653  SCIP_SEPA* sepa, /**< separator */
654  SCIP_DECL_SEPAINIT ((*sepainit)) /**< initialize separator */
655  )
656 {
657  assert(sepa != NULL);
658 
659  sepa->sepainit = sepainit;
660 }
661 
662 /** sets deinitialization method of separator */
664  SCIP_SEPA* sepa, /**< separator */
665  SCIP_DECL_SEPAEXIT ((*sepaexit)) /**< deinitialize separator */
666  )
667 {
668  assert(sepa != NULL);
669 
670  sepa->sepaexit = sepaexit;
671 }
672 
673 /** sets solving process initialization method of separator */
675  SCIP_SEPA* sepa, /**< separator */
676  SCIP_DECL_SEPAINITSOL ((*sepainitsol)) /**< solving process initialization method of separator */
677  )
678 {
679  assert(sepa != NULL);
680 
681  sepa->sepainitsol = sepainitsol;
682 }
683 
684 /** sets solving process deinitialization method of separator */
686  SCIP_SEPA* sepa, /**< separator */
687  SCIP_DECL_SEPAEXITSOL ((*sepaexitsol)) /**< solving process deinitialization method of separator */
688  )
689 {
690  assert(sepa != NULL);
691 
692  sepa->sepaexitsol = sepaexitsol;
693 }
694 
695 /** gets name of separator */
696 const char* SCIPsepaGetName(
697  SCIP_SEPA* sepa /**< separator */
698  )
699 {
700  assert(sepa != NULL);
701 
702  return sepa->name;
703 }
704 
705 /** gets description of separator */
706 const char* SCIPsepaGetDesc(
707  SCIP_SEPA* sepa /**< separator */
708  )
709 {
710  assert(sepa != NULL);
711 
712  return sepa->desc;
713 }
714 
715 /** gets priority of separator */
717  SCIP_SEPA* sepa /**< separator */
718  )
719 {
720  assert(sepa != NULL);
721 
722  return sepa->priority;
723 }
724 
725 /** sets priority of separator */
727  SCIP_SEPA* sepa, /**< separator */
728  SCIP_SET* set, /**< global SCIP settings */
729  int priority /**< new priority of the separator */
730  )
731 {
732  assert(sepa != NULL);
733  assert(set != NULL);
734 
735  sepa->priority = priority;
736  set->sepassorted = FALSE;
737 }
738 
739 /** gets frequency of separator */
741  SCIP_SEPA* sepa /**< separator */
742  )
743 {
744  assert(sepa != NULL);
745 
746  return sepa->freq;
747 }
748 
749 /** sets frequency of separator */
751  SCIP_SEPA* sepa, /**< separator */
752  int freq /**< new frequency of separator */
753  )
754 {
755  assert(sepa != NULL);
756 
757  sepa->freq = freq;
758 }
759 
760 /** get maximal bound distance at which the separator is called */
762  SCIP_SEPA* sepa /**< separator */
763  )
764 {
765  assert(sepa != NULL);
766 
767  return sepa->maxbounddist;
768 }
769 
770 /** does the separator use a secondary SCIP instance? */
772  SCIP_SEPA* sepa /**< separator */
773  )
774 {
775  assert(sepa != NULL);
776 
777  return sepa->usessubscip;
778 }
779 
780 /** enables or disables all clocks of \p sepa, depending on the value of the flag */
782  SCIP_SEPA* sepa, /**< the separator for which all clocks should be enabled or disabled */
783  SCIP_Bool enable /**< should the clocks of the separator be enabled? */
784  )
785 {
786  assert(sepa != NULL);
787 
788  SCIPclockEnableOrDisable(sepa->setuptime, enable);
789  SCIPclockEnableOrDisable(sepa->sepaclock, enable);
790 }
791 
792 /** gets time in seconds used in this separator for setting up for next stages */
794  SCIP_SEPA* sepa /**< separator */
795  )
796 {
797  assert(sepa != NULL);
798 
799  return SCIPclockGetTime(sepa->setuptime);
800 }
801 
802 /** gets time in seconds used in this separator */
804  SCIP_SEPA* sepa /**< separator */
805  )
806 {
807  assert(sepa != NULL);
808 
809  return SCIPclockGetTime(sepa->sepaclock);
810 }
811 
812 /** gets the total number of times, the separator was called */
814  SCIP_SEPA* sepa /**< separator */
815  )
816 {
817  assert(sepa != NULL);
818 
819  return sepa->ncalls;
820 }
821 
822 /** gets the number of times, the separator was called at the current node */
824  SCIP_SEPA* sepa /**< separator */
825  )
826 {
827  assert(sepa != NULL);
828 
829  return sepa->ncallsatnode;
830 }
831 
832 /** gets total number of times, the separator detected a cutoff */
834  SCIP_SEPA* sepa /**< separator */
835  )
836 {
837  assert(sepa != NULL);
838 
839  return sepa->ncutoffs;
840 }
841 
842 /** gets the total number of cutting planes found by this separator */
844  SCIP_SEPA* sepa /**< separator */
845  )
846 {
847  assert(sepa != NULL);
848 
849  return sepa->ncutsfound;
850 }
851 
852 /** gets the total number of cutting planes applied to lp */
854  SCIP_SEPA* sepa /**< separator */
855  )
856 {
857  assert(sepa != NULL);
858 
859  return sepa->ncutsapplied;
860 }
861 
862 /** increase count of applied cuts */
864  SCIP_SEPA* sepa /**< separator */
865  )
866 {
867  assert( sepa != NULL );
868 
869  ++sepa->ncutsapplied;
870 }
871 
872 /** increase count of found cuts */
874  SCIP_SEPA* sepa /**< separator */
875  )
876 {
877  assert( sepa != NULL );
878 
879  ++sepa->ncutsfound;
880 }
881 
882 /** increase count of found cuts at current node */
884  SCIP_SEPA* sepa /**< separator */
885  )
886 {
887  assert( sepa != NULL );
888 
889  ++sepa->ncutsfoundatnode;
890 }
891 
892 /** gets the number of cutting planes found by this separator at the current node */
894  SCIP_SEPA* sepa /**< separator */
895  )
896 {
897  assert(sepa != NULL);
898 
899  return sepa->ncutsfoundatnode;
900 }
901 
902 /** gets total number of additional constraints added by this separator */
904  SCIP_SEPA* sepa /**< separator */
905  )
906 {
907  assert(sepa != NULL);
908 
909  return sepa->nconssfound;
910 }
911 
912 /** gets total number of domain reductions found by this separator */
914  SCIP_SEPA* sepa /**< separator */
915  )
916 {
917  assert(sepa != NULL);
918 
919  return sepa->ndomredsfound;
920 }
921 
922 /** should separator be delayed, if other separators found cuts? */
924  SCIP_SEPA* sepa /**< separator */
925  )
926 {
927  assert(sepa != NULL);
928 
929  return sepa->delay;
930 }
931 
932 /** was separation of the LP solution delayed at the last call? */
934  SCIP_SEPA* sepa /**< separator */
935  )
936 {
937  assert(sepa != NULL);
938 
939  return sepa->lpwasdelayed;
940 }
941 
942 /** was separation of the primal solution delayed at the last call? */
944  SCIP_SEPA* sepa /**< separator */
945  )
946 {
947  assert(sepa != NULL);
948 
949  return sepa->solwasdelayed;
950 }
951 
952 /** is separator initialized? */
954  SCIP_SEPA* sepa /**< separator */
955  )
956 {
957  assert(sepa != NULL);
958 
959  return sepa->initialized;
960 }
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:52
SCIP_Bool solwasdelayed
Definition: struct_sepa.h:69
void SCIPsepaSetFree(SCIP_SEPA *sepa, SCIP_DECL_SEPAFREE((*sepafree)))
Definition: sepa.c:641
SCIP_Real SCIPsepaGetSetupTime(SCIP_SEPA *sepa)
Definition: sepa.c:793
internal methods for separators
SCIP_Bool usessubscip
Definition: struct_sepa.h:66
#define NULL
Definition: def.h:253
int SCIPsepaGetFreq(SCIP_SEPA *sepa)
Definition: sepa.c:740
SCIP_SEPADATA * sepadata
Definition: struct_sepa.h:58
SCIP_Bool SCIPsetIsLE(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
Definition: set.c:6011
void SCIPsepaEnableOrDisableClocks(SCIP_SEPA *sepa, SCIP_Bool enable)
Definition: sepa.c:781
SCIP_CLOCK * setuptime
Definition: struct_sepa.h:59
#define BMSfreeMemoryArrayNull(ptr)
Definition: memory.h:138
void SCIPsepaSetFreq(SCIP_SEPA *sepa, int freq)
Definition: sepa.c:750
SCIP_Real SCIPsepaGetTime(SCIP_SEPA *sepa)
Definition: sepa.c:803
SCIP_RETCODE SCIPsepaCopyInclude(SCIP_SEPA *sepa, SCIP_SET *set)
Definition: sepa.c:69
SCIP_DECL_SORTPTRCOMP(SCIPsepaComp)
Definition: sepa.c:42
SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
Definition: paramset.c:661
SCIP_CLOCK * sepaclock
Definition: struct_sepa.h:60
void SCIPsepaIncNAppliedCuts(SCIP_SEPA *sepa)
Definition: sepa.c:863
#define SCIP_MAXSTRLEN
Definition: def.h:274
internal methods for clocks and timing issues
SCIP_Longint ntotalnodes
Definition: struct_stat.h:78
char * name
Definition: struct_sepa.h:48
struct SCIP_ParamData SCIP_PARAMDATA
Definition: type_paramset.h:76
#define SCIP_CALL_FINALLY(x, y)
Definition: def.h:407
SCIP_Longint SCIPsepaGetNCutsFound(SCIP_SEPA *sepa)
Definition: sepa.c:843
SCIP_Bool SCIPsepaUsesSubscip(SCIP_SEPA *sepa)
Definition: sepa.c:771
SCIP_RETCODE SCIPsepaExecSol(SCIP_SEPA *sepa, SCIP_SET *set, SCIP_STAT *stat, SCIP_SEPASTORE *sepastore, SCIP_SOL *sol, int depth, SCIP_Bool allowlocal, SCIP_Bool execdelayed, SCIP_RESULT *result)
Definition: sepa.c:499
SCIP_Longint nholechgs
Definition: struct_stat.h:107
void SCIPclockStop(SCIP_CLOCK *clck, SCIP_SET *set)
Definition: clock.c:350
#define FALSE
Definition: def.h:73
int SCIPsepaGetPriority(SCIP_SEPA *sepa)
Definition: sepa.c:716
SCIP_Longint SCIPsepaGetNCutsFoundAtNode(SCIP_SEPA *sepa)
Definition: sepa.c:893
void SCIPclockStart(SCIP_CLOCK *clck, SCIP_SET *set)
Definition: clock.c:280
SCIP_Real maxbounddist
Definition: struct_sepa.h:46
#define TRUE
Definition: def.h:72
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:53
SCIP_Bool initialized
Definition: struct_sepa.h:70
SCIP_Longint ncutsfound
Definition: struct_sepa.h:42
void SCIPsepaSetExit(SCIP_SEPA *sepa, SCIP_DECL_SEPAEXIT((*sepaexit)))
Definition: sepa.c:663
void SCIPsepaIncNCutsFoundAtNode(SCIP_SEPA *sepa)
Definition: sepa.c:883
int ncallsatnode
Definition: struct_sepa.h:63
SCIP_RETCODE SCIPsetSepaPriority(SCIP *scip, SCIP_SEPA *sepa, int priority)
Definition: scip_sepa.c:274
SCIP_RETCODE SCIPsepaFree(SCIP_SEPA **sepa, SCIP_SET *set)
Definition: sepa.c:226
#define SCIP_DECL_SEPAEXECLP(x)
Definition: type_sepa.h:116
int SCIPcutpoolGetNCuts(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1050
internal methods for handling parameter settings
SCIP_Bool SCIPsepaIsInitialized(SCIP_SEPA *sepa)
Definition: sepa.c:953
void SCIPclockEnableOrDisable(SCIP_CLOCK *clck, SCIP_Bool enable)
Definition: clock.c:250
#define BMSfreeMemory(ptr)
Definition: memory.h:135
SCIP_RETCODE SCIPsepaInit(SCIP_SEPA *sepa, SCIP_SET *set)
Definition: sepa.c:253
#define SCIP_DECL_SEPACOPY(x)
Definition: type_sepa.h:47
SCIP_CUTPOOL * SCIPgetDelayedGlobalCutpool(SCIP *scip)
Definition: scip_cut.c:680
SCIP_RETCODE SCIPsepaInitsol(SCIP_SEPA *sepa, SCIP_SET *set)
Definition: sepa.c:331
SCIP_CUTPOOL * SCIPgetGlobalCutpool(SCIP *scip)
Definition: scip_cut.c:408
SCIP_RETCODE SCIPsepaExecLP(SCIP_SEPA *sepa, SCIP_SET *set, SCIP_STAT *stat, SCIP_SEPASTORE *sepastore, int depth, SCIP_Real bounddist, SCIP_Bool allowlocal, SCIP_Bool execdelayed, SCIP_RESULT *result)
Definition: sepa.c:382
SCIP_Longint nconssfound
Definition: struct_sepa.h:44
#define SCIPerrorMessage
Definition: pub_message.h:45
SCIP_Longint lastsepanode
Definition: struct_sepa.h:39
SCIP_Bool lpwasdelayed
Definition: struct_sepa.h:68
SCIP_Longint ncalls
Definition: struct_sepa.h:40
void SCIPclockReset(SCIP_CLOCK *clck)
Definition: clock.c:199
static SCIP_DECL_PARAMCHGD(paramChgdSepaPriority)
Definition: sepa.c:55
SCIP_Bool SCIPsepaIsDelayed(SCIP_SEPA *sepa)
Definition: sepa.c:923
SCIP_Bool SCIPsepaWasSolDelayed(SCIP_SEPA *sepa)
Definition: sepa.c:943
int SCIPsepastoreGetNCuts(SCIP_SEPASTORE *sepastore)
Definition: sepastore.c:1086
SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
Definition: clock.c:428
int ncutsfoundatnode
Definition: struct_sepa.h:64
void SCIPsepaSetExitsol(SCIP_SEPA *sepa, SCIP_DECL_SEPAEXITSOL((*sepaexitsol)))
Definition: sepa.c:685
internal methods for global SCIP settings
#define SCIP_CALL(x)
Definition: def.h:365
#define LOG2(x)
Definition: def.h:213
SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
Definition: sepa.c:607
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
Definition: sepa.c:696
SCIP_RETCODE SCIPsetAddIntParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: set.c:2879
internal methods for storing separated cuts
#define BMSduplicateMemoryArray(ptr, source, num)
Definition: memory.h:133
SCIP_Longint nprobboundchgs
Definition: struct_stat.h:108
SCIP_RETCODE SCIPclockCreate(SCIP_CLOCK **clck, SCIP_CLOCKTYPE clocktype)
Definition: clock.c:160
void SCIPsepaSetCopy(SCIP_SEPA *sepa, SCIP_DECL_SEPACOPY((*sepacopy)))
Definition: sepa.c:630
SCIP_Real SCIPsepaGetMaxbounddist(SCIP_SEPA *sepa)
Definition: sepa.c:761
SCIP_Longint SCIPsepaGetNCutsApplied(SCIP_SEPA *sepa)
Definition: sepa.c:853
SCIP_Bool SCIPsetIsIntegral(SCIP_SET *set, SCIP_Real val)
Definition: set.c:6098
public data structures and miscellaneous methods
void SCIPsepaSetInitsol(SCIP_SEPA *sepa, SCIP_DECL_SEPAINITSOL((*sepainitsol)))
Definition: sepa.c:674
#define SCIP_Bool
Definition: def.h:70
#define SCIP_DECL_SEPAINIT(x)
Definition: type_sepa.h:63
void SCIPclockFree(SCIP_CLOCK **clck)
Definition: clock.c:175
#define SCIPsetDebugMsg
Definition: set.h:1720
SCIP_Longint ncutoffs
Definition: struct_sepa.h:41
#define SCIP_DECL_SEPAEXITSOL(x)
Definition: type_sepa.h:93
#define SCIP_DECL_SEPAEXECSOL(x)
Definition: type_sepa.h:140
#define BMSclearMemory(ptr)
Definition: memory.h:119
SCIP_Bool delay
Definition: struct_sepa.h:67
#define SCIP_MAXTREEDEPTH
Definition: def.h:301
SCIP_Longint SCIPsepaGetNDomredsFound(SCIP_SEPA *sepa)
Definition: sepa.c:913
int SCIPparamGetInt(SCIP_PARAM *param)
Definition: paramset.c:716
SCIP_Bool SCIPsepaWasLPDelayed(SCIP_SEPA *sepa)
Definition: sepa.c:933
void SCIPsepaSetPriority(SCIP_SEPA *sepa, SCIP_SET *set, int priority)
Definition: sepa.c:726
#define MAX(x, y)
Definition: def.h:222
SCIP_Longint SCIPsepaGetNConssFound(SCIP_SEPA *sepa)
Definition: sepa.c:903
int nactiveconss
Definition: struct_stat.h:222
SCIP_Longint SCIPsepaGetNCutoffs(SCIP_SEPA *sepa)
Definition: sepa.c:833
SCIP_RETCODE SCIPsepaExit(SCIP_SEPA *sepa, SCIP_SET *set)
Definition: sepa.c:301
#define SCIP_DECL_SEPAEXIT(x)
Definition: type_sepa.h:71
#define SCIP_DECL_SEPAINITSOL(x)
Definition: type_sepa.h:82
public methods for message output
SCIP_Longint ncutsapplied
Definition: struct_sepa.h:43
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition: misc.c:10263
SCIP_Longint ndomredsfound
Definition: struct_sepa.h:45
SCIP_Longint nboundchgs
Definition: struct_stat.h:106
#define SCIP_Real
Definition: def.h:164
internal methods for problem statistics
datastructures for separators
static SCIP_RETCODE doSepaCreate(SCIP_SEPA **sepa, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int freq, SCIP_Real maxbounddist, SCIP_Bool usessubscip, SCIP_Bool delay, SCIP_DECL_SEPACOPY((*sepacopy)), SCIP_DECL_SEPAFREE((*sepafree)), SCIP_DECL_SEPAINIT((*sepainit)), SCIP_DECL_SEPAEXIT((*sepaexit)), SCIP_DECL_SEPAINITSOL((*sepainitsol)), SCIP_DECL_SEPAEXITSOL((*sepaexitsol)), SCIP_DECL_SEPAEXECLP((*sepaexeclp)), SCIP_DECL_SEPAEXECSOL((*sepaexecsol)), SCIP_SEPADATA *sepadata)
Definition: sepa.c:88
#define BMSallocMemory(ptr)
Definition: memory.h:109
void SCIPsepaIncNCutsFound(SCIP_SEPA *sepa)
Definition: sepa.c:873
#define SCIP_Longint
Definition: def.h:149
int priority
Definition: struct_sepa.h:61
void SCIPsepaSetInit(SCIP_SEPA *sepa, SCIP_DECL_SEPAINIT((*sepainit)))
Definition: sepa.c:652
void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
Definition: sepa.c:617
const char * SCIPsepaGetDesc(SCIP_SEPA *sepa)
Definition: sepa.c:706
common defines and data types used in all packages of SCIP
SCIP_Longint SCIPsepaGetNCalls(SCIP_SEPA *sepa)
Definition: sepa.c:813
struct BMS_BlkMem BMS_BLKMEM
Definition: memory.h:427
SCIP_RETCODE SCIPsetAddRealParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: set.c:2927
#define SCIP_ALLOC(x)
Definition: def.h:376
int expbackoff
Definition: struct_sepa.h:65
SCIP_RETCODE SCIPsepaExitsol(SCIP_SEPA *sepa, SCIP_SET *set)
Definition: sepa.c:358
int SCIPsepaGetNCallsAtNode(SCIP_SEPA *sepa)
Definition: sepa.c:823
SCIP_RETCODE SCIPsetAddBoolParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: set.c:2857
SCIP_Longint nprobholechgs
Definition: struct_stat.h:109
#define SCIP_DECL_SEPAFREE(x)
Definition: type_sepa.h:55
struct SCIP_SepaData SCIP_SEPADATA
Definition: type_sepa.h:38
SCIP_RETCODE SCIPsepaCreate(SCIP_SEPA **sepa, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int freq, SCIP_Real maxbounddist, SCIP_Bool usessubscip, SCIP_Bool delay, SCIP_DECL_SEPACOPY((*sepacopy)), SCIP_DECL_SEPAFREE((*sepafree)), SCIP_DECL_SEPAINIT((*sepainit)), SCIP_DECL_SEPAEXIT((*sepaexit)), SCIP_DECL_SEPAINITSOL((*sepainitsol)), SCIP_DECL_SEPAEXITSOL((*sepaexitsol)), SCIP_DECL_SEPAEXECLP((*sepaexeclp)), SCIP_DECL_SEPAEXECSOL((*sepaexecsol)), SCIP_SEPADATA *sepadata)
Definition: sepa.c:187
SCIP callable library.
char * desc
Definition: struct_sepa.h:49