diff --git a/src/math/lp/core_solver_pretty_printer.h b/src/math/lp/core_solver_pretty_printer.h index 990fd94ed..61540c155 100644 --- a/src/math/lp/core_solver_pretty_printer.h +++ b/src/math/lp/core_solver_pretty_printer.h @@ -52,7 +52,7 @@ class core_solver_pretty_printer { std::string m_upp_bounds_title; std::string m_exact_norm_title; std::string m_approx_norm_title; - + bool m_squash_blanks; unsigned ncols() { return m_core_solver.m_A.column_count(); } unsigned nrows() { return m_core_solver.m_A.row_count(); } @@ -124,9 +124,9 @@ public: void print_cost(); - void print_given_rows(vector & row, vector & signs, X rst); + void print_given_row(vector & row, vector & signs, X rst); void print_row(unsigned i); - + void print_blanks_local(int n, std::ostream & out); }; } diff --git a/src/math/lp/core_solver_pretty_printer_def.h b/src/math/lp/core_solver_pretty_printer_def.h index 828e10cce..8d2cef125 100644 --- a/src/math/lp/core_solver_pretty_printer_def.h +++ b/src/math/lp/core_solver_pretty_printer_def.h @@ -53,6 +53,7 @@ core_solver_pretty_printer::core_solver_pretty_printer(lp_core_solver_base m_basis_heading_title = "heading"; m_x_title = "x*"; m_title_width = static_cast(std::max(std::max(m_cost_title.size(), std::max(m_basis_heading_title.size(), m_x_title.size())), m_approx_norm_title.size())); + m_squash_blanks = nrows() > 10 && ncols() > 10; } template void core_solver_pretty_printer::init_costs() { @@ -219,6 +220,12 @@ template void core_solver_pretty_printer::set_coe } } + +template void core_solver_pretty_printer::print_blanks_local(int n, std::ostream & out) { + if (m_squash_blanks) + n = 1; + while (n--) {out << ' '; } +} template void core_solver_pretty_printer::print_x() { if (ncols() == 0) { return; @@ -226,13 +233,13 @@ template void core_solver_pretty_printer::print_x int blanks = m_title_width + 1 - static_cast(m_x_title.size()); m_out << m_x_title; - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); auto bh = m_core_solver.m_x; for (unsigned i = 0; i < ncols(); i++) { string s = T_to_string(bh[i]); int blanks = m_column_widths[i] - static_cast(s.size()); - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); m_out << s << " "; // the column interval } m_out << std::endl; @@ -272,12 +279,12 @@ template void core_solver_pretty_printer::print_l } int blanks = m_title_width + 1 - static_cast(m_lower_bounds_title.size()); m_out << m_lower_bounds_title; - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); for (unsigned i = 0; i < ncols(); i++) { string s = get_lower_bound_string(i); int blanks = m_column_widths[i] - static_cast(s.size()); - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); m_out << s << " "; // the column interval } m_out << std::endl; @@ -289,12 +296,12 @@ template void core_solver_pretty_printer::print_u } int blanks = m_title_width + 1 - static_cast(m_upp_bounds_title.size()); m_out << m_upp_bounds_title; - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); for (unsigned i = 0; i < ncols(); i++) { string s = get_upp_bound_string(i); int blanks = m_column_widths[i] - static_cast(s.size()); - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); m_out << s << " "; // the column interval } m_out << std::endl; @@ -304,11 +311,11 @@ template void core_solver_pretty_printer::print_e if (m_core_solver.use_tableau()) return; int blanks = m_title_width + 1 - static_cast(m_exact_norm_title.size()); m_out << m_exact_norm_title; - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); for (unsigned i = 0; i < ncols(); i++) { string s = get_exact_column_norm_string(i); int blanks = m_column_widths[i] - static_cast(s.size()); - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); m_out << s << " "; } m_out << std::endl; @@ -318,11 +325,11 @@ template void core_solver_pretty_printer::print_a if (m_core_solver.use_tableau()) return; int blanks = m_title_width + 1 - static_cast(m_approx_norm_title.size()); m_out << m_approx_norm_title; - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); for (unsigned i = 0; i < ncols(); i++) { string s = T_to_string(m_core_solver.m_column_norms[i]); int blanks = m_column_widths[i] - static_cast(s.size()); - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); m_out << s << " "; } m_out << std::endl; @@ -347,7 +354,7 @@ template void core_solver_pretty_printer::print() template void core_solver_pretty_printer::print_basis_heading() { int blanks = m_title_width + 1 - static_cast(m_basis_heading_title.size()); m_out << m_basis_heading_title; - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); if (ncols() == 0) { return; @@ -356,7 +363,7 @@ template void core_solver_pretty_printer::print_b for (unsigned i = 0; i < ncols(); i++) { string s = T_to_string(bh[i]); int blanks = m_column_widths[i] - static_cast(s.size()); - print_blanks(blanks, m_out); + print_blanks_local(blanks, m_out); m_out << s << " "; // the column interval } m_out << std::endl; @@ -365,36 +372,44 @@ template void core_solver_pretty_printer::print_b template void core_solver_pretty_printer::print_cost() { int blanks = m_title_width + 1 - static_cast(m_cost_title.size()); m_out << m_cost_title; - print_blanks(blanks, m_out); - print_given_rows(m_costs, m_cost_signs, m_core_solver.get_cost()); + print_blanks_local(blanks, m_out); + print_given_row(m_costs, m_cost_signs, m_core_solver.get_cost()); } -template void core_solver_pretty_printer::print_given_rows(vector & row, vector & signs, X rst) { +bool string_is_trivial(const std::string & s) { + for (char c : s) { + if (c != '0' && c != '.') + return false; + } + return true; +} + +template void core_solver_pretty_printer::print_given_row(vector & row, vector & signs, X rst) { for (unsigned col = 0; col < row.size(); col++) { unsigned width = m_column_widths[col]; string s = row[col]; + if (m_squash_blanks && string_is_trivial(s)) + continue; int number_of_blanks = width - static_cast(s.size()); lp_assert(number_of_blanks >= 0); - print_blanks(number_of_blanks, m_out); + m_out << signs[col] << ' '; + print_blanks_local(number_of_blanks, m_out); m_out << s << ' '; - if (col < row.size() - 1) { - m_out << signs[col + 1] << ' '; - } } m_out << '='; string rs = T_to_string(rst); int nb = m_rs_width - static_cast(rs.size()); lp_assert(nb >= 0); - print_blanks(nb + 1, m_out); + print_blanks_local(nb + 1, m_out); m_out << rs << std::endl; } template void core_solver_pretty_printer::print_row(unsigned i){ - print_blanks(m_title_width + 1, m_out); + print_blanks_local(m_title_width + 1, m_out); auto row = m_A[i]; auto sign_row = m_signs[i]; auto rs = m_rs[i]; - print_given_rows(row, sign_row, rs); + print_given_row(row, sign_row, rs); } }