mirror of
https://github.com/Z3Prover/z3
synced 2025-07-01 10:28:46 +00:00
simplify factorization
Signed-off-by: Lev <levnach@hotmail.com>
This commit is contained in:
parent
667d1be8c3
commit
aefd7eefb6
3 changed files with 15 additions and 22 deletions
|
@ -4,13 +4,13 @@ namespace nla {
|
||||||
|
|
||||||
void const_iterator_mon::init_vars_by_the_mask(unsigned_vector & k_vars, unsigned_vector & j_vars) const {
|
void const_iterator_mon::init_vars_by_the_mask(unsigned_vector & k_vars, unsigned_vector & j_vars) const {
|
||||||
// the last element for m_factorization.m_rooted_vars goes to k_vars
|
// the last element for m_factorization.m_rooted_vars goes to k_vars
|
||||||
SASSERT(m_mask.size() + 1 == m_ff->m_cmon.vars().size());
|
SASSERT(m_mask.size() + 1 == m_ff->m_vars.size());
|
||||||
k_vars.push_back(m_ff->m_cmon.vars().back());
|
k_vars.push_back(m_ff->m_vars.back());
|
||||||
for (unsigned j = 0; j < m_mask.size(); j++) {
|
for (unsigned j = 0; j < m_mask.size(); j++) {
|
||||||
if (m_mask[j]) {
|
if (m_mask[j]) {
|
||||||
k_vars.push_back(m_ff->m_cmon.vars()[j]);
|
k_vars.push_back(m_ff->m_vars[j]);
|
||||||
} else {
|
} else {
|
||||||
j_vars.push_back(m_ff->m_cmon.vars()[j]);
|
j_vars.push_back(m_ff->m_vars[j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ const_iterator_mon::reference const_iterator_mon::operator*() const {
|
||||||
unsigned j, k; rational sign;
|
unsigned j, k; rational sign;
|
||||||
if (!get_factors(j, k, sign))
|
if (!get_factors(j, k, sign))
|
||||||
return factorization();
|
return factorization();
|
||||||
return create_binary_factorization(j, k, m_ff->m_cmon.coeff() * sign);
|
return create_binary_factorization(j, k, sign);
|
||||||
}
|
}
|
||||||
|
|
||||||
void const_iterator_mon::advance_mask() {
|
void const_iterator_mon::advance_mask() {
|
||||||
|
@ -113,7 +113,7 @@ factorization const_iterator_mon::create_binary_factorization(lpvar j, lpvar k,
|
||||||
|
|
||||||
factorization const_iterator_mon::create_full_factorization() const {
|
factorization const_iterator_mon::create_full_factorization() const {
|
||||||
factorization f;
|
factorization f;
|
||||||
f.vars() = m_ff->m_mon.vars();
|
f.vars() = m_ff->m_vars;
|
||||||
f.sign() = rational(1);
|
f.sign() = rational(1);
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,27 +75,23 @@ struct const_iterator_mon {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct factorization_factory {
|
struct factorization_factory {
|
||||||
|
const svector<lpvar>& m_vars;
|
||||||
// returns true if found
|
// returns true if found
|
||||||
virtual bool find_monomial_of_vars(const svector<lpvar>& vars, monomial& m, rational & sign) const = 0;
|
virtual bool find_monomial_of_vars(const svector<lpvar>& vars, monomial& m, rational & sign) const = 0;
|
||||||
unsigned m_i_mon;
|
|
||||||
const monomial& m_mon;
|
|
||||||
monomial_coeff m_cmon;
|
|
||||||
|
|
||||||
factorization_factory(unsigned i_mon, const monomial& mon, const monomial_coeff& cmon) :
|
factorization_factory(const svector<lpvar>& vars) :
|
||||||
m_i_mon(i_mon),
|
m_vars(vars) {
|
||||||
m_mon(mon),
|
|
||||||
m_cmon(cmon) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const_iterator_mon begin() const {
|
const_iterator_mon begin() const {
|
||||||
// we keep the last element always in the first factor to avoid
|
// we keep the last element always in the first factor to avoid
|
||||||
// repeating a pair twice
|
// repeating a pair twice
|
||||||
svector<bool> mask(m_mon.vars().size() - 1, false);
|
svector<bool> mask(m_vars.size() - 1, false);
|
||||||
return const_iterator_mon(mask, this);
|
return const_iterator_mon(mask, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
const_iterator_mon end() const {
|
const_iterator_mon end() const {
|
||||||
svector<bool> mask(m_mon.vars().size() - 1, true);
|
svector<bool> mask(m_vars.size() - 1, true);
|
||||||
auto it = const_iterator_mon(mask, this);
|
auto it = const_iterator_mon(mask, this);
|
||||||
it.m_full_factorization_returned = true;
|
it.m_full_factorization_returned = true;
|
||||||
return it;
|
return it;
|
||||||
|
|
|
@ -478,11 +478,8 @@ struct solver::imp {
|
||||||
struct factorization_factory_imp: factorization_factory {
|
struct factorization_factory_imp: factorization_factory {
|
||||||
const imp& m_imp;
|
const imp& m_imp;
|
||||||
|
|
||||||
factorization_factory_imp(unsigned i_mon, const imp& s) :
|
factorization_factory_imp(const svector<lpvar>& m_vars, const imp& s) :
|
||||||
factorization_factory(i_mon,
|
factorization_factory(m_vars),
|
||||||
s.m_monomials[i_mon],
|
|
||||||
s.canonize_monomial(s.m_monomials[i_mon])
|
|
||||||
),
|
|
||||||
m_imp(s) { }
|
m_imp(s) { }
|
||||||
|
|
||||||
bool find_monomial_of_vars(const svector<lpvar>& vars, monomial& m, rational & sign) const {
|
bool find_monomial_of_vars(const svector<lpvar>& vars, monomial& m, rational & sign) const {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue