SCIP Doxygen Documentation
Loading...
Searching...
No Matches
cutsel_hybrid.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 cutsel_hybrid.c
26 * @ingroup DEFPLUGINS_CUTSEL
27 * @brief hybrid cut selector
28 * @author Leona Gottwald
29 * @author Felipe Serrano
30 * @author Mark Turner
31 */
32
33/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
34
35#include "scip/scip_cutsel.h"
36#include "scip/scip_cut.h"
37#include "scip/scip_lp.h"
39#include "scip/cutsel_hybrid.h"
40
41
42#define CUTSEL_NAME "hybrid"
43#define CUTSEL_DESC "weighted sum of efficacy, dircutoffdist, objparal, and intsupport"
44#define CUTSEL_PRIORITY 8000
45
46#define RANDSEED 0x5EED
47#define GOODSCORE 0.9
48#define BADSCORE 0.0
49
50#define DEFAULT_EFFICACYWEIGHT 1.0 /**< weight of efficacy in score calculation */
51#define DEFAULT_DIRCUTOFFDISTWEIGHT 0.0 /**< weight of directed cutoff distance in score calculation */
52#define DEFAULT_OBJPARALWEIGHT 0.1 /**< weight of objective parallelism in score calculation */
53#define DEFAULT_INTSUPPORTWEIGHT 0.1 /**< weight of integral support in cut score calculation */
54#define DEFAULT_MINORTHO 0.90 /**< minimal orthogonality for a cut to enter the LP */
55#define DEFAULT_MINORTHOROOT 0.90 /**< minimal orthogonality for a cut to enter the LP in the root node */
56
57/*
58 * Data structures
59 */
60
61/** cut selector data */
62struct SCIP_CutselData
63{
64 SCIP_RANDNUMGEN* randnumgen; /**< random generator for tiebreaking */
65 SCIP_Real goodscore; /**< threshold for score of cut relative to best score to be considered good,
66 * so that less strict filtering is applied */
67 SCIP_Real badscore; /**< threshold for score of cut relative to best score to be discarded */
68 SCIP_Real objparalweight; /**< weight of objective parallelism in cut score calculation */
69 SCIP_Real efficacyweight; /**< weight of efficacy in cut score calculation */
70 SCIP_Real dircutoffdistweight;/**< weight of directed cutoff distance in cut score calculation */
71 SCIP_Real intsupportweight; /**< weight of integral support in cut score calculation */
72 SCIP_Real minortho; /**< minimal orthogonality for a cut to enter the LP */
73 SCIP_Real minorthoroot; /**< minimal orthogonality for a cut to enter the LP in the root node */
74};
75
76
77/*
78 * Local methods
79 */
80
81/** returns the maximum score of cuts; if scores is not NULL, then stores the individual score of each cut in scores */
82static
84 SCIP* scip, /**< SCIP data structure */
85 SCIP_ROW** cuts, /**< array with cuts to score */
86 SCIP_RANDNUMGEN* randnumgen, /**< random number generator for tie-breaking, or NULL */
87 SCIP_Real dircutoffdistweight,/**< weight of directed cutoff distance in cut score calculation */
88 SCIP_Real efficacyweight, /**< weight of efficacy in cut score calculation */
89 SCIP_Real objparalweight, /**< weight of objective parallelism in cut score calculation */
90 SCIP_Real intsupportweight, /**< weight of integral support in cut score calculation */
91 int ncuts, /**< number of cuts in cuts array */
92 SCIP_Real* scores /**< array to store the score of cuts or NULL */
93 )
94{
95 SCIP_Real maxscore = 0.0;
97 int i;
98
100
101 /* if there is an incumbent and the factor is not 0.0, compute directed cutoff distances for the incumbent */
102 if( sol != NULL && dircutoffdistweight > 0.0 )
103 {
104 for( i = 0; i < ncuts; ++i )
105 {
106 SCIP_Real score;
107 SCIP_Real objparallelism;
108 SCIP_Real intsupport;
109 SCIP_Real efficacy;
110
111 if( intsupportweight > 0.0 )
112 intsupport = intsupportweight * SCIPgetRowNumIntCols(scip, cuts[i]) / (SCIP_Real) SCIProwGetNNonz(cuts[i]);
113 else
114 intsupport = 0.0;
115
116 if( objparalweight > 0.0 )
117 objparallelism = objparalweight * SCIPgetRowObjParallelism(scip, cuts[i]);
118 else
119 objparallelism = 0.0;
120
121 efficacy = SCIPgetCutEfficacy(scip, NULL, cuts[i]);
122
123 if( SCIProwIsLocal(cuts[i]) )
124 {
125 score = dircutoffdistweight * efficacy;
126 }
127 else
128 {
129 score = SCIPgetCutLPSolCutoffDistance(scip, sol, cuts[i]);
130 score = dircutoffdistweight * MAX(score, efficacy);
131 }
132
133 efficacy *= efficacyweight;
134 score += objparallelism + intsupport + efficacy;
135
136 /* add small term to prefer global pool cuts */
137 if( SCIProwIsInGlobalCutpool(cuts[i]) )
138 score += 1e-4;
139
140 if( randnumgen != NULL )
141 {
142 score += SCIPrandomGetReal(randnumgen, 0.0, 1e-6);
143 }
144
145 maxscore = MAX(maxscore, score);
146
147 if( scores != NULL )
148 scores[i] = score;
149 }
150 }
151 else
152 {
153 /* in case there is no solution add the directed cutoff distance weight to the efficacy weight
154 * since the efficacy underestimates the directed cuttoff distance
155 */
156 efficacyweight += dircutoffdistweight;
157 for( i = 0; i < ncuts; ++i )
158 {
159 SCIP_Real score;
160 SCIP_Real objparallelism;
161 SCIP_Real intsupport;
162 SCIP_Real efficacy;
163
164 if( intsupportweight > 0.0 )
165 intsupport = intsupportweight * SCIPgetRowNumIntCols(scip, cuts[i]) / (SCIP_Real) SCIProwGetNNonz(cuts[i]);
166 else
167 intsupport = 0.0;
168
169 if( objparalweight > 0.0 )
170 objparallelism = objparalweight * SCIPgetRowObjParallelism(scip, cuts[i]);
171 else
172 objparallelism = 0.0;
173
174 efficacy = efficacyweight > 0.0 ? efficacyweight * SCIPgetCutEfficacy(scip, NULL, cuts[i]) : 0.0;
175
176 score = objparallelism + intsupport + efficacy;
177
178 /* add small term to prefer global pool cuts */
179 if( SCIProwIsInGlobalCutpool(cuts[i]) )
180 score += 1e-4;
181
182 if( randnumgen != NULL )
183 {
184 score += SCIPrandomGetReal(randnumgen, 0.0, 1e-6);
185 }
186
187 maxscore = MAX(maxscore, score);
188
189 if( scores != NULL )
190 scores[i] = score;
191 }
192 }
193 return maxscore;
194}
195
196
197/** move the cut with the highest score to the first position in the array; there must be at least one cut */
198static
200 SCIP_ROW** cuts, /**< array with cuts to perform selection algorithm */
201 SCIP_Real* scores, /**< array with scores of cuts to perform selection algorithm */
202 int ncuts /**< number of cuts in given array */
203 )
204{
205 int i;
206 int bestpos;
207 SCIP_Real bestscore;
208
209 assert(ncuts > 0);
210 assert(cuts != NULL);
211 assert(scores != NULL);
212
213 bestscore = scores[0];
214 bestpos = 0;
215
216 for( i = 1; i < ncuts; ++i )
217 {
218 if( scores[i] > bestscore )
219 {
220 bestpos = i;
221 bestscore = scores[i];
222 }
223 }
224
225 SCIPswapPointers((void**) &cuts[bestpos], (void**) &cuts[0]);
226 SCIPswapReals(&scores[bestpos], &scores[0]);
227}
228
229/** filters the given array of cuts to enforce a maximum parallelism constraint
230 * w.r.t the given cut; moves filtered cuts to the end of the array and returns number of selected cuts */
231static
233 SCIP_ROW* cut, /**< cut to filter orthogonality with */
234 SCIP_ROW** cuts, /**< array with cuts to perform selection algorithm */
235 SCIP_Real* scores, /**< array with scores of cuts to perform selection algorithm */
236 int ncuts, /**< number of cuts in given array */
237 SCIP_Real goodscore, /**< threshold for the score to be considered a good cut */
238 SCIP_Real goodmaxparall, /**< maximal parallelism for good cuts */
239 SCIP_Real maxparall /**< maximal parallelism for all cuts that are not good */
240 )
241{
242 int i;
243
244 assert( cut != NULL );
245 assert( ncuts == 0 || cuts != NULL );
246 assert( ncuts == 0 || scores != NULL );
247
248 for( i = ncuts - 1; i >= 0; --i )
249 {
250 SCIP_Real thisparall;
251 SCIP_Real thismaxparall;
252
253 thisparall = SCIProwGetParallelism(cut, cuts[i], 'e');
254 thismaxparall = scores[i] >= goodscore ? goodmaxparall : maxparall;
255
256 if( thisparall > thismaxparall )
257 {
258 --ncuts;
259 SCIPswapPointers((void**) &cuts[i], (void**) &cuts[ncuts]);
260 SCIPswapReals(&scores[i], &scores[ncuts]);
261 }
262 }
263
264 return ncuts;
265}
266
267
268/*
269 * Callback methods of cut selector
270 */
271
272
273/** copy method for cut selector plugin (called when SCIP copies plugins) */
274static
275SCIP_DECL_CUTSELCOPY(cutselCopyHybrid)
276{ /*lint --e{715}*/
277 assert(scip != NULL);
278 assert(cutsel != NULL);
279
281
282 /* call inclusion method of cut selector */
284
285 return SCIP_OKAY;
286}
287
288/** destructor of cut selector to free user data (called when SCIP is exiting) */
289/**! [SnippetCutselFreeHybrid] */
290static
291SCIP_DECL_CUTSELFREE(cutselFreeHybrid)
292{ /*lint --e{715}*/
293 SCIP_CUTSELDATA* cutseldata;
294
295 cutseldata = SCIPcutselGetData(cutsel);
296
297 SCIPfreeBlockMemory(scip, &cutseldata);
298
299 SCIPcutselSetData(cutsel, NULL);
300
301 return SCIP_OKAY;
302}
303/**! [SnippetCutselFreeHybrid] */
304
305/** initialization method of cut selector (called after problem was transformed) */
306static
307SCIP_DECL_CUTSELINIT(cutselInitHybrid)
308{ /*lint --e{715}*/
309 SCIP_CUTSELDATA* cutseldata;
310
311 cutseldata = SCIPcutselGetData(cutsel);
312 assert(cutseldata != NULL);
313
314 SCIP_CALL( SCIPcreateRandom(scip, &(cutseldata)->randnumgen, RANDSEED, TRUE) );
315
316 return SCIP_OKAY;
317}
318
319/** deinitialization method of cut selector (called before transformed problem is freed) */
320static
321SCIP_DECL_CUTSELEXIT(cutselExitHybrid)
322{ /*lint --e{715}*/
323 SCIP_CUTSELDATA* cutseldata;
324
325 cutseldata = SCIPcutselGetData(cutsel);
326 assert(cutseldata != NULL);
327 assert(cutseldata->randnumgen != NULL);
328
329 SCIPfreeRandom(scip, &cutseldata->randnumgen);
330
331 return SCIP_OKAY;
332}
333
334/** cut selection method of cut selector */
335static
336SCIP_DECL_CUTSELSELECT(cutselSelectHybrid)
337{ /*lint --e{715}*/
338 SCIP_CUTSELDATA* cutseldata;
339 SCIP_Real goodmaxparall;
340 SCIP_Real maxparall;
341
342 assert(cutsel != NULL);
343 assert(result != NULL);
344
346
347 cutseldata = SCIPcutselGetData(cutsel);
348 assert(cutseldata != NULL);
349
350 SCIP_Real minortho = cutseldata->minortho;
351 if( root )
352 minortho = cutseldata->minorthoroot;
353
354 maxparall = 1.0 - minortho;
355 goodmaxparall = MAX(0.5, 1.0 - minortho);
356
357 SCIP_CALL( SCIPselectCutsHybrid(scip, cuts, forcedcuts, cutseldata->randnumgen, cutseldata->goodscore, cutseldata->badscore,
358 goodmaxparall, maxparall, cutseldata->dircutoffdistweight, cutseldata->efficacyweight,
359 cutseldata->objparalweight, cutseldata->intsupportweight, ncuts, nforcedcuts, maxnselectedcuts, nselectedcuts) );
360
361 return SCIP_OKAY;
362}
363
364
365/*
366 * cut selector specific interface methods
367 */
368
369/** creates the hybrid cut selector and includes it in SCIP */
371 SCIP* scip /**< SCIP data structure */
372 )
373{
374 SCIP_CUTSELDATA* cutseldata;
375 SCIP_CUTSEL* cutsel;
376
377 /* create hybrid cut selector data */
378 SCIP_CALL( SCIPallocBlockMemory(scip, &cutseldata) );
379 BMSclearMemory(cutseldata);
380 cutseldata->goodscore = GOODSCORE;
381 cutseldata->badscore = BADSCORE;
382
384 cutseldata) );
385
386 assert(cutsel != NULL);
387
388 /* set non fundamental callbacks via setter functions */
389 SCIP_CALL( SCIPsetCutselCopy(scip, cutsel, cutselCopyHybrid) );
390
391 SCIP_CALL( SCIPsetCutselFree(scip, cutsel, cutselFreeHybrid) );
392 SCIP_CALL( SCIPsetCutselInit(scip, cutsel, cutselInitHybrid) );
393 SCIP_CALL( SCIPsetCutselExit(scip, cutsel, cutselExitHybrid) );
394
395 /* add hybrid cut selector parameters */
397 "cutselection/" CUTSEL_NAME "/efficacyweight",
398 "weight of efficacy in cut score calculation",
399 &cutseldata->efficacyweight, FALSE, DEFAULT_EFFICACYWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
400
402 "cutselection/" CUTSEL_NAME "/dircutoffdistweight",
403 "weight of directed cutoff distance in cut score calculation",
404 &cutseldata->dircutoffdistweight, FALSE, DEFAULT_DIRCUTOFFDISTWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
405
407 "cutselection/" CUTSEL_NAME "/objparalweight",
408 "weight of objective parallelism in cut score calculation",
409 &cutseldata->objparalweight, FALSE, DEFAULT_OBJPARALWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
410
412 "cutselection/" CUTSEL_NAME "/intsupportweight",
413 "weight of integral support in cut score calculation",
414 &cutseldata->intsupportweight, FALSE, DEFAULT_INTSUPPORTWEIGHT, 0.0, SCIP_INVALID/10.0, NULL, NULL) );
415
417 "cutselection/" CUTSEL_NAME "/minortho",
418 "minimal orthogonality for a cut to enter the LP",
419 &cutseldata->minortho, FALSE, DEFAULT_MINORTHO, 0.0, 1.0, NULL, NULL) );
420
422 "cutselection/" CUTSEL_NAME "/minorthoroot",
423 "minimal orthogonality for a cut to enter the LP in the root node",
424 &cutseldata->minorthoroot, FALSE, DEFAULT_MINORTHOROOT, 0.0, 1.0, NULL, NULL) );
425
426 return SCIP_OKAY;
427}
428
429
430/** perform a cut selection algorithm for the given array of cuts
431 *
432 * This is the selection method of the hybrid cut selector which uses a weighted sum of the
433 * efficacy, parallelism, directed cutoff distance, and the integral support.
434 * The input cuts array gets re-sorted s.t the selected cuts come first and the remaining
435 * ones are the end.
436 */
438 SCIP* scip, /**< SCIP data structure */
439 SCIP_ROW** cuts, /**< array with cuts to perform selection algorithm */
440 SCIP_ROW** forcedcuts, /**< array with forced cuts */
441 SCIP_RANDNUMGEN* randnumgen, /**< random number generator for tie-breaking, or NULL */
442 SCIP_Real goodscorefac, /**< factor of best score among the given cuts to consider a cut good
443 * and filter with less strict settings of the maximum parallelism */
444 SCIP_Real badscorefac, /**< factor of best score among the given cuts to consider a cut bad
445 * and discard it regardless of its parallelism to other cuts */
446 SCIP_Real goodmaxparall, /**< maximum parallelism for good cuts */
447 SCIP_Real maxparall, /**< maximum parallelism for non-good cuts */
448 SCIP_Real dircutoffdistweight,/**< weight of directed cutoff distance in cut score calculation */
449 SCIP_Real efficacyweight, /**< weight of efficacy in cut score calculation */
450 SCIP_Real objparalweight, /**< weight of objective parallelism in cut score calculation */
451 SCIP_Real intsupportweight, /**< weight of integral support in cut score calculation */
452 int ncuts, /**< number of cuts in cuts array */
453 int nforcedcuts, /**< number of forced cuts */
454 int maxselectedcuts, /**< maximal number of cuts from cuts array to select */
455 int* nselectedcuts /**< pointer to return number of selected cuts from cuts array */
456 )
457{
458 SCIP_Real* scores;
459 SCIP_Real* scoresptr;
460 SCIP_Real maxforcedscores;
461 SCIP_Real maxnonforcedscores;
462 SCIP_Real goodscore;
463 SCIP_Real badscore;
464 int i;
465
466 assert(cuts != NULL && ncuts > 0);
467 assert(forcedcuts != NULL || nforcedcuts == 0);
468 assert(nselectedcuts != NULL);
469
470 *nselectedcuts = 0;
471
472 SCIP_CALL( SCIPallocBufferArray(scip, &scores, ncuts) );
473
474 /* compute scores of cuts and max score of cuts and forced cuts (used to define goodscore) */
475 maxforcedscores = scoring(scip, forcedcuts, randnumgen, dircutoffdistweight, efficacyweight, objparalweight, intsupportweight, nforcedcuts, NULL);
476 maxnonforcedscores = scoring(scip, cuts, randnumgen, dircutoffdistweight, efficacyweight, objparalweight, intsupportweight, ncuts, scores);
477
478 goodscore = MAX(maxforcedscores, maxnonforcedscores);
479
480 /* compute values for filtering cuts */
481 badscore = goodscore * badscorefac;
482 goodscore *= goodscorefac;
483
484 /* perform cut selection algorithm for the cuts */
485
486 /* forced cuts are going to be selected so use them to filter cuts */
487 for( i = 0; i < nforcedcuts && ncuts > 0; ++i )
488 {
489 ncuts = filterWithParallelism(forcedcuts[i], cuts, scores, ncuts, goodscore, goodmaxparall, maxparall);
490 }
491
492 /* now greedily select the remaining cuts */
493 scoresptr = scores;
494 while( ncuts > 0 )
495 {
496 SCIP_ROW* selectedcut;
497
498 selectBestCut(cuts, scores, ncuts);
499 selectedcut = cuts[0];
500
501 /* if the best cut of the remaining cuts is considered bad, we discard it and all remaining cuts */
502 if( scores[0] < badscore )
503 break;
504
505 ++(*nselectedcuts);
506
507 /* if the maximal number of cuts was selected, we can stop here */
508 if( *nselectedcuts == maxselectedcuts )
509 break;
510
511 /* move the pointers to the next position and filter the remaining cuts to enforce the maximum parallelism constraint */
512 ++cuts;
513 ++scores;
514 --ncuts;
515
516 ncuts = filterWithParallelism(selectedcut, cuts, scores, ncuts, goodscore, goodmaxparall, maxparall);
517 }
518
519 SCIPfreeBufferArray(scip, &scoresptr);
520
521 return SCIP_OKAY;
522}
#define DEFAULT_EFFICACYWEIGHT
#define DEFAULT_INTSUPPORTWEIGHT
#define DEFAULT_OBJPARALWEIGHT
#define RANDSEED
#define CUTSEL_DESC
#define CUTSEL_PRIORITY
#define DEFAULT_MINORTHO
#define DEFAULT_DIRCUTOFFDISTWEIGHT
#define CUTSEL_NAME
static int filterWithParallelism(SCIP_ROW *cut, SCIP_ROW **cuts, SCIP_Real *scores, int ncuts, SCIP_Real goodscore, SCIP_Real goodmaxparall, SCIP_Real maxparall)
static SCIP_Real scoring(SCIP *scip, SCIP_ROW **cuts, SCIP_RANDNUMGEN *randnumgen, SCIP_Real dircutoffdistweight, SCIP_Real efficacyweight, SCIP_Real objparalweight, SCIP_Real intsupportweight, int ncuts, SCIP_Real *scores)
static void selectBestCut(SCIP_ROW **cuts, SCIP_Real *scores, int ncuts)
#define BADSCORE
#define GOODSCORE
#define DEFAULT_MINORTHOROOT
hybrid cut selector
#define NULL
Definition def.h:257
#define SCIP_INVALID
Definition def.h:187
#define SCIP_STRINGEQ(name, reference, retcode)
Definition def.h:454
#define SCIP_Real
Definition def.h:165
#define TRUE
Definition def.h:102
#define FALSE
Definition def.h:103
#define MAX(x, y)
Definition def.h:229
#define SCIP_CALL(x)
Definition def.h:364
SCIP_RETCODE SCIPselectCutsHybrid(SCIP *scip, SCIP_ROW **cuts, SCIP_ROW **forcedcuts, SCIP_RANDNUMGEN *randnumgen, SCIP_Real goodscorefac, SCIP_Real badscorefac, SCIP_Real goodmaxparall, SCIP_Real maxparall, SCIP_Real dircutoffdistweight, SCIP_Real efficacyweight, SCIP_Real objparalweight, SCIP_Real intsupportweight, int ncuts, int nforcedcuts, int maxselectedcuts, int *nselectedcuts)
SCIP_RETCODE SCIPincludeCutselHybrid(SCIP *scip)
SCIP_RETCODE SCIPaddRealParam(SCIP *scip, 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 scip_param.c:139
void SCIPswapPointers(void **pointer1, void **pointer2)
Definition misc.c:10511
void SCIPswapReals(SCIP_Real *value1, SCIP_Real *value2)
Definition misc.c:10498
SCIP_Real SCIPgetCutEfficacy(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
Definition scip_cut.c:94
SCIP_Real SCIPgetCutLPSolCutoffDistance(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
Definition scip_cut.c:72
SCIP_RETCODE SCIPsetCutselInit(SCIP *scip, SCIP_CUTSEL *cutsel,)
SCIP_RETCODE SCIPincludeCutselBasic(SCIP *scip, SCIP_CUTSEL **cutsel, const char *name, const char *desc, int priority, SCIP_DECL_CUTSELSELECT((*cutselselect)), SCIP_CUTSELDATA *cutseldata)
Definition scip_cutsel.c:98
SCIP_RETCODE SCIPsetCutselCopy(SCIP *scip, SCIP_CUTSEL *cutsel,)
SCIP_RETCODE SCIPsetCutselExit(SCIP *scip, SCIP_CUTSEL *cutsel,)
SCIP_CUTSELDATA * SCIPcutselGetData(SCIP_CUTSEL *cutsel)
Definition cutsel.c:419
void SCIPcutselSetData(SCIP_CUTSEL *cutsel, SCIP_CUTSELDATA *cutseldata)
Definition cutsel.c:429
const char * SCIPcutselGetName(SCIP_CUTSEL *cutsel)
Definition cutsel.c:159
SCIP_RETCODE SCIPsetCutselFree(SCIP *scip, SCIP_CUTSEL *cutsel,)
#define SCIPallocBufferArray(scip, ptr, num)
Definition scip_mem.h:124
#define SCIPfreeBufferArray(scip, ptr)
Definition scip_mem.h:136
#define SCIPfreeBlockMemory(scip, ptr)
Definition scip_mem.h:108
#define SCIPallocBlockMemory(scip, ptr)
Definition scip_mem.h:89
SCIP_Real SCIProwGetParallelism(SCIP_ROW *row1, SCIP_ROW *row2, char orthofunc)
Definition lp.c:7970
int SCIProwGetNNonz(SCIP_ROW *row)
Definition lp.c:17607
SCIP_Bool SCIProwIsInGlobalCutpool(SCIP_ROW *row)
Definition lp.c:17885
SCIP_Bool SCIProwIsLocal(SCIP_ROW *row)
Definition lp.c:17795
SCIP_Real SCIPgetRowObjParallelism(SCIP *scip, SCIP_ROW *row)
Definition scip_lp.c:2154
int SCIPgetRowNumIntCols(SCIP *scip, SCIP_ROW *row)
Definition scip_lp.c:1832
SCIP_SOL * SCIPgetBestSol(SCIP *scip)
Definition scip_sol.c:2986
SCIP_Real SCIPrandomGetReal(SCIP_RANDNUMGEN *randnumgen, SCIP_Real minrandval, SCIP_Real maxrandval)
Definition misc.c:10245
return SCIP_OKAY
SCIPfreeRandom(scip, &heurdata->randnumgen)
SCIPcreateRandom(scip, &heurdata->randnumgen, DEFAULT_RANDSEED, TRUE))
static SCIP_SOL * sol
assert(minobj< SCIPgetCutoffbound(scip))
#define BMSclearMemory(ptr)
Definition memory.h:129
public methods for cuts and aggregation rows
public methods for cut selector plugins
public methods for the LP relaxation, rows and columns
public methods for random numbers
#define SCIP_DECL_CUTSELEXIT(x)
Definition type_cutsel.h:86
#define SCIP_DECL_CUTSELSELECT(x)
#define SCIP_DECL_CUTSELFREE(x)
Definition type_cutsel.h:70
struct SCIP_Cutsel SCIP_CUTSEL
Definition type_cutsel.h:52
struct SCIP_CutselData SCIP_CUTSELDATA
Definition type_cutsel.h:53
#define SCIP_DECL_CUTSELINIT(x)
Definition type_cutsel.h:78
#define SCIP_DECL_CUTSELCOPY(x)
Definition type_cutsel.h:62
struct SCIP_Row SCIP_ROW
Definition type_lp.h:105
struct SCIP_RandNumGen SCIP_RANDNUMGEN
Definition type_misc.h:127
@ SCIP_SUCCESS
Definition type_result.h:58
@ SCIP_INVALIDCALL
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_Sol SCIP_SOL
Definition type_sol.h:57