mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 14:13:23 +00:00
port fixes to intblast
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
dcaacf5e9b
commit
361e04a18e
3 changed files with 20 additions and 5 deletions
|
@ -1531,7 +1531,7 @@ namespace lp {
|
||||||
SASSERT(all_vars_are_registered(coeffs));
|
SASSERT(all_vars_are_registered(coeffs));
|
||||||
lar_term* t = new lar_term(coeffs);
|
lar_term* t = new lar_term(coeffs);
|
||||||
subst_known_terms(t);
|
subst_known_terms(t);
|
||||||
SASSERT(t->is_empty() == false);
|
SASSERT (!t->is_empty());
|
||||||
m_terms.push_back(t);
|
m_terms.push_back(t);
|
||||||
lpvar ret = A_r().column_count();
|
lpvar ret = A_r().column_count();
|
||||||
add_row_from_term_no_constraint(t, ext_i);
|
add_row_from_term_no_constraint(t, ext_i);
|
||||||
|
@ -2266,12 +2266,22 @@ namespace lp {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool lar_solver::are_equal(lpvar j, lpvar k) {
|
||||||
|
vector<std::pair<mpq, lpvar>> coeffs;
|
||||||
|
coeffs.push_back(std::make_pair(mpq(1), j));
|
||||||
|
coeffs.push_back(std::make_pair(mpq(-1), k));
|
||||||
|
lar_term t(coeffs);
|
||||||
|
subst_known_terms(&t);
|
||||||
|
return t.is_empty();
|
||||||
|
}
|
||||||
|
|
||||||
std::pair<constraint_index, constraint_index> lar_solver::add_equality(lpvar j, lpvar k) {
|
std::pair<constraint_index, constraint_index> lar_solver::add_equality(lpvar j, lpvar k) {
|
||||||
vector<std::pair<mpq, lpvar>> coeffs;
|
vector<std::pair<mpq, lpvar>> coeffs;
|
||||||
|
|
||||||
coeffs.push_back(std::make_pair(mpq(1), j));
|
coeffs.push_back(std::make_pair(mpq(1), j));
|
||||||
coeffs.push_back(std::make_pair(mpq(-1), k));
|
coeffs.push_back(std::make_pair(mpq(-1), k));
|
||||||
unsigned ej = add_term(coeffs, UINT_MAX); // UINT_MAX is the external null var
|
unsigned ej = add_term(coeffs, UINT_MAX); // UINT_MAX is the external null var
|
||||||
|
|
||||||
|
|
||||||
if (get_column_value(j) != get_column_value(k))
|
if (get_column_value(j) != get_column_value(k))
|
||||||
set_status(lp_status::UNKNOWN);
|
set_status(lp_status::UNKNOWN);
|
||||||
|
|
|
@ -559,6 +559,7 @@ public:
|
||||||
return m_mpq_lar_core_solver.m_r_solver.calc_current_x_is_feasible_include_non_basis();
|
return m_mpq_lar_core_solver.m_r_solver.calc_current_x_is_feasible_include_non_basis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool are_equal(lpvar j, lpvar k);
|
||||||
std::pair<constraint_index, constraint_index> add_equality(lpvar j, lpvar k);
|
std::pair<constraint_index, constraint_index> add_equality(lpvar j, lpvar k);
|
||||||
|
|
||||||
u_dependency* get_bound_constraint_witnesses_for_column(unsigned j) {
|
u_dependency* get_bound_constraint_witnesses_for_column(unsigned j) {
|
||||||
|
|
|
@ -331,15 +331,17 @@ namespace arith {
|
||||||
expr_ref x(a.mk_mod(_x, a.mk_int(N)), m);
|
expr_ref x(a.mk_mod(_x, a.mk_int(N)), m);
|
||||||
expr_ref y(a.mk_mod(_y, a.mk_int(N)), m);
|
expr_ref y(a.mk_mod(_y, a.mk_int(N)), m);
|
||||||
|
|
||||||
|
// 0 <= n < 2^sz
|
||||||
|
|
||||||
|
add_clause(mk_literal(a.mk_ge(n, a.mk_int(0))));
|
||||||
|
add_clause(mk_literal(a.mk_le(n, a.mk_int(N - 1))));
|
||||||
|
|
||||||
if (a.is_band(n)) {
|
if (a.is_band(n)) {
|
||||||
|
|
||||||
// 0 <= x&y < 2^sz
|
|
||||||
// x&y <= x
|
// x&y <= x
|
||||||
// x&y <= y
|
// x&y <= y
|
||||||
// TODO? x = y => x&y = x
|
// TODO? x = y => x&y = x
|
||||||
|
|
||||||
add_clause(mk_literal(a.mk_ge(n, a.mk_int(0))));
|
|
||||||
add_clause(mk_literal(a.mk_le(n, a.mk_int(N - 1))));
|
|
||||||
add_clause(mk_literal(a.mk_le(n, x)));
|
add_clause(mk_literal(a.mk_le(n, x)));
|
||||||
add_clause(mk_literal(a.mk_le(n, y)));
|
add_clause(mk_literal(a.mk_le(n, y)));
|
||||||
}
|
}
|
||||||
|
@ -537,6 +539,8 @@ namespace arith {
|
||||||
euf::enode* n2 = var2enode(v2);
|
euf::enode* n2 = var2enode(v2);
|
||||||
lpvar w1 = register_theory_var_in_lar_solver(v1);
|
lpvar w1 = register_theory_var_in_lar_solver(v1);
|
||||||
lpvar w2 = register_theory_var_in_lar_solver(v2);
|
lpvar w2 = register_theory_var_in_lar_solver(v2);
|
||||||
|
if (lp().are_equal(w1, w2))
|
||||||
|
return;
|
||||||
auto cs = lp().add_equality(w1, w2);
|
auto cs = lp().add_equality(w1, w2);
|
||||||
add_eq_constraint(cs.first, n1, n2);
|
add_eq_constraint(cs.first, n1, n2);
|
||||||
add_eq_constraint(cs.second, n1, n2);
|
add_eq_constraint(cs.second, n1, n2);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue