Skip to content

Commit cc21b5f

Browse files
committed
Enable trivial heur. Change sync sol logic.
1 parent 0f309d6 commit cc21b5f

File tree

4 files changed

+11
-22
lines changed

4 files changed

+11
-22
lines changed

highs/mip/HighsMipSolver.cpp

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -335,21 +335,14 @@ void HighsMipSolver::run() {
335335
};
336336

337337
auto syncSolutions = [&]() -> void {
338+
// Note: Upper bound / limit of workers updated via addIncumbent
338339
for (HighsMipWorker& worker : mipdata_->workers) {
339340
for (auto& sol : worker.solutions_) {
340341
mipdata_->addIncumbent(std::get<0>(sol), std::get<1>(sol),
341342
std::get<2>(sol));
342343
}
343344
worker.solutions_.clear();
344345
}
345-
// TODO: Should addIncumbent just update all worker bounds?
346-
// Pass the new upper bound information back to the workers
347-
for (HighsMipWorker& worker : mipdata_->workers) {
348-
assert(mipdata_->upper_bound <= worker.upper_bound);
349-
worker.upper_bound = mipdata_->upper_bound;
350-
worker.upper_limit = mipdata_->upper_limit;
351-
worker.optimality_limit = mipdata_->optimality_limit;
352-
}
353346
};
354347

355348
auto syncPools = [&](std::vector<HighsInt>& indices) -> void {
@@ -358,8 +351,6 @@ void HighsMipSolver::run() {
358351
for (const HighsInt i : indices) {
359352
mipdata_->workers[i].conflictpool_->syncConflictPool(
360353
mipdata_->conflictPool);
361-
// TODO: Is this aging call needed? (Already aged at end of separate)
362-
mipdata_->workers[i].cutpool_->performAging();
363354
mipdata_->workers[i].cutpool_->syncCutPool(*this, mipdata_->cutpool);
364355
}
365356
mipdata_->cutpool.performAging();
@@ -767,9 +758,7 @@ void HighsMipSolver::run() {
767758
if (evaluate_node_result == HighsSearch::NodeResult::kSubOptimal) return;
768759

769760
// analysis_.mipTimerStart(kMipClockDivePrimalHeuristics);
770-
// TODO MT: Make trivial heuristics work locally
771-
// TODO MT: Why can't these run locally now???
772-
if (mipdata_->incumbent.empty() && !mipdata_->parallelLockActive()) {
761+
if (mipdata_->incumbent.empty()) {
773762
// analysis_.mipTimerStart(kMipClockDiveRandomizedRounding);
774763
mipdata_->heuristics.randomizedRounding(
775764
worker, worker.lp_->getLpSolver().getSolution().col_value);

highs/mip/HighsMipSolverData.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,8 +1585,8 @@ bool HighsMipSolverData::addIncumbent(const std::vector<double>& sol,
15851585
double prev_upper_bound = upper_bound;
15861586

15871587
upper_bound = solobj;
1588-
if (hasSingleWorker()) {
1589-
workers[0].upper_bound = upper_bound;
1588+
for (HighsMipWorker& worker : workers) {
1589+
worker.upper_bound = upper_bound;
15901590
}
15911591

15921592
bool bound_change = upper_bound != prev_upper_bound;
@@ -1607,9 +1607,9 @@ bool HighsMipSolverData::addIncumbent(const std::vector<double>& sol,
16071607
computeNewUpperLimit(solobj, mipsolver.options_mip_->mip_abs_gap,
16081608
mipsolver.options_mip_->mip_rel_gap);
16091609
nodequeue.setOptimalityLimit(optimality_limit);
1610-
if (hasSingleWorker()) {
1611-
workers[0].upper_limit = upper_limit;
1612-
workers[0].optimality_limit = optimality_limit;
1610+
for (HighsMipWorker& worker : workers) {
1611+
worker.upper_limit = upper_limit;
1612+
worker.optimality_limit = optimality_limit;
16131613
}
16141614
debugSolution.newIncumbentFound();
16151615
domain.propagate();

highs/mip/HighsMipSolverData.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -274,10 +274,6 @@ struct HighsMipSolverData {
274274
bool hasMultipleWorkers() const {
275275
return workers.size() > 1;
276276
}
277-
278-
bool hasSingleWorker() const {
279-
return workers.size() == 1;
280-
}
281277
};
282278

283279
#endif

highs/mip/HighsPrimalHeuristics.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,7 @@ bool HighsPrimalHeuristics::tryRoundedPoint(HighsMipWorker& worker,
954954

955955
if (numintcols != mipsolver.numCol()) {
956956
HighsLpRelaxation lprelax(mipsolver);
957+
lprelax.setMipWorker(worker);
957958
lprelax.loadModel();
958959
lprelax.setIterationLimit(
959960
std::max(int64_t{10000}, 2 * mipsolver.mipdata_->firstrootlpiters));
@@ -1094,6 +1095,7 @@ void HighsPrimalHeuristics::randomizedRounding(
10941095
if (mipsolver.mipdata_->integer_cols.size() !=
10951096
static_cast<size_t>(mipsolver.numCol())) {
10961097
HighsLpRelaxation lprelax(mipsolver);
1098+
lprelax.setMipWorker(worker);
10971099
lprelax.loadModel();
10981100
lprelax.setIterationLimit(
10991101
std::max(int64_t{10000}, 2 * mipsolver.mipdata_->firstrootlpiters));
@@ -1147,6 +1149,7 @@ void HighsPrimalHeuristics::shifting(HighsMipWorker& worker,
11471149
HighsInt t = 0;
11481150
const HighsLp& currentLp = *mipsolver.model_;
11491151
HighsLpRelaxation lprelax(worker.getLpRelaxation());
1152+
lprelax.setMipWorker(worker);
11501153
std::vector<std::pair<HighsInt, double>> current_fractional_integers =
11511154
lprelax.getFractionalIntegers();
11521155
std::vector<std::tuple<HighsInt, HighsInt, double>> current_infeasible_rows =
@@ -1510,6 +1513,7 @@ void HighsPrimalHeuristics::ziRound(HighsMipWorker& worker,
15101513

15111514
void HighsPrimalHeuristics::feasibilityPump(HighsMipWorker& worker) {
15121515
HighsLpRelaxation lprelax(worker.getLpRelaxation());
1516+
lprelax.setMipWorker(worker);
15131517
std::unordered_set<std::vector<HighsInt>, HighsVectorHasher, HighsVectorEqual>
15141518
referencepoints;
15151519
std::vector<double> roundedsol;

0 commit comments

Comments
 (0)