@@ -930,14 +930,7 @@ void HighsMipSolverData::runSetup() {
930930 if (domain.infeasible ()) {
931931 mipsolver.modelstatus_ = HighsModelStatus::kInfeasible ;
932932
933- double prev_lower_bound = lower_bound;
934-
935- lower_bound = kHighsInf ;
936-
937- bool bound_change = lower_bound != prev_lower_bound;
938- if (!mipsolver.submip && bound_change)
939- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
940- upper_bound);
933+ updateLowerBound (kHighsInf );
941934
942935 pruned_treeweight = 1.0 ;
943936 return ;
@@ -990,14 +983,7 @@ void HighsMipSolverData::runSetup() {
990983 // integer variable is fixed to a fractional value -> infeasible
991984 mipsolver.modelstatus_ = HighsModelStatus::kInfeasible ;
992985
993- double prev_lower_bound = lower_bound;
994-
995- lower_bound = kHighsInf ;
996-
997- bool bound_change = lower_bound != prev_lower_bound;
998- if (!mipsolver.submip && bound_change)
999- updatePrimalDualIntegral (prev_lower_bound, lower_bound,
1000- upper_bound, upper_bound);
986+ updateLowerBound (kHighsInf );
1001987
1002988 pruned_treeweight = 1.0 ;
1003989 return ;
@@ -1390,19 +1376,14 @@ void HighsMipSolverData::performRestart() {
13901376 // is never applied, since MIP solving is complete, and
13911377 // lower_bound is set to upper_bound, so apply the offset now, so
13921378 // that housekeeping in updatePrimalDualIntegral is correct
1393- double prev_lower_bound = lower_bound - mipsolver.model_ ->offset_ ;
1394-
1395- lower_bound = upper_bound;
1379+ lower_bound -= mipsolver.model_ ->offset_ ;
13961380
13971381 // There must be a gap change, since it's now zero, so always call
13981382 // updatePrimalDualIntegral (unless solving a sub-MIP)
13991383 //
14001384 // Surely there must be a lower bound change
1401- bool bound_change = lower_bound != prev_lower_bound;
1402- assert (bound_change);
1403- if (!mipsolver.submip && bound_change)
1404- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1405- upper_bound);
1385+ updateLowerBound (upper_bound);
1386+
14061387 if (mipsolver.solution_objective_ != kHighsInf &&
14071388 mipsolver.modelstatus_ == HighsModelStatus::kInfeasible )
14081389 mipsolver.modelstatus_ = HighsModelStatus::kOptimal ;
@@ -1824,14 +1805,7 @@ HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp() {
18241805 globalOrbits->orbitalFixing (domain);
18251806
18261807 if (domain.infeasible ()) {
1827- double prev_lower_bound = lower_bound;
1828-
1829- lower_bound = std::min (kHighsInf , upper_bound);
1830-
1831- bool bound_change = lower_bound != prev_lower_bound;
1832- if (!mipsolver.submip && bound_change)
1833- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1834- upper_bound);
1808+ updateLowerBound (std::min (kHighsInf , upper_bound));
18351809 pruned_treeweight = 1.0 ;
18361810 num_nodes += 1 ;
18371811 num_leaves += 1 ;
@@ -1873,15 +1847,7 @@ HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp() {
18731847 addIncumbent (lp.getLpSolver ().getSolution ().col_value ,
18741848 lp.getObjective (), kSolutionSourceEvaluateNode )) {
18751849 mipsolver.modelstatus_ = HighsModelStatus::kOptimal ;
1876-
1877- double prev_lower_bound = lower_bound;
1878-
1879- lower_bound = upper_bound;
1880-
1881- bool bound_change = lower_bound != prev_lower_bound;
1882- if (!mipsolver.submip && bound_change)
1883- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1884- upper_bound);
1850+ updateLowerBound (upper_bound);
18851851 pruned_treeweight = 1.0 ;
18861852 num_nodes += 1 ;
18871853 num_leaves += 1 ;
@@ -1896,29 +1862,15 @@ HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp() {
18961862 status = lp.getStatus ();
18971863
18981864 if (status == HighsLpRelaxation::Status::kInfeasible ) {
1899- double prev_lower_bound = lower_bound;
1900-
1901- lower_bound = std::min (kHighsInf , upper_bound);
1902-
1903- bool bound_change = lower_bound != prev_lower_bound;
1904- if (!mipsolver.submip && bound_change)
1905- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1906- upper_bound);
1865+ updateLowerBound (std::min (kHighsInf , upper_bound));
19071866 pruned_treeweight = 1.0 ;
19081867 num_nodes += 1 ;
19091868 num_leaves += 1 ;
19101869 return status;
19111870 }
19121871
19131872 if (lp.unscaledDualFeasible (lp.getStatus ())) {
1914- double prev_lower_bound = lower_bound;
1915-
1916- lower_bound = std::max (lp.getObjective (), lower_bound);
1917-
1918- bool bound_change = lower_bound != prev_lower_bound;
1919- if (!mipsolver.submip && bound_change)
1920- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1921- upper_bound);
1873+ updateLowerBound (std::max (lp.getObjective (), lower_bound));
19221874
19231875 if (lpWasSolved) {
19241876 redcostfixing.addRootRedcost (mipsolver,
@@ -1995,14 +1947,7 @@ void HighsMipSolverData::evaluateRootNode() {
19951947 domain.clearChangedCols ();
19961948 lp.setObjectiveLimit (upper_limit);
19971949
1998- double prev_lower_bound = lower_bound;
1999-
2000- lower_bound = std::max (lower_bound, domain.getObjectiveLowerBound ());
2001-
2002- bool bound_change = lower_bound != prev_lower_bound;
2003- if (!mipsolver.submip && bound_change)
2004- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
2005- upper_bound);
1950+ updateLowerBound (std::max (lower_bound, domain.getObjectiveLowerBound ()));
20061951
20071952 printDisplayLine ();
20081953
@@ -2691,6 +2636,15 @@ void HighsMipSolverData::limitsToBounds(double& dual_bound,
26912636 }
26922637}
26932638
2639+ void HighsMipSolverData::updateLowerBound (double new_lower_bound) {
2640+ // Update lower bound
2641+ double prev_lower_bound = lower_bound;
2642+ lower_bound = new_lower_bound;
2643+ if (!mipsolver.submip && lower_bound != prev_lower_bound)
2644+ updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
2645+ upper_bound);
2646+ }
2647+
26942648// Interface to callbackAction, with mipsolver_objective_value since
26952649// incumbent value (mipsolver.solution_objective_) is not right for
26962650// callback_type = kCallbackMipSolution
0 commit comments