@@ -414,7 +414,7 @@ void HighsMipSolver::run() {
414414 };
415415
416416 auto setParallelLock = [&](bool lock) -> void {
417- if (mipdata_->workers . size () <= 1 ) return ;
417+ if (! mipdata_->hasMultipleWorkers () ) return ;
418418 mipdata_->parallel_lock = lock;
419419 for (HighsConflictPool& conflictpool : mipdata_->conflictpools ) {
420420 conflictpool.setAgeLock (lock);
@@ -437,7 +437,8 @@ void HighsMipSolver::run() {
437437 };
438438
439439 auto syncPools = [&]() -> void {
440- if (mipdata_->workers .size () <= 1 || mipdata_->parallelLockActive ()) return ;
440+ if (!mipdata_->hasMultipleWorkers () || mipdata_->parallelLockActive ())
441+ return ;
441442 for (HighsInt i = 1 ; i < mipdata_->conflictpools .size (); ++i) {
442443 mipdata_->conflictpools [i].syncConflictPool (mipdata_->conflictPool );
443444 }
@@ -447,25 +448,25 @@ void HighsMipSolver::run() {
447448 };
448449
449450 auto syncGlobalDomain = [&]() -> void {
450- if (mipdata_->workers . size () <= 1 ) return ;
451+ if (! mipdata_->hasMultipleWorkers () ) return ;
451452 for (HighsMipWorker& worker : mipdata_->workers ) {
452453 const auto & domchgstack = worker.globaldom_ .getDomainChangeStack ();
453454 for (const HighsDomainChange& domchg : domchgstack) {
454455 if ((domchg.boundtype == HighsBoundType::kLower &&
455456 domchg.boundval > mipdata_->domain .col_lower_ [domchg.column ]) ||
456457 (domchg.boundtype == HighsBoundType::kUpper &&
457- domchg.boundval < mipdata_->domain .col_upper_ [domchg.column ])) {
458- mipdata_->domain .changeBound (domchg,
459- HighsDomain::Reason::unspecified ());
460- }
458+ domchg.boundval < mipdata_->domain .col_upper_ [domchg.column ])) {
459+ mipdata_->domain .changeBound (domchg,
460+ HighsDomain::Reason::unspecified ());
461+ }
461462 }
462463 }
463464 };
464465
465466 auto resetDomains = [&]() -> void {
466467 search.resetLocalDomain ();
467468 mipdata_->domain .clearChangedCols ();
468- if (mipdata_->workers . size () <= 1 ) return ;
469+ if (! mipdata_->hasMultipleWorkers () ) return ;
469470 for (HighsInt i = 1 ; i < mip_search_concurrency; i++) {
470471 mipdata_->domains [i] = mipdata_->domain ;
471472 mipdata_->workers [i].globaldom_ = mipdata_->domains [i];
@@ -716,6 +717,21 @@ void HighsMipSolver::run() {
716717 }
717718 }
718719
720+ // Handle case where all nodes have been pruned (and lb hasn't been updated
721+ // due to parallelism)
722+ // TODO MT: Change the if statement
723+ // if (mipdata_->hasMultipleWorkers() && num_search_indices == 0) {
724+ if (mipdata_->hasMultipleWorkers () &&
725+ (num_search_indices == 0 || search_indices[0 ] != 0 )) {
726+ double prev_lower_bound = mipdata_->lower_bound ;
727+ mipdata_->lower_bound = std::min (mipdata_->upper_bound ,
728+ mipdata_->nodequeue .getBestLowerBound ());
729+ if (!submip && (mipdata_->lower_bound != prev_lower_bound))
730+ mipdata_->updatePrimalDualIntegral (
731+ prev_lower_bound, mipdata_->lower_bound , mipdata_->upper_bound ,
732+ mipdata_->upper_bound );
733+ }
734+
719735 if (mipdata_->checkLimits ()) {
720736 analysis_.mipTimerStop (kMipClockNodePrunedLoop );
721737 return std::make_pair (true , false );
@@ -926,7 +942,7 @@ void HighsMipSolver::run() {
926942 break ;
927943 }
928944
929- if (!mipdata_->parallelLockActive ()) {
945+ if (!mipdata_->hasMultipleWorkers ()) {
930946 HighsInt numPlungeNodes = mipdata_->num_nodes - plungestart;
931947 if (numPlungeNodes >= 100 ) break ;
932948
@@ -937,7 +953,7 @@ void HighsMipSolver::run() {
937953 if (!backtrack_plunge) break ;
938954 }
939955
940- if (!mipdata_->parallelLockActive ()) assert (search.hasNode ());
956+ if (!mipdata_->hasMultipleWorkers ()) assert (search.hasNode ());
941957
942958 analysis_.mipTimerStart (kMipClockPerformAging2 );
943959 for (HighsConflictPool& conflictpool : mipdata_->conflictpools ) {
@@ -952,7 +968,7 @@ void HighsMipSolver::run() {
952968 mipdata_->workers [i].search_ptr_ ->flushStatistics ();
953969 }
954970 mipdata_->printDisplayLine ();
955- if (mipdata_->parallelLockActive ()) break ;
971+ if (mipdata_->hasMultipleWorkers ()) break ;
956972 // printf("continue plunging due to good estimate\n");
957973 } // while (true)
958974 analysis_.mipTimerStop (kMipClockDive );
0 commit comments