Skip to content

Commit 99cb4e5

Browse files
committed
Improve handling of infinite bounds
1 parent c20f0ab commit 99cb4e5

File tree

1 file changed

+19
-21
lines changed

1 file changed

+19
-21
lines changed

highs/presolve/HPresolve.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4693,21 +4693,15 @@ HPresolve::Result HPresolve::singletonColStuffing(
46934693

46944694
// lambda for updating row activity bounds
46954695
auto updateActivityBounds = [&](HighsCDouble& sumLower,
4696-
HighsCDouble& sumUpper, double aj,
4696+
HighsCDouble& sumUpper, bool& sumLowerFinite,
4697+
bool& sumUpperFinite, double aj,
46974698
double lowerSumBound, double upperSumBound) {
4698-
if (sumLower != -kHighsInf) {
4699-
if (std::abs(lowerSumBound) != kHighsInf)
4700-
sumLower += aj * static_cast<HighsCDouble>(lowerSumBound);
4701-
else
4702-
sumLower = -kHighsInf;
4703-
}
4704-
if (sumUpper != kHighsInf) {
4705-
if (std::abs(upperSumBound) != kHighsInf)
4706-
sumUpper += aj * static_cast<HighsCDouble>(upperSumBound);
4707-
else
4708-
sumUpper = kHighsInf;
4709-
}
4710-
return (sumLower != -kHighsInf || sumUpper != kHighsInf);
4699+
sumLowerFinite = sumLowerFinite && std::abs(lowerSumBound) != kHighsInf;
4700+
sumUpperFinite = sumUpperFinite && std::abs(upperSumBound) != kHighsInf;
4701+
if (sumLowerFinite)
4702+
sumLower += aj * static_cast<HighsCDouble>(lowerSumBound);
4703+
if (sumUpperFinite)
4704+
sumUpper += aj * static_cast<HighsCDouble>(upperSumBound);
47114705
};
47124706

47134707
// lambda for actual stuffing
@@ -4719,6 +4713,8 @@ HPresolve::Result HPresolve::singletonColStuffing(
47194713
std::vector<std::tuple<HighsInt, double, HighsInt>> candidates;
47204714
HighsCDouble sumLower = 0.0;
47214715
HighsCDouble sumUpper = 0.0;
4716+
bool sumLowerFinite = true;
4717+
bool sumUpperFinite = true;
47224718

47234719
for (auto& nz : getRowVector(row)) {
47244720
// get column index, coefficient, cost and bounds
@@ -4744,9 +4740,9 @@ HPresolve::Result HPresolve::singletonColStuffing(
47444740
} else if (aj < 0)
47454741
std::swap(sumLowerBound, sumUpperBound);
47464742
// update activities
4747-
if (!updateActivityBounds(sumLower, sumUpper, aj, sumLowerBound,
4748-
sumUpperBound))
4749-
return Result::kOk;
4743+
updateActivityBounds(sumLower, sumUpper, sumLowerFinite, sumUpperFinite,
4744+
aj, sumLowerBound, sumUpperBound);
4745+
if (!sumLowerFinite && !sumUpperFinite) return Result::kOk;
47504746
}
47514747

47524748
// sort candidates
@@ -4767,20 +4763,22 @@ HPresolve::Result HPresolve::singletonColStuffing(
47674763
(static_cast<HighsCDouble>(model->col_upper_[j]) -
47684764
static_cast<HighsCDouble>(model->col_lower_[j]));
47694765
// check if variable can be fixed
4770-
if (delta <= direction * rhs - sumUpper + primal_feastol) {
4766+
if (sumUpperFinite &&
4767+
delta <= direction * rhs - sumUpper + primal_feastol) {
47714768
if (multiplier < 0)
47724769
HPRESOLVE_CHECKED_CALL(fixColToLower(postsolve_stack, j));
47734770
else
47744771
HPRESOLVE_CHECKED_CALL(fixColToUpper(postsolve_stack, j));
4775-
} else if (direction * rhs <= sumLower + primal_feastol) {
4772+
} else if (sumLowerFinite &&
4773+
direction * rhs <= sumLower + primal_feastol) {
47764774
if (multiplier < 0)
47774775
HPRESOLVE_CHECKED_CALL(fixColToUpper(postsolve_stack, j));
47784776
else
47794777
HPRESOLVE_CHECKED_CALL(fixColToLower(postsolve_stack, j));
47804778
}
47814779
// update row activities
4782-
sumLower += delta;
4783-
sumUpper += delta;
4780+
if (sumLowerFinite) sumLower += delta;
4781+
if (sumUpperFinite) sumUpper += delta;
47844782
}
47854783

47864784
return Result::kOk;

0 commit comments

Comments
 (0)