@@ -929,14 +929,7 @@ void HighsMipSolverData::runSetup() {
929929 if (domain.infeasible ()) {
930930 mipsolver.modelstatus_ = HighsModelStatus::kInfeasible ;
931931
932- double prev_lower_bound = lower_bound;
933-
934- lower_bound = kHighsInf ;
935-
936- bool bound_change = lower_bound != prev_lower_bound;
937- if (!mipsolver.submip && bound_change)
938- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
939- upper_bound);
932+ updateLowerBound (kHighsInf );
940933
941934 pruned_treeweight = 1.0 ;
942935 return ;
@@ -989,14 +982,7 @@ void HighsMipSolverData::runSetup() {
989982 // integer variable is fixed to a fractional value -> infeasible
990983 mipsolver.modelstatus_ = HighsModelStatus::kInfeasible ;
991984
992- double prev_lower_bound = lower_bound;
993-
994- lower_bound = kHighsInf ;
995-
996- bool bound_change = lower_bound != prev_lower_bound;
997- if (!mipsolver.submip && bound_change)
998- updatePrimalDualIntegral (prev_lower_bound, lower_bound,
999- upper_bound, upper_bound);
985+ updateLowerBound (kHighsInf );
1000986
1001987 pruned_treeweight = 1.0 ;
1002988 return ;
@@ -1389,19 +1375,14 @@ void HighsMipSolverData::performRestart() {
13891375 // is never applied, since MIP solving is complete, and
13901376 // lower_bound is set to upper_bound, so apply the offset now, so
13911377 // that housekeeping in updatePrimalDualIntegral is correct
1392- double prev_lower_bound = lower_bound - mipsolver.model_ ->offset_ ;
1393-
1394- lower_bound = upper_bound;
1378+ lower_bound -= mipsolver.model_ ->offset_ ;
13951379
13961380 // There must be a gap change, since it's now zero, so always call
13971381 // updatePrimalDualIntegral (unless solving a sub-MIP)
13981382 //
13991383 // Surely there must be a lower bound change
1400- bool bound_change = lower_bound != prev_lower_bound;
1401- assert (bound_change);
1402- if (!mipsolver.submip && bound_change)
1403- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1404- upper_bound);
1384+ updateLowerBound (upper_bound);
1385+
14051386 if (mipsolver.solution_objective_ != kHighsInf &&
14061387 mipsolver.modelstatus_ == HighsModelStatus::kInfeasible )
14071388 mipsolver.modelstatus_ = HighsModelStatus::kOptimal ;
@@ -1823,14 +1804,7 @@ HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp() {
18231804 globalOrbits->orbitalFixing (domain);
18241805
18251806 if (domain.infeasible ()) {
1826- double prev_lower_bound = lower_bound;
1827-
1828- lower_bound = std::min (kHighsInf , upper_bound);
1829-
1830- bool bound_change = lower_bound != prev_lower_bound;
1831- if (!mipsolver.submip && bound_change)
1832- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1833- upper_bound);
1807+ updateLowerBound (std::min (kHighsInf , upper_bound));
18341808 pruned_treeweight = 1.0 ;
18351809 num_nodes += 1 ;
18361810 num_leaves += 1 ;
@@ -1872,15 +1846,7 @@ HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp() {
18721846 addIncumbent (lp.getLpSolver ().getSolution ().col_value ,
18731847 lp.getObjective (), kSolutionSourceEvaluateNode )) {
18741848 mipsolver.modelstatus_ = HighsModelStatus::kOptimal ;
1875-
1876- double prev_lower_bound = lower_bound;
1877-
1878- lower_bound = upper_bound;
1879-
1880- bool bound_change = lower_bound != prev_lower_bound;
1881- if (!mipsolver.submip && bound_change)
1882- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1883- upper_bound);
1849+ updateLowerBound (upper_bound);
18841850 pruned_treeweight = 1.0 ;
18851851 num_nodes += 1 ;
18861852 num_leaves += 1 ;
@@ -1895,29 +1861,15 @@ HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp() {
18951861 status = lp.getStatus ();
18961862
18971863 if (status == HighsLpRelaxation::Status::kInfeasible ) {
1898- double prev_lower_bound = lower_bound;
1899-
1900- lower_bound = std::min (kHighsInf , upper_bound);
1901-
1902- bool bound_change = lower_bound != prev_lower_bound;
1903- if (!mipsolver.submip && bound_change)
1904- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1905- upper_bound);
1864+ updateLowerBound (std::min (kHighsInf , upper_bound));
19061865 pruned_treeweight = 1.0 ;
19071866 num_nodes += 1 ;
19081867 num_leaves += 1 ;
19091868 return status;
19101869 }
19111870
19121871 if (lp.unscaledDualFeasible (lp.getStatus ())) {
1913- double prev_lower_bound = lower_bound;
1914-
1915- lower_bound = std::max (lp.getObjective (), lower_bound);
1916-
1917- bool bound_change = lower_bound != prev_lower_bound;
1918- if (!mipsolver.submip && bound_change)
1919- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
1920- upper_bound);
1872+ updateLowerBound (std::max (lp.getObjective (), lower_bound));
19211873
19221874 if (lpWasSolved) {
19231875 redcostfixing.addRootRedcost (mipsolver,
@@ -1994,14 +1946,7 @@ void HighsMipSolverData::evaluateRootNode() {
19941946 domain.clearChangedCols ();
19951947 lp.setObjectiveLimit (upper_limit);
19961948
1997- double prev_lower_bound = lower_bound;
1998-
1999- lower_bound = std::max (lower_bound, domain.getObjectiveLowerBound ());
2000-
2001- bool bound_change = lower_bound != prev_lower_bound;
2002- if (!mipsolver.submip && bound_change)
2003- updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
2004- upper_bound);
1949+ updateLowerBound (std::max (lower_bound, domain.getObjectiveLowerBound ()));
20051950
20061951 printDisplayLine ();
20071952
@@ -2690,6 +2635,15 @@ void HighsMipSolverData::limitsToBounds(double& dual_bound,
26902635 }
26912636}
26922637
2638+ void HighsMipSolverData::updateLowerBound (double new_lower_bound) {
2639+ // Update lower bound
2640+ double prev_lower_bound = lower_bound;
2641+ lower_bound = new_lower_bound;
2642+ if (!mipsolver.submip && lower_bound != prev_lower_bound)
2643+ updatePrimalDualIntegral (prev_lower_bound, lower_bound, upper_bound,
2644+ upper_bound);
2645+ }
2646+
26932647// Interface to callbackAction, with mipsolver_objective_value since
26942648// incumbent value (mipsolver.solution_objective_) is not right for
26952649// callback_type = kCallbackMipSolution
0 commit comments