3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-20 23:44:41 +00:00

run tangent and ordered lemmas only on canonical monomials

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-05-10 14:44:03 -07:00
parent 5352a5fb85
commit 2dbfb2edc2
6 changed files with 33 additions and 66 deletions

View file

@ -805,12 +805,20 @@ std::ostream & core::print_factorization(const factorization& f, std::ostream& o
return out;
}
bool core::find_canonical_monomial_of_vars(const svector<lpvar>& vars, unsigned & i) const {
SASSERT(vars_are_roots(vars));
bool core::find_canonical_monomial_of_vars(const svector<lpvar>& vars, lpvar & i) const {
monomial const* sv = m_emons.find_canonical(vars);
return sv && (i = sv->var(), true);
}
bool core::is_canonical_monomial(lpvar j) const {
const monomial & m = m_emons[j];
unsigned k;
SASSERT(find_canonical_monomial_of_vars(m.rvars(), k));
find_canonical_monomial_of_vars(m.rvars(), k);
return j == k;
}
void core::explain_existing_lower_bound(lpvar j) {
SASSERT(has_lower_bound(j));
current_expl().add(m_lar_solver.get_column_lower_bound_witness(j));
@ -1410,7 +1418,7 @@ bool core::divide(const monomial& bc, const factor& c, factor & b) const {
b = factor(b_rvars[0], factor_type::VAR);
} else {
monomial const* sv = m_emons.find_canonical(b_rvars);
if (!sv) {
if (sv == nullptr) {
TRACE("nla_solver_div", tout << "not in rooted";);
return false;
}
@ -1592,11 +1600,14 @@ bool core::find_bfc_to_refine_on_monomial(const monomial& m, factorization & bf)
}
return false;
}
// finds a canonical monomial with its binary factorization
bool core::find_bfc_to_refine(const monomial* & m, factorization & bf){
m = nullptr;
// todo: randomise loop
for (unsigned i: m_to_refine) {
unsigned r = random(), sz = m_to_refine.size();
for (unsigned k = 0; k < sz; k++) {
lpvar i = m_to_refine[(k + r) % sz];
if (!is_canonical_monomial(i)) continue;
m = &m_emons[i];
SASSERT (!check_monomial(*m));
if (m->size() == 2) {