63 assert(concsolvertype !=
NULL);
65 assert(prefpriodefault >= 0.0 && prefpriodefault <= 1.0);
67 assert(concsolvercreateinst !=
NULL);
68 assert(concsolverdestroyinst !=
NULL);
69 assert(concsolverexec !=
NULL);
70 assert(concsolvercopysolvdata !=
NULL);
71 assert(concsolverstop !=
NULL);
72 assert(concsolversyncwrite !=
NULL);
73 assert(concsolversyncread !=
NULL);
78 (*concsolvertype)->data = data;
79 (*concsolvertype)->ninstances = 0;
80 (*concsolvertype)->concsolvercreateinst = concsolvercreateinst;
81 (*concsolvertype)->concsolverdestroyinst = concsolverdestroyinst;
82 (*concsolvertype)->concsolverinitseeds = concsolverinitseeds;
83 (*concsolvertype)->concsolverexec = concsolverexec;
84 (*concsolvertype)->concsolvercopysolvdata = concsolvercopysolvdata;
85 (*concsolvertype)->concsolverstop = concsolverstop;
86 (*concsolvertype)->concsolversyncwrite = concsolversyncwrite;
87 (*concsolvertype)->concsolversyncread = concsolversyncread;
88 (*concsolvertype)->concsolvertypefreedata = concsolvertypefreedata;
91 (void)
SCIPsnprintf(paramdesc,
SCIP_MAXSTRLEN,
"the preferred number concurrent solvers of type <%s> with respect to the number of threads", name);
93 &(*concsolvertype)->prefprio,
FALSE, prefpriodefault, 0.0, 1.0,
104 assert(concsolvertype !=
NULL);
105 assert(*concsolvertype !=
NULL);
107 if( (*concsolvertype)->concsolvertypefreedata !=
NULL )
108 (*concsolvertype)->concsolvertypefreedata(&(*concsolvertype)->data);
119 assert(concsolvertype !=
NULL);
121 return concsolvertype->
data;
130 assert(concsolvertype !=
NULL);
132 concsolvertype->
data = data;
140 assert(concsolvertype !=
NULL);
142 return concsolvertype->
name;
150 assert(concsolvertype !=
NULL);
170 (*concsolver)->type = concsolvertype;
173 (*concsolver)->nsolsrecvd = 0;
174 (*concsolver)->nsolsshared = 0;
175 (*concsolver)->ntighterbnds = 0;
176 (*concsolver)->ntighterintbnds = 0;
180 (*concsolver)->nsyncs = 0;
181 (*concsolver)->syncdelay = 0.0;
187 (*concsolver)->syncfreq = 0.01 *
set->scip->stat->nnz *
SCIPgetNVars(set->scip) *
set->concurrent_freqinit;
189 (*concsolver)->syncfreq = set->concurrent_freqinit;
191 (*concsolver)->syncdata =
NULL;
193 SCIPdebugMessage(
"concsolver %s initialized sync freq to %f\n", (*concsolver)->name, (*concsolver)->syncfreq);
196 SCIP_CALL( concsolvertype->concsolvercreateinst(set->scip, concsolvertype, *concsolver) );
208 assert(concsolver !=
NULL);
209 assert((*concsolver)->type !=
NULL);
211 assert((*concsolver)->type->concsolverdestroyinst !=
NULL);
213 SCIP_CALL( (*concsolver)->type->concsolverdestroyinst(set->scip, *concsolver) );
214 --(*concsolver)->type->ninstances;
229 assert(concsolver !=
NULL);
231 return concsolver->
data;
240 assert(concsolver !=
NULL);
242 concsolver->
data = data;
250 assert(concsolver !=
NULL);
252 return concsolver->
name;
261 assert(concsolver !=
NULL);
264 if( concsolver->
type->concsolverinitseeds !=
NULL )
265 SCIP_CALL( concsolver->
type->concsolverinitseeds(concsolver, seed) );
275 assert(concsolver !=
NULL);
277 assert(concsolver->
type->concsolverexec !=
NULL);
294 assert(concsolver !=
NULL);
296 assert(concsolver->
type->concsolvercopysolvdata !=
NULL);
298 return concsolver->
type->concsolvercopysolvdata(concsolver, scip);
306 assert(concsolver !=
NULL);
308 assert(concsolver->
type->concsolverstop !=
NULL);
333 assert(concsolver !=
NULL);
335 assert(concsolver->
type->concsolversyncwrite !=
NULL);
336 assert(concsolver->
type->concsolversyncread !=
NULL);
343 concsolvertype = concsolver->
type;
346 assert(syncstore !=
NULL);
350 if( syncdata ==
NULL )
358 SCIP_CALL( concsolvertype->concsolversyncwrite(concsolver, syncstore, syncdata, set->concurrent_nbestsols, set->concurrent_maxnsols, &nsols) );
381 if( concsolver->
nsyncs == 0 )
398 progress =
SCIPrelDiff(prevub - prevlb, newub - newlb);
405 progress =
set->concurrent_targetprogress;
412 if( progress < 0.5 * set->concurrent_targetprogress )
413 freqfactor =
set->concurrent_freqfactor;
414 else if( progress > 2 * set->concurrent_targetprogress )
415 freqfactor = 0.5 + 0.5 /
set->concurrent_freqfactor;
419 SCIPdebugMessage(
"syncfreq is %g and freqfactor is %f due to progress %f\n", concsolver->
syncfreq, freqfactor, progress);
420 newsyncfreq = concsolver->
syncfreq * freqfactor;
435 while( syncdata !=
NULL )
439 SCIP_CALL( concsolvertype->concsolversyncread(concsolver, syncstore, syncdata, &nsols, &ntighterbnds, &ntighterintbnds) );
459 assert(concsolver !=
NULL);
469 assert(concsolver !=
NULL);
482 assert(concsolver !=
NULL);
492 assert(concsolver !=
NULL);
502 assert(concsolver !=
NULL);
512 assert(concsolver !=
NULL);
522 assert(concsolver !=
NULL);
524 return concsolver->
nnodes;
532 assert(concsolver !=
NULL);
542 assert(concsolver !=
NULL);
552 assert(concsolver !=
NULL);
562 assert(concsolver !=
NULL);
572 assert(concsolver !=
NULL);
574 return concsolver->
idx;
SCIP_Bool SCIPsetIsInfinity(SCIP_SET *set, SCIP_Real val)
struct SCIP_ConcSolverTypeData SCIP_CONCSOLVERTYPEDATA
#define SCIP_DECL_CONCSOLVERSYNCREAD(x)
int SCIPboundstoreGetNChgs(SCIP_BOUNDSTORE *boundstore)
int SCIPgetNConcurrentSolvers(SCIP *scip)
SCIP_RETCODE SCIPsyncstoreEnsureAllSynced(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA *syncdata)
SCIP_Real SCIPconcsolverTypeGetPrefPrio(SCIP_CONCSOLVERTYPE *concsolvertype)
SCIP_STATUS SCIPsyncdataGetStatus(SCIP_SYNCDATA *syncdata)
internal methods for clocks and timing issues
SCIP_SYNCDATA * SCIPsyncstoreGetSyncdata(SCIP_SYNCSTORE *syncstore, SCIP_Longint syncnum)
void SCIPconcsolverTypeFree(SCIP_CONCSOLVERTYPE **concsolvertype)
SCIP_Real SCIPsetInfinity(SCIP_SET *set)
SCIP_RETCODE SCIPstopClock(SCIP *scip, SCIP_CLOCK *clck)
SCIP_RETCODE SCIPconcsolverTypeCreate(SCIP_CONCSOLVERTYPE **concsolvertype, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
#define SCIP_DECL_CONCSOLVEREXEC(x)
SCIP_Real SCIPrelDiff(SCIP_Real val1, SCIP_Real val2)
char * SCIPconcsolverGetName(SCIP_CONCSOLVER *concsolver)
int SCIPsnprintf(char *t, int len, const char *s,...)
enum SCIP_Retcode SCIP_RETCODE
SCIP_Longint SCIPconcsolverGetNSolsShared(SCIP_CONCSOLVER *concsolver)
datastructures for concurrent solvers
SCIP_RETCODE SCIPconcsolverSync(SCIP_CONCSOLVER *concsolver, SCIP_SET *set)
SCIP_Longint ntighterbnds
datastructures for concurrent solvers
SCIP_RETCODE SCIPfreeClock(SCIP *scip, SCIP_CLOCK **clck)
#define BMSfreeMemory(ptr)
SCIP_RETCODE SCIPconcsolverCreateInstance(SCIP_SET *set, SCIP_CONCSOLVERTYPE *concsolvertype, SCIP_CONCSOLVER **concsolver)
#define SCIP_DECL_CONCSOLVERDESTROYINST(x)
void SCIPconcsolverSetData(SCIP_CONCSOLVER *concsolver, SCIP_CONCSOLVERDATA *data)
SCIP_Bool SCIPsetIsGE(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPcreateWallClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_SYNCDATA * SCIPsyncstoreGetNextSyncdata(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA *syncdata, SCIP_Real syncfreq, SCIP_Longint writenum, SCIP_Real *delay)
#define SCIP_DECL_CONCSOLVERSTOP(x)
SCIP_Longint SCIPconcsolverGetMemTotal(SCIP_CONCSOLVER *concsolver)
SCIP_RETCODE SCIPconcsolverGetSolvingData(SCIP_CONCSOLVER *concsolver, SCIP *scip)
SCIP_Longint SCIPconcsolverGetNSolsRecvd(SCIP_CONCSOLVER *concsolver)
SCIP_Real SCIPconcsolverGetSolvingTime(SCIP_CONCSOLVER *concsolver)
void SCIPsyncdataSetSyncFreq(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA *syncdata, SCIP_Real syncfreq)
void SCIPconcsolverSetTimeSinceLastSync(SCIP_CONCSOLVER *concsolver, SCIP_Real time)
#define BMSfreeMemoryArray(ptr)
SCIP_Real SCIPconcsolverGetSyncFreq(SCIP_CONCSOLVER *concsolver)
SCIP_CLOCK * totalsynctime
struct SCIP_SyncData SCIP_SYNCDATA
SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
the interface of the boundstore structure
SCIP_RETCODE SCIPconcsolverInitSeeds(SCIP_CONCSOLVER *concsolver, unsigned int seed)
internal methods for global SCIP settings
SCIP main data structure.
#define SCIP_DECL_CONCSOLVERINITSEEDS(x)
SCIP_RETCODE SCIPconcsolverDestroyInstance(SCIP_SET *set, SCIP_CONCSOLVER **concsolver)
SCIP_RETCODE SCIPconcsolverStop(SCIP_CONCSOLVER *concsolver)
SCIP_Longint SCIPconcsolverGetNNodes(SCIP_CONCSOLVER *concsolver)
#define BMSduplicateMemoryArray(ptr, source, num)
SCIP_Longint SCIPconcsolverGetNTighterIntBnds(SCIP_CONCSOLVER *concsolver)
the function declarations for the synchronization store
SCIP_CONCSOLVERTYPE * type
static const char * paramname[]
SCIP_SYNCSTORE * SCIPgetSyncstore(SCIP *scip)
SCIP_Real SCIPsyncdataGetLowerbound(SCIP_SYNCDATA *syncdata)
SCIP_RETCODE SCIPsyncstoreStartSync(SCIP_SYNCSTORE *syncstore, SCIP_Longint syncnum, SCIP_SYNCDATA **syncdata)
SCIP_CONCSOLVERTYPEDATA * data
SCIP_Longint SCIPsyncdataGetMemTotal(SCIP_SYNCDATA *syncdata)
#define SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA(x)
SCIP_CONCSOLVERDATA * SCIPconcsolverGetData(SCIP_CONCSOLVER *concsolver)
datastructures for problem statistics
#define SCIP_DECL_CONCSOLVERTYPEFREEDATA(x)
helper functions for concurrent scip solvers
int SCIPgetNVars(SCIP *scip)
int SCIPsyncdataGetNSynced(SCIP_SYNCDATA *syncdata)
int SCIPconcsolverGetIdx(SCIP_CONCSOLVER *concsolver)
SCIP_Longint ntighterintbnds
SCIP_Real SCIPconcsolverGetSyncTime(SCIP_CONCSOLVER *concsolver)
SCIP_CONCSOLVERDATA * data
SCIP_RETCODE SCIPconcsolverExec(SCIP_CONCSOLVER *concsolver)
SCIP_BOUNDSTORE * SCIPsyncdataGetBoundChgs(SCIP_SYNCDATA *syncdata)
SCIP_RETCODE SCIPaddConcurrentSolver(SCIP *scip, SCIP_CONCSOLVER *concsolver)
SCIP_Real SCIPsyncdataGetSyncFreq(SCIP_SYNCDATA *syncdata)
SCIP_Longint SCIPconcsolverGetNTighterBnds(SCIP_CONCSOLVER *concsolver)
void SCIPconcsolverTypeSetData(SCIP_CONCSOLVERTYPE *concsolvertype, SCIP_CONCSOLVERTYPEDATA *data)
#define BMSallocMemory(ptr)
SCIP_Longint SCIPconcsolverGetNLPIterations(SCIP_CONCSOLVER *concsolver)
SCIP_RETCODE SCIPsyncstoreFinishSync(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA **syncdata)
SCIP_CONCSOLVERTYPEDATA * SCIPconcsolverTypeGetData(SCIP_CONCSOLVERTYPE *concsolvertype)
SCIP_Longint nlpiterations
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_Real SCIPsyncdataGetUpperbound(SCIP_SYNCDATA *syncdata)
#define SCIP_DECL_CONCSOLVERSYNCWRITE(x)
int SCIPsyncstoreGetNSolvers(SCIP_SYNCSTORE *syncstore)
#define SCIP_DECL_CONCSOLVERCREATEINST(x)
SCIP_RETCODE SCIPstartClock(SCIP *scip, SCIP_CLOCK *clck)
struct SCIP_ConcSolverData SCIP_CONCSOLVERDATA
SCIP_Real timesincelastsync
char * SCIPconcsolverTypeGetName(SCIP_CONCSOLVERTYPE *concsolvertype)
memory allocation routines