Skip to content

Commit 62c4994

Browse files
committed
Add sync pools
1 parent d9c57a6 commit 62c4994

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

highs/mip/HighsMipSolver.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ void HighsMipSolver::run() {
340340

341341
// (Re-)Initialise local cut and conflict pool for master worker
342342
if (mip_search_concurrency > 1) {
343-
if (mipdata_->numRestarts <= mipdata_->numRestartsRoot) {
343+
if (mipdata_->cutpools.size() <= 1) {
344344
mipdata_->cutpools.emplace_back(numCol(),
345345
options_mip_->mip_pool_age_limit,
346346
options_mip_->mip_pool_soft_limit, 1);
@@ -358,7 +358,7 @@ void HighsMipSolver::run() {
358358

359359
// Create / re-initialise workers
360360
for (int i = 1; i < mip_search_concurrency; i++) {
361-
if (mipdata_->numRestarts <= mipdata_->numRestartsRoot) {
361+
if (mipdata_->workers.size() <= i) {
362362
mipdata_->domains.emplace_back(mipdata_->domain);
363363
mipdata_->lps.emplace_back(mipdata_->lp, i);
364364
mipdata_->cutpools.emplace_back(numCol(),
@@ -1010,6 +1010,7 @@ void HighsMipSolver::run() {
10101010
analysis_.mipTimerStart(kMipClockDomainPropgate);
10111011
// sync global domain changes from parallel dives
10121012
syncGlobalDomain();
1013+
syncPools();
10131014
mipdata_->domain.propagate();
10141015
analysis_.mipTimerStop(kMipClockDomainPropgate);
10151016

highs/mip/HighsMipSolverData.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ HighsMipSolverData::HighsMipSolverData(HighsMipSolver& mipsolver)
2727
lp(lps.at(0)),
2828
cutpools(),
2929
cutpool(*cutpools.emplace(cutpools.end(), mipsolver.numCol(),
30-
mipsolver.options_mip_->mip_pool_age_limit,
31-
mipsolver.options_mip_->mip_pool_soft_limit, 0)),
30+
mipsolver.options_mip_->mip_pool_age_limit,
31+
mipsolver.options_mip_->mip_pool_soft_limit,
32+
0)),
3233
conflictpools(
3334
1, HighsConflictPool(5 * mipsolver.options_mip_->mip_pool_age_limit,
3435
mipsolver.options_mip_->mip_pool_soft_limit)),
@@ -1359,6 +1360,7 @@ void HighsMipSolverData::performRestart() {
13591360
// is never applied, since MIP solving is complete, and
13601361
// lower_bound is set to upper_bound, so apply the offset now, so
13611362
// that housekeeping in updatePrimalDualIntegral is correct
1363+
// MT: If the model is optimal after presolve, then don't check prev data
13621364
double prev_lower_bound = lower_bound - mipsolver.model_->offset_;
13631365

13641366
lower_bound = upper_bound;
@@ -1370,8 +1372,9 @@ void HighsMipSolverData::performRestart() {
13701372
bool bound_change = lower_bound != prev_lower_bound;
13711373
assert(bound_change);
13721374
if (!mipsolver.submip && bound_change)
1373-
updatePrimalDualIntegral(prev_lower_bound, lower_bound, upper_bound,
1374-
upper_bound);
1375+
updatePrimalDualIntegral(
1376+
prev_lower_bound, lower_bound, upper_bound, upper_bound, true,
1377+
mipsolver.modelstatus_ != HighsModelStatus::kOptimal);
13751378
if (mipsolver.solution_objective_ != kHighsInf &&
13761379
mipsolver.modelstatus_ == HighsModelStatus::kInfeasible)
13771380
mipsolver.modelstatus_ = HighsModelStatus::kOptimal;

0 commit comments

Comments
 (0)