@@ -220,8 +220,12 @@ HighsLpRelaxation::HighsLpRelaxation(const HighsLpRelaxation& other)
220220
221221void HighsLpRelaxation::loadModel () {
222222 HighsLp lpmodel = *mipsolver.model_ ;
223- lpmodel.col_lower_ = mipsolver.mipdata_ ->domain .col_lower_ ;
224- lpmodel.col_upper_ = mipsolver.mipdata_ ->domain .col_upper_ ;
223+ lpmodel.col_lower_ = (worker_ && mipsolver.mipdata_ ->parallelLockActive ())
224+ ? worker_->globaldom_ ->col_lower_
225+ : mipsolver.mipdata_ ->domain .col_lower_ ;
226+ lpmodel.col_upper_ = (worker_ && mipsolver.mipdata_ ->parallelLockActive ())
227+ ? worker_->globaldom_ ->col_upper_
228+ : mipsolver.mipdata_ ->domain .col_upper_ ;
225229 lpmodel.offset_ = 0 ;
226230 lprows.clear ();
227231 lprows.reserve (lpmodel.num_row_ );
@@ -946,7 +950,9 @@ void HighsLpRelaxation::storeDualInfProof() {
946950 }
947951
948952 HighsDomain& globaldomain =
949- worker_ ? worker_->getGlobalDomain () : mipsolver.mipdata_ ->domain ;
953+ (worker_ && mipsolver.mipdata_ ->parallelLockActive ())
954+ ? worker_->getGlobalDomain ()
955+ : mipsolver.mipdata_ ->domain ;
950956
951957 for (HighsInt i : row_ap.getNonzeros ()) {
952958 double val = row_ap.getValue (i);
@@ -1012,10 +1018,14 @@ void HighsLpRelaxation::storeDualUBProof() {
10121018 dualproofvals.clear ();
10131019
10141020 if (lpsolver.getSolution ().dual_valid ) {
1015- hasdualproof = computeDualProof (
1016- worker_ ? worker_->getGlobalDomain () : mipsolver.mipdata_ ->domain ,
1017- mipsolver.mipdata_ ->upper_limit , dualproofinds, dualproofvals,
1018- dualproofrhs);
1021+ hasdualproof =
1022+ computeDualProof ((worker_ && mipsolver.mipdata_ ->parallelLockActive ())
1023+ ? worker_->getGlobalDomain ()
1024+ : mipsolver.mipdata_ ->domain ,
1025+ (worker_ && mipsolver.mipdata_ ->parallelLockActive ())
1026+ ? worker_->upper_limit
1027+ : mipsolver.mipdata_ ->upper_limit ,
1028+ dualproofinds, dualproofvals, dualproofrhs);
10191029 } else {
10201030 hasdualproof = false ;
10211031 }
@@ -1214,9 +1224,15 @@ HighsLpRelaxation::Status HighsLpRelaxation::run(bool resolve_on_error) {
12141224 HighsLogType::kWarning ,
12151225 " HighsLpRelaxation::run LP is unbounded with no basis, "
12161226 " but not returning Status::kError\n " );
1217- if (info.primal_solution_status == kSolutionStatusFeasible )
1218- mipsolver.mipdata_ ->trySolution (lpsolver.getSolution ().col_value ,
1219- kSolutionSourceUnbounded );
1227+ if (info.primal_solution_status == kSolutionStatusFeasible ) {
1228+ if (!mipsolver.mipdata_ ->parallelLockActive () || !worker_) {
1229+ mipsolver.mipdata_ ->trySolution (lpsolver.getSolution ().col_value ,
1230+ kSolutionSourceUnbounded );
1231+ } else {
1232+ worker_->trySolution (lpsolver.getSolution ().col_value ,
1233+ kSolutionSourceUnbounded );
1234+ }
1235+ }
12201236
12211237 return Status::kUnbounded ;
12221238 case HighsModelStatus::kUnknown :
@@ -1303,7 +1319,9 @@ HighsLpRelaxation::Status HighsLpRelaxation::resolveLp(HighsDomain* domain) {
13031319 HighsCDouble objsum = 0 ;
13041320 bool roundable = true ;
13051321 const HighsDomain& globaldom =
1306- worker_ ? worker_->getGlobalDomain () : mipsolver.mipdata_ ->domain ;
1322+ (worker_ && mipsolver.mipdata_ ->parallelLockActive ())
1323+ ? worker_->getGlobalDomain ()
1324+ : mipsolver.mipdata_ ->domain ;
13071325
13081326 for (HighsInt i : mipsolver.mipdata_ ->integral_cols ) {
13091327 // for the fractionality we assume that LP bounds are not violated
0 commit comments