mirror of
https://github.com/Z3Prover/z3
synced 2025-08-11 21:50:52 +00:00
na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
253c954094
commit
cfd204e5fe
7 changed files with 107 additions and 71 deletions
|
@ -76,13 +76,13 @@ namespace simplex {
|
|||
scoped_eps_numeral value(em), tmp(em);
|
||||
row_iterator it = M.row_begin(r), end = M.row_end(r);
|
||||
for (; it != end; ++it) {
|
||||
var_t v = it->m_var;
|
||||
var_t v = it->var();
|
||||
if (v == base_var) {
|
||||
m.set(base_coeff, it->m_coeff);
|
||||
m.set(base_coeff, it->coeff());
|
||||
}
|
||||
else {
|
||||
SASSERT(!is_base(v));
|
||||
em.mul(m_vars[v].m_value, it->m_coeff, tmp);
|
||||
em.mul(m_vars[v].m_value, it->coeff(), tmp);
|
||||
em.add(value, tmp, value);
|
||||
}
|
||||
}
|
||||
|
@ -97,8 +97,8 @@ namespace simplex {
|
|||
bool first = true;
|
||||
for (; it2 != end; ++it2) {
|
||||
if (!first) tout << " + ";
|
||||
tout << "v" << it2->m_var << " * ";
|
||||
m.display(tout, it2->m_coeff); tout << " ";
|
||||
tout << "v" << it2->var() << " * ";
|
||||
m.display(tout, it2->coeff()); tout << " ";
|
||||
first = false;
|
||||
}
|
||||
tout << "\n";
|
||||
|
@ -176,7 +176,7 @@ namespace simplex {
|
|||
new_value = vi.m_value;
|
||||
}
|
||||
// need to move var such that old_base comes in bound.
|
||||
update_and_pivot(old_base, var, re.m_coeff, new_value);
|
||||
update_and_pivot(old_base, var, re.coeff(), new_value);
|
||||
SASSERT(is_base(var));
|
||||
SASSERT(m_vars[var].m_base2row == r.id());
|
||||
SASSERT(!below_lower(old_base) && !above_upper(old_base));
|
||||
|
@ -285,10 +285,10 @@ namespace simplex {
|
|||
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 << " ";
|
||||
m.display(out, it->coeff());
|
||||
out << "*v" << it->var() << " ";
|
||||
if (values) {
|
||||
var_info const& vi = m_vars[it->m_var];
|
||||
var_info const& vi = m_vars[it->var()];
|
||||
out << em.to_string(vi.m_value);
|
||||
out << " [";
|
||||
if (vi.m_lower_valid) out << em.to_string(vi.m_lower); else out << "-oo";
|
||||
|
@ -405,7 +405,7 @@ namespace simplex {
|
|||
for (; it != end; ++it) {
|
||||
row r_k = it.get_row();
|
||||
if (r_k.id() != r_i) {
|
||||
a_kj = it.get_row_entry().m_coeff;
|
||||
a_kj = it.get_row_entry().coeff();
|
||||
a_kj.neg();
|
||||
M.mul(r_k, a_ij);
|
||||
M.add(r_k, a_kj, row(r_i));
|
||||
|
@ -439,7 +439,7 @@ namespace simplex {
|
|||
var_t s = m_row2base[r.id()];
|
||||
var_info& si = m_vars[s];
|
||||
scoped_eps_numeral delta2(em);
|
||||
numeral const& coeff = it.get_row_entry().m_coeff;
|
||||
numeral const& coeff = it.get_row_entry().coeff();
|
||||
em.mul(delta, coeff, delta2);
|
||||
em.div(delta2, si.m_base_coeff, delta2);
|
||||
delta2.neg();
|
||||
|
@ -555,9 +555,9 @@ namespace simplex {
|
|||
row_iterator it = M.row_begin(r), end = M.row_end(r);
|
||||
|
||||
for (; it != end; ++it) {
|
||||
var_t x_j = it->m_var;
|
||||
var_t x_j = it->var();
|
||||
if (x_i == x_j) continue;
|
||||
numeral const & a_ij = it->m_coeff;
|
||||
numeral const & a_ij = it->coeff();
|
||||
|
||||
bool is_neg = is_below ? m.is_neg(a_ij) : m.is_pos(a_ij);
|
||||
bool is_pos = !is_neg;
|
||||
|
@ -618,8 +618,8 @@ namespace simplex {
|
|||
row r(m_vars[x_i].m_base2row);
|
||||
row_iterator it = M.row_begin(r), end = M.row_end(r);
|
||||
for (; it != end; ++it) {
|
||||
var_t x_j = it->m_var;
|
||||
numeral const & a_ij = it->m_coeff;
|
||||
var_t x_j = it->var();
|
||||
numeral const & a_ij = it->coeff();
|
||||
bool is_neg = is_below ? m.is_neg(a_ij) : m.is_pos(a_ij);
|
||||
if (x_i != x_j && ((!is_neg && above_lower(x_j)) || (is_neg && below_upper(x_j)))) {
|
||||
SASSERT(!is_base(x_j));
|
||||
|
@ -749,7 +749,7 @@ namespace simplex {
|
|||
//
|
||||
var_t s = m_row2base[it.get_row().id()];
|
||||
var_info& vs = m_vars[s];
|
||||
numeral const& coeff = it.get_row_entry().m_coeff;
|
||||
numeral const& coeff = it.get_row_entry().coeff();
|
||||
numeral const& base_coeff = vs.m_base_coeff;
|
||||
SASSERT(!m.is_zero(coeff));
|
||||
bool base_to_lower = (m.is_pos(coeff) != m.is_pos(base_coeff)) == to_lower;
|
||||
|
@ -801,9 +801,9 @@ namespace simplex {
|
|||
bool inc_y = false;
|
||||
|
||||
for (; it != end; ++it) {
|
||||
var_t x = it->m_var;
|
||||
var_t x = it->var();
|
||||
if (x == v) continue;
|
||||
bool inc_x = m.is_pos(it->m_coeff) == m.is_pos(m_vars[v].m_base_coeff);
|
||||
bool inc_x = m.is_pos(it->coeff()) == m.is_pos(m_vars[v].m_base_coeff);
|
||||
if ((inc_x && at_upper(x)) || (!inc_x && at_lower(x))) {
|
||||
TRACE("simplex", tout << "v" << x << " pos: " << inc_x
|
||||
<< " at upper: " << at_upper(x)
|
||||
|
@ -867,7 +867,7 @@ namespace simplex {
|
|||
row r = it.get_row();
|
||||
var_t s = m_row2base[r.id()];
|
||||
var_info& vi = m_vars[s];
|
||||
numeral const& a_ij = it.get_row_entry().m_coeff;
|
||||
numeral const& a_ij = it.get_row_entry().coeff();
|
||||
numeral const& a_ii = vi.m_base_coeff;
|
||||
bool sign_eq = (m.is_pos(a_ii) == m.is_pos(a_ij));
|
||||
bool inc_s = sign_eq != inc_x_j;
|
||||
|
@ -1013,9 +1013,9 @@ namespace simplex {
|
|||
row_iterator it = M.row_begin(r), end = M.row_end(r);
|
||||
scoped_eps_numeral sum(em), tmp(em);
|
||||
for (; it != end; ++it) {
|
||||
em.mul(m_vars[it->m_var].m_value, it->m_coeff, tmp);
|
||||
em.mul(m_vars[it->var()].m_value, it->coeff(), tmp);
|
||||
sum += tmp;
|
||||
SASSERT(s != it->m_var || m.eq(m_vars[s].m_base_coeff, it->m_coeff));
|
||||
SASSERT(s != it->var() || m.eq(m_vars[s].m_base_coeff, it->coeff()));
|
||||
}
|
||||
if (!em.is_zero(sum)) {
|
||||
IF_VERBOSE(0, M.display_row(verbose_stream(), r););
|
||||
|
|
|
@ -32,10 +32,14 @@ namespace simplex {
|
|||
typedef typename Ext::manager manager;
|
||||
typedef unsigned var_t;
|
||||
|
||||
struct row_entry {
|
||||
class row_entry {
|
||||
friend class sparse_matrix;
|
||||
numeral m_coeff;
|
||||
var_t m_var;
|
||||
public:
|
||||
row_entry(numeral && c, var_t v) : m_coeff(std::move(c)), m_var(v) {}
|
||||
inline numeral const& coeff() const { return m_coeff; }
|
||||
inline var_t var() const { return m_var; }
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -63,7 +67,7 @@ namespace simplex {
|
|||
};
|
||||
_row_entry(numeral && c, var_t v) : row_entry(std::move(c), v), m_col_idx(0) {}
|
||||
_row_entry() : row_entry(numeral(), dead_id), m_col_idx(0) {}
|
||||
bool is_dead() const { return row_entry::m_var == dead_id; }
|
||||
bool is_dead() const { return row_entry::var() == dead_id; }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -99,10 +99,10 @@ namespace simplex {
|
|||
if (i != j) {
|
||||
_row_entry & t2 = m_entries[j];
|
||||
m.swap(t2.m_coeff, t1.m_coeff);
|
||||
t2.m_var = t1.m_var;
|
||||
t2.m_var = t1.var();
|
||||
t2.m_col_idx = t1.m_col_idx;
|
||||
SASSERT(!t2.is_dead());
|
||||
column & col = cols[t2.m_var];
|
||||
column & col = cols[t2.var()];
|
||||
col.m_entries[t2.m_col_idx].m_row_idx = j;
|
||||
}
|
||||
j++;
|
||||
|
@ -138,8 +138,8 @@ namespace simplex {
|
|||
unsigned idx = 0;
|
||||
for (auto const& e : m_entries) {
|
||||
if (!e.is_dead()) {
|
||||
result_map[e.m_var] = idx;
|
||||
idxs.push_back(e.m_var);
|
||||
result_map[e.var()] = idx;
|
||||
idxs.push_back(e.var());
|
||||
}
|
||||
++idx;
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ namespace simplex {
|
|||
int sparse_matrix<Ext>::_row::get_idx_of(var_t v) const {
|
||||
unsigned idx = 0;
|
||||
for (auto const& e : m_entries) {
|
||||
if (!e.is_dead() && e.m_var == v)
|
||||
if (!e.is_dead() && e.var() == v)
|
||||
return idx;
|
||||
++idx;
|
||||
}
|
||||
|
@ -350,7 +350,7 @@ namespace simplex {
|
|||
else { \
|
||||
/* variable v is in row1 */ \
|
||||
_row_entry & r_entry = r1.m_entries[pos]; \
|
||||
SASSERT(r_entry.m_var == v); \
|
||||
SASSERT(r_entry.var() == v); \
|
||||
_ADD_COEFF_; \
|
||||
if (m.is_zero(r_entry.m_coeff)) { \
|
||||
del_row_entry(r1, pos); \
|
||||
|
@ -386,7 +386,7 @@ namespace simplex {
|
|||
template<typename Ext>
|
||||
void sparse_matrix<Ext>::del_row_entry(_row& r, unsigned pos) {
|
||||
_row_entry & r_entry = r.m_entries[pos];
|
||||
var_t v = r_entry.m_var;
|
||||
var_t v = r_entry.var();
|
||||
int col_idx = r_entry.m_col_idx;
|
||||
r.del_row_entry(pos);
|
||||
column & c = m_columns[v];
|
||||
|
@ -452,12 +452,12 @@ namespace simplex {
|
|||
g.reset();
|
||||
row_iterator it = row_begin(r), end = row_end(r);
|
||||
for (; it != end && !m.is_one(g); ++it) {
|
||||
if (!m.is_int(it->m_coeff)) {
|
||||
if (!m.is_int(it->coeff())) {
|
||||
g = numeral(1);
|
||||
break;
|
||||
}
|
||||
if (m.is_zero(g)) g = it->m_coeff;
|
||||
else m.gcd(g, it->m_coeff, g);
|
||||
else m.gcd(g, it->coeff(), g);
|
||||
}
|
||||
if (m.is_zero(g)) {
|
||||
g = numeral(1);
|
||||
|
@ -498,13 +498,13 @@ namespace simplex {
|
|||
continue;
|
||||
}
|
||||
DEBUG_CODE(
|
||||
SASSERT(!vars.contains(e.m_var));
|
||||
SASSERT(!vars.contains(e.var()));
|
||||
SASSERT(!m.is_zero(e.m_coeff));
|
||||
SASSERT(e.m_var != dead_id);
|
||||
col_entry const& c = m_columns[e.m_var].m_entries[e.m_col_idx];
|
||||
SASSERT(e.var() != dead_id);
|
||||
col_entry const& c = m_columns[e.var()].m_entries[e.m_col_idx];
|
||||
SASSERT((unsigned)c.m_row_id == row_id);
|
||||
SASSERT((unsigned)c.m_row_idx == i););
|
||||
vars.insert(e.m_var);
|
||||
vars.insert(e.var());
|
||||
}
|
||||
int idx = r.m_first_free_idx;
|
||||
while (idx != -1) {
|
||||
|
@ -533,7 +533,7 @@ namespace simplex {
|
|||
DEBUG_CODE(
|
||||
_row const& row = m_rows[c.m_row_id];
|
||||
_row_entry const& r = row.m_entries[c.m_row_idx];
|
||||
SASSERT(r.m_var == v);
|
||||
SASSERT(r.var() == v);
|
||||
SASSERT((unsigned)r.m_col_idx == i););
|
||||
rows.insert(c.m_row_id);
|
||||
}
|
||||
|
@ -571,8 +571,8 @@ namespace simplex {
|
|||
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 << " ";
|
||||
m.display(out, it->coeff());
|
||||
out << "*v" << it->var() << " ";
|
||||
}
|
||||
out << "\n";
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue