79#define HEUR_NAME "dks"
80#define HEUR_DESC "decomposition kernel search"
81#define HEUR_DISPCHAR 'D'
82#define HEUR_PRIORITY -1102500
85#define HEUR_MAXDEPTH 0
86#define HEUR_TIMING SCIP_HEURTIMING_AFTERLPNODE
87#define HEUR_USESSUBSCIP TRUE
89#define DEFAULT_MAXBUCKS 20
90#define DEFAULT_KERNELSIZEFACTOR 2.0
91#define DEFAULT_ADDUSECONSS TRUE
92#define DEFAULT_LINKBUCKSIZE TRUE
93#define DEFAULT_TRANSLBKERNEL TRUE
94#define DEFAULT_LESSLOCKSKERNEL FALSE
95#define DEFAULT_USETRANSPROB TRUE
96#define DEFAULT_BUCKMAXGAP 0.01
97#define DEFAULT_MAXLINKSCORE 1.0
98#define DEFAULT_MAXBUCKFRAC 0.10
99#define DEFAULT_MAXNODES 5000LL
100#define DEFAULT_USETWOLEVEL TRUE
101#define DEFAULT_USEDECOMP TRUE
102#define DEFAULT_USEBESTSOL TRUE
103#define DEFAULT_REDCOSTSORT TRUE
104#define DEFAULT_PRIMALONLY FALSE
105#define DEFAULT_REDCOSTLOGSORT TRUE
106#define DEFAULT_OBJCUTOFF TRUE
107#define DEFAULT_RUNBINPROBSONLY FALSE
188 int nlinkscoreconss = 0;
189 int nlinkscorevars = 0;
195 for( v = 0; v <
nvars; v++ )
203 else if( *nblocklabels < nblocks && blocklabels !=
NULL )
208 for(
b = 0;
b < *nblocklabels;
b++ )
210 if( blocklabels[
b] == varlabels[v] )
219 blocklabels[(*nblocklabels)++] = varlabels[v];
224 for( v = 0; v < nconss; v++ )
249 int* bw_ncontkernelvars,
250 int* bw_ncontnonkernelvars,
252 int* bw_nnonkernelvars,
253 int* bw_nintkernelvars,
254 int* bw_nintnonkernelvars,
255 int* ncontkernelvars,
256 int* ncontnonkernelvars,
260 int* nintnonkernelvars,
292 block = block2index[
MAX(varlabels[
i] + blklbl_offset, 0)];
301 bw_nkernelvars[block]++;
306 bw_nnonkernelvars[block]++;
318 if( nintkernelvars !=
NULL )
320 if( bw_nintkernelvars !=
NULL )
321 bw_nintkernelvars[block]++;
326 bw_nkernelvars[block]++;
333 if( nintnonkernelvars !=
NULL )
334 (*nintnonkernelvars)++;
335 if( bw_nintnonkernelvars !=
NULL )
336 bw_nintnonkernelvars[block]++;
341 bw_nnonkernelvars[block]++;
352 (*ncontkernelvars)++;
353 bw_ncontkernelvars[block]++;
357 (*ncontnonkernelvars)++;
358 bw_ncontnonkernelvars[block]++;
385 int* bw_contkernelcount,
386 int* bw_contnonkernelcount,
388 int* bw_nonkernelcount,
389 int* bw_intkernelcount,
390 int* bw_intnonkernelcount,
391 int* bw_ncontkernelvars,
392 int* bw_ncontnonkernelvars,
394 int* bw_nnonkernelvars,
395 int* bw_nintkernelvars,
396 int* bw_nintnonkernelvars,
432 block_index = block2index[
MAX(varlabels[
i] + blklbl_offset, 0)];
440 binintvars[j++] =
vars[
i];
444 n = bw_kernelcount[block_index];
446 assert(n < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
447 bw_kernelvars[block_index][n] =
vars[
i];
448 bw_kernelcount[block_index]++;
452 n = bw_nonkernelcount[block_index];
454 assert(n < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
455 bw_nonkernelvars[block_index][n] =
vars[
i];
456 bw_nonkernelcount[block_index]++;
465 binintvars[j++] =
vars[
i];
472 if( bw_intkernelcount !=
NULL )
474 m = bw_intkernelcount[block_index];
477 assert(m < bw_nintkernelvars[block_index] + bw_nintnonkernelvars[block_index]);
478 if( bw_intkernelvars !=
NULL )
479 bw_intkernelvars[block_index][m] =
vars[
i];
480 bw_intkernelcount[block_index]++;
485 m = bw_kernelcount[block_index];
487 assert(m < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
488 bw_kernelvars[block_index][m] =
vars[
i];
489 bw_kernelcount[block_index]++;
496 if( bw_intnonkernelcount !=
NULL )
498 m = bw_intnonkernelcount[block_index];
501 assert(m < bw_nintkernelvars[block_index] + bw_nintnonkernelvars[block_index]);
502 if( bw_intnonkernelvars !=
NULL )
503 bw_intnonkernelvars[block_index][m] =
vars[
i];
504 bw_intnonkernelcount[block_index]++;
509 m = bw_nonkernelcount[block_index];
511 assert(m < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
512 bw_nonkernelvars[block_index][m] =
vars[
i];
513 bw_nonkernelcount[block_index]++;
524 l = bw_contkernelcount[block_index];
526 assert(l < bw_ncontkernelvars[block_index] + bw_ncontnonkernelvars[block_index]);
527 bw_contkernelvars[block_index][l] =
vars[
i];
528 bw_contkernelcount[block_index]++;
532 l = bw_contnonkernelcount[block_index];
534 assert(l < bw_ncontkernelvars[block_index] + bw_ncontnonkernelvars[block_index]);
535 bw_contnonkernelvars[block_index][l] =
vars[
i];
536 bw_contnonkernelcount[block_index]++;
555 int* bw_ncontnonkernelvars,
556 int* bw_nnonkernelvars,
557 int* bw_nintnonkernelvars,
571 for(
b = 0;
b < nblocks + 1;
b++ )
576 for(
i = 0;
i < bw_ncontnonkernelvars[
b];
i++ )
581 (*bw_cont_redcost)[
b][
i] = 0.0;
584 for(
i = 0;
i < bw_nnonkernelvars[
b];
i++ )
589 (*bw_redcost)[
b][
i] = 0.0;
592 SCIPsortRealPtr((*bw_cont_redcost)[
b], (
void**)bw_contnonkernelvars[
b], bw_ncontnonkernelvars[
b]);
599 for(
i = 0;
i < bw_nintnonkernelvars[
b];
i++ )
604 (*bw_int_redcost)[
b][
i] = 0.0;
607 SCIPsortRealPtr((*bw_int_redcost)[
b], (
void**)bw_intnonkernelvars[
b], bw_nintnonkernelvars[
b]);
627 if( *bw_cont_redcost !=
NULL )
629 for(
b = 0;
b < nblocks + 1;
b++ )
631 if( (*bw_cont_redcost)[
b] !=
NULL )
638 if( *bw_redcost !=
NULL )
640 for(
b = 0;
b < nblocks + 1;
b++ )
642 if( (*bw_redcost)[
b] !=
NULL )
649 if( *bw_int_redcost !=
NULL )
651 for(
b = 0;
b < nblocks + 1;
b++ )
653 if( (*bw_int_redcost)[
b] !=
NULL )
675 SCIP_Real redcostlb = pow(base, (
double)(currentindex - 1));
676 SCIP_Real redcostub = pow(base, (
double)currentindex);
679 SCIP_Real shifted_redcost = redcost - redcostmin + 1.0;
689 if( currentindex == 1 )
691 return lessequalmaxcost;
692 else if ( currentindex == nbuckets )
694 return greatermincost;
697 return greatermincost && lessequalmaxcost;
708 int* bw_ncontnonkernelvars,
709 int* bw_nnonkernelvars,
710 int* bw_nintnonkernelvars,
753 for(
b = 0;
b < nblocks + 1;
b++ )
755 if( bw_ncontnonkernelvars[
b] > 0 )
758 tmp_max = bw_cont_redcost[
b][bw_ncontnonkernelvars[
b] - 1];
759 tmp_min = bw_cont_redcost[
b][0];
764 contbases[
b] = (
SCIP_Real) pow(tmp_max - tmp_min + 1.0, 1.0/nbuckets);
770 if( bw_nnonkernelvars[
b] > 0 )
773 tmp_max = bw_redcost[
b][bw_nnonkernelvars[
b] - 1];
774 tmp_min = bw_redcost[
b][0];
779 bases[
b] = (
SCIP_Real) pow(tmp_max - tmp_min + 1.0, 1.0/nbuckets);
787 if( bw_nintnonkernelvars[
b] > 0 )
790 tmp_max = bw_int_redcost[
b][bw_nintnonkernelvars[
b] - 1];
791 tmp_min = bw_int_redcost[
b][0];
795 intbases[
b] = (
SCIP_Real) pow(tmp_max - tmp_min + 1.0, 1.0/nbuckets);
805 for( k = 1; k < nbuckets + 1; k++ )
807 bucket = &(*bucketlist)->buckets[k];
814 for(
b = 0;
b < nblocks + 1;
b++ )
819 for( l = 0; l < bw_ncontnonkernelvars[
b]; l++ )
825 for( l = 0; l < bw_nnonkernelvars[
b]; l++ )
833 for( l = 0; l < bw_nintnonkernelvars[
b]; l++ )
848 contbucklength += tocontvars - fromcontvars;
849 bucklength += tovars - fromvars;
856 intbucklength += tointvars - fromintvars;
876 for(
b = 0;
b < nblocks + 1;
b++ )
881 for( l = 0; l < bw_ncontnonkernelvars[
b]; l++ )
887 for( l = 0; l < bw_nnonkernelvars[
b]; l++ )
895 for( l = 0; l < bw_nintnonkernelvars[
b]; l++ )
911 for( l = 0; l < tocontvars - fromcontvars; l++ )
912 bucket->
contbucketvars[j++] = bw_contnonkernelvars[
b][fromcontvars + l];
913 for( l = 0; l < tovars - fromvars; l++ )
914 bucket->
bucketvars[n++] = bw_nonkernelvars[
b][fromvars + l];
922 for( l = 0; l < tointvars - fromintvars; l++ )
923 bucket->
intbucketvars[m++] = bw_intnonkernelvars[
b][fromintvars + l];
928 assert(j == contbucklength);
931 assert(m == intbucklength);
1038 (*bucketlist)->scip =
scip;
1039 (*bucketlist)->nbuckets = 0;
1056 scip = (*bucketlist)->scip;
1059 if( (*bucketlist)->buckets !=
NULL )
1163 if( newcons !=
NULL )
1172 if( newcons !=
NULL )
1183 SCIPdebugMsg(
scip,
"In heur_dks: failed to copy some constraints to subscip, continue anyway\n");
1221 for(
i = 0;
i < nsubvars;
i++ )
1284 for(
b = 0;
b < nbuckets + 1;
b++ )
1287 assert((*bucketlist)->nbuckets ==
b + 1);
1289 bucket = &(*bucketlist)->buckets[
b];
1297 assert(nbuckets + 1 == (*bucketlist)->nbuckets);
1307 int ncontkernelvars,
1323 for( j = 0; j < ncontkernelvars; j++ )
1325 if( contkernelvars[j] !=
NULL &&
var == contkernelvars[j] )
1344 for( j = 0; j < nkernelvars; j++ )
1346 if( kernelvars[j] !=
NULL &&
var == kernelvars[j] )
1354 for( j = 0; j < nintkernelvars; j++ )
1356 if( intkernelvars[j] !=
NULL &&
var == intkernelvars[j] )
1392 int* ncontkernelvars,
1393 int maxcontkernelsize,
1398 int* nintkernelvars,
1399 int maxintkernelsize,
1410 int nnewcontkernelvars;
1412 int nnewintkernelvars;
1416 contkvars = *contkernelvars;
1417 kvars = *kernelvars;
1418 intkvars = *intkernelvars;
1425 nnewintkernelvars = 0;
1426 nnewcontkernelvars = 0;
1427 for( n = 0; n < *ncontkernelvars; n++ )
1429 if( contkvars[n] ==
NULL )
1450 (*contkernelvars)[nnewcontkernelvars++] = contkvars[n];
1453 contkvars[n] =
NULL;
1458 for( n = 0; n < *nkernelvars; n++ )
1460 if( kvars[n] ==
NULL )
1480 (*kernelvars)[nnewkernelvars++] = kvars[n];
1483 (*kernelvars)[nnewkernelvars++] = kvars[n];
1492 nnewintkernelvars = 0;
1494 for( n = 0; n < *nintkernelvars; n++ )
1496 if( intkvars[n] ==
NULL )
1517 (*intkernelvars)[nnewintkernelvars++] = intkvars[n];
1552 (*contkernelvars)[nnewcontkernelvars++] = bucket->
contbucketvars[n];
1557 *ncontkernelvars = nnewcontkernelvars;
1585 (*kernelvars)[nnewkernelvars++] = bucket->
bucketvars[n];
1593 (*kernelvars)[nnewkernelvars++] = bucket->
bucketvars[n];
1598 *nkernelvars = nnewkernelvars;
1628 (*intkernelvars)[nnewintkernelvars++] = bucket->
intbucketvars[n];
1632 *nintkernelvars = nnewintkernelvars;
1723 if( subvars !=
NULL )
1726 if( coeffs !=
NULL )
1816 int* varlabels =
NULL;
1817 int* conslabels =
NULL;
1818 int* block2index =
NULL;
1819 int* blocklabels =
NULL;
1820 int* bw_ncontkernelvars =
NULL;
1821 int* bw_ncontnonkernelvars =
NULL;
1822 int* bw_nkernelvars =
NULL;
1823 int* bw_nnonkernelvars =
NULL;
1824 int* bw_nintkernelvars =
NULL;
1825 int* bw_nintnonkernelvars =
NULL;
1826 int* bw_contkernelcount =
NULL;
1827 int* bw_contnonkernelcount =
NULL;
1828 int* bw_kernelcount =
NULL;
1829 int* bw_nonkernelcount =
NULL;
1830 int* bw_intkernelcount =
NULL;
1831 int* bw_intnonkernelcount =
NULL;
1839 int ncontkernelvars;
1840 int ncontnonkernelvars;
1844 int nintnonkernelvars;
1879 ncontkernelvars = 0;
1880 ncontnonkernelvars = 0;
1884 nintnonkernelvars = 0;
1889#ifdef DKS_WRITE_PROBLEMS
1933 if( tempvar !=
NULL )
1959 if( ndecomps > 0 &&
heurdata->usedecomp )
1962 decomp = alldecomps[0];
1970 SCIPdebugMsg(
scip,
"No decompositions available or wanted, going ahead without decomp\n");
1976 if(
nvars == 0 || nconss == 0 )
1987 SCIPdebugMsg(
scip,
"do not run dks if continuous variables or only integer variables are present\n");
2003 if( ndecomps > 0 &&
heurdata->usedecomp )
2014 nblocks,
nvars, nconss) );
2015 if( linkscore >
heurdata->maxlinkscore )
2021 if( nblocklabels > 0 )
2026 if( blocklabels[0] == 0 )
2039 for(
b = 0;
b < nblocklabels;
b++ )
2040 block2index[blocklabels[
b] + blklbl_offset] =
b + 1;
2047 for( v = 0; v <
nvars; v++ )
2073 if( nbinvars == 0 || nintvars == 0 || !
heurdata->usetwolevel )
2077 bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars,
NULL,
NULL,
2078 &ncontkernelvars, &ncontnonkernelvars, &nkernelvars, &nnonkernelvars,
NULL,
NULL,
2079 block2index, varlabels, blklbl_offset,
nvars) );
2084 if( nkernelvars == 0 )
2086 SCIPdebugMsg(
scip,
"No suitable variables for dks found. Leaving heuristic. \n");
2089 else if( nkernelvars > nnonkernelvars )
2091 SCIPdebugMsg(
scip,
"There are more kernel variables than not in the kernel\n");
2103 bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars, bw_nintkernelvars,
2104 bw_nintnonkernelvars, &ncontkernelvars, &ncontnonkernelvars, &nkernelvars, &nnonkernelvars,
2105 &nintkernelvars, &nintnonkernelvars, block2index, varlabels, blklbl_offset,
nvars) );
2107 SCIPdebugMsg(
scip,
"%d initial bin kernel vars\n%d initial int kernel vars\n", nkernelvars, nintkernelvars);
2109 if( nkernelvars == 0 )
2111 if( nintkernelvars == 0 )
2113 SCIPdebugMsg(
scip,
"No suitable variables for the construction of a kernel. Leaving heuristic. \n");
2119 nkernelvars = nintkernelvars;
2120 nnonkernelvars += nintnonkernelvars;
2122 nintnonkernelvars = 0;
2125 for(
b = 0;
b < nblocks + 1;
b++ )
2127 bw_nkernelvars[
b] = bw_nintkernelvars[
b];
2128 bw_nnonkernelvars[
b] += bw_nintnonkernelvars[
b];
2129 bw_nintnonkernelvars[
b] = 0;
2135 else if( nintkernelvars == 0 )
2138 nnonkernelvars += nintnonkernelvars;
2139 nintnonkernelvars = 0;
2142 for(
b = 0;
b < nblocks + 1;
b++ )
2144 bw_nnonkernelvars[
b] += bw_nintnonkernelvars[
b];
2145 bw_nintnonkernelvars[
b] = 0;
2150 else if( nkernelvars > nnonkernelvars || nintkernelvars > nintnonkernelvars )
2152 SCIPdebugMsg(
scip,
"There are more kernel variables than not in the kernel\n");
2168 for(
b = 0;
b < nblocks + 1;
b++ )
2170 int contblocksize = bw_ncontkernelvars[
b] + bw_ncontnonkernelvars[
b];
2171 int blocksize = bw_nkernelvars[
b] + bw_nnonkernelvars[
b];
2185 intblocksize = bw_nintkernelvars[
b] + bw_nintnonkernelvars[
b];
2192 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * ncontkernelvars) < (ncontkernelvars + ncontnonkernelvars) )
2195 maxcontkernelsize = ncontkernelvars + ncontnonkernelvars;
2197 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * ncontnonkernelvars) < (ncontkernelvars + ncontnonkernelvars) )
2200 maxcontnonkernelsize = ncontkernelvars + ncontnonkernelvars;
2202 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nkernelvars) < (nkernelvars + nnonkernelvars) )
2205 maxkernelsize = nkernelvars + nnonkernelvars;
2207 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nnonkernelvars) < (nkernelvars + nnonkernelvars) )
2210 maxnonkernelsize = nkernelvars + nnonkernelvars;
2227 maxintkernelsize = 0;
2233 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nintkernelvars) < (nintkernelvars + nintnonkernelvars) )
2236 maxintkernelsize = nintkernelvars + nintnonkernelvars;
2238 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nintnonkernelvars) < (nintkernelvars + nintnonkernelvars) )
2241 maxintnonkernelsize = nintkernelvars + nintnonkernelvars;
2253 bw_contkernelvars, bw_contnonkernelvars, bw_kernelvars, bw_nonkernelvars,
2254 bw_intkernelvars, bw_intnonkernelvars, bestcurrsol, lbvarmap, twolevel, usebestsol,
2256 bw_contnonkernelcount, bw_kernelcount, bw_nonkernelcount, bw_intkernelcount,
2257 bw_intnonkernelcount, bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars,
2258 bw_nintkernelvars, bw_nintnonkernelvars, block2index, varlabels, blklbl_offset,
nvars,
nbinintvars) );
2264 bw_contkernelvars, bw_contnonkernelvars, bw_kernelvars, bw_nonkernelvars,
NULL,
NULL,
2265 bestcurrsol, lbvarmap, twolevel, usebestsol,
heurdata->usetransprob,
2266 heurdata->translbkernel, bw_contkernelcount, bw_contnonkernelcount, bw_kernelcount,
2267 bw_nonkernelcount,
NULL,
NULL, bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars,
2275 &bw_cont_redcost, &bw_redcost, &bw_int_redcost, bw_ncontnonkernelvars, bw_nnonkernelvars,
2276 bw_nintnonkernelvars, twolevel, nblocks) );
2289 for(
b = 0;
b < nblocks + 1;
b++ )
2292 if( bw_nintnonkernelvars[
b] > 0 && bw_nintkernelvars[
b] > 0 )
2297 if( bw_nnonkernelvars[
b] > 0 && bw_nkernelvars[
b] > 0 )
2304 nbuckets += (int)intratio;
2309 nbuckets += (int)binratio;
2318 for(
b = 0;
b < nblocks + 1;
b++ )
2320 if( bw_nnonkernelvars[
b] > 0 && bw_nkernelvars[
b] > 0 )
2328 if( nusedratios > 0 )
2348 bw_contnonkernelvars, bw_nonkernelvars, bw_intnonkernelvars,
2349 bw_ncontnonkernelvars, bw_nnonkernelvars, bw_nintnonkernelvars,
2350 bw_cont_redcost, bw_redcost, bw_int_redcost,
2351 twolevel,
heurdata->redcostlogsort, iters - 1, nblocks) );
2358 for(
b = 0;
b < nblocks + 1;
b++ )
2360 for( l = 0; l < bw_ncontkernelvars[
b]; l++ )
2361 contkernelvars[j++] = bw_contkernelvars[
b][l];
2363 for( l = 0; l < bw_nkernelvars[
b]; l++ )
2364 kernelvars[n++] = bw_kernelvars[
b][l];
2368 for( l = 0; l < bw_nintkernelvars[
b]; l++ )
2369 intkernelvars[m++] = bw_intkernelvars[
b][l];
2372 assert(j == ncontkernelvars);
2373 assert(n == nkernelvars);
2375 assert(m == nintkernelvars);
2381 for( k = 0; k < iters; k++ )
2393 bucket = &bucketlist->
buckets[k];
2417 intkernelvars, nintkernelvars,
var, &found) );
2439 else if( ub >= 0.0 )
2465#ifdef DKS_WRITE_PROBLEMS
2477 subtimelimit = totaltimelimit - timeused;
2478 if( subtimelimit > 1.0 )
2491 if( 1LL > nodes_evenly_dist )
2494 nnodes = nodes_evenly_dist;
2515 if( bucket->
number == 0 )
2525 mipgap += (
heurdata->buckmaxgap / iters) * gapfactor;
2533 mipgap -= (
heurdata->buckmaxgap / iters) * gapfactor;
2555 nbestbucket = bucket->
number;
2562 &kernelvars, &nkernelvars, (
int)maxkernelsize, &intkernelvars, &nintkernelvars, (
int)maxintkernelsize,
2568 SCIPdebugMsg(
scip,
"Bucket reached node limit. No optimal solution available.\n");
2579#ifdef DKS_KERNEL_INFO
2580 fclose(variable_info);
2585 if( nbestbucket > -1 )
2592 bestbucket = &bucketlist->
buckets[nbestbucket];
2596 if( bestsol ==
NULL )
2598 SCIPdebugMsg(
scip,
"Function SCIPgetBestSol() has returned a NULL pointer\n");
2637 if( bucketconss !=
NULL )
2640 if( bw_intnonkernelcount !=
NULL )
2643 if( bw_intkernelcount !=
NULL )
2646 if( intnonkernelvars !=
NULL )
2649 if( intkernelvars !=
NULL )
2652 if( bw_nonkernelcount !=
NULL )
2655 if( bw_kernelcount !=
NULL )
2658 if( bw_contnonkernelcount !=
NULL )
2661 if( bw_contkernelcount !=
NULL )
2664 if( binintvars !=
NULL )
2667 if( nonkernelvars !=
NULL )
2670 if( kernelvars !=
NULL )
2673 if( contnonkernelvars !=
NULL )
2676 if( contkernelvars !=
NULL )
2679 if( bw_intkernelvars !=
NULL )
2681 for(
b = nblocks;
b >= 0;
b-- )
2683 if( bw_intnonkernelvars[
b] !=
NULL )
2685 if( bw_intkernelvars[
b] !=
NULL )
2690 if( bw_kernelvars !=
NULL )
2692 for(
b = nblocks;
b >= 0;
b-- )
2694 if( bw_nonkernelvars[
b] !=
NULL )
2696 if( bw_kernelvars[
b] !=
NULL )
2701 if( bw_contkernelvars !=
NULL )
2703 for(
b = nblocks;
b >= 0;
b-- )
2705 if( bw_contnonkernelvars[
b] !=
NULL )
2707 if( bw_contkernelvars[
b] !=
NULL )
2712 if( bw_intnonkernelvars !=
NULL )
2715 if( bw_intkernelvars !=
NULL )
2718 if( bw_nonkernelvars !=
NULL )
2721 if( bw_kernelvars !=
NULL )
2724 if( bw_contnonkernelvars !=
NULL )
2727 if( bw_contkernelvars !=
NULL )
2730 if( bw_nintnonkernelvars !=
NULL )
2733 if( bw_nintkernelvars !=
NULL )
2736 if( bw_nnonkernelvars !=
NULL )
2739 if( bw_nkernelvars !=
NULL )
2742 if( bw_ncontnonkernelvars !=
NULL )
2745 if( bw_ncontkernelvars !=
NULL )
2748 if( block2index !=
NULL )
2750 if( nblocklabels > 0 )
2759 if( blocklabels !=
NULL )
2762 if( conslabels !=
NULL )
2765 if( varlabels !=
NULL )
2770 if( lbvarmap !=
NULL )
2773 if( bucketlist !=
NULL )
2775 for( k = bucketlist->
nbuckets - 1; k >= 1; k-- )
2783 if( bucketlist !=
NULL )
2825 "maximal number of buckets to be investigated",
2829 "factor with which the initial kernel size can grow max",
2833 "should a constraint be added ensuring that bucket variables are used?",
2837 "should the linking variables in the kernel influence the size of the buckets?",
2841 "should a variable with different lower bound in transformed and original problem be in the kernel?",
2845 "should a variable with max one uplock and one downlock be in the kernel?",
2849 "should dks use the transformed problem?",
2853 "defines the maximum mipgap a bucket can be solved to",
2857 "defines a bound to the linkscore of the decomp",
2861 "defines a maximal share of bin/int variables for a bucket to be respected",
2865 "maximum number of nodes to regard in all subproblems",
2869 "should a two level bucket structure be used if possible?",
2873 "should a decomposition be used if given?",
2877 "should the best solution instead of the LP solution be used?",
2881 "should the bucket variables be sorted by reduced costs in the LP solution?",
2885 "should the heuristic terminate after the first primal solution is found?",
2889 "should the bucket variables be sorted logarithmically by reduced costs in the LP solution?",
2893 "should the next solution at least satisfy the old objective?",
2897 "should the heuristic be used only for binary problems or problems with integer and binary variables?",
Constraint handler for linear constraints in their most general form, .
#define SCIP_STRINGEQ(name, reference, retcode)
#define SCIP_CALL_ABORT(x)
SCIP_RETCODE SCIPcreateConsBasicLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs)
SCIP_RETCODE SCIPcopyPlugins(SCIP *sourcescip, SCIP *targetscip, SCIP_Bool copyreaders, SCIP_Bool copypricers, SCIP_Bool copyconshdlrs, SCIP_Bool copyconflicthdlrs, SCIP_Bool copypresolvers, SCIP_Bool copyrelaxators, SCIP_Bool copyseparators, SCIP_Bool copycutselectors, SCIP_Bool copypropagators, SCIP_Bool copyheuristics, SCIP_Bool copyeventhdlrs, SCIP_Bool copynodeselectors, SCIP_Bool copybranchrules, SCIP_Bool copyiisfinders, SCIP_Bool copydisplays, SCIP_Bool copydialogs, SCIP_Bool copytables, SCIP_Bool copyexprhdlrs, SCIP_Bool copynlpis, SCIP_Bool passmessagehdlr, SCIP_Bool *valid)
SCIP_RETCODE SCIPcopyVars(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_VAR **fixedvars, SCIP_Real *fixedvals, int nfixedvars, SCIP_Bool global)
SCIP_RETCODE SCIPgetConsCopy(SCIP *sourcescip, SCIP *targetscip, SCIP_CONS *sourcecons, SCIP_CONS **targetcons, SCIP_CONSHDLR *sourceconshdlr, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, const char *name, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool global, SCIP_Bool *valid)
SCIP_RETCODE SCIPcopyProb(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_Bool global, const char *name)
SCIP_RETCODE SCIPtranslateSubSol(SCIP *scip, SCIP *subscip, SCIP_SOL *subsol, SCIP_HEUR *heur, SCIP_VAR **subvars, SCIP_SOL **newsol)
SCIP_RETCODE SCIPcopyParamSettings(SCIP *sourcescip, SCIP *targetscip)
SCIP_RETCODE SCIPcopyLimits(SCIP *sourcescip, SCIP *targetscip)
void SCIPgetDecomps(SCIP *scip, SCIP_DECOMP ***decomps, int *ndecomps, SCIP_Bool original)
int SCIPdecompGetNBlocks(SCIP_DECOMP *decomp)
void SCIPdecompGetConsLabels(SCIP_DECOMP *decomp, SCIP_CONS **conss, int *labels, int nconss)
void SCIPdecompGetVarsLabels(SCIP_DECOMP *decomp, SCIP_VAR **vars, int *labels, int nvars)
SCIP_RETCODE SCIPfree(SCIP **scip)
SCIP_RETCODE SCIPcreate(SCIP **scip)
SCIP_STATUS SCIPgetStatus(SCIP *scip)
int SCIPgetNIntVars(SCIP *scip)
const char * SCIPgetProbName(SCIP *scip)
SCIP_RETCODE SCIPwriteOrigProblem(SCIP *scip, const char *filename, const char *extension, SCIP_Bool genericnames)
SCIP_RETCODE SCIPsetObjlimit(SCIP *scip, SCIP_Real objlimit)
int SCIPgetNBinImplVars(SCIP *scip)
int SCIPgetNOrigBinVars(SCIP *scip)
SCIP_RETCODE SCIPgetVarsData(SCIP *scip, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars, int *nimplvars, int *ncontvars)
int SCIPgetNOrigConss(SCIP *scip)
SCIP_VAR ** SCIPgetOrigVars(SCIP *scip)
int SCIPgetNOrigIntVars(SCIP *scip)
SCIP_CONS ** SCIPgetConss(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNConss(SCIP *scip)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
int SCIPgetNOrigVars(SCIP *scip)
int SCIPgetNOrigBinImplVars(SCIP *scip)
int SCIPgetNOrigIntImplVars(SCIP *scip)
int SCIPgetNIntImplVars(SCIP *scip)
SCIP_CONS ** SCIPgetOrigConss(SCIP *scip)
SCIP_RETCODE SCIPwriteTransProblem(SCIP *scip, const char *filename, const char *extension, SCIP_Bool genericnames)
int SCIPgetNBinVars(SCIP *scip)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
void * SCIPhashmapEntryGetImage(SCIP_HASHMAPENTRY *entry)
SCIP_Real SCIPhashmapGetImageReal(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapSetImageReal(SCIP_HASHMAP *hashmap, void *origin, SCIP_Real image)
int SCIPhashmapGetNEntries(SCIP_HASHMAP *hashmap)
SCIP_HASHMAPENTRY * SCIPhashmapGetEntry(SCIP_HASHMAP *hashmap, int entryidx)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
void * SCIPhashmapEntryGetOrigin(SCIP_HASHMAPENTRY *entry)
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
SCIP_RETCODE SCIPaddLongintParam(SCIP *scip, const char *name, const char *desc, SCIP_Longint *valueptr, SCIP_Bool isadvanced, SCIP_Longint defaultvalue, SCIP_Longint minvalue, SCIP_Longint maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_Bool SCIPisParamFixed(SCIP *scip, const char *name)
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPsetLongintParam(SCIP *scip, const char *name, SCIP_Longint value)
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)
SCIP_RETCODE SCIPsetIntParam(SCIP *scip, const char *name, int value)
SCIP_RETCODE SCIPsetSubscipsOff(SCIP *scip, SCIP_Bool quiet)
SCIP_RETCODE SCIPgetRealParam(SCIP *scip, const char *name, SCIP_Real *value)
SCIP_RETCODE SCIPunfixParam(SCIP *scip, const char *name)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPsetBoolParam(SCIP *scip, const char *name, SCIP_Bool value)
SCIP_RETCODE SCIPsetRealParam(SCIP *scip, const char *name, SCIP_Real value)
SCIP_RETCODE SCIPincludeHeurDKS(SCIP *scip)
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetHeurFree(SCIP *scip, SCIP_HEUR *heur,)
SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
SCIP_RETCODE SCIPincludeHeurBasic(SCIP *scip, SCIP_HEUR **heur, const char *name, const char *desc, char dispchar, int priority, int freq, int freqofs, int maxdepth, SCIP_HEURTIMING timingmask, SCIP_Bool usessubscip, SCIP_DECL_HEUREXEC((*heurexec)), SCIP_HEURDATA *heurdata)
SCIP_RETCODE SCIPsetHeurCopy(SCIP *scip, SCIP_HEUR *heur,)
const char * SCIPheurGetName(SCIP_HEUR *heur)
void SCIPheurSetData(SCIP_HEUR *heur, SCIP_HEURDATA *heurdata)
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
SCIP_Longint SCIPgetMemExternEstim(SCIP *scip)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
SCIP_Longint SCIPgetMemUsed(SCIP *scip)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
#define SCIPallocClearBlockMemoryArray(scip, ptr, num)
#define SCIPallocClearBufferArray(scip, ptr, num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPduplicateBufferArray(scip, ptr, source, num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPfreeBufferArrayNull(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_SOL * SCIPgetBestSol(SCIP *scip)
SCIP_RETCODE SCIPprintSol(SCIP *scip, SCIP_SOL *sol, FILE *file, SCIP_Bool printzeros)
int SCIPgetNSols(SCIP *scip)
SCIP_RETCODE SCIPtrySolFree(SCIP *scip, SCIP_SOL **sol, SCIP_Bool printreason, SCIP_Bool completely, SCIP_Bool checkbounds, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool *stored)
SCIP_Real SCIPgetSolOrigObj(SCIP *scip, SCIP_SOL *sol)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
SCIP_RETCODE SCIPfreeTransform(SCIP *scip)
SCIP_RETCODE SCIPsolve(SCIP *scip)
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_Real SCIPgetCutoffbound(SCIP *scip)
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
SCIP_Real SCIPgetTotalTime(SCIP *scip)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPvarGetOrigvarSum(SCIP_VAR **var, SCIP_Real *scalar, SCIP_Real *constant)
SCIP_Bool SCIPvarIsActive(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbOriginal(SCIP_VAR *var)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
int SCIPvarGetProbindex(SCIP_VAR *var)
SCIP_Real SCIPvarGetLPSol(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_Real SCIPgetVarRedcost(SCIP *scip, SCIP_VAR *var)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPfixVar(SCIP *scip, SCIP_VAR *var, SCIP_Real fixedval, SCIP_Bool *infeasible, SCIP_Bool *fixed)
void SCIPsortRealPtr(SCIP_Real *realarray, void **ptrarray, int len)
void SCIPsortInt(int *intarray, int len)
int SCIPsnprintf(char *t, int len, const char *s,...)
static SCIP_RETCODE fillBuckets(SCIP *scip, BUCKETLIST **bucketlist, SCIP_VAR ***bw_contnonkernelvars, SCIP_VAR ***bw_nonkernelvars, SCIP_VAR ***bw_intnonkernelvars, int *bw_ncontnonkernelvars, int *bw_nnonkernelvars, int *bw_nintnonkernelvars, SCIP_Real **bw_cont_redcost, SCIP_Real **bw_redcost, SCIP_Real **bw_int_redcost, SCIP_Bool twolevel, SCIP_Bool redcostlogsort, int nbuckets, int nblocks)
static SCIP_RETCODE searchKernelAndBucket(BUCKET *bucket, SCIP_VAR **contkernelvars, int ncontkernelvars, SCIP_VAR **kernelvars, int nkernelvars, SCIP_VAR **intkernelvars, int nintkernelvars, SCIP_VAR *var, SCIP_Bool *found)
static SCIP_RETCODE fillKernels(SCIP *scip, SCIP_VAR **vars, SCIP_VAR **binintvars, SCIP_VAR ***bw_contkernelvars, SCIP_VAR ***bw_contnonkernelvars, SCIP_VAR ***bw_kernelvars, SCIP_VAR ***bw_nonkernelvars, SCIP_VAR ***bw_intkernelvars, SCIP_VAR ***bw_intnonkernelvars, SCIP_SOL *bestcurrsol, SCIP_HASHMAP *lbvarmap, SCIP_Bool twolevel, SCIP_Bool usebestsol, SCIP_Bool usetransprob, SCIP_Bool usetranslb, int *bw_contkernelcount, int *bw_contnonkernelcount, int *bw_kernelcount, int *bw_nonkernelcount, int *bw_intkernelcount, int *bw_intnonkernelcount, int *bw_ncontkernelvars, int *bw_ncontnonkernelvars, int *bw_nkernelvars, int *bw_nnonkernelvars, int *bw_nintkernelvars, int *bw_nintnonkernelvars, int *block2index, int *varlabels, int blklbl_offset, int nvars, int nbinintvars)
#define DEFAULT_OBJCUTOFF
#define DEFAULT_LINKBUCKSIZE
#define DEFAULT_BUCKMAXGAP
#define DEFAULT_ADDUSECONSS
static SCIP_RETCODE reducedCostSort(SCIP *scip, SCIP_VAR ***bw_contnonkernelvars, SCIP_VAR ***bw_nonkernelvars, SCIP_VAR ***bw_intnonkernelvars, SCIP_Real ***bw_cont_redcost, SCIP_Real ***bw_redcost, SCIP_Real ***bw_int_redcost, int *bw_ncontnonkernelvars, int *bw_nnonkernelvars, int *bw_nintnonkernelvars, SCIP_Bool twolevel, int nblocks)
#define DEFAULT_KERNELSIZEFACTOR
#define DEFAULT_TRANSLBKERNEL
struct Bucketlist BUCKETLIST
static SCIP_RETCODE createBucketlistAndBuckets(SCIP *scip, SCIP_Bool usetransprob, int nbuckets, BUCKETLIST **bucketlist, SCIP_Bool *success)
static SCIP_RETCODE freeBucketArrays(SCIP *scip, BUCKET *bucket, SCIP_Bool twolevel)
#define DEFAULT_REDCOSTLOGSORT
static SCIP_RETCODE initBucket(BUCKETLIST *bucketlist)
#define DEFAULT_MAXLINKSCORE
#define DEFAULT_USETWOLEVEL
static SCIP_RETCODE getLinkingScoreAndBlocklabels(int *blocklabels, int *varlabels, int *conslabels, SCIP_Real *linkscore, int *nblocklabels, int nblocks, int nvars, int nconss)
static SCIP_RETCODE adjustKernelVars(SCIP *scip, BUCKET *bucket, SCIP_VAR ***contkernelvars, int *ncontkernelvars, int maxcontkernelsize, SCIP_VAR ***kernelvars, int *nkernelvars, int maxkernelsize, SCIP_VAR ***intkernelvars, int *nintkernelvars, int maxintkernelsize, SCIP_Bool twolevel)
#define DEFAULT_MAXBUCKFRAC
static SCIP_RETCODE freeBucket(SCIP *scip, BUCKET *bucket)
static SCIP_RETCODE freeRedcostArrays(SCIP *scip, SCIP_Real ***bw_cont_redcost, SCIP_Real ***bw_redcost, SCIP_Real ***bw_int_redcost, int nblocks)
static SCIP_RETCODE bucketCreateSubscip(BUCKET *bucket, SCIP_Bool usetransprob, SCIP_Bool *success)
#define DEFAULT_USEBESTSOL
#define DEFAULT_REDCOSTSORT
static SCIP_RETCODE countKernelVariables(SCIP *scip, SCIP_VAR **vars, SCIP_SOL *bestcurrsol, SCIP_HASHMAP *lbvarmap, SCIP_Bool twolevel, SCIP_Bool usebestsol, SCIP_Bool usetransprob, SCIP_Bool usetranslb, int *bw_ncontkernelvars, int *bw_ncontnonkernelvars, int *bw_nkernelvars, int *bw_nnonkernelvars, int *bw_nintkernelvars, int *bw_nintnonkernelvars, int *ncontkernelvars, int *ncontnonkernelvars, int *nkernelvars, int *nnonkernelvars, int *nintkernelvars, int *nintnonkernelvars, int *block2index, int *varlabels, int blklbl_offset, int nvars)
#define DEFAULT_PRIMALONLY
static SCIP_RETCODE freeBucketlist(BUCKETLIST **bucketlist, int nbuckets)
static SCIP_RETCODE addUseConstraint(BUCKET *bucket)
static SCIP_RETCODE initBucketlist(SCIP *scip, BUCKETLIST **bucketlist, int nbuckets)
#define DEFAULT_USEDECOMP
#define DEFAULT_LESSLOCKSKERNEL
#define DEFAULT_RUNBINPROBSONLY
static SCIP_Bool isInCurrentLogBucket(SCIP *scip, SCIP_Real base, SCIP_Real redcost, SCIP_Real redcostmin, int currentindex, int nbuckets)
#define DEFAULT_USETRANSPROB
assert(minobj< SCIPgetCutoffbound(scip))
methods commonly used by primal heuristics
memory allocation routines
public methods for managing constraints
public methods for managing events
wrapper functions to map file i/o to standard or zlib file i/o
public methods for primal heuristics
public methods for LP management
public methods for message output
public data structures and miscellaneous methods
methods for selecting k-medians
public methods for primal CIP solutions
public methods for branch and bound tree
public methods for problem variables
public methods for branching rule plugins and branching
public methods for constraint handler plugins and constraints
public methods for problem copies
public methods for decompositions
public methods for event handler plugins and event handlers
public methods for primal heuristic plugins and divesets
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for node selector plugins
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for random numbers
public methods for solutions
public methods for querying solving statistics
public methods for statistics table plugins
public methods for timing
public methods for the branch-and-bound tree
public methods for SCIP variables
internal methods for storing primal CIP solutions
SCIP_VAR ** intbucketvars
SCIP_VAR ** contbucketvars
struct SCIP_Cons SCIP_CONS
struct SCIP_Conshdlr SCIP_CONSHDLR
#define SCIP_DECOMP_LINKVAR
struct SCIP_Decomp SCIP_DECOMP
#define SCIP_DECOMP_LINKCONS
#define SCIP_DECL_HEURCOPY(x)
struct SCIP_HeurData SCIP_HEURDATA
struct SCIP_Heur SCIP_HEUR
#define SCIP_DECL_HEURFREE(x)
#define SCIP_DECL_HEUREXEC(x)
struct SCIP_HashMap SCIP_HASHMAP
struct SCIP_HashMapEntry SCIP_HASHMAPENTRY
enum SCIP_Retcode SCIP_RETCODE
enum SCIP_Status SCIP_STATUS
@ SCIP_VARTYPE_CONTINUOUS