mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
debugging simplex/pb
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
ea65f32914
commit
e2db1418f9
7 changed files with 235 additions and 73 deletions
|
@ -115,9 +115,19 @@ namespace simplex {
|
|||
void ensure_var(var_t v);
|
||||
row add_row(var_t base, unsigned num_vars, var_t const* vars, numeral const* coeffs);
|
||||
row get_infeasible_row();
|
||||
var_t get_base_var(row const& r) const { return m_row2base[r.id()]; }
|
||||
numeral const& get_base_coeff(row const& r) const { return m_vars[m_row2base[r.id()]].m_base_coeff; }
|
||||
void del_row(row const& r);
|
||||
void set_lower(var_t var, eps_numeral const& b);
|
||||
void set_upper(var_t var, eps_numeral const& b);
|
||||
void get_lower(var_t var, scoped_eps_numeral& b) const { b = m_vars[var].m_lower; }
|
||||
void get_upper(var_t var, scoped_eps_numeral& b) const { b = m_vars[var].m_upper; }
|
||||
bool above_lower(var_t var, eps_numeral const& b) const;
|
||||
bool below_upper(var_t var, eps_numeral const& b) const;
|
||||
bool below_lower(var_t v) const;
|
||||
bool above_upper(var_t v) const;
|
||||
bool lower_valid(var_t var) const { return m_vars[var].m_lower_valid; }
|
||||
bool upper_valid(var_t var) const { return m_vars[var].m_upper_valid; }
|
||||
void unset_lower(var_t var);
|
||||
void unset_upper(var_t var);
|
||||
void set_value(var_t var, eps_numeral const& b);
|
||||
|
@ -127,6 +137,7 @@ namespace simplex {
|
|||
lbool minimize(var_t var);
|
||||
eps_numeral const& get_value(var_t v);
|
||||
void display(std::ostream& out) const;
|
||||
void display_row(std::ostream& out, row const& r, bool values = true);
|
||||
|
||||
unsigned get_num_vars() const { return m_vars.size(); }
|
||||
|
||||
|
@ -159,8 +170,6 @@ namespace simplex {
|
|||
|
||||
bool at_lower(var_t v) const;
|
||||
bool at_upper(var_t v) const;
|
||||
bool below_lower(var_t v) const;
|
||||
bool above_upper(var_t v) const;
|
||||
bool above_lower(var_t v) const;
|
||||
bool below_upper(var_t v) const;
|
||||
bool outside_bounds(var_t v) const { return below_lower(v) || above_upper(v); }
|
||||
|
|
|
@ -47,10 +47,12 @@ namespace simplex {
|
|||
m.set(b, m_vars[v].m_base_coeff);
|
||||
m.lcm(a, b, c);
|
||||
TRACE("simplex",
|
||||
m.display(tout << "a: ", a);
|
||||
m.display(tout << "b v" << v << " : ", b);
|
||||
m.display(tout << "c: ", c);
|
||||
m.display(tout << " a: ", a);
|
||||
m.display(tout << " b v" << v << " : ", b);
|
||||
m.display(tout << " c: ", c);
|
||||
tout << "\n";
|
||||
M.display_row(tout, r);
|
||||
M.display_row(tout, row(m_vars[v].m_base2row));
|
||||
if (m.is_zero(b)) {
|
||||
display(tout);
|
||||
});
|
||||
|
@ -58,11 +60,11 @@ namespace simplex {
|
|||
m.abs(c);
|
||||
m.div(c, a, b);
|
||||
m.div(c, m_vars[v].m_base_coeff, a);
|
||||
m.set(mul, a);
|
||||
m.abs(mul);
|
||||
m.mul(mul, b, mul);
|
||||
M.mul(r, b);
|
||||
m.neg(a);
|
||||
M.add(r, a, row(m_vars[v].m_base2row));
|
||||
TRACE("simplex", M.display_row(tout, r););
|
||||
}
|
||||
|
||||
scoped_numeral base_coeff(m);
|
||||
|
@ -136,6 +138,18 @@ namespace simplex {
|
|||
M.del(r);
|
||||
}
|
||||
|
||||
template<typename Ext>
|
||||
bool simplex<Ext>::above_lower(var_t var, eps_numeral const& b) const {
|
||||
var_info const& vi = m_vars[var];
|
||||
return !vi.m_lower_valid || em.gt(b, vi.m_lower);
|
||||
}
|
||||
|
||||
template<typename Ext>
|
||||
bool simplex<Ext>::below_upper(var_t var, eps_numeral const& b) const {
|
||||
var_info const& vi = m_vars[var];
|
||||
return !vi.m_upper_valid || em.lt(b, vi.m_upper);
|
||||
}
|
||||
|
||||
template<typename Ext>
|
||||
void simplex<Ext>::set_lower(var_t var, eps_numeral const& b) {
|
||||
var_info& vi = m_vars[var];
|
||||
|
@ -206,6 +220,26 @@ namespace simplex {
|
|||
}
|
||||
}
|
||||
|
||||
template<typename Ext>
|
||||
void simplex<Ext>::display_row(std::ostream& out, row const& r, bool values) {
|
||||
row_iterator it = M.row_begin(r), end = M.row_end(r);
|
||||
for (; it != end; ++it) {
|
||||
m.display(out, it->m_coeff);
|
||||
out << "*v" << it->m_var << " ";
|
||||
if (values) {
|
||||
var_info const& vi = m_vars[it->m_var];
|
||||
out << em.to_string(vi.m_value);
|
||||
out << " [";
|
||||
if (vi.m_lower_valid) out << em.to_string(vi.m_lower); else out << "-oo";
|
||||
out << ":";
|
||||
if (vi.m_upper_valid) out << em.to_string(vi.m_upper); else out << "oo";
|
||||
out << "] ";
|
||||
}
|
||||
}
|
||||
out << "\n";
|
||||
}
|
||||
|
||||
|
||||
template<typename Ext>
|
||||
void simplex<Ext>::ensure_var(var_t v) {
|
||||
while (v >= m_vars.size()) {
|
||||
|
@ -344,6 +378,8 @@ namespace simplex {
|
|||
return vi.m_lower_valid && em.lt(vi.m_value, vi.m_lower);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename Ext>
|
||||
bool simplex<Ext>::above_upper(var_t v) const {
|
||||
var_info const& vi = m_vars[v];
|
||||
|
|
|
@ -235,6 +235,7 @@ namespace simplex {
|
|||
col_iterator col_end(int v) const { return col_iterator(m_columns[v], m_rows, false); }
|
||||
|
||||
void display(std::ostream& out);
|
||||
void display_row(std::ostream& out, row const& r);
|
||||
bool well_formed() const;
|
||||
|
||||
|
||||
|
|
|
@ -554,15 +554,20 @@ namespace simplex {
|
|||
void sparse_matrix<Ext>::display(std::ostream& out) {
|
||||
for (unsigned i = 0; i < m_rows.size(); ++i) {
|
||||
if (m_rows[i].size() == 0) continue;
|
||||
row_iterator it = row_begin(row(i)), end = row_end(row(i));
|
||||
for (; it != end; ++it) {
|
||||
m.display(out, it->m_coeff);
|
||||
out << "*v" << it->m_var << " ";
|
||||
}
|
||||
out << "\n";
|
||||
display_row(out, row(i));
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Ext>
|
||||
void sparse_matrix<Ext>::display_row(std::ostream& out, row const& r) {
|
||||
row_iterator it = row_begin(r), end = row_end(r);
|
||||
for (; it != end; ++it) {
|
||||
m.display(out, it->m_coeff);
|
||||
out << "*v" << it->m_var << " ";
|
||||
}
|
||||
out << "\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue