3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-05 13:56:03 +00:00

gcd reduce and use c().val for sign constraints

This commit is contained in:
Nikolaj Bjorner 2025-10-01 18:42:34 -07:00
parent 018cb3c734
commit e709885e72
3 changed files with 10 additions and 5 deletions

View file

@ -8,7 +8,7 @@ BasedOnStyle: LLVM
IndentWidth: 4 IndentWidth: 4
TabWidth: 4 TabWidth: 4
UseTab: Never UseTab: Never
IndentCaseLabels: false

View file

@ -308,8 +308,8 @@ namespace nla {
} }
bound_assumptions bounds{"units"}; bound_assumptions bounds{"units"};
for (auto v : vars) { for (auto v : vars) {
if (m_values[v] == 1 || m_values[v] == -1) { if (c().val(v) == 1 || c().val(v) == -1) {
bound_assumption b(v, lp::lconstraint_kind::EQ, m_values[v]); bound_assumption b(v, lp::lconstraint_kind::EQ, c().val(v));
bounds.bounds.push_back(b); bounds.bounds.push_back(b);
} }
} }
@ -396,7 +396,7 @@ namespace nla {
rational stellensatz::mvalue(lp::lar_term const &t) const { rational stellensatz::mvalue(lp::lar_term const &t) const {
rational r(0); rational r(0);
for (auto cv : t) for (auto cv : t)
r += m_values[cv.j()] * cv.coeff(); r += c().val(cv.j()) * cv.coeff();
return r; return r;
} }
@ -474,6 +474,7 @@ namespace nla {
} }
} }
bool stellensatz::is_new_inequality(vector<std::pair<rational, lpvar>> lhs, lp::lconstraint_kind k, bool stellensatz::is_new_inequality(vector<std::pair<rational, lpvar>> lhs, lp::lconstraint_kind k,
rational const &rhs) { rational const &rhs) {
std::stable_sort(lhs.begin(), lhs.end(), std::stable_sort(lhs.begin(), lhs.end(),
@ -487,6 +488,7 @@ namespace nla {
return true; return true;
} }
lp::constraint_index stellensatz::add_ineq( lp::constraint_index stellensatz::add_ineq(
justification const& just, lp::lar_term & t, lp::lconstraint_kind k, justification const& just, lp::lar_term & t, lp::lconstraint_kind k,
rational const & rhs_) { rational const & rhs_) {
@ -494,6 +496,7 @@ namespace nla {
auto coeffs = t.coeffs_as_vector(); auto coeffs = t.coeffs_as_vector();
gcd_normalize(coeffs, k, rhs); gcd_normalize(coeffs, k, rhs);
if (!is_new_inequality(coeffs, k, rhs)) if (!is_new_inequality(coeffs, k, rhs))
return lp::null_ci; return lp::null_ci;
@ -546,7 +549,6 @@ namespace nla {
for (auto ci : constraints.indices()) for (auto ci : constraints.indices())
insert_monomials_from_constraint(ci); insert_monomials_from_constraint(ci);
auto &constraints = m_solver.lra().constraints(); auto &constraints = m_solver.lra().constraints();
unsigned initial_false_constraints = m_false_constraints.size(); unsigned initial_false_constraints = m_false_constraints.size();
for (unsigned it = 0; it < m_false_constraints.size(); ++it) { for (unsigned it = 0; it < m_false_constraints.size(); ++it) {
@ -562,6 +564,7 @@ namespace nla {
continue; continue;
for (auto v : vars) { for (auto v : vars) {
if (v >= m_occurs.size()) if (v >= m_occurs.size())
continue; continue;
for (unsigned cidx = 0; cidx < m_occurs[v].size(); ++cidx) { for (unsigned cidx = 0; cidx < m_occurs[v].size(); ++cidx) {
@ -598,6 +601,7 @@ namespace nla {
// Eventually it can saturate to full pseudo-elimination of mx. // Eventually it can saturate to full pseudo-elimination of mx.
// or better: a conflict or a solution. // or better: a conflict or a solution.
IF_VERBOSE(3, verbose_stream() << "saturate2\n"); IF_VERBOSE(3, verbose_stream() << "saturate2\n");
auto &constraints = m_solver.lra().constraints(); auto &constraints = m_solver.lra().constraints();
for (auto ci : constraints.indices()) for (auto ci : constraints.indices())

View file

@ -211,6 +211,7 @@ namespace nla {
lbool add_bounds(svector<lpvar> const &vars, vector<bound_assumption> &bounds); lbool add_bounds(svector<lpvar> const &vars, vector<bound_assumption> &bounds);
void saturate_constraints(); void saturate_constraints();
void saturate_constraints2(); void saturate_constraints2();
void eliminate(lpvar mi); void eliminate(lpvar mi);
void ext_resolve(lpvar j, lp::constraint_index lo, lp::constraint_index hi); void ext_resolve(lpvar j, lp::constraint_index lo, lp::constraint_index hi);