Skip to content

Commit a9a9476

Browse files
committed
Make lpcutremoved thread safe
1 parent 7f946c5 commit a9a9476

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

highs/mip/HighsCutPool.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ double HighsCutPool::getParallelism(HighsInt row1, HighsInt row2,
147147
return dotprod * rownormalization_[row1] * pool2.rownormalization_[row2];
148148
}
149149

150-
void HighsCutPool::lpCutRemoved(HighsInt cut) {
150+
void HighsCutPool::lpCutRemoved(HighsInt cut, bool thread_safe) {
151151
numLps_[cut].fetch_add(-1, std::memory_order_relaxed);
152+
if (thread_safe) return;
152153
if (matrix_.columnsLinked(cut)) {
153154
propRows.erase(std::make_pair(-1, cut));
154155
propRows.emplace(1, cut);

highs/mip/HighsCutPool.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,13 @@ class HighsCutPool {
102102
bool isDuplicate(size_t hash, double norm, const HighsInt* Rindex,
103103
const double* Rvalue, HighsInt Rlen, double rhs);
104104

105-
void resetAge(HighsInt cut) {
105+
void resetAge(HighsInt cut, bool thread_safe = false) {
106106
if (ages_[cut] > 0) {
107+
if (thread_safe) {
108+
int16_t numLp = numLps_[cut].fetch_add(1, std::memory_order_relaxed);
109+
if (numLp >= 0) numLps_[cut].fetch_add(-1, std::memory_order_relaxed);
110+
return;
111+
}
107112
if (matrix_.columnsLinked(cut)) {
108113
propRows.erase(std::make_pair(ages_[cut], cut));
109114
propRows.emplace(0, cut);
@@ -121,7 +126,7 @@ class HighsCutPool {
121126

122127
void performAging(bool parallel_sepa = false);
123128

124-
void lpCutRemoved(HighsInt cut);
129+
void lpCutRemoved(HighsInt cut, bool thread_safe = false);
125130

126131
void addPropagationDomain(HighsDomain::CutpoolPropagation* domain) {
127132
propagationDomains.push_back(domain);

highs/mip/HighsDomain.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2493,7 +2493,8 @@ bool HighsDomain::propagate() {
24932493
for (HighsInt k = 0; k != numproprows; ++k) {
24942494
HighsInt i = propagateinds[k];
24952495
if (propRowNumChangedBounds_[k].first != 0) {
2496-
cutpoolprop.cutpool->resetAge(i);
2496+
cutpoolprop.cutpool->resetAge(
2497+
i, mipsolver->mipdata_->parallelLockActive());
24972498
HighsInt start = cutpoolprop.cutpool->getMatrix().getRowStart(i);
24982499
HighsInt end = start + propRowNumChangedBounds_[k].first;
24992500
for (HighsInt j = start; j != end && !infeasible_; ++j)

highs/mip/HighsLpRelaxation.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ void HighsLpRelaxation::removeObsoleteRows(bool notifyPool) {
530530
if (notifyPool) {
531531
assert(lprows[i].cutpool <= mipsolver.mipdata_->cutpools.size());
532532
mipsolver.mipdata_->cutpools[lprows[i].cutpool].lpCutRemoved(
533-
lprows[i].index);
533+
lprows[i].index, mipsolver.mipdata_->parallelLockActive());
534534
}
535535
}
536536
}
@@ -579,7 +579,7 @@ void HighsLpRelaxation::removeCuts() {
579579
if (lprows[i].origin == LpRow::Origin::kCutPool) {
580580
assert(lprows[i].cutpool <= mipsolver.mipdata_->cutpools.size());
581581
mipsolver.mipdata_->cutpools[lprows[i].cutpool].lpCutRemoved(
582-
lprows[i].index);
582+
lprows[i].index, mipsolver.mipdata_->parallelLockActive());
583583
}
584584
}
585585
lprows.resize(modelrows);
@@ -627,7 +627,7 @@ void HighsLpRelaxation::performAging(bool deleteRows) {
627627
deletemask[i] = 1;
628628
assert(lprows[i].cutpool <= mipsolver.mipdata_->cutpools.size());
629629
mipsolver.mipdata_->cutpools[lprows[i].cutpool].lpCutRemoved(
630-
lprows[i].index);
630+
lprows[i].index, mipsolver.mipdata_->parallelLockActive());
631631
}
632632
} else if (std::abs(lpsolver.getSolution().row_dual[i]) >
633633
lpsolver.getOptions().dual_feasibility_tolerance) {

0 commit comments

Comments
 (0)