@@ -137,7 +137,7 @@ void HighsMipSolver::run() {
137137 // Initialize master worker.
138138 // Now the worker lives in mipdata.
139139 // The master worker is used in evaluateRootNode.
140- mipdata_->workers .emplace_back (*this , mipdata_->lp , mipdata_->domain ,
140+ mipdata_->workers .emplace_back (*this , & mipdata_->lp , mipdata_->domain ,
141141 &mipdata_->cutpool , mipdata_->conflictPool );
142142
143143 HighsMipWorker& master_worker = mipdata_->workers .at (0 );
@@ -243,7 +243,7 @@ void HighsMipSolver::run() {
243243 " master_worker lprelaxation_ member with address %p, %d "
244244 " columns, and %d rows\n " ,
245245 (void *)&master_worker.lprelaxation_ ,
246- int (master_worker.lprelaxation_ . getLpSolver ().getNumCol ()),
246+ int (master_worker.lprelaxation_ -> getLpSolver ().getNumCol ()),
247247 int (mipdata_->lps .at (0 ).getLpSolver ().getNumRow ()));
248248
249249 std::shared_ptr<const HighsBasis> basis;
@@ -318,20 +318,57 @@ void HighsMipSolver::run() {
318318 const HighsInt num_worker = mip_search_concurrency - 1 ;
319319 highs::parallel::TaskGroup tg;
320320
321+ auto recreatePools = [&](HighsInt index, HighsMipWorker& worker) -> void {
322+ HighsCutPool* p = &mipdata_->cutpools .at (index);
323+ p->~HighsCutPool ();
324+ ::new (static_cast <void *>(p))
325+ HighsCutPool (numCol (), options_mip_->mip_pool_age_limit ,
326+ options_mip_->mip_pool_soft_limit , index);
327+ mipdata_->conflictpools [index] =
328+ HighsConflictPool (5 * options_mip_->mip_pool_age_limit ,
329+ options_mip_->mip_pool_soft_limit );
330+ worker.conflictpool_ = mipdata_->conflictpools [index];
331+ };
332+
333+ auto recreateLpAndDomains = [&](HighsInt index, HighsMipWorker& worker) {
334+ HighsLpRelaxation* p = &mipdata_->lps .at (index);
335+ p->~HighsLpRelaxation ();
336+ ::new (p) HighsLpRelaxation (mipdata_->lp , index);
337+ mipdata_->domains [index] = HighsDomain (mipdata_->domain );
338+ worker.globaldom_ = mipdata_->domains .at (index);
339+ };
340+
341+ // (Re-)Initialise local cut and conflict pool for master worker
342+ if (mip_search_concurrency > 1 ) {
343+ if (mipdata_->numRestarts <= mipdata_->numRestartsRoot ) {
344+ mipdata_->cutpools .emplace_back (numCol (),
345+ options_mip_->mip_pool_age_limit ,
346+ options_mip_->mip_pool_soft_limit , 1 );
347+ master_worker.cutpool_ = &mipdata_->cutpools .back ();
348+ mipdata_->conflictpools .emplace_back (5 * options_mip_->mip_pool_age_limit ,
349+ options_mip_->mip_pool_soft_limit );
350+ master_worker.conflictpool_ = mipdata_->conflictpools .back ();
351+ } else {
352+ recreatePools (1 , master_worker);
353+ }
354+ }
355+
356+ // Create / re-initialise workers
321357 for (int i = 1 ; i < mip_search_concurrency; i++) {
322358 if (mipdata_->numRestarts <= mipdata_->numRestartsRoot ) {
323359 mipdata_->domains .emplace_back (mipdata_->domain );
324360 mipdata_->lps .emplace_back (mipdata_->lp , i);
325- mipdata_->cutpools .emplace_back (
326- numCol (), options_mip_->mip_pool_age_limit ,
327- options_mip_->mip_pool_soft_limit , i);
328- mipdata_->conflictpools .emplace_back (
329- 5 * options_mip_->mip_pool_age_limit ,
330- options_mip_->mip_pool_soft_limit );
361+ mipdata_->cutpools .emplace_back (numCol (),
362+ options_mip_->mip_pool_age_limit ,
363+ options_mip_->mip_pool_soft_limit , i);
364+ mipdata_->conflictpools .emplace_back (5 * options_mip_->mip_pool_age_limit ,
365+ options_mip_->mip_pool_soft_limit );
331366 mipdata_->workers .emplace_back (
332- *this , mipdata_->lps .back (), mipdata_->domains .back (),
367+ *this , & mipdata_->lps .back (), mipdata_->domains .back (),
333368 &mipdata_->cutpools .back (), mipdata_->conflictpools .back ());
334369 } else {
370+ recreatePools (i + 1 , mipdata_->workers .at (i));
371+ recreateLpAndDomains (i, mipdata_->workers .at (i));
335372 mipdata_->workers [i].resetSearch ();
336373 }
337374 }
0 commit comments