@@ -245,7 +245,7 @@ void HighsMipSolver::run() {
245245 printf (
246246 " master_worker lprelaxation_ member with address %p, %d "
247247 " columns, and %d rows\n " ,
248- ( void *)& master_worker.lprelaxation_ ,
248+ master_worker.lprelaxation_ ,
249249 int (master_worker.lprelaxation_ ->getLpSolver ().getNumCol ()),
250250 int (mipdata_->lps .at (0 ).getLpSolver ().getNumRow ()));
251251
@@ -317,8 +317,9 @@ void HighsMipSolver::run() {
317317 worker.globaldom_ ->addCutpool (*worker.cutpool_ );
318318 assert (worker.globaldom_ ->getDomainChangeStack ().empty ());
319319 worker.globaldom_ ->addConflictPool (*worker.conflictpool_ );
320- worker.resetSearch ();
321320 worker.lprelaxation_ ->setMipWorker (worker);
321+ worker.resetSearch ();
322+ worker.resetSepa ();
322323 };
323324
324325 auto createNewWorker = [&](HighsInt i) {
@@ -350,14 +351,18 @@ void HighsMipSolver::run() {
350351 mipdata_->implications .cleanupVarbounds (col);
351352
352353 mipdata_->domain .setDomainChangeStack (std::vector<HighsDomainChange>());
354+ if (!mipdata_->hasMultipleWorkers ())
355+ master_worker.search_ptr_ ->resetLocalDomain ();
353356 mipdata_->domain .clearChangedCols ();
354357 mipdata_->removeFixedIndices ();
355358 analysis_.mipTimerStop (kMipClockUpdateLocalDomain );
356359 }
357360 for (HighsMipWorker& worker : mipdata_->workers ) {
358361 for (HighsInt i = 0 ; i < numCol (); ++i) {
359- assert (mipdata_->domain .col_lower_ [i] == worker.globaldom_ ->col_lower_ [i]);
360- assert (mipdata_->domain .col_upper_ [i] == worker.globaldom_ ->col_upper_ [i]);
362+ assert (mipdata_->domain .col_lower_ [i] ==
363+ worker.globaldom_ ->col_lower_ [i]);
364+ assert (mipdata_->domain .col_upper_ [i] ==
365+ worker.globaldom_ ->col_upper_ [i]);
361366 }
362367 }
363368 };
@@ -375,10 +380,8 @@ void HighsMipSolver::run() {
375380 createNewWorker (i);
376381 }
377382
378- master_worker.resetSepa ();
379383 HighsSearch& search = *master_worker.search_ptr_ ;
380384 mipdata_->debugSolution .registerDomain (search.getLocalDomain ());
381- HighsSeparation& sepa = *master_worker.sepa_ptr_ ;
382385
383386 analysis_.mipTimerStart (kMipClockSearch );
384387 search.installNode (mipdata_->nodequeue .popBestBoundNode ());
@@ -476,14 +479,16 @@ void HighsMipSolver::run() {
476479 mipdata_->domain .getDomainChangeStack ()) {
477480 worker.getGlobalDomain ().changeBound (
478481 domchg, HighsDomain::Reason::unspecified ());
479- }
482+ }
480483 worker.getGlobalDomain ().setDomainChangeStack (
481484 std::vector<HighsDomainChange>());
482- worker.getGlobalDomain ().clearChangedCols ();
483485 worker.search_ptr_ ->resetLocalDomain ();
486+ worker.getGlobalDomain ().clearChangedCols ();
484487 for (HighsInt i = 0 ; i < numCol (); ++i) {
485- assert (mipdata_->domain .col_lower_ [i] == worker.globaldom_ ->col_lower_ [i]);
486- assert (mipdata_->domain .col_upper_ [i] == worker.globaldom_ ->col_upper_ [i]);
488+ assert (mipdata_->domain .col_lower_ [i] ==
489+ worker.globaldom_ ->col_lower_ [i]);
490+ assert (mipdata_->domain .col_upper_ [i] ==
491+ worker.globaldom_ ->col_upper_ [i]);
487492 }
488493 }
489494 }
@@ -881,8 +886,8 @@ void HighsMipSolver::run() {
881886 std::vector<HighsSearch::NodeResult> dive_results (
882887 mipdata_->workers .size (), HighsSearch::NodeResult::kBranched );
883888 setParallelLock (true );
884- if ( mipdata_->workers .size () > 1 ) {
885- for ( int i = 0 ; i < mipdata_->workers . size (); i++ ) {
889+ for (HighsInt i = 0 ; i != mipdata_->workers .size (); ++i ) {
890+ if ( mipdata_->hasMultipleWorkers () ) {
886891 tg.spawn ([&, i]() {
887892 if (!mipdata_->workers [i].search_ptr_ ->hasNode () ||
888893 mipdata_->workers [i].search_ptr_ ->currentNodePruned ()) {
@@ -892,14 +897,17 @@ void HighsMipSolver::run() {
892897 dive_times[i] += analysis_.mipTimerRead (kMipClockNodeSearch );
893898 }
894899 });
895- }
896- tg.taskWait ();
897- } else {
898- if (!search.currentNodePruned ()) {
899- dive_results[0 ] = search.dive ();
900- dive_times[0 ] += analysis_.mipTimerRead (kMipClockNodeSearch );
900+ } else {
901+ if (!mipdata_->workers [i].search_ptr_ ->hasNode () ||
902+ mipdata_->workers [i].search_ptr_ ->currentNodePruned ()) {
903+ dive_times[i] = -1 ;
904+ } else {
905+ dive_results[i] = mipdata_->workers [i].search_ptr_ ->dive ();
906+ dive_times[i] += analysis_.mipTimerRead (kMipClockNodeSearch );
907+ }
901908 }
902909 }
910+ if (mipdata_->hasMultipleWorkers ()) tg.taskWait ();
903911 analysis_.mipTimerStop (kMipClockTheDive );
904912 setParallelLock (false );
905913 bool suboptimal = false ;
@@ -1065,9 +1073,6 @@ void HighsMipSolver::run() {
10651073 break ;
10661074 }
10671075
1068- // set local global domains of all workers to copy changes of global
1069- if (mipdata_->hasMultipleWorkers ()) resetWorkerDomains ();
1070-
10711076 double prev_lower_bound = mipdata_->lower_bound ;
10721077
10731078 mipdata_->lower_bound = std::min (mipdata_->upper_bound ,
@@ -1080,8 +1085,11 @@ void HighsMipSolver::run() {
10801085 mipdata_->printDisplayLine ();
10811086 if (mipdata_->nodequeue .empty ()) break ;
10821087
1088+ // set local global domains of all workers to copy changes of global
1089+ if (mipdata_->hasMultipleWorkers ()) resetWorkerDomains ();
10831090 // flush all changes made to the global domain
10841091 resetGlobalDomain ();
1092+ if (!mipdata_->hasMultipleWorkers ()) search.resetLocalDomain ();
10851093
10861094 if (!submip && mipdata_->num_nodes >= nextCheck) {
10871095 auto nTreeRestarts = mipdata_->numRestarts - mipdata_->numRestartsRoot ;
@@ -1203,6 +1211,7 @@ void HighsMipSolver::run() {
12031211 break ;
12041212 }
12051213 } // while(search.hasNode())
1214+ syncSolutions ();
12061215 analysis_.mipTimerStop (kMipClockSearch );
12071216
12081217 cleanupSolve ();
0 commit comments