Skip to content

Commit f1ea4bf

Browse files
committed
Add more calls to worker in lprelax
1 parent 917d61f commit f1ea4bf

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

highs/mip/HighsLpRelaxation.cpp

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,12 @@ HighsLpRelaxation::HighsLpRelaxation(const HighsLpRelaxation& other)
220220

221221
void 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

highs/mip/HighsMipSolver.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,12 @@ void HighsMipSolver::run() {
350350
mipdata_->removeFixedIndices();
351351
analysis_.mipTimerStop(kMipClockUpdateLocalDomain);
352352
}
353+
for (HighsMipWorker& worker : mipdata_->workers) {
354+
for (HighsInt i = 0; i < numCol(); ++i) {
355+
assert(mipdata_->domain.col_lower_[i] == worker.globaldom_->col_lower_[i]);
356+
assert(mipdata_->domain.col_upper_[i] == worker.globaldom_->col_upper_[i]);
357+
}
358+
}
353359
};
354360

355361
// TODO: Should we be propagating this first?
@@ -461,6 +467,7 @@ void HighsMipSolver::run() {
461467
// TODO MT: Is it simpler to just copy the domain each time
462468
if (mipdata_->hasMultipleWorkers()) {
463469
for (HighsMipWorker& worker : mipdata_->workers) {
470+
worker.globaldom_->backtrackToGlobal();
464471
for (const HighsDomainChange& domchg :
465472
mipdata_->domain.getDomainChangeStack()) {
466473
worker.getGlobalDomain().changeBound(

0 commit comments

Comments
 (0)