From 7915f295a6b1324f5214aa531eedec02009166ec Mon Sep 17 00:00:00 2001 From: jajhall Date: Fri, 27 Sep 2024 12:39:47 +0100 Subject: [PATCH] Formatted --- src/lp_data/HighsModelUtils.cpp | 2 +- src/lp_data/HighsOptions.h | 11 ++-- src/mip/HighsMipAnalysis.cpp | 16 +++--- src/mip/HighsMipAnalysis.h | 4 +- src/mip/HighsMipSolver.cpp | 95 ++++++++++++++++----------------- src/mip/MipTimer.h | 77 +++++++++++++------------- src/util/HighsTimer.h | 6 ++- 7 files changed, 106 insertions(+), 105 deletions(-) diff --git a/src/lp_data/HighsModelUtils.cpp b/src/lp_data/HighsModelUtils.cpp index 004560eae9..7cdb46fa43 100644 --- a/src/lp_data/HighsModelUtils.cpp +++ b/src/lp_data/HighsModelUtils.cpp @@ -107,7 +107,7 @@ std::string statusToString(const HighsBasisStatus status, const double lower, if (lower == upper) { return "FX"; } else { - return "UB"; + return "UB"; } break; case HighsBasisStatus::kZero: diff --git a/src/lp_data/HighsOptions.h b/src/lp_data/HighsOptions.h index 633a08a40d..e67a221698 100644 --- a/src/lp_data/HighsOptions.h +++ b/src/lp_data/HighsOptions.h @@ -736,11 +736,12 @@ class HighsOptions : public HighsOptionsStruct { kHighsDebugLevelMin, kHighsDebugLevelMax); records.push_back(record_int); - record_int = new OptionRecordInt( - "highs_analysis_level", "Analysis level in HiGHS", now_advanced, - &highs_analysis_level, kHighsAnalysisLevelMin, kHighsAnalysisLevelMipTime, - //kHighsAnalysisLevelMin, - kHighsAnalysisLevelMax); + record_int = + new OptionRecordInt("highs_analysis_level", "Analysis level in HiGHS", + now_advanced, &highs_analysis_level, + kHighsAnalysisLevelMin, kHighsAnalysisLevelMipTime, + // kHighsAnalysisLevelMin, + kHighsAnalysisLevelMax); records.push_back(record_int); record_int = new OptionRecordInt( diff --git a/src/mip/HighsMipAnalysis.cpp b/src/mip/HighsMipAnalysis.cpp index c8cb53b634..5d5e1d46ff 100644 --- a/src/mip/HighsMipAnalysis.cpp +++ b/src/mip/HighsMipAnalysis.cpp @@ -41,8 +41,10 @@ void HighsMipAnalysis::mipTimerStart(const HighsInt mip_clock if (!analyse_mip_time) return; HighsInt highs_timer_clock = mip_clocks.clock_[mip_clock]; if (highs_timer_clock == check_mip_clock) { - std::string clock_name = mip_clocks.timer_pointer_->clock_names[check_mip_clock]; - printf("MipTimer: starting clock %d: %s\n", int(check_mip_clock), clock_name.c_str()); + std::string clock_name = + mip_clocks.timer_pointer_->clock_names[check_mip_clock]; + printf("MipTimer: starting clock %d: %s\n", int(check_mip_clock), + clock_name.c_str()); } mip_clocks.timer_pointer_->start(highs_timer_clock); } @@ -53,14 +55,16 @@ void HighsMipAnalysis::mipTimerStop(const HighsInt mip_clock if (!analyse_mip_time) return; HighsInt highs_timer_clock = mip_clocks.clock_[mip_clock]; if (highs_timer_clock == check_mip_clock) { - std::string clock_name = mip_clocks.timer_pointer_->clock_names[check_mip_clock]; - printf("MipTimer: stopping clock %d: %s\n", int(check_mip_clock), clock_name.c_str()); + std::string clock_name = + mip_clocks.timer_pointer_->clock_names[check_mip_clock]; + printf("MipTimer: stopping clock %d: %s\n", int(check_mip_clock), + clock_name.c_str()); } mip_clocks.timer_pointer_->stop(highs_timer_clock); } bool HighsMipAnalysis::mipTimerRunning(const HighsInt mip_clock - // , const HighsInt thread_id + // , const HighsInt thread_id ) { if (!analyse_mip_time) return; HighsInt highs_timer_clock = mip_clocks.clock_[mip_clock]; @@ -68,7 +72,7 @@ bool HighsMipAnalysis::mipTimerRunning(const HighsInt mip_clock } double HighsMipAnalysis::mipTimerRead(const HighsInt mip_clock - // , const HighsInt thread_id + // , const HighsInt thread_id ) { if (!analyse_mip_time) return; HighsInt highs_timer_clock = mip_clocks.clock_[mip_clock]; diff --git a/src/mip/HighsMipAnalysis.h b/src/mip/HighsMipAnalysis.h index 145dbcd8a3..78d571f80b 100644 --- a/src/mip/HighsMipAnalysis.h +++ b/src/mip/HighsMipAnalysis.h @@ -34,10 +34,10 @@ class HighsMipAnalysis { // , const HighsInt thread_id = 0 ); bool mipTimerRunning(const HighsInt mip_clock - // , const HighsInt thread_id = 0 + // , const HighsInt thread_id = 0 ); double mipTimerRead(const HighsInt mip_clock - // , const HighsInt thread_id = 0 + // , const HighsInt thread_id = 0 ); void reportMipTimer(); diff --git a/src/mip/HighsMipSolver.cpp b/src/mip/HighsMipSolver.cpp index 7e3eed5d48..1011aae56e 100644 --- a/src/mip/HighsMipSolver.cpp +++ b/src/mip/HighsMipSolver.cpp @@ -246,41 +246,39 @@ void HighsMipSolver::run() { while (true) { // Possibly apply primal heuristics if (considerHeuristics && mipdata_->moreHeuristicsAllowed()) { + analysis_.mipTimerStart(kMipClockEvaluateNode); + const HighsSearch::NodeResult evaluate_node_result = + search.evaluateNode(); + analysis_.mipTimerStop(kMipClockEvaluateNode); - analysis_.mipTimerStart(kMipClockEvaluateNode); - const HighsSearch::NodeResult evaluate_node_result = search.evaluateNode(); - analysis_.mipTimerStop(kMipClockEvaluateNode); - - if (evaluate_node_result == HighsSearch::NodeResult::kSubOptimal) - break; + if (evaluate_node_result == HighsSearch::NodeResult::kSubOptimal) break; if (search.currentNodePruned()) { ++mipdata_->num_leaves; search.flushStatistics(); } else { - - analysis_.mipTimerStart(kMipClockPrimalHeuristics); + analysis_.mipTimerStart(kMipClockPrimalHeuristics); if (mipdata_->incumbent.empty()) { - analysis_.mipTimerStart(kMipClockRandomizedRounding); + analysis_.mipTimerStart(kMipClockRandomizedRounding); mipdata_->heuristics.randomizedRounding( mipdata_->lp.getLpSolver().getSolution().col_value); - analysis_.mipTimerStop(kMipClockRandomizedRounding); - } + analysis_.mipTimerStop(kMipClockRandomizedRounding); + } if (mipdata_->incumbent.empty()) { - analysis_.mipTimerStart(kMipClockRens); + analysis_.mipTimerStart(kMipClockRens); mipdata_->heuristics.RENS( mipdata_->lp.getLpSolver().getSolution().col_value); - analysis_.mipTimerStop(kMipClockRens); - } else { - analysis_.mipTimerStart(kMipClockRins); + analysis_.mipTimerStop(kMipClockRens); + } else { + analysis_.mipTimerStart(kMipClockRins); mipdata_->heuristics.RINS( mipdata_->lp.getLpSolver().getSolution().col_value); - analysis_.mipTimerStop(kMipClockRins); - } + analysis_.mipTimerStop(kMipClockRins); + } mipdata_->heuristics.flushStatistics(); - analysis_.mipTimerStop(kMipClockPrimalHeuristics); + analysis_.mipTimerStop(kMipClockPrimalHeuristics); } } @@ -289,10 +287,9 @@ void HighsMipSolver::run() { if (mipdata_->domain.infeasible()) break; if (!search.currentNodePruned()) { - - analysis_.mipTimerStart(kMipClockTheDive); - const HighsSearch::NodeResult search_dive_result = search.dive(); - analysis_.mipTimerStop(kMipClockTheDive); + analysis_.mipTimerStart(kMipClockTheDive); + const HighsSearch::NodeResult search_dive_result = search.dive(); + analysis_.mipTimerStop(kMipClockTheDive); if (search_dive_result == HighsSearch::NodeResult::kSubOptimal) break; @@ -318,15 +315,15 @@ void HighsMipSolver::run() { if (mipdata_->conflictPool.getNumConflicts() > options_mip_->mip_pool_soft_limit) { - analysis_.mipTimerStart(kMipClockPerformAging2); + analysis_.mipTimerStart(kMipClockPerformAging2); mipdata_->conflictPool.performAging(); - analysis_.mipTimerStop(kMipClockPerformAging2); + analysis_.mipTimerStop(kMipClockPerformAging2); } search.flushStatistics(); mipdata_->printDisplayLine(); // printf("continue plunging due to good estimate\n"); - } // while (true) + } // while (true) analysis_.mipTimerStop(kMipClockDive); analysis_.mipTimerStart(kMipClockOpenNodesToQueue); @@ -458,10 +455,10 @@ void HighsMipSolver::run() { highsLogUser(options_mip_->log_options, HighsLogType::kInfo, "\nRestarting search from the root node\n"); mipdata_->performRestart(); - analysis_.mipTimerStop(kMipClockSearch); + analysis_.mipTimerStop(kMipClockSearch); goto restart; } - } // if (!submip && mipdata_->num_nodes >= nextCheck)) + } // if (!submip && mipdata_->num_nodes >= nextCheck)) // remove the iteration limit when installing a new node // mipdata_->lp.setIterationLimit(); @@ -582,10 +579,10 @@ void HighsMipSolver::run() { } break; - } // while(!mipdata_->nodequeue.empty()) + } // while(!mipdata_->nodequeue.empty()) if (limit_reached) break; - } // while(search.hasNode()) + } // while(search.hasNode()) analysis_.mipTimerStop(kMipClockSearch); cleanupSolve(); @@ -595,7 +592,8 @@ void HighsMipSolver::cleanupSolve() { mipdata_->printDisplayLine('Z'); // Stop the solve clock - which won't be running if presolve // determines the model status - if (analysis_.mipTimerRunning(kMipClockSolve)) analysis_.mipTimerStop(kMipClockSolve); + if (analysis_.mipTimerRunning(kMipClockSolve)) + analysis_.mipTimerStop(kMipClockSolve); analysis_.mipTimerStart(kMipClockPostsolve); bool havesolution = solution_objective_ != kHighsInf; bool feasible; @@ -704,24 +702,25 @@ void HighsMipSolver::cleanupSolve() { " %.12g (row viol.)\n", solution_objective_, bound_violation_, integrality_violation_, row_violation_); - highsLogUser( - options_mip_->log_options, HighsLogType::kInfo, - " Timing %.2f (total)\n" - " %.2f (presolve)\n" - " %.2f (solve)\n" - " %.2f (postsolve)\n" - " Nodes %llu\n" - " LP iterations %llu (total)\n" - " %llu (strong br.)\n" - " %llu (separation)\n" - " %llu (heuristics)\n", - timer_.read(timer_.total_clock), analysis_.mipTimerRead(kMipClockPresolve), - analysis_.mipTimerRead(kMipClockSolve), analysis_.mipTimerRead(kMipClockPostsolve), - (long long unsigned)mipdata_->num_nodes, - (long long unsigned)mipdata_->total_lp_iterations, - (long long unsigned)mipdata_->sb_lp_iterations, - (long long unsigned)mipdata_->sepa_lp_iterations, - (long long unsigned)mipdata_->heuristic_lp_iterations); + highsLogUser(options_mip_->log_options, HighsLogType::kInfo, + " Timing %.2f (total)\n" + " %.2f (presolve)\n" + " %.2f (solve)\n" + " %.2f (postsolve)\n" + " Nodes %llu\n" + " LP iterations %llu (total)\n" + " %llu (strong br.)\n" + " %llu (separation)\n" + " %llu (heuristics)\n", + timer_.read(timer_.total_clock), + analysis_.mipTimerRead(kMipClockPresolve), + analysis_.mipTimerRead(kMipClockSolve), + analysis_.mipTimerRead(kMipClockPostsolve), + (long long unsigned)mipdata_->num_nodes, + (long long unsigned)mipdata_->total_lp_iterations, + (long long unsigned)mipdata_->sb_lp_iterations, + (long long unsigned)mipdata_->sepa_lp_iterations, + (long long unsigned)mipdata_->heuristic_lp_iterations); analysis_.reportMipTimer(); diff --git a/src/mip/MipTimer.h b/src/mip/MipTimer.h index edda8e6fbc..3ba83982da 100644 --- a/src/mip/MipTimer.h +++ b/src/mip/MipTimer.h @@ -64,7 +64,8 @@ class MipTimer { clock[kMipClockInit] = timer_pointer->clock_def("Initialise"); clock[kMipClockRunPresolve] = timer_pointer->clock_def("Run presolve"); clock[kMipClockRunSetup] = timer_pointer->clock_def("Run setup"); - clock[kMipClockEvaluateRootNode] = timer_pointer->clock_def("Evaluate root node"); + clock[kMipClockEvaluateRootNode] = + timer_pointer->clock_def("Evaluate root node"); clock[kMipClockPerformAging0] = timer_pointer->clock_def("Perform aging 0"); clock[kMipClockSearch] = timer_pointer->clock_def("Search"); // kMipClockPostsolve @@ -72,22 +73,27 @@ class MipTimer { // Search - Should correspond to kMipClockSearch clock[kMipClockPerformAging1] = timer_pointer->clock_def("Perform aging 1"); clock[kMipClockDive] = timer_pointer->clock_def("Dive"); - clock[kMipClockOpenNodesToQueue] = timer_pointer->clock_def("Open nodes to queue"); - clock[kMipClockDomainPropgate] = timer_pointer->clock_def("Domain propagate"); - clock[kMipClockPruneInfeasibleNodes] = timer_pointer->clock_def("Prune infeasible nodes"); + clock[kMipClockOpenNodesToQueue] = + timer_pointer->clock_def("Open nodes to queue"); + clock[kMipClockDomainPropgate] = + timer_pointer->clock_def("Domain propagate"); + clock[kMipClockPruneInfeasibleNodes] = + timer_pointer->clock_def("Prune infeasible nodes"); // Dive - Should correspond to kMipClockDive clock[kMipClockEvaluateNode] = timer_pointer->clock_def("Evaluate node"); - clock[kMipClockPrimalHeuristics] = timer_pointer->clock_def("Primal heuristics"); - clock[kMipClockTheDive] = timer_pointer->clock_def("The dive"); - clock[kMipClockBacktrackPlunge] = timer_pointer->clock_def("Backtrack plunge"); + clock[kMipClockPrimalHeuristics] = + timer_pointer->clock_def("Primal heuristics"); + clock[kMipClockTheDive] = timer_pointer->clock_def("The dive"); + clock[kMipClockBacktrackPlunge] = + timer_pointer->clock_def("Backtrack plunge"); clock[kMipClockPerformAging2] = timer_pointer->clock_def("Perform aging 2"); // Primal heuristics - Should correspond to kMipClockPrimalHeuristics - clock[kMipClockRandomizedRounding] = timer_pointer->clock_def("Randomized rounding"); + clock[kMipClockRandomizedRounding] = + timer_pointer->clock_def("Randomized rounding"); clock[kMipClockRens] = timer_pointer->clock_def("RENS"); clock[kMipClockRins] = timer_pointer->clock_def("RINS"); - // clock[] = timer_pointer->clock_def(""); } @@ -95,7 +101,7 @@ class MipTimer { bool reportMipClockList(const char* grepStamp, const std::vector mip_clock_list, const HighsTimerClock& mip_timer_clock, - const HighsInt kMipClockIdeal = kMipClockTotal, + const HighsInt kMipClockIdeal = kMipClockTotal, const double tolerance_percent_report_ = -1) { HighsTimer* timer_pointer = mip_timer_clock.timer_pointer_; const std::vector& clock = mip_timer_clock.clock_; @@ -117,53 +123,42 @@ class MipTimer { // const std::vector& clock = mip_timer_clock.clock_; const std::vector mip_clock_list{ kMipClockPresolve, kMipClockSolve, kMipClockPostsolve}; - reportMipClockList("MipCore", mip_clock_list, mip_timer_clock, kMipClockTotal); + reportMipClockList("MipCore", mip_clock_list, mip_timer_clock, + kMipClockTotal); }; void reportMipLevel1Clock(const HighsTimerClock& mip_timer_clock) { const std::vector mip_clock_list{ - kMipClockInit, - kMipClockRunPresolve, - kMipClockRunSetup, - kMipClockEvaluateRootNode, - kMipClockPerformAging0, - kMipClockSearch, - kMipClockPostsolve - }; - reportMipClockList("MipLvl1", mip_clock_list, mip_timer_clock, kMipClockTotal, tolerance_percent_report); + kMipClockInit, kMipClockRunPresolve, + kMipClockRunSetup, kMipClockEvaluateRootNode, + kMipClockPerformAging0, kMipClockSearch, + kMipClockPostsolve}; + reportMipClockList("MipLvl1", mip_clock_list, mip_timer_clock, + kMipClockTotal, tolerance_percent_report); }; void reportMipSearchClock(const HighsTimerClock& mip_timer_clock) { const std::vector mip_clock_list{ - kMipClockPerformAging1, - kMipClockDive, - kMipClockOpenNodesToQueue, - kMipClockDomainPropgate, - kMipClockPruneInfeasibleNodes - }; - reportMipClockList("MipSrch", mip_clock_list, mip_timer_clock, kMipClockSearch, tolerance_percent_report); + kMipClockPerformAging1, kMipClockDive, kMipClockOpenNodesToQueue, + kMipClockDomainPropgate, kMipClockPruneInfeasibleNodes}; + reportMipClockList("MipSrch", mip_clock_list, mip_timer_clock, + kMipClockSearch, tolerance_percent_report); }; void reportMipDiveClock(const HighsTimerClock& mip_timer_clock) { const std::vector mip_clock_list{ - kMipClockEvaluateNode, - kMipClockPrimalHeuristics, - kMipClockTheDive, - kMipClockBacktrackPlunge, - kMipClockPerformAging2 - }; - reportMipClockList("MipDive", mip_clock_list, mip_timer_clock, kMipClockDive, tolerance_percent_report); + kMipClockEvaluateNode, kMipClockPrimalHeuristics, kMipClockTheDive, + kMipClockBacktrackPlunge, kMipClockPerformAging2}; + reportMipClockList("MipDive", mip_clock_list, mip_timer_clock, + kMipClockDive, tolerance_percent_report); }; void reportMipPrimalHeuristicsClock(const HighsTimerClock& mip_timer_clock) { - const std::vector mip_clock_list{ - kMipClockRandomizedRounding, - kMipClockRens, - kMipClockRins - }; - reportMipClockList("MipPrimalHeuristics", mip_clock_list, mip_timer_clock, kMipClockPrimalHeuristics, tolerance_percent_report); + const std::vector mip_clock_list{kMipClockRandomizedRounding, + kMipClockRens, kMipClockRins}; + reportMipClockList("MipPrimalHeuristics", mip_clock_list, mip_timer_clock, + kMipClockPrimalHeuristics, tolerance_percent_report); }; - }; #endif /* MIP_MIPTIMER_H_ */ diff --git a/src/util/HighsTimer.h b/src/util/HighsTimer.h index 82e183df61..6feb433999 100644 --- a/src/util/HighsTimer.h +++ b/src/util/HighsTimer.h @@ -141,7 +141,8 @@ class HighsTimer { // the clock's been started when it's next stopped if (i_clock == check_clock) { std::string clock_name = this->clock_names[check_clock]; - printf("HighsTimer: starting clock %d: %s\n", int(check_clock), clock_name.c_str()); + printf("HighsTimer: starting clock %d: %s\n", int(check_clock), + clock_name.c_str()); } clock_start[i_clock] = -getWallTime(); } @@ -164,7 +165,8 @@ class HighsTimer { // stopped when it's next started if (i_clock == check_clock) { std::string clock_name = this->clock_names[check_clock]; - printf("HighsTimer: stopping clock %d: %s\n", int(check_clock), clock_name.c_str()); + printf("HighsTimer: stopping clock %d: %s\n", int(check_clock), + clock_name.c_str()); } clock_start[i_clock] = wall_time; }