Skip to content

Commit 9345801

Browse files
committed
Make lprelax also pointer. Add convencience functions
1 parent 0e80ead commit 9345801

File tree

4 files changed

+55
-18
lines changed

4 files changed

+55
-18
lines changed

highs/mip/HighsMipSolver.cpp

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void HighsMipSolver::run() {
137137
// Initialize master worker.
138138
// Now the worker lives in mipdata.
139139
// The master worker is used in evaluateRootNode.
140-
mipdata_->workers.emplace_back(*this, mipdata_->lp, mipdata_->domain,
140+
mipdata_->workers.emplace_back(*this, &mipdata_->lp, mipdata_->domain,
141141
&mipdata_->cutpool, mipdata_->conflictPool);
142142

143143
HighsMipWorker& master_worker = mipdata_->workers.at(0);
@@ -243,7 +243,7 @@ void HighsMipSolver::run() {
243243
"master_worker lprelaxation_ member with address %p, %d "
244244
"columns, and %d rows\n",
245245
(void*)&master_worker.lprelaxation_,
246-
int(master_worker.lprelaxation_.getLpSolver().getNumCol()),
246+
int(master_worker.lprelaxation_->getLpSolver().getNumCol()),
247247
int(mipdata_->lps.at(0).getLpSolver().getNumRow()));
248248

249249
std::shared_ptr<const HighsBasis> basis;
@@ -318,20 +318,57 @@ void HighsMipSolver::run() {
318318
const HighsInt num_worker = mip_search_concurrency - 1;
319319
highs::parallel::TaskGroup tg;
320320

321+
auto recreatePools = [&](HighsInt index, HighsMipWorker& worker) -> void {
322+
HighsCutPool* p = &mipdata_->cutpools.at(index);
323+
p->~HighsCutPool();
324+
::new (static_cast<void*>(p))
325+
HighsCutPool(numCol(), options_mip_->mip_pool_age_limit,
326+
options_mip_->mip_pool_soft_limit, index);
327+
mipdata_->conflictpools[index] =
328+
HighsConflictPool(5 * options_mip_->mip_pool_age_limit,
329+
options_mip_->mip_pool_soft_limit);
330+
worker.conflictpool_ = mipdata_->conflictpools[index];
331+
};
332+
333+
auto recreateLpAndDomains = [&](HighsInt index, HighsMipWorker& worker) {
334+
HighsLpRelaxation* p = &mipdata_->lps.at(index);
335+
p->~HighsLpRelaxation();
336+
::new (p) HighsLpRelaxation(mipdata_->lp, index);
337+
mipdata_->domains[index] = HighsDomain(mipdata_->domain);
338+
worker.globaldom_ = mipdata_->domains.at(index);
339+
};
340+
341+
// (Re-)Initialise local cut and conflict pool for master worker
342+
if (mip_search_concurrency > 1) {
343+
if (mipdata_->numRestarts <= mipdata_->numRestartsRoot) {
344+
mipdata_->cutpools.emplace_back(numCol(),
345+
options_mip_->mip_pool_age_limit,
346+
options_mip_->mip_pool_soft_limit, 1);
347+
master_worker.cutpool_ = &mipdata_->cutpools.back();
348+
mipdata_->conflictpools.emplace_back(5 * options_mip_->mip_pool_age_limit,
349+
options_mip_->mip_pool_soft_limit);
350+
master_worker.conflictpool_ = mipdata_->conflictpools.back();
351+
} else {
352+
recreatePools(1, master_worker);
353+
}
354+
}
355+
356+
// Create / re-initialise workers
321357
for (int i = 1; i < mip_search_concurrency; i++) {
322358
if (mipdata_->numRestarts <= mipdata_->numRestartsRoot) {
323359
mipdata_->domains.emplace_back(mipdata_->domain);
324360
mipdata_->lps.emplace_back(mipdata_->lp, i);
325-
mipdata_->cutpools.emplace_back(
326-
numCol(), options_mip_->mip_pool_age_limit,
327-
options_mip_->mip_pool_soft_limit, i);
328-
mipdata_->conflictpools.emplace_back(
329-
5 * options_mip_->mip_pool_age_limit,
330-
options_mip_->mip_pool_soft_limit);
361+
mipdata_->cutpools.emplace_back(numCol(),
362+
options_mip_->mip_pool_age_limit,
363+
options_mip_->mip_pool_soft_limit, i);
364+
mipdata_->conflictpools.emplace_back(5 * options_mip_->mip_pool_age_limit,
365+
options_mip_->mip_pool_soft_limit);
331366
mipdata_->workers.emplace_back(
332-
*this, mipdata_->lps.back(), mipdata_->domains.back(),
367+
*this, &mipdata_->lps.back(), mipdata_->domains.back(),
333368
&mipdata_->cutpools.back(), mipdata_->conflictpools.back());
334369
} else {
370+
recreatePools(i + 1, mipdata_->workers.at(i));
371+
recreateLpAndDomains(i, mipdata_->workers.at(i));
335372
mipdata_->workers[i].resetSearch();
336373
}
337374
}

highs/mip/HighsMipWorker.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "mip/MipTimer.h"
1212

1313
HighsMipWorker::HighsMipWorker(const HighsMipSolver& mipsolver__,
14-
HighsLpRelaxation& lprelax_, HighsDomain& domain,
14+
HighsLpRelaxation* lprelax_, HighsDomain& domain,
1515
HighsCutPool* cutpool,
1616
HighsConflictPool& conflictpool)
1717
: mipsolver_(mipsolver__),
@@ -58,7 +58,7 @@ HighsMipWorker::HighsMipWorker(const HighsMipSolver& mipsolver__,
5858

5959
// HighsSearch has its own relaxation initialized no nullptr.
6060

61-
search_ptr_->setLpRelaxation(&lprelaxation_);
61+
search_ptr_->setLpRelaxation(lprelaxation_);
6262

6363
// printf(
6464
// "Search has lp member in constructor of mipworker with address %p, %d "
@@ -88,7 +88,7 @@ void HighsMipWorker::resetSearch() {
8888
// search_ptr_->getLocalDomain().addConflictPool(mipsolver_.mipdata_->conflictPool);
8989
// search_ptr_->getLocalDomain().addCutpool(cutpool_);
9090
// search_ptr_->getLocalDomain().addConflictPool(conflictpool_);
91-
search_ptr_->setLpRelaxation(&lprelaxation_);
91+
search_ptr_->setLpRelaxation(lprelaxation_);
9292
}
9393

9494
bool HighsMipWorker::addIncumbent(const std::vector<double>& sol, double solobj,

highs/mip/HighsMipWorker.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class HighsMipWorker {
2626
const HighsMipSolverData& mipdata_;
2727

2828
HighsPseudocost pseudocost_;
29-
HighsLpRelaxation& lprelaxation_;
29+
HighsLpRelaxation* lprelaxation_;
3030
HighsDomain& globaldom_;
3131
HighsCutPool* cutpool_;
3232
HighsConflictPool& conflictpool_;
@@ -45,7 +45,7 @@ class HighsMipWorker {
4545

4646
// HighsMipWorker(const HighsMipSolver& mipsolver__);
4747
HighsMipWorker(const HighsMipSolver& mipsolver__,
48-
HighsLpRelaxation& lprelax_,
48+
HighsLpRelaxation* lprelax_,
4949
HighsDomain& domain,
5050
HighsCutPool* cutpool,
5151
HighsConflictPool& conflictpool);

highs/mip/HighsPrimalHeuristics.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ void HighsPrimalHeuristics::RENS(HighsMipWorker& worker,
342342
[&](HighsInt i) { return worker.globaldom_.isFixed(i); }),
343343
intcols.end());
344344

345-
HighsLpRelaxation heurlp(worker.lprelaxation_);
345+
HighsLpRelaxation heurlp(*worker.lprelaxation_);
346346
// only use the global upper limit as LP limit so that dual proofs are valid
347347
heurlp.setObjectiveLimit(mipsolver.mipdata_->upper_limit);
348348
heurlp.setAdjustSymmetricBranchingCol(false);
@@ -603,7 +603,7 @@ void HighsPrimalHeuristics::RINS(HighsMipWorker& worker,
603603
HighsDomain& localdom = heur.getLocalDomain();
604604
heur.setHeuristic(true);
605605

606-
HighsLpRelaxation heurlp(worker.lprelaxation_);
606+
HighsLpRelaxation heurlp(*worker.lprelaxation_);
607607
// only use the global upper limit as LP limit so that dual proofs are valid
608608
heurlp.setObjectiveLimit(mipsolver.mipdata_->upper_limit);
609609
heurlp.setAdjustSymmetricBranchingCol(false);
@@ -1103,7 +1103,7 @@ void HighsPrimalHeuristics::shifting(HighsMipWorker& worker,
11031103
std::vector<double> current_relax_solution = relaxationsol;
11041104
HighsInt t = 0;
11051105
const HighsLp& currentLp = *mipsolver.model_;
1106-
HighsLpRelaxation lprelax(worker.lprelaxation_);
1106+
HighsLpRelaxation lprelax(*worker.lprelaxation_);
11071107
std::vector<std::pair<HighsInt, double>> current_fractional_integers =
11081108
lprelax.getFractionalIntegers();
11091109
std::vector<std::tuple<HighsInt, HighsInt, double>> current_infeasible_rows =
@@ -1465,7 +1465,7 @@ void HighsPrimalHeuristics::ziRound(HighsMipWorker& worker,
14651465
}
14661466

14671467
void HighsPrimalHeuristics::feasibilityPump(HighsMipWorker& worker) {
1468-
HighsLpRelaxation lprelax(worker.lprelaxation_);
1468+
HighsLpRelaxation lprelax(*worker.lprelaxation_);
14691469
std::unordered_set<std::vector<HighsInt>, HighsVectorHasher, HighsVectorEqual>
14701470
referencepoints;
14711471
std::vector<double> roundedsol;

0 commit comments

Comments
 (0)