| 1840 | } |
| 1841 | |
| 1842 | bool HighsMipSolverData::rootSeparationRound( |
| 1843 | HighsMipWorker& worker, HighsSeparation& sepa, HighsInt& ncuts, |
| 1844 | HighsLpRelaxation::Status& status) { |
| 1845 | int64_t tmpLpIters = -getLp().getNumLpIterations(); |
| 1846 | ncuts = sepa.separationRound(getDomain(), status); |
| 1847 | tmpLpIters += getLp().getNumLpIterations(); |
| 1848 | avgrootlpiters = getLp().getAvgSolveIters(); |
| 1849 | total_lp_iterations += tmpLpIters; |
| 1850 | sepa_lp_iterations += tmpLpIters; |
| 1851 | |
| 1852 | status = evaluateRootLp(worker); |
| 1853 | if (status == HighsLpRelaxation::Status::kInfeasible) return true; |
| 1854 | |
| 1855 | const std::vector<double>& solvals = |
| 1856 | getLp().getLpSolver().getSolution().col_value; |
| 1857 | |
| 1858 | if (mipsolver.submip || incumbent.empty()) { |
| 1859 | heuristics.randomizedRounding(worker, solvals); |
| 1860 | if (mipsolver.options_mip_->mip_heuristic_run_shifting) |
| 1861 | heuristics.shifting(worker, solvals); |
| 1862 | heuristics.flushStatistics(mipsolver, worker); |
| 1863 | status = evaluateRootLp(worker); |
| 1864 | if (status == HighsLpRelaxation::Status::kInfeasible) return true; |
| 1865 | } |
| 1866 | |
| 1867 | return false; |
| 1868 | } |
| 1869 | |
| 1870 | HighsLpRelaxation::Status HighsMipSolverData::evaluateRootLp( |
| 1871 | HighsMipWorker& worker) { |
nothing calls this directly
no test coverage detected