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,
431 block_index = block2index[
MAX(varlabels[
i] + blklbl_offset, 0)];
438 binintvars[j++] =
vars[
i];
442 n = bw_kernelcount[block_index];
444 assert(n < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
445 bw_kernelvars[block_index][n] =
vars[
i];
446 bw_kernelcount[block_index]++;
450 n = bw_nonkernelcount[block_index];
452 assert(n < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
453 bw_nonkernelvars[block_index][n] =
vars[
i];
454 bw_nonkernelcount[block_index]++;
462 binintvars[j++] =
vars[
i];
469 if( bw_intkernelcount !=
NULL )
471 m = bw_intkernelcount[block_index];
474 assert(m < bw_nintkernelvars[block_index] + bw_nintnonkernelvars[block_index]);
475 if( bw_intkernelvars !=
NULL )
476 bw_intkernelvars[block_index][m] =
vars[
i];
477 bw_intkernelcount[block_index]++;
482 m = bw_kernelcount[block_index];
484 assert(m < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
485 bw_kernelvars[block_index][m] =
vars[
i];
486 bw_kernelcount[block_index]++;
493 if( bw_intnonkernelcount !=
NULL )
495 m = bw_intnonkernelcount[block_index];
498 assert(m < bw_nintkernelvars[block_index] + bw_nintnonkernelvars[block_index]);
499 if( bw_intnonkernelvars !=
NULL )
500 bw_intnonkernelvars[block_index][m] =
vars[
i];
501 bw_intnonkernelcount[block_index]++;
506 m = bw_nonkernelcount[block_index];
508 assert(m < bw_nkernelvars[block_index] + bw_nnonkernelvars[block_index]);
509 bw_nonkernelvars[block_index][m] =
vars[
i];
510 bw_nonkernelcount[block_index]++;
521 l = bw_contkernelcount[block_index];
523 assert(l < bw_ncontkernelvars[block_index] + bw_ncontnonkernelvars[block_index]);
524 bw_contkernelvars[block_index][l] =
vars[
i];
525 bw_contkernelcount[block_index]++;
529 l = bw_contnonkernelcount[block_index];
531 assert(l < bw_ncontkernelvars[block_index] + bw_ncontnonkernelvars[block_index]);
532 bw_contnonkernelvars[block_index][l] =
vars[
i];
533 bw_contnonkernelcount[block_index]++;
552 int* bw_ncontnonkernelvars,
553 int* bw_nnonkernelvars,
554 int* bw_nintnonkernelvars,
568 for(
b = 0;
b < nblocks + 1;
b++ )
573 for(
i = 0;
i < bw_ncontnonkernelvars[
b];
i++ )
578 (*bw_cont_redcost)[
b][
i] = 0.0;
581 for(
i = 0;
i < bw_nnonkernelvars[
b];
i++ )
586 (*bw_redcost)[
b][
i] = 0.0;
589 SCIPsortRealPtr((*bw_cont_redcost)[
b], (
void**)bw_contnonkernelvars[
b], bw_ncontnonkernelvars[
b]);
596 for(
i = 0;
i < bw_nintnonkernelvars[
b];
i++ )
601 (*bw_int_redcost)[
b][
i] = 0.0;
604 SCIPsortRealPtr((*bw_int_redcost)[
b], (
void**)bw_intnonkernelvars[
b], bw_nintnonkernelvars[
b]);
624 if( *bw_cont_redcost !=
NULL )
626 for(
b = 0;
b < nblocks + 1;
b++ )
628 if( (*bw_cont_redcost)[
b] !=
NULL )
635 if( *bw_redcost !=
NULL )
637 for(
b = 0;
b < nblocks + 1;
b++ )
639 if( (*bw_redcost)[
b] !=
NULL )
646 if( *bw_int_redcost !=
NULL )
648 for(
b = 0;
b < nblocks + 1;
b++ )
650 if( (*bw_int_redcost)[
b] !=
NULL )
672 SCIP_Real redcostlb = pow(base, (
double)(currentindex - 1));
673 SCIP_Real redcostub = pow(base, (
double)currentindex);
676 SCIP_Real shifted_redcost = redcost - redcostmin + 1.0;
686 if( currentindex == 1 )
688 return lessequalmaxcost;
689 else if ( currentindex == nbuckets )
691 return greatermincost;
694 return greatermincost && lessequalmaxcost;
705 int* bw_ncontnonkernelvars,
706 int* bw_nnonkernelvars,
707 int* bw_nintnonkernelvars,
750 for(
b = 0;
b < nblocks + 1;
b++ )
752 if( bw_ncontnonkernelvars[
b] > 0 )
755 tmp_max = bw_cont_redcost[
b][bw_ncontnonkernelvars[
b] - 1];
756 tmp_min = bw_cont_redcost[
b][0];
761 contbases[
b] = (
SCIP_Real) pow(tmp_max - tmp_min + 1.0, 1.0/nbuckets);
767 if( bw_nnonkernelvars[
b] > 0 )
770 tmp_max = bw_redcost[
b][bw_nnonkernelvars[
b] - 1];
771 tmp_min = bw_redcost[
b][0];
776 bases[
b] = (
SCIP_Real) pow(tmp_max - tmp_min + 1.0, 1.0/nbuckets);
784 if( bw_nintnonkernelvars[
b] > 0 )
787 tmp_max = bw_int_redcost[
b][bw_nintnonkernelvars[
b] - 1];
788 tmp_min = bw_int_redcost[
b][0];
792 intbases[
b] = (
SCIP_Real) pow(tmp_max - tmp_min + 1.0, 1.0/nbuckets);
802 for( k = 1; k < nbuckets + 1; k++ )
804 bucket = &(*bucketlist)->buckets[k];
811 for(
b = 0;
b < nblocks + 1;
b++ )
816 for( l = 0; l < bw_ncontnonkernelvars[
b]; l++ )
822 for( l = 0; l < bw_nnonkernelvars[
b]; l++ )
830 for( l = 0; l < bw_nintnonkernelvars[
b]; l++ )
845 contbucklength += tocontvars - fromcontvars;
846 bucklength += tovars - fromvars;
853 intbucklength += tointvars - fromintvars;
873 for(
b = 0;
b < nblocks + 1;
b++ )
878 for( l = 0; l < bw_ncontnonkernelvars[
b]; l++ )
884 for( l = 0; l < bw_nnonkernelvars[
b]; l++ )
892 for( l = 0; l < bw_nintnonkernelvars[
b]; l++ )
908 for( l = 0; l < tocontvars - fromcontvars; l++ )
909 bucket->
contbucketvars[j++] = bw_contnonkernelvars[
b][fromcontvars + l];
910 for( l = 0; l < tovars - fromvars; l++ )
911 bucket->
bucketvars[n++] = bw_nonkernelvars[
b][fromvars + l];
919 for( l = 0; l < tointvars - fromintvars; l++ )
920 bucket->
intbucketvars[m++] = bw_intnonkernelvars[
b][fromintvars + l];
925 assert(j == contbucklength);
928 assert(m == intbucklength);
1035 (*bucketlist)->scip =
scip;
1036 (*bucketlist)->nbuckets = 0;
1053 scip = (*bucketlist)->scip;
1056 if( (*bucketlist)->buckets !=
NULL )
1160 if( newcons !=
NULL )
1169 if( newcons !=
NULL )
1180 SCIPdebugMsg(
scip,
"In heur_dks: failed to copy some constraints to subscip, continue anyway\n");
1218 for(
i = 0;
i < nsubvars;
i++ )
1281 for(
b = 0;
b < nbuckets + 1;
b++ )
1284 assert((*bucketlist)->nbuckets ==
b + 1);
1286 bucket = &(*bucketlist)->buckets[
b];
1294 assert(nbuckets + 1 == (*bucketlist)->nbuckets);
1304 int ncontkernelvars,
1320 for( j = 0; j < ncontkernelvars; j++ )
1322 if( contkernelvars[j] !=
NULL &&
var == contkernelvars[j] )
1341 for( j = 0; j < nkernelvars; j++ )
1343 if( kernelvars[j] !=
NULL &&
var == kernelvars[j] )
1351 for( j = 0; j < nintkernelvars; j++ )
1353 if( intkernelvars[j] !=
NULL &&
var == intkernelvars[j] )
1389 int* ncontkernelvars,
1390 int maxcontkernelsize,
1395 int* nintkernelvars,
1396 int maxintkernelsize,
1407 int nnewcontkernelvars;
1409 int nnewintkernelvars;
1413 contkvars = *contkernelvars;
1414 kvars = *kernelvars;
1415 intkvars = *intkernelvars;
1422 nnewintkernelvars = 0;
1423 nnewcontkernelvars = 0;
1424 for( n = 0; n < *ncontkernelvars; n++ )
1426 if( contkvars[n] ==
NULL )
1447 (*contkernelvars)[nnewcontkernelvars++] = contkvars[n];
1450 contkvars[n] =
NULL;
1455 for( n = 0; n < *nkernelvars; n++ )
1457 if( kvars[n] ==
NULL )
1477 (*kernelvars)[nnewkernelvars++] = kvars[n];
1480 (*kernelvars)[nnewkernelvars++] = kvars[n];
1489 nnewintkernelvars = 0;
1491 for( n = 0; n < *nintkernelvars; n++ )
1493 if( intkvars[n] ==
NULL )
1514 (*intkernelvars)[nnewintkernelvars++] = intkvars[n];
1549 (*contkernelvars)[nnewcontkernelvars++] = bucket->
contbucketvars[n];
1554 *ncontkernelvars = nnewcontkernelvars;
1582 (*kernelvars)[nnewkernelvars++] = bucket->
bucketvars[n];
1590 (*kernelvars)[nnewkernelvars++] = bucket->
bucketvars[n];
1595 *nkernelvars = nnewkernelvars;
1625 (*intkernelvars)[nnewintkernelvars++] = bucket->
intbucketvars[n];
1629 *nintkernelvars = nnewintkernelvars;
1720 if( subvars !=
NULL )
1723 if( coeffs !=
NULL )
1812 int* varlabels =
NULL;
1813 int* conslabels =
NULL;
1814 int* block2index =
NULL;
1815 int* blocklabels =
NULL;
1816 int* bw_ncontkernelvars =
NULL;
1817 int* bw_ncontnonkernelvars =
NULL;
1818 int* bw_nkernelvars =
NULL;
1819 int* bw_nnonkernelvars =
NULL;
1820 int* bw_nintkernelvars =
NULL;
1821 int* bw_nintnonkernelvars =
NULL;
1822 int* bw_contkernelcount =
NULL;
1823 int* bw_contnonkernelcount =
NULL;
1824 int* bw_kernelcount =
NULL;
1825 int* bw_nonkernelcount =
NULL;
1826 int* bw_intkernelcount =
NULL;
1827 int* bw_intnonkernelcount =
NULL;
1835 int ncontkernelvars;
1836 int ncontnonkernelvars;
1840 int nintnonkernelvars;
1876 ncontkernelvars = 0;
1877 ncontnonkernelvars = 0;
1881 nintnonkernelvars = 0;
1889#ifdef DKS_WRITE_PROBLEMS
1929 if( tempvar !=
NULL )
1951 if( ndecomps > 0 &&
heurdata->usedecomp )
1954 decomp = alldecomps[0];
1962 SCIPdebugMsg(
scip,
"No decompositions available or wanted, going ahead without decomp\n");
1968 if(
nvars == 0 || nconss == 0 )
1977 if( nbinvars == 0 || ncontvars > 0 )
1979 SCIPdebugMsg(
scip,
"do not run dks if continuous variables or only integer variables are present\n");
1995 if( ndecomps > 0 &&
heurdata->usedecomp )
2006 nblocks,
nvars, nconss) );
2007 if( linkscore >
heurdata->maxlinkscore )
2013 if( nblocklabels > 0 )
2018 if( blocklabels[0] == 0 )
2031 for(
b = 0;
b < nblocklabels;
b++ )
2032 block2index[blocklabels[
b] + blklbl_offset] =
b + 1;
2039 for( v = 0; v <
nvars; v++ )
2065 if( nbinvars == 0 || nintvars == 0 || !
heurdata->usetwolevel )
2069 bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars,
NULL,
NULL,
2070 &ncontkernelvars, &ncontnonkernelvars, &nkernelvars, &nnonkernelvars,
NULL,
NULL,
2071 block2index, varlabels, blklbl_offset,
nvars) );
2076 if( nkernelvars == 0 )
2078 SCIPdebugMsg(
scip,
"No suitable variables for dks found. Leaving heuristic. \n");
2081 else if( nkernelvars > nnonkernelvars )
2083 SCIPdebugMsg(
scip,
"There are more kernel variables than not in the kernel\n");
2095 bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars, bw_nintkernelvars,
2096 bw_nintnonkernelvars, &ncontkernelvars, &ncontnonkernelvars, &nkernelvars, &nnonkernelvars,
2097 &nintkernelvars, &nintnonkernelvars, block2index, varlabels, blklbl_offset,
nvars) );
2099 SCIPdebugMsg(
scip,
"%d initial bin kernel vars\n%d initial int kernel vars\n", nkernelvars, nintkernelvars);
2101 if( nkernelvars == 0 )
2103 if( nintkernelvars == 0 )
2105 SCIPdebugMsg(
scip,
"No suitable variables for the construction of a kernel. Leaving heuristic. \n");
2111 nkernelvars = nintkernelvars;
2112 nnonkernelvars += nintnonkernelvars;
2114 nintnonkernelvars = 0;
2117 for(
b = 0;
b < nblocks + 1;
b++ )
2119 bw_nkernelvars[
b] = bw_nintkernelvars[
b];
2120 bw_nnonkernelvars[
b] += bw_nintnonkernelvars[
b];
2121 bw_nintnonkernelvars[
b] = 0;
2127 else if( nintkernelvars == 0 )
2130 nnonkernelvars += nintnonkernelvars;
2131 nintnonkernelvars = 0;
2134 for(
b = 0;
b < nblocks + 1;
b++ )
2136 bw_nnonkernelvars[
b] += bw_nintnonkernelvars[
b];
2137 bw_nintnonkernelvars[
b] = 0;
2142 else if( nkernelvars > nnonkernelvars || nintkernelvars > nintnonkernelvars )
2144 SCIPdebugMsg(
scip,
"There are more kernel variables than not in the kernel\n");
2160 for(
b = 0;
b < nblocks + 1;
b++ )
2162 int contblocksize = bw_ncontkernelvars[
b] + bw_ncontnonkernelvars[
b];
2163 int blocksize = bw_nkernelvars[
b] + bw_nnonkernelvars[
b];
2177 intblocksize = bw_nintkernelvars[
b] + bw_nintnonkernelvars[
b];
2184 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * ncontkernelvars) < (ncontkernelvars + ncontnonkernelvars) )
2187 maxcontkernelsize = ncontkernelvars + ncontnonkernelvars;
2189 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * ncontnonkernelvars) < (ncontkernelvars + ncontnonkernelvars) )
2192 maxcontnonkernelsize = ncontkernelvars + ncontnonkernelvars;
2194 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nkernelvars) < (nkernelvars + nnonkernelvars) )
2197 maxkernelsize = nkernelvars + nnonkernelvars;
2199 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nnonkernelvars) < (nkernelvars + nnonkernelvars) )
2202 maxnonkernelsize = nkernelvars + nnonkernelvars;
2219 maxintkernelsize = 0;
2225 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nintkernelvars) < (nintkernelvars + nintnonkernelvars) )
2228 maxintkernelsize = nintkernelvars + nintnonkernelvars;
2230 if( (
int)
SCIPfloor(
scip,
heurdata->kernelsizefactor * nintnonkernelvars) < (nintkernelvars + nintnonkernelvars) )
2233 maxintnonkernelsize = nintkernelvars + nintnonkernelvars;
2245 bw_contkernelvars, bw_contnonkernelvars, bw_kernelvars, bw_nonkernelvars,
2246 bw_intkernelvars, bw_intnonkernelvars, bestcurrsol, lbvarmap, twolevel, usebestsol,
2248 bw_contnonkernelcount, bw_kernelcount, bw_nonkernelcount, bw_intkernelcount,
2249 bw_intnonkernelcount, bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars,
2250 bw_nintkernelvars, bw_nintnonkernelvars, block2index, varlabels, blklbl_offset,
nvars) );
2255 bw_contkernelvars, bw_contnonkernelvars, bw_kernelvars, bw_nonkernelvars,
NULL,
NULL,
2256 bestcurrsol, lbvarmap, twolevel, usebestsol,
heurdata->usetransprob,
2257 heurdata->translbkernel, bw_contkernelcount, bw_contnonkernelcount, bw_kernelcount,
2258 bw_nonkernelcount,
NULL,
NULL, bw_ncontkernelvars, bw_ncontnonkernelvars, bw_nkernelvars, bw_nnonkernelvars,
2259 NULL,
NULL, block2index, varlabels, blklbl_offset,
nvars) );
2265 &bw_cont_redcost, &bw_redcost, &bw_int_redcost, bw_ncontnonkernelvars, bw_nnonkernelvars,
2266 bw_nintnonkernelvars, twolevel, nblocks) );
2279 for(
b = 0;
b < nblocks + 1;
b++ )
2282 if( bw_nintnonkernelvars[
b] > 0 && bw_nintkernelvars[
b] > 0 )
2287 if( bw_nnonkernelvars[
b] > 0 && bw_nkernelvars[
b] > 0 )
2294 nbuckets += (int)intratio;
2299 nbuckets += (int)binratio;
2308 for(
b = 0;
b < nblocks + 1;
b++ )
2310 if( bw_nnonkernelvars[
b] > 0 && bw_nkernelvars[
b] > 0 )
2318 if( nusedratios > 0 )
2338 bw_contnonkernelvars, bw_nonkernelvars, bw_intnonkernelvars,
2339 bw_ncontnonkernelvars, bw_nnonkernelvars, bw_nintnonkernelvars,
2340 bw_cont_redcost, bw_redcost, bw_int_redcost,
2341 twolevel,
heurdata->redcostlogsort, iters - 1, nblocks) );
2348 for(
b = 0;
b < nblocks + 1;
b++ )
2350 for( l = 0; l < bw_ncontkernelvars[
b]; l++ )
2351 contkernelvars[j++] = bw_contkernelvars[
b][l];
2353 for( l = 0; l < bw_nkernelvars[
b]; l++ )
2354 kernelvars[n++] = bw_kernelvars[
b][l];
2358 for( l = 0; l < bw_nintkernelvars[
b]; l++ )
2359 intkernelvars[m++] = bw_intkernelvars[
b][l];
2362 assert(j == ncontkernelvars);
2363 assert(n == nkernelvars);
2365 assert(m == nintkernelvars);
2371 for( k = 0; k < iters; k++ )
2383 bucket = &bucketlist->
buckets[k];
2407 intkernelvars, nintkernelvars,
var, &found) );
2429 else if( ub >= 0.0 )
2455#ifdef DKS_WRITE_PROBLEMS
2467 subtimelimit = totaltimelimit - timeused;
2468 if( subtimelimit > 1.0 )
2481 if( 1LL > nodes_evenly_dist )
2484 nnodes = nodes_evenly_dist;
2505 if( bucket->
number == 0 )
2515 mipgap += (
heurdata->buckmaxgap / iters) * gapfactor;
2523 mipgap -= (
heurdata->buckmaxgap / iters) * gapfactor;
2545 nbestbucket = bucket->
number;
2552 &kernelvars, &nkernelvars, (
int)maxkernelsize, &intkernelvars, &nintkernelvars, (
int)maxintkernelsize,
2558 SCIPdebugMsg(
scip,
"Bucket reached node limit. No optimal solution available.\n");
2569#ifdef DKS_KERNEL_INFO
2570 fclose(variable_info);
2575 if( nbestbucket > -1 )
2582 bestbucket = &bucketlist->
buckets[nbestbucket];
2586 if( bestsol ==
NULL )
2588 SCIPdebugMsg(
scip,
"Function SCIPgetBestSol() has returned a NULL pointer\n");
2627 if( bucketconss !=
NULL )
2630 if( bw_intnonkernelcount !=
NULL )
2633 if( bw_intkernelcount !=
NULL )
2636 if( intnonkernelvars !=
NULL )
2639 if( intkernelvars !=
NULL )
2642 if( bw_nonkernelcount !=
NULL )
2645 if( bw_kernelcount !=
NULL )
2648 if( bw_contnonkernelcount !=
NULL )
2651 if( bw_contkernelcount !=
NULL )
2654 if( binintvars !=
NULL )
2657 if( nonkernelvars !=
NULL )
2660 if( kernelvars !=
NULL )
2663 if( contnonkernelvars !=
NULL )
2666 if( contkernelvars !=
NULL )
2669 if( bw_intkernelvars !=
NULL )
2671 for(
b = nblocks;
b >= 0;
b-- )
2673 if( bw_intnonkernelvars[
b] !=
NULL )
2675 if( bw_intkernelvars[
b] !=
NULL )
2680 if( bw_kernelvars !=
NULL )
2682 for(
b = nblocks;
b >= 0;
b-- )
2684 if( bw_nonkernelvars[
b] !=
NULL )
2686 if( bw_kernelvars[
b] !=
NULL )
2691 if( bw_contkernelvars !=
NULL )
2693 for(
b = nblocks;
b >= 0;
b-- )
2695 if( bw_contnonkernelvars[
b] !=
NULL )
2697 if( bw_contkernelvars[
b] !=
NULL )
2702 if( bw_intnonkernelvars !=
NULL )
2705 if( bw_intkernelvars !=
NULL )
2708 if( bw_nonkernelvars !=
NULL )
2711 if( bw_kernelvars !=
NULL )
2714 if( bw_contnonkernelvars !=
NULL )
2717 if( bw_contkernelvars !=
NULL )
2720 if( bw_nintnonkernelvars !=
NULL )
2723 if( bw_nintkernelvars !=
NULL )
2726 if( bw_nnonkernelvars !=
NULL )
2729 if( bw_nkernelvars !=
NULL )
2732 if( bw_ncontnonkernelvars !=
NULL )
2735 if( bw_ncontkernelvars !=
NULL )
2738 if( block2index !=
NULL )
2740 if( nblocklabels > 0 )
2749 if( blocklabels !=
NULL )
2752 if( conslabels !=
NULL )
2755 if( varlabels !=
NULL )
2760 if( lbvarmap !=
NULL )
2763 if( bucketlist !=
NULL )
2765 for( k = bucketlist->
nbuckets - 1; k >= 1; k-- )
2773 if( bucketlist !=
NULL )
2815 "maximal number of buckets to be investigated",
2819 "factor with which the initial kernel size can grow max",
2823 "should a constraint be added ensuring that bucket variables are used?",
2827 "should the linking variables in the kernel influence the size of the buckets?",
2831 "should a variable with different lower bound in transformed and original problem be in the kernel?",
2835 "should a variable with max one uplock and one downlock be in the kernel?",
2839 "should dks use the transformed problem?",
2843 "defines the maximum mipgap a bucket can be solved to",
2847 "defines a bound to the linkscore of the decomp",
2851 "defines a maximal share of bin/int variables for a bucket to be respected",
2855 "maximum number of nodes to regard in all subproblems",
2859 "should a two level bucket structure be used if possible?",
2863 "should a decomposition be used if given?",
2867 "should the best solution instead of the LP solution be used?",
2871 "should the bucket variables be sorted by reduced costs in the LP solution?",
2875 "should the heuristic terminate after the first primal solution is found?",
2879 "should the bucket variables be sorted logarithmically by reduced costs in the LP solution?",
2883 "should the next solution at least satisfy the old objective?",
2887 "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_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)
SCIP_RETCODE SCIPgetOrigVarsData(SCIP *scip, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars, int *nimplvars, int *ncontvars)
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)
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)
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)
SCIP_CONS ** SCIPgetOrigConss(SCIP *scip)
SCIP_RETCODE SCIPwriteTransProblem(SCIP *scip, const char *filename, const char *extension, SCIP_Bool genericnames)
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)
#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
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)
#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 (weighted) 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