45 assert(heur1 !=
NULL);
46 assert(heur2 !=
NULL);
76 assert(paramdata !=
NULL);
90 assert(diveset !=
NULL);
128 assert(diveset !=
NULL);
160 assert(heur !=
NULL);
161 assert(diveset !=
NULL);
164 diveset->
heur = heur;
204 unsigned int initialseed,
213 const char* divesetname;
215 assert(diveset !=
NULL);
217 assert(divesetgetscore !=
NULL);
218 assert(heur !=
NULL);
219 assert(blkmem !=
NULL);
222 (*diveset)->blkmem = blkmem;
225 (*diveset)->initialseed = initialseed;
226 (*diveset)->randnumgen =
NULL;
232 (*diveset)->heur =
NULL;
235 (*diveset)->divesetgetscore = divesetgetscore;
238 (*diveset)->sol =
NULL;
239 (*diveset)->divetypemask = divetypemask;
244 paramname,
"minimal relative depth to start diving",
245 &(*diveset)->minreldepth,
TRUE, minreldepth, 0.0, 1.0,
NULL,
NULL) );
249 "maximal relative depth to start diving",
250 &(*diveset)->maxreldepth,
TRUE, maxreldepth, 0.0, 1.0,
NULL,
NULL) );
255 "maximal fraction of diving LP iterations compared to node LP iterations",
261 "additional number of allowed LP iterations",
262 &(*diveset)->maxlpiterofs,
FALSE, maxlpiterofs, 0, INT_MAX,
NULL,
NULL) );
267 "maximal quotient (curlowerbound - lowerbound)/(cutoffbound - lowerbound) where diving is performed (0.0: no limit)",
268 &(*diveset)->maxdiveubquot,
TRUE, maxdiveubquot, 0.0, 1.0,
NULL,
NULL) );
273 "maximal quotient (curlowerbound - lowerbound)/(avglowerbound - lowerbound) where diving is performed (0.0: no limit)",
279 "maximal UBQUOT when no solution was found yet (0.0: no limit)",
280 &(*diveset)->maxdiveubquotnosol,
TRUE, maxdiveubquotnosol, 0.0, 1.0,
NULL,
NULL) );
285 "maximal AVGQUOT when no solution was found yet (0.0: no limit)",
291 "use one level of backtracking if infeasibility is encountered?",
296 "percentage of immediate domain changes during probing to trigger LP resolve",
302 "LP solve frequency for diving heuristics (0: only after enough domain changes have been found)",
303 &(*diveset)->lpsolvefreq,
FALSE, lpsolvefreq, 0, INT_MAX,
309 "should only LP branching candidates be considered instead of the slower but " 310 "more general constraint handler diving variable selection?",
311 &(*diveset)->onlylpbranchcands,
FALSE, onlylpbranchcands,
NULL,
NULL) );
323 return diveset->
heur;
331 assert(diveset !=
NULL);
342 assert(diveset !=
NULL);
352 assert(diveset !=
NULL);
354 return diveset->
name;
386 assert(diveset !=
NULL);
396 assert(diveset !=
NULL);
406 assert(diveset !=
NULL);
416 assert(diveset !=
NULL);
426 assert(diveset !=
NULL);
436 assert(diveset !=
NULL);
446 assert(diveset !=
NULL);
456 assert(diveset !=
NULL);
466 assert(diveset !=
NULL);
476 assert(diveset !=
NULL);
486 assert(diveset !=
NULL);
551 assert(diveset !=
NULL);
561 assert(diveset !=
NULL);
572 assert(diveset !=
NULL);
584 assert(diveset !=
NULL);
595 assert(diveset !=
NULL);
619 assert(*diveset !=
NULL);
620 assert((*diveset)->name !=
NULL);
621 assert((*diveset)->blkmem !=
NULL);
622 assert((*diveset)->randnumgen !=
NULL);
642 assert(diveset->divesetgetscore !=
NULL);
643 assert(candscore !=
NULL);
644 assert(roundup !=
NULL);
645 assert(divecand !=
NULL);
648 SCIP_CALL( diveset->divesetgetscore(set->scip, diveset, divetype, divecand, divecandsol, divecandfrac,
649 candscore, roundup) );
662 assert(heur !=
NULL);
664 assert(set->scip !=
NULL);
666 if( heur->heurcopy !=
NULL )
669 SCIP_CALL( heur->heurcopy(set->scip, heur) );
703 assert(heur !=
NULL);
704 assert(name !=
NULL);
705 assert(desc !=
NULL);
707 assert(freqofs >= 0);
708 assert(heurexec !=
NULL);
713 (*heur)->dispchar = dispchar;
714 (*heur)->priority = priority;
715 (*heur)->freq = freq;
716 (*heur)->freqofs = freqofs;
717 (*heur)->maxdepth = maxdepth;
718 (*heur)->delaypos = -1;
719 (*heur)->timingmask = timingmask;
720 (*heur)->usessubscip = usessubscip;
721 (*heur)->heurcopy = heurcopy;
722 (*heur)->heurfree = heurfree;
723 (*heur)->heurinit = heurinit;
724 (*heur)->heurexit = heurexit;
725 (*heur)->heurinitsol = heurinitsol;
726 (*heur)->heurexitsol = heurexitsol;
727 (*heur)->heurexec = heurexec;
728 (*heur)->heurdata = heurdata;
732 (*heur)->nsolsfound = 0;
733 (*heur)->nbestsolsfound = 0;
734 (*heur)->initialized =
FALSE;
735 (*heur)->divesets =
NULL;
736 (*heur)->ndivesets = 0;
742 &(*heur)->priority,
TRUE, priority, INT_MIN/4, INT_MAX/4,
745 (void)
SCIPsnprintf(paramdesc,
SCIP_MAXSTRLEN,
"frequency for calling primal heuristic <%s> (-1: never, 0: only at depth freqofs)", name);
767 assert(heur !=
NULL);
768 assert(*heur !=
NULL);
769 assert(!(*heur)->initialized);
771 assert((*heur)->divesets !=
NULL || (*heur)->ndivesets == 0);
774 if( (*heur)->heurfree !=
NULL )
776 SCIP_CALL( (*heur)->heurfree(set->scip, *heur) );
779 for( d = 0; d < (*heur)->ndivesets; ++d )
781 assert((*heur)->divesets[d] !=
NULL);
801 assert(heur !=
NULL);
810 if( set->misc_resetstat )
821 if( heur->heurinit !=
NULL )
826 SCIP_CALL( heur->heurinit(set->scip, heur) );
850 assert(heur !=
NULL);
859 if( heur->heurexit !=
NULL )
864 SCIP_CALL( heur->heurexit(set->scip, heur) );
880 assert(heur !=
NULL);
886 set->heurssorted =
FALSE;
890 if( heur->heurinitsol !=
NULL )
895 SCIP_CALL( heur->heurinitsol(set->scip, heur) );
910 assert(heur !=
NULL);
914 if( heur->heurexitsol !=
NULL )
919 SCIP_CALL( heur->heurexitsol(set->scip, heur) );
932 int lpstateforkdepth,
943 execute = heur->
freq >= 0;
951 execute = (heur->
freq > 0 && depth >= heur->
freqofs 962 execute = execute || (depth == heur->
freqofs && heur->
freq == 0);
968 execute = execute || (heur->
delaypos >= 0);
985 execute = execute && (heur->
timingmask & heurtiming) > 0;
996 int lpstateforkdepth,
1006 assert(heur !=
NULL);
1007 assert(heur->heurexec !=
NULL);
1008 assert(heur->
freq >= -1);
1011 assert(
set !=
NULL);
1012 assert(set->scip !=
NULL);
1013 assert(primal !=
NULL);
1015 assert(ndelayedheurs !=
NULL);
1016 assert(result !=
NULL);
1043 SCIP_CALL( heur->heurexec(set->scip, heur, heurtiming, nodeinfeasible, result) );
1055 SCIPerrorMessage(
"execution method of primal heuristic <%s> returned invalid result <%d>\n",
1056 heur->
name, *result);
1068 set->heurssorted =
FALSE;
1076 SCIPsetDebugMsg(
set,
"delaying execution of primal heuristic <%s> in depth %d (delaypos: %d), heur was%s delayed before, had delaypos %d\n",
1080 if( heur->
delaypos != *ndelayedheurs )
1083 set->heurssorted =
FALSE;
1096 assert(heur !=
NULL);
1107 assert(heur !=
NULL);
1120 assert(heur !=
NULL);
1122 heur->heurcopy = heurcopy;
1131 assert(heur !=
NULL);
1133 heur->heurfree = heurfree;
1142 assert(heur !=
NULL);
1144 heur->heurinit = heurinit;
1153 assert(heur !=
NULL);
1155 heur->heurexit = heurexit;
1164 assert(heur !=
NULL);
1166 heur->heurinitsol = heurinitsol;
1175 assert(heur !=
NULL);
1177 heur->heurexitsol = heurexitsol;
1185 assert(heur !=
NULL);
1195 assert(heur !=
NULL);
1205 assert(heur !=
NULL);
1215 assert(heur !=
NULL);
1226 assert(heur !=
NULL);
1236 assert(heur !=
NULL);
1246 assert(heur !=
NULL);
1258 assert(heur !=
NULL);
1259 assert(
set !=
NULL);
1262 set->heurssorted =
FALSE;
1270 assert(heur !=
NULL);
1281 assert(heur !=
NULL);
1291 assert(heur !=
NULL);
1301 assert(heur !=
NULL);
1311 assert(heur !=
NULL);
1321 assert(heur !=
NULL);
1331 assert(heur !=
NULL);
1341 assert(heur !=
NULL);
1352 assert(heur !=
NULL);
1363 assert(heur !=
NULL);
1373 assert(heur !=
NULL);
1383 assert(heur !=
NULL);
1393 assert(heur !=
NULL);
enum SCIP_Result SCIP_RESULT
SCIP_Bool onlylpbranchcands
SCIP_HEURTIMING SCIPheurGetTimingmask(SCIP_HEUR *heur)
SCIP_RETCODE SCIPrandomCreate(SCIP_RANDNUMGEN **randnumgen, BMS_BLKMEM *blkmem, unsigned int initialseed)
void SCIPheurSetInitsol(SCIP_HEUR *heur, SCIP_DECL_HEURINITSOL((*heurinitsol)))
static SCIP_DECL_PARAMCHGD(paramChgdHeurPriority)
#define SCIP_DECL_HEURINITSOL(x)
int SCIPdivesetGetMinSolutionDepth(SCIP_DIVESET *diveset)
int SCIPheurGetPriority(SCIP_HEUR *heur)
SCIP_Real SCIPheurGetSetupTime(SCIP_HEUR *heur)
SCIP_RETCODE SCIPheurFree(SCIP_HEUR **heur, SCIP_SET *set)
#define BMSfreeMemoryArrayNull(ptr)
SCIP_RETCODE SCIPdivesetGetScore(SCIP_DIVESET *diveset, SCIP_SET *set, SCIP_DIVETYPE divetype, SCIP_VAR *divecand, SCIP_Real divecandsol, SCIP_Real divecandfrac, SCIP_Real *candscore, SCIP_Bool *roundup)
SCIP_Longint SCIPdivesetGetNBacktracks(SCIP_DIVESET *diveset)
SCIP_Longint totalnbacktracks
SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
static void divesetFree(SCIP_DIVESET **diveset)
SCIP_Bool SCIPdivesetUseBacktrack(SCIP_DIVESET *diveset)
SCIP_Longint SCIPheurGetNBestSolsFound(SCIP_HEUR *heur)
internal methods for clocks and timing issues
unsigned int SCIP_HEURTIMING
void SCIPheurSetExitsol(SCIP_HEUR *heur, SCIP_DECL_HEUREXITSOL((*heurexitsol)))
struct SCIP_ParamData SCIP_PARAMDATA
SCIP_Real SCIPdivesetGetUbQuot(SCIP_DIVESET *diveset)
int SCIPdivesetGetMaxLPIterOffset(SCIP_DIVESET *diveset)
SCIP_DIVESET ** SCIPheurGetDivesets(SCIP_HEUR *heur)
SCIP_Real SCIPdivesetGetAvgQuotNoSol(SCIP_DIVESET *diveset)
static SCIP_RETCODE heurAddDiveset(SCIP_HEUR *heur, SCIP_DIVESET *diveset)
void SCIPclockStop(SCIP_CLOCK *clck, SCIP_SET *set)
void SCIPclockStart(SCIP_CLOCK *clck, SCIP_SET *set)
int SCIPsnprintf(char *t, int len, const char *s,...)
SCIP_RETCODE SCIPheurExec(SCIP_HEUR *heur, SCIP_SET *set, SCIP_PRIMAL *primal, int depth, int lpstateforkdepth, SCIP_HEURTIMING heurtiming, SCIP_Bool nodeinfeasible, int *ndelayedheurs, SCIP_RESULT *result)
#define SCIP_DECL_HEURCOPY(x)
enum SCIP_Retcode SCIP_RETCODE
#define SCIP_DECL_HEUREXEC(x)
SCIP_Real SCIPdivesetGetMaxRelDepth(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPheurInitsol(SCIP_HEUR *heur, SCIP_SET *set)
int SCIPheurGetFreqofs(SCIP_HEUR *heur)
void SCIPheurSetPriority(SCIP_HEUR *heur, SCIP_SET *set, int priority)
struct SCIP_HeurData SCIP_HEURDATA
SCIP_Longint SCIPdivesetGetNLPIterations(SCIP_DIVESET *diveset)
#define BMSallocMemoryArray(ptr, num)
SCIP_Bool SCIPheurUsesSubscip(SCIP_HEUR *heur)
unsigned int SCIP_DIVETYPE
SCIP_Real SCIPdivesetGetMinRelDepth(SCIP_DIVESET *diveset)
internal methods for handling parameter settings
SCIP_RETCODE SCIPheurCopyInclude(SCIP_HEUR *heur, SCIP_SET *set)
int SCIPdivesetGetNSolutionCalls(SCIP_DIVESET *diveset)
void SCIPclockEnableOrDisable(SCIP_CLOCK *clck, SCIP_Bool enable)
SCIP_Real SCIPdivesetGetAvgSolutionDepth(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPheurCreate(SCIP_HEUR **heur, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, char dispchar, int priority, int freq, int freqofs, int maxdepth, SCIP_HEURTIMING timingmask, SCIP_Bool usessubscip, SCIP_DECL_HEURCOPY((*heurcopy)), SCIP_DECL_HEURFREE((*heurfree)), SCIP_DECL_HEURINIT((*heurinit)), SCIP_DECL_HEUREXIT((*heurexit)), SCIP_DECL_HEURINITSOL((*heurinitsol)), SCIP_DECL_HEUREXITSOL((*heurexitsol)), SCIP_DECL_HEUREXEC((*heurexec)), SCIP_HEURDATA *heurdata)
void SCIPheurSetData(SCIP_HEUR *heur, SCIP_HEURDATA *heurdata)
#define BMSfreeMemory(ptr)
#define SCIP_DECL_DIVESETGETSCORE(x)
void SCIPheurSetFreq(SCIP_HEUR *heur, int freq)
SCIP_Bool SCIPdivesetUseOnlyLPBranchcands(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPdivesetReset(SCIP_DIVESET *diveset, SCIP_SET *set)
internal methods for collecting primal CIP solutions and primal informations
#define SCIP_HEURTIMING_AFTERPSEUDOPLUNGE
SCIP_Real SCIPdivesetGetMaxLPIterQuot(SCIP_DIVESET *diveset)
SCIP_Real maxdiveavgquotnosol
void SCIPdivesetUpdateLPStats(SCIP_DIVESET *diveset, SCIP_STAT *stat, SCIP_Longint niterstoadd)
SCIP_RETCODE SCIPsetHeurPriority(SCIP *scip, SCIP_HEUR *heur, int priority)
SCIP_HEUR * SCIPdivesetGetHeur(SCIP_DIVESET *diveset)
int SCIPdivesetGetMaxSolutionDepth(SCIP_DIVESET *diveset)
void SCIPrandomFree(SCIP_RANDNUMGEN **randnumgen)
SCIP_HEURTIMING timingmask
const char * SCIPheurGetName(SCIP_HEUR *heur)
#define BMSfreeMemoryArray(ptr)
int SCIPheurGetMaxdepth(SCIP_HEUR *heur)
SCIP_Longint nbestsolsfound
#define SCIP_HEURTIMING_AFTERLPNODE
void SCIPclockReset(SCIP_CLOCK *clck)
int SCIPdivesetGetMaxDepth(SCIP_DIVESET *diveset)
SCIP_Real SCIPdivesetGetAvgQuot(SCIP_DIVESET *diveset)
SCIP_Real SCIPdivesetGetAvgDepth(SCIP_DIVESET *diveset)
const char * SCIPheurGetDesc(SCIP_HEUR *heur)
SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
void SCIPheurSetCopy(SCIP_HEUR *heur, SCIP_DECL_HEURCOPY((*heurcopy)))
SCIP_Real lpresolvedomchgquot
SCIP_RANDNUMGEN * randnumgen
int SCIPheurGetFreq(SCIP_HEUR *heur)
internal methods for global SCIP settings
#define SCIP_HEURTIMING_DURINGPRESOLLOOP
#define SCIP_HEURTIMING_BEFOREPRESOL
SCIP_RETCODE SCIPsetAddIntParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_Real SCIPdivesetGetLPResolveDomChgQuot(SCIP_DIVESET *diveset)
int SCIPheurGetNDivesets(SCIP_HEUR *heur)
SCIP_Longint SCIPheurGetNCalls(SCIP_HEUR *heur)
SCIP_Bool SCIPdivesetSupportsType(SCIP_DIVESET *diveset, SCIP_DIVETYPE divetype)
SCIP_Longint nlpiterations
#define BMSduplicateMemoryArray(ptr, source, num)
SCIP_RETCODE SCIPclockCreate(SCIP_CLOCK **clck, SCIP_CLOCKTYPE clocktype)
#define BMSfreeBlockMemory(mem, ptr)
SCIP_Longint totalsoldepth
datastructures for primal heuristics
public data structures and miscellaneous methods
SCIP_Longint ndivesetlpiterations
void SCIPdivesetUpdateStats(SCIP_DIVESET *diveset, SCIP_STAT *stat, int depth, int nprobingnodes, int nbacktracks, SCIP_Longint nsolsfound, SCIP_Longint nbestsolsfound, SCIP_Bool leavesol)
SCIP_Real SCIPdivesetGetUbQuotNoSol(SCIP_DIVESET *diveset)
static const char * paramname[]
SCIP_RANDNUMGEN * SCIPdivesetGetRandnumgen(SCIP_DIVESET *diveset)
void SCIPclockFree(SCIP_CLOCK **clck)
SCIP_Bool SCIPheurShouldBeExecuted(SCIP_HEUR *heur, int depth, int lpstateforkdepth, SCIP_HEURTIMING heurtiming, SCIP_Bool *delayed)
SCIP_RETCODE SCIPheurInit(SCIP_HEUR *heur, SCIP_SET *set)
void SCIPheurSetFree(SCIP_HEUR *heur, SCIP_DECL_HEURFREE((*heurfree)))
void SCIPheurEnableOrDisableClocks(SCIP_HEUR *heur, SCIP_Bool enable)
SCIP_DIVETYPE divetypemask
#define SCIP_MAXTREEDEPTH
int SCIPparamGetInt(SCIP_PARAM *param)
void SCIPdivesetSetWorkSolution(SCIP_DIVESET *diveset, SCIP_SOL *sol)
SCIP_DECL_SORTPTRCOMP(SCIPheurComp)
void SCIPheurSetExit(SCIP_HEUR *heur, SCIP_DECL_HEUREXIT((*heurexit)))
#define SCIP_DECL_HEUREXIT(x)
SCIP_RETCODE SCIPheurExit(SCIP_HEUR *heur, SCIP_SET *set)
public methods for message output
#define SCIP_DECL_HEURINIT(x)
#define SCIP_HEURTIMING_AFTERPSEUDONODE
SCIP_Longint nbestsolsfound
void SCIPheurSetInit(SCIP_HEUR *heur, SCIP_DECL_HEURINIT((*heurinit)))
char SCIPheurGetDispchar(SCIP_HEUR *heur)
SCIP_Longint nbestsolsfound
void SCIPheurSetTimingmask(SCIP_HEUR *heur, SCIP_HEURTIMING timingmask)
#define SCIP_DECL_HEURFREE(x)
#define BMSallocMemory(ptr)
#define BMSreallocMemoryArray(ptr, num)
SCIP_Longint SCIPheurGetNSolsFound(SCIP_HEUR *heur)
SCIP_Longint SCIPdivesetGetSolSuccess(SCIP_DIVESET *diveset)
int SCIPsetInitializeRandomSeed(SCIP_SET *set, int initialseedvalue)
#define SCIP_HEURTIMING_AFTERLPPLUNGE
#define BMSallocBlockMemory(mem, ptr)
SCIP_Bool SCIPheurIsInitialized(SCIP_HEUR *heur)
common defines and data types used in all packages of SCIP
struct BMS_BlkMem BMS_BLKMEM
SCIP_RETCODE SCIPsetAddRealParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
internal methods for primal heuristics
SCIP_RETCODE SCIPheurExitsol(SCIP_HEUR *heur, SCIP_SET *set)
SCIP_RETCODE SCIPdivesetCreate(SCIP_DIVESET **diveset, SCIP_HEUR *heur, const char *name, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, SCIP_Real minreldepth, SCIP_Real maxreldepth, SCIP_Real maxlpiterquot, SCIP_Real maxdiveubquot, SCIP_Real maxdiveavgquot, SCIP_Real maxdiveubquotnosol, SCIP_Real maxdiveavgquotnosol, SCIP_Real lpresolvedomchgquot, int lpsolvefreq, int maxlpiterofs, unsigned int initialseed, SCIP_Bool backtrack, SCIP_Bool onlylpbranchcands, SCIP_DIVETYPE divetypemask, SCIP_DECL_DIVESETGETSCORE((*divesetgetscore)))
SCIP_Real SCIPheurGetTime(SCIP_HEUR *heur)
SCIP_RETCODE SCIPsetAddBoolParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
#define SCIP_DECL_HEUREXITSOL(x)
int SCIPdivesetGetNCalls(SCIP_DIVESET *diveset)
SCIP_SOL * SCIPdivesetGetWorkSolution(SCIP_DIVESET *diveset)
SCIP_Real maxdiveubquotnosol
SCIP_Longint SCIPdivesetGetNProbingNodes(SCIP_DIVESET *diveset)
int SCIPdivesetGetLPSolveFreq(SCIP_DIVESET *diveset)
SCIP_Longint totaldivesetdepth
const char * SCIPdivesetGetName(SCIP_DIVESET *diveset)
int SCIPdivesetGetMinDepth(SCIP_DIVESET *diveset)