Skip to content

Commit b0b8374

Browse files
committed
Use mipworker cutpool in separation
1 parent d171a40 commit b0b8374

File tree

5 files changed

+23
-15
lines changed

5 files changed

+23
-15
lines changed

highs/mip/HighsMipSolver.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ void HighsMipSolver::run() {
351351
options_mip_->mip_pool_soft_limit);
352352
master_worker.conflictpool_ = mipdata_->conflictpools.back();
353353
} else {
354+
master_worker.cutpool_ = &mipdata_->cutpools[1];
355+
master_worker.conflictpool_ = mipdata_->conflictpools[1];
354356
recreatePools(1, master_worker);
355357
}
356358
master_worker.upper_bound = mipdata_->upper_bound;
@@ -703,11 +705,11 @@ void HighsMipSolver::run() {
703705
if (i != 0) continue;
704706
if (mipdata_->parallelLockActive()) {
705707
tg.spawn([&, i]() {
706-
mipdata_->workers[i].sepa_ptr_->separate(mipdata_->workers[i], mipdata_->workers[i].search_ptr_->getLocalDomain());
708+
mipdata_->workers[i].sepa_ptr_->separate(
709+
mipdata_->workers[i].search_ptr_->getLocalDomain());
707710
});
708711
} else {
709712
mipdata_->workers[i].sepa_ptr_->separate(
710-
mipdata_->workers[i],
711713
mipdata_->workers[i].search_ptr_->getLocalDomain());
712714
}
713715
}

highs/mip/HighsMipSolverData.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,12 @@ void HighsMipSolverData::performRestart() {
13861386
// HighsNodeQueue oldNodeQueue;
13871387
// std::swap(nodequeue, oldNodeQueue);
13881388

1389+
// Ensure master worker is pointing to the correct cut and conflict pools
1390+
if (mipsolver.options_mip_->mip_search_concurrency > 1) {
1391+
mipsolver.mipdata_->workers[0].cutpool_ = &cutpool;
1392+
mipsolver.mipdata_->workers[0].conflictpool_ = conflictPool;
1393+
}
1394+
13891395
// remove the pointer into the stack-space of this function
13901396
if (mipsolver.rootbasis == &root_basis) mipsolver.rootbasis = nullptr;
13911397
mipsolver.pscostinit = nullptr;

highs/mip/HighsSeparation.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,9 @@ HighsInt HighsSeparation::separationRound(HighsDomain& propdomain,
8686
// additional probing in parallel case
8787
if (&propdomain == &mipdata.domain) {
8888
lp->getMipSolver().timer_.start(implBoundClock);
89-
mipdata.implications.separateImpliedBounds(
90-
*lp, lp->getSolution().col_value, mipdata.cutpool, mipdata.feastol);
89+
mipdata.implications.separateImpliedBounds(*lp, lp->getSolution().col_value,
90+
*mipworker_.cutpool_,
91+
mipdata.feastol);
9192
lp->getMipSolver().timer_.stop(implBoundClock);
9293
}
9394

@@ -103,7 +104,7 @@ HighsInt HighsSeparation::separationRound(HighsDomain& propdomain,
103104
if (&propdomain == &mipdata.domain) {
104105
lp->getMipSolver().timer_.start(cliqueClock);
105106
mipdata.cliquetable.separateCliques(lp->getMipSolver(), sol.col_value,
106-
mipdata.cutpool, mipdata.feastol);
107+
*mipworker_.cutpool_, mipdata.feastol);
107108
lp->getMipSolver().timer_.stop(cliqueClock);
108109
}
109110

@@ -124,7 +125,7 @@ HighsInt HighsSeparation::separationRound(HighsDomain& propdomain,
124125
HighsLpAggregator lpAggregator(*lp);
125126

126127
for (const std::unique_ptr<HighsSeparator>& separator : separators) {
127-
separator->run(*lp, lpAggregator, transLp, mipdata.cutpool);
128+
separator->run(*lp, lpAggregator, transLp, *mipworker_.cutpool_);
128129
if (mipworker_.globaldom_.infeasible()) {
129130
status = HighsLpRelaxation::Status::kInfeasible;
130131
return 0;
@@ -137,8 +138,8 @@ HighsInt HighsSeparation::separationRound(HighsDomain& propdomain,
137138
else
138139
ncuts += numboundchgs;
139140

140-
mipdata.cutpool.separate(sol.col_value, propdomain, cutset,
141-
mipdata.feastol, mipdata.cutpools);
141+
mipworker_.cutpool_->separate(sol.col_value, propdomain, cutset,
142+
mipdata.feastol, mipdata.cutpools);
142143

143144
if (cutset.numCuts() > 0) {
144145
ncuts += cutset.numCuts();
@@ -158,8 +159,7 @@ HighsInt HighsSeparation::separationRound(HighsDomain& propdomain,
158159
return ncuts;
159160
}
160161

161-
void HighsSeparation::separate(HighsMipWorker& worker,
162-
HighsDomain& propdomain) {
162+
void HighsSeparation::separate(HighsDomain& propdomain) {
163163
HighsLpRelaxation::Status status = lp->getStatus();
164164
const HighsMipSolver& mipsolver = lp->getMipSolver();
165165

@@ -179,7 +179,7 @@ void HighsSeparation::separate(HighsMipWorker& worker,
179179
// mipsolver.mipdata_->total_lp_iterations += nlpiters;
180180

181181
// todo:ig more stats for separation iterations?
182-
worker.heur_stats.lp_iterations += nlpiters;
182+
mipworker_.heur_stats.lp_iterations += nlpiters;
183183

184184
// printf("separated %" HIGHSINT_FORMAT " cuts\n", ncuts);
185185

@@ -206,6 +206,6 @@ void HighsSeparation::separate(HighsMipWorker& worker,
206206

207207
// mipsolver.mipdata_->cutpool.performAging();
208208
// ig: using worker cutpool
209-
worker.cutpool_->performAging();
209+
mipworker_.cutpool_->performAging();
210210
}
211211
}

highs/mip/HighsSeparation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class HighsSeparation {
2626
HighsLpRelaxation::Status& status);
2727

2828
// void separate(HighsDomain& propdomain);
29-
void separate(HighsMipWorker& worker, HighsDomain& propdomain);
29+
void separate(HighsDomain& propdomain);
3030

3131
void setLpRelaxation(HighsLpRelaxation* lp) { this->lp = lp; }
3232

highs/mip/HighsTransformedLp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ HighsTransformedLp::HighsTransformedLp(const HighsLpRelaxation& lprelaxation,
3535
vectorsum.setDimension(numTransformedCol);
3636

3737
for (HighsInt col : mipsolver.mipdata_->continuous_cols) {
38-
if (mipsolver.mipdata_->workers.size() <= 1)
38+
if (!mipsolver.mipdata_->parallelLockActive())
3939
mipsolver.mipdata_->implications.cleanupVarbounds(col);
4040

4141
if (globaldom_.infeasible()) return;
@@ -66,7 +66,7 @@ HighsTransformedLp::HighsTransformedLp(const HighsLpRelaxation& lprelaxation,
6666
double bestub = globaldom_.col_upper_[col];
6767
double bestlb = globaldom_.col_lower_[col];
6868

69-
if (mipsolver.mipdata_->workers.size() <= 1)
69+
if (!mipsolver.mipdata_->parallelLockActive())
7070
mipsolver.mipdata_->implications.cleanupVarbounds(col);
7171

7272
if (globaldom_.infeasible()) return;

0 commit comments

Comments
 (0)