mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 10:52:02 +00:00
port over moving m_nla_lemmas into nla_core from the linear monomial propagation branch
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
8d2b65b20b
commit
ec2937e2de
9 changed files with 80 additions and 84 deletions
|
@ -808,7 +808,7 @@ void core::print_stats(std::ostream& out) {
|
|||
|
||||
|
||||
void core::clear() {
|
||||
m_lemma_vec->clear();
|
||||
m_lemmas.clear();
|
||||
m_literal_vec->clear();
|
||||
}
|
||||
|
||||
|
@ -1045,7 +1045,7 @@ rational core::val(const factorization& f) const {
|
|||
}
|
||||
|
||||
new_lemma::new_lemma(core& c, char const* name):name(name), c(c) {
|
||||
c.m_lemma_vec->push_back(lemma());
|
||||
c.m_lemmas.push_back(lemma());
|
||||
}
|
||||
|
||||
new_lemma& new_lemma::operator|=(ineq const& ineq) {
|
||||
|
@ -1067,7 +1067,7 @@ new_lemma::~new_lemma() {
|
|||
}
|
||||
|
||||
lemma& new_lemma::current() const {
|
||||
return c.m_lemma_vec->back();
|
||||
return c.m_lemmas.back();
|
||||
}
|
||||
|
||||
new_lemma& new_lemma::operator&=(lp::explanation const& e) {
|
||||
|
@ -1180,7 +1180,7 @@ void core::negate_relation(new_lemma& lemma, unsigned j, const rational& a) {
|
|||
}
|
||||
|
||||
bool core::conflict_found() const {
|
||||
for (const auto & l : * m_lemma_vec) {
|
||||
for (const auto & l : m_lemmas) {
|
||||
if (l.is_conflict())
|
||||
return true;
|
||||
}
|
||||
|
@ -1188,7 +1188,7 @@ bool core::conflict_found() const {
|
|||
}
|
||||
|
||||
bool core::done() const {
|
||||
return m_lemma_vec->size() >= 10 ||
|
||||
return m_lemmas.size() >= 10 ||
|
||||
conflict_found() ||
|
||||
lp_settings().get_cancel_flag();
|
||||
}
|
||||
|
@ -1477,7 +1477,7 @@ void core::check_weighted(unsigned sz, std::pair<unsigned, std::function<void(vo
|
|||
for (unsigned i = 0; i < sz; ++i)
|
||||
bound += checks[i].first;
|
||||
uint_set seen;
|
||||
while (bound > 0 && !done() && m_lemma_vec->empty()) {
|
||||
while (bound > 0 && !done() && m_lemmas.empty()) {
|
||||
unsigned n = random() % bound;
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
if (seen.contains(i))
|
||||
|
@ -1493,13 +1493,13 @@ void core::check_weighted(unsigned sz, std::pair<unsigned, std::function<void(vo
|
|||
}
|
||||
}
|
||||
|
||||
lbool core::check_power(lpvar r, lpvar x, lpvar y, vector<lemma>& l_vec) {
|
||||
m_lemma_vec = &l_vec;
|
||||
return m_powers.check(r, x, y, l_vec);
|
||||
lbool core::check_power(lpvar r, lpvar x, lpvar y) {
|
||||
m_lemmas.reset();
|
||||
return m_powers.check(r, x, y, m_lemmas);
|
||||
}
|
||||
|
||||
void core::check_bounded_divisions(vector<lemma>& l_vec) {
|
||||
m_lemma_vec = &l_vec;
|
||||
void core::check_bounded_divisions() {
|
||||
m_lemmas.reset();
|
||||
m_divisions.check_bounded_divisions();
|
||||
}
|
||||
// looking for a free variable inside of a monic to split
|
||||
|
@ -1518,11 +1518,10 @@ void core::add_bounds() {
|
|||
}
|
||||
}
|
||||
|
||||
lbool core::check(vector<ineq>& lits, vector<lemma>& l_vec) {
|
||||
lbool core::check(vector<ineq>& lits) {
|
||||
lp_settings().stats().m_nla_calls++;
|
||||
TRACE("nla_solver", tout << "calls = " << lp_settings().stats().m_nla_calls << "\n";);
|
||||
lra.get_rid_of_inf_eps();
|
||||
m_lemma_vec = &l_vec;
|
||||
m_literal_vec = &lits;
|
||||
if (!(lra.get_status() == lp::lp_status::OPTIMAL ||
|
||||
lra.get_status() == lp::lp_status::FEASIBLE)) {
|
||||
|
@ -1543,7 +1542,7 @@ lbool core::check(vector<ineq>& lits, vector<lemma>& l_vec) {
|
|||
bool run_bounded_nlsat = should_run_bounded_nlsat();
|
||||
bool run_bounds = params().arith_nl_branching();
|
||||
|
||||
auto no_effect = [&]() { return !done() && l_vec.empty() && lits.empty(); };
|
||||
auto no_effect = [&]() { return !done() && m_lemmas.empty() && lits.empty(); };
|
||||
|
||||
if (no_effect())
|
||||
m_monomial_bounds.propagate();
|
||||
|
@ -1561,7 +1560,7 @@ lbool core::check(vector<ineq>& lits, vector<lemma>& l_vec) {
|
|||
{1, check2},
|
||||
{1, check3} };
|
||||
check_weighted(3, checks);
|
||||
if (!l_vec.empty() || !lits.empty())
|
||||
if (!m_lemmas.empty() || !lits.empty())
|
||||
return l_false;
|
||||
}
|
||||
|
||||
|
@ -1598,15 +1597,15 @@ lbool core::check(vector<ineq>& lits, vector<lemma>& l_vec) {
|
|||
m_stats.m_nra_calls++;
|
||||
}
|
||||
|
||||
if (ret == l_undef && !l_vec.empty() && m_reslim.inc())
|
||||
if (ret == l_undef && !m_lemmas.empty() && m_reslim.inc())
|
||||
ret = l_false;
|
||||
|
||||
m_stats.m_nla_lemmas += l_vec.size();
|
||||
for (const auto& l : l_vec)
|
||||
m_stats.m_nla_lemmas += m_lemmas.size();
|
||||
for (const auto& l : m_lemmas)
|
||||
m_stats.m_nla_explanations += static_cast<unsigned>(l.expl().size());
|
||||
|
||||
|
||||
TRACE("nla_solver", tout << "ret = " << ret << ", lemmas count = " << l_vec.size() << "\n";);
|
||||
TRACE("nla_solver", tout << "ret = " << ret << ", lemmas count = " << m_lemmas.size() << "\n";);
|
||||
IF_VERBOSE(2, if(ret == l_undef) {verbose_stream() << "Monomials\n"; print_monics(verbose_stream());});
|
||||
CTRACE("nla_solver", ret == l_undef, tout << "Monomials\n"; print_monics(tout););
|
||||
return ret;
|
||||
|
@ -1641,13 +1640,13 @@ lbool core::bounded_nlsat() {
|
|||
m_nlsat_delay /= 2;
|
||||
}
|
||||
if (ret == l_true) {
|
||||
m_lemma_vec->reset();
|
||||
m_lemmas.reset();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool core::no_lemmas_hold() const {
|
||||
for (auto & l : * m_lemma_vec) {
|
||||
for (auto & l : m_lemmas) {
|
||||
if (lemma_holds(l)) {
|
||||
TRACE("nla_solver", print_lemma(l, tout););
|
||||
return false;
|
||||
|
@ -1656,10 +1655,10 @@ bool core::no_lemmas_hold() const {
|
|||
return true;
|
||||
}
|
||||
|
||||
lbool core::test_check(vector<lemma>& l) {
|
||||
lbool core::test_check() {
|
||||
vector<ineq> lits;
|
||||
lra.set_status(lp::lp_status::OPTIMAL);
|
||||
return check(lits, l);
|
||||
return check(lits);
|
||||
}
|
||||
|
||||
std::ostream& core::print_terms(std::ostream& out) const {
|
||||
|
@ -1811,12 +1810,11 @@ bool core::improve_bounds() {
|
|||
return bounds_improved;
|
||||
}
|
||||
|
||||
void core::propagate(vector<lemma>& lemmas) {
|
||||
void core::propagate() {
|
||||
// disable for now
|
||||
return;
|
||||
// propagate linear monomials
|
||||
lemmas.reset();
|
||||
m_lemma_vec = &lemmas;
|
||||
m_lemmas.reset();
|
||||
|
||||
m_monomial_bounds.unit_propagate();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue