Skip to content

Commit 34145f9

Browse files
committed
Add minor changes on when stuff is called
1 parent 756d7cf commit 34145f9

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

highs/mip/HighsDomain.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,6 +2066,7 @@ void HighsDomain::changeBound(HighsDomainChange boundchg, Reason reason) {
20662066
// MT: This code should be alright. It only uses the clique table.
20672067
// (It doesn't modify anything but the domain?)
20682068
// if (mipsolver->mipdata_->workers.size() <= 1)
2069+
// TODO: Parallel lock should not be needed here..... Tests fail though.
20692070
mipsolver->mipdata_->cliquetable.addImplications(
20702071
*this, boundchg.column, col_lower_[boundchg.column] > 0.5);
20712072
}

highs/mip/HighsMipSolver.cpp

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ void HighsMipSolver::run() {
245245
printf(
246246
"master_worker lprelaxation_ member with address %p, %d "
247247
"columns, and %d rows\n",
248-
(void*)&master_worker.lprelaxation_,
248+
master_worker.lprelaxation_,
249249
int(master_worker.lprelaxation_->getLpSolver().getNumCol()),
250250
int(mipdata_->lps.at(0).getLpSolver().getNumRow()));
251251

@@ -317,8 +317,9 @@ void HighsMipSolver::run() {
317317
worker.globaldom_->addCutpool(*worker.cutpool_);
318318
assert(worker.globaldom_->getDomainChangeStack().empty());
319319
worker.globaldom_->addConflictPool(*worker.conflictpool_);
320-
worker.resetSearch();
321320
worker.lprelaxation_->setMipWorker(worker);
321+
worker.resetSearch();
322+
worker.resetSepa();
322323
};
323324

324325
auto createNewWorker = [&](HighsInt i) {
@@ -350,14 +351,18 @@ void HighsMipSolver::run() {
350351
mipdata_->implications.cleanupVarbounds(col);
351352

352353
mipdata_->domain.setDomainChangeStack(std::vector<HighsDomainChange>());
354+
if (!mipdata_->hasMultipleWorkers())
355+
master_worker.search_ptr_->resetLocalDomain();
353356
mipdata_->domain.clearChangedCols();
354357
mipdata_->removeFixedIndices();
355358
analysis_.mipTimerStop(kMipClockUpdateLocalDomain);
356359
}
357360
for (HighsMipWorker& worker : mipdata_->workers) {
358361
for (HighsInt i = 0; i < numCol(); ++i) {
359-
assert(mipdata_->domain.col_lower_[i] == worker.globaldom_->col_lower_[i]);
360-
assert(mipdata_->domain.col_upper_[i] == worker.globaldom_->col_upper_[i]);
362+
assert(mipdata_->domain.col_lower_[i] ==
363+
worker.globaldom_->col_lower_[i]);
364+
assert(mipdata_->domain.col_upper_[i] ==
365+
worker.globaldom_->col_upper_[i]);
361366
}
362367
}
363368
};
@@ -375,10 +380,8 @@ void HighsMipSolver::run() {
375380
createNewWorker(i);
376381
}
377382

378-
master_worker.resetSepa();
379383
HighsSearch& search = *master_worker.search_ptr_;
380384
mipdata_->debugSolution.registerDomain(search.getLocalDomain());
381-
HighsSeparation& sepa = *master_worker.sepa_ptr_;
382385

383386
analysis_.mipTimerStart(kMipClockSearch);
384387
search.installNode(mipdata_->nodequeue.popBestBoundNode());
@@ -476,14 +479,16 @@ void HighsMipSolver::run() {
476479
mipdata_->domain.getDomainChangeStack()) {
477480
worker.getGlobalDomain().changeBound(
478481
domchg, HighsDomain::Reason::unspecified());
479-
}
482+
}
480483
worker.getGlobalDomain().setDomainChangeStack(
481484
std::vector<HighsDomainChange>());
482-
worker.getGlobalDomain().clearChangedCols();
483485
worker.search_ptr_->resetLocalDomain();
486+
worker.getGlobalDomain().clearChangedCols();
484487
for (HighsInt i = 0; i < numCol(); ++i) {
485-
assert(mipdata_->domain.col_lower_[i] == worker.globaldom_->col_lower_[i]);
486-
assert(mipdata_->domain.col_upper_[i] == worker.globaldom_->col_upper_[i]);
488+
assert(mipdata_->domain.col_lower_[i] ==
489+
worker.globaldom_->col_lower_[i]);
490+
assert(mipdata_->domain.col_upper_[i] ==
491+
worker.globaldom_->col_upper_[i]);
487492
}
488493
}
489494
}
@@ -881,8 +886,8 @@ void HighsMipSolver::run() {
881886
std::vector<HighsSearch::NodeResult> dive_results(
882887
mipdata_->workers.size(), HighsSearch::NodeResult::kBranched);
883888
setParallelLock(true);
884-
if (mipdata_->workers.size() > 1) {
885-
for (int i = 0; i < mipdata_->workers.size(); i++) {
889+
for (HighsInt i = 0; i != mipdata_->workers.size(); ++i) {
890+
if (mipdata_->hasMultipleWorkers()) {
886891
tg.spawn([&, i]() {
887892
if (!mipdata_->workers[i].search_ptr_->hasNode() ||
888893
mipdata_->workers[i].search_ptr_->currentNodePruned()) {
@@ -892,14 +897,17 @@ void HighsMipSolver::run() {
892897
dive_times[i] += analysis_.mipTimerRead(kMipClockNodeSearch);
893898
}
894899
});
895-
}
896-
tg.taskWait();
897-
} else {
898-
if (!search.currentNodePruned()) {
899-
dive_results[0] = search.dive();
900-
dive_times[0] += analysis_.mipTimerRead(kMipClockNodeSearch);
900+
} else {
901+
if (!mipdata_->workers[i].search_ptr_->hasNode() ||
902+
mipdata_->workers[i].search_ptr_->currentNodePruned()) {
903+
dive_times[i] = -1;
904+
} else {
905+
dive_results[i] = mipdata_->workers[i].search_ptr_->dive();
906+
dive_times[i] += analysis_.mipTimerRead(kMipClockNodeSearch);
907+
}
901908
}
902909
}
910+
if (mipdata_->hasMultipleWorkers()) tg.taskWait();
903911
analysis_.mipTimerStop(kMipClockTheDive);
904912
setParallelLock(false);
905913
bool suboptimal = false;
@@ -1065,9 +1073,6 @@ void HighsMipSolver::run() {
10651073
break;
10661074
}
10671075

1068-
// set local global domains of all workers to copy changes of global
1069-
if (mipdata_->hasMultipleWorkers()) resetWorkerDomains();
1070-
10711076
double prev_lower_bound = mipdata_->lower_bound;
10721077

10731078
mipdata_->lower_bound = std::min(mipdata_->upper_bound,
@@ -1080,8 +1085,11 @@ void HighsMipSolver::run() {
10801085
mipdata_->printDisplayLine();
10811086
if (mipdata_->nodequeue.empty()) break;
10821087

1088+
// set local global domains of all workers to copy changes of global
1089+
if (mipdata_->hasMultipleWorkers()) resetWorkerDomains();
10831090
// flush all changes made to the global domain
10841091
resetGlobalDomain();
1092+
if (!mipdata_->hasMultipleWorkers()) search.resetLocalDomain();
10851093

10861094
if (!submip && mipdata_->num_nodes >= nextCheck) {
10871095
auto nTreeRestarts = mipdata_->numRestarts - mipdata_->numRestartsRoot;
@@ -1203,6 +1211,7 @@ void HighsMipSolver::run() {
12031211
break;
12041212
}
12051213
} // while(search.hasNode())
1214+
syncSolutions();
12061215
analysis_.mipTimerStop(kMipClockSearch);
12071216

12081217
cleanupSolve();

highs/mip/HighsPrimalHeuristics.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ void HighsPrimalHeuristics::RENS(HighsMipWorker& worker,
349349

350350
HighsLpRelaxation heurlp(*worker.lprelaxation_);
351351
// only use the global upper limit as LP limit so that dual proofs are valid
352+
// TODO MT: Should this be the upper limit from the worker?
352353
heurlp.setObjectiveLimit(mipsolver.mipdata_->upper_limit);
353354
heurlp.setAdjustSymmetricBranchingCol(false);
354355
heur.setLpRelaxation(&heurlp);
@@ -611,6 +612,7 @@ void HighsPrimalHeuristics::RINS(HighsMipWorker& worker,
611612

612613
HighsLpRelaxation heurlp(*worker.lprelaxation_);
613614
// only use the global upper limit as LP limit so that dual proofs are valid
615+
// TODO MT: Should this be the upper limit from the worker?
614616
heurlp.setObjectiveLimit(mipsolver.mipdata_->upper_limit);
615617
heurlp.setAdjustSymmetricBranchingCol(false);
616618
heur.setLpRelaxation(&heurlp);

0 commit comments

Comments
 (0)