20#include "absl/strings/str_cat.h"
21#include "absl/strings/str_format.h"
22#include "absl/strings/string_view.h"
31std::string ExtractSubSolverName(
const std::string& improvement_info) {
32 if (improvement_info.empty())
return "";
35 for (
int i = 0;
i < improvement_info.size(); ++
i) {
36 if (!std::isalnum(improvement_info[
i]) && improvement_info[
i] !=
'_') {
37 return improvement_info.substr(0,
i);
41 return improvement_info;
44std::string ProgressMessage(absl::string_view event_or_solution_count,
45 double time_in_seconds,
double obj_best,
46 double obj_lb,
double obj_ub,
47 absl::string_view solution_info) {
48 const std::string obj_next =
49 obj_lb <= obj_ub ? absl::StrFormat(
"next:[%.9g,%.9g]", obj_lb, obj_ub)
51 return absl::StrFormat(
"#%-5s %6.2fs best:%-5.9g %-15s %s",
52 event_or_solution_count, time_in_seconds, obj_best,
53 obj_next, solution_info);
56std::string SatProgressMessage(absl::string_view event_or_solution_count,
57 double time_in_seconds,
58 absl::string_view solution_info) {
59 return absl::StrFormat(
"#%-5s %6.2fs %s", event_or_solution_count,
60 time_in_seconds, solution_info);
68 SatProgressMessage(
"Done", wall_timer_.Get(), info.
change_info));
72 RegisterSolutionFound(info.
change_info, num_solutions_);
75 if (is_optimization_) {
76 RegisterSolutionFound(info.
change_info, num_solutions_);
79 absl::StrCat(num_solutions_), wall_timer_.Get(),
85 SatProgressMessage(absl::StrCat(num_solutions_),
90 logger_->ThrottledLog(
95 RegisterObjectiveBoundImprovement(info.
change_info);
99void SolverProgressLogger::RegisterSolutionFound(
100 const std::string& improvement_info,
int solution_number) {
101 if (improvement_info.empty())
return;
102 const std::string subsolver_name = ExtractSubSolverName(improvement_info);
103 primal_improvements_count_[subsolver_name]++;
104 primal_improvements_min_rank_.insert({subsolver_name, solution_number});
105 primal_improvements_max_rank_[subsolver_name] = solution_number;
108void SolverProgressLogger::RegisterObjectiveBoundImprovement(
109 const std::string& improvement_info) {
110 if (improvement_info.empty() || improvement_info ==
"initial domain")
return;
111 dual_improvements_count_[ExtractSubSolverName(improvement_info)]++;
116 if (!primal_improvements_count_.empty()) {
117 std::vector<std::vector<std::string>> table;
119 {absl::StrCat(
"Solutions (", num_solutions_,
")"),
"Num",
"Rank"});
120 for (
const auto& entry : primal_improvements_count_) {
121 auto it = primal_improvements_min_rank_.find(entry.first);
122 if (it == primal_improvements_min_rank_.end())
continue;
123 const int min_rank = it->second;
124 it = primal_improvements_max_rank_.find(entry.first);
125 if (it == primal_improvements_max_rank_.end())
continue;
126 const int max_rank = it->second;
128 absl::StrCat(
"[", min_rank,
",", max_rank,
"]")});
132 if (!dual_improvements_count_.empty()) {
133 std::vector<std::vector<std::string>> table;
134 table.push_back({
"Objective bounds",
"Num"});
135 for (
const auto& entry : dual_improvements_count_) {
void UpdateProgress(const SolverStatusChangeInfo &info)
void DisplayImprovementStatistics(SolverLogger *logger) const
std::string FormatName(absl::string_view name)
std::string FormatTable(std::vector< std::vector< std::string > > &table, int spacing)
std::string FormatCounter(int64_t num)
double cur_objective_value_ub
double best_objective_value
double cur_objective_value_lb
#define SOLVER_LOG(logger,...)