Skip to content

Commit

Permalink
Formatted
Browse files Browse the repository at this point in the history
  • Loading branch information
jajhall committed Sep 27, 2024
1 parent 2abf359 commit 7915f29
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 105 deletions.
2 changes: 1 addition & 1 deletion src/lp_data/HighsModelUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
11 changes: 6 additions & 5 deletions src/lp_data/HighsOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
16 changes: 10 additions & 6 deletions src/mip/HighsMipAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -53,22 +55,24 @@ 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];
return mip_clocks.timer_pointer_->running(highs_timer_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];
Expand Down
4 changes: 2 additions & 2 deletions src/mip/HighsMipAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
95 changes: 47 additions & 48 deletions src/mip/HighsMipSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand All @@ -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;

Expand All @@ -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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand All @@ -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;
Expand Down Expand Up @@ -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();

Expand Down
77 changes: 36 additions & 41 deletions src/mip/MipTimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,38 +64,44 @@ 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

// 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("");
}

bool reportMipClockList(const char* grepStamp,
const std::vector<HighsInt> 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<HighsInt>& clock = mip_timer_clock.clock_;
Expand All @@ -117,53 +123,42 @@ class MipTimer {
// const std::vector<HighsInt>& clock = mip_timer_clock.clock_;
const std::vector<HighsInt> 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<HighsInt> 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<HighsInt> 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<HighsInt> 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<HighsInt> mip_clock_list{
kMipClockRandomizedRounding,
kMipClockRens,
kMipClockRins
};
reportMipClockList("MipPrimalHeuristics", mip_clock_list, mip_timer_clock, kMipClockPrimalHeuristics, tolerance_percent_report);
const std::vector<HighsInt> mip_clock_list{kMipClockRandomizedRounding,
kMipClockRens, kMipClockRins};
reportMipClockList("MipPrimalHeuristics", mip_clock_list, mip_timer_clock,
kMipClockPrimalHeuristics, tolerance_percent_report);
};

};

#endif /* MIP_MIPTIMER_H_ */
Loading

0 comments on commit 7915f29

Please sign in to comment.