@@ -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