3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-24 03:57:51 +00:00

fixes to new solver, add mode for using nlsat solver eagerly from nla_core

This commit is contained in:
Nikolaj Bjorner 2021-03-14 13:57:04 -07:00
parent 9a975a4523
commit 8412ecbdbf
22 changed files with 156 additions and 164 deletions

View file

@ -32,20 +32,12 @@ namespace arith {
{
m_solver = alloc(lp::lar_solver);
smt_params_helper lpar(ctx.s().params());
lp().updt_params(ctx.s().params());
lp().settings().set_resource_limit(m_resource_limit);
lp().settings().simplex_strategy() = static_cast<lp::simplex_strategy_enum>(lpar.arith_simplex_strategy());
lp().settings().bound_propagation() = bound_prop_mode::BP_NONE != propagation_mode();
lp().settings().enable_hnf() = lpar.arith_enable_hnf();
lp().settings().print_external_var_name() = lpar.arith_print_ext_var_names();
lp().set_track_pivoted_rows(lpar.arith_bprop_on_pivoted_rows());
lp().settings().report_frequency = lpar.arith_rep_freq();
lp().settings().print_statistics = lpar.arith_print_stats();
lp().settings().cheap_eqs() = lpar.arith_propagate_eqs();
lp().set_cut_strategy(get_config().m_arith_branch_cut_ratio);
lp().settings().int_run_gcd_test() = get_config().m_arith_gcd_test;
lp().settings().set_random_seed(get_config().m_random_seed);
m_lia = alloc(lp::int_solver, *m_solver.get());
}

View file

@ -276,7 +276,9 @@ namespace bv {
void solver::register_true_false_bit(theory_var v, unsigned idx) {
SASSERT(s().value(m_bits[v][idx]) != l_undef);
bool is_true = (s().value(m_bits[v][idx]) == l_true);
sat::literal l = m_bits[v][idx];
SASSERT(l == mk_true() || ~l == mk_true());
bool is_true = l == mk_true();
zero_one_bits& bits = m_zero_one_bits[v];
bits.push_back(zero_one_bit(v, idx, is_true));
}
@ -309,7 +311,7 @@ namespace bv {
void solver::set_bit_eh(theory_var v, literal l, unsigned idx) {
SASSERT(m_bits[v][idx] == l);
if (s().value(l) != l_undef && s().lvl(l) == 0)
if (l.var() == mk_true().var())
register_true_false_bit(v, idx);
else {
atom* b = mk_atom(l.var());
@ -354,6 +356,14 @@ namespace bv {
return get_bv_size(var2enode(v));
}
sat::literal solver::mk_true() {
if (m_true == sat::null_literal) {
ctx.push(value_trail<sat::literal>(m_true));
m_true = ctx.internalize(m.mk_true(), false, false, false);
}
return m_true;
}
void solver::internalize_num(app* a) {
numeral val;
unsigned sz = 0;
@ -365,7 +375,7 @@ namespace bv {
m_bb.num2bits(val, sz, bits);
SASSERT(bits.size() == sz);
SASSERT(m_bits[v].empty());
sat::literal true_literal = ctx.internalize(m.mk_true(), false, false, false);
sat::literal true_literal = mk_true();
for (unsigned i = 0; i < sz; i++) {
expr* l = bits.get(i);
SASSERT(m.is_true(l) || m.is_false(l));

View file

@ -70,12 +70,14 @@ namespace bv {
bits[0].resize(bv_sz, false);
bits[1].resize(bv_sz, false);
sat::literal_vector assigned;
theory_var curr = v;
do {
literal_vector const& lits = m_bits[curr];
for (unsigned i = 0; i < lits.size(); i++) {
literal l = lits[i];
if (s().value(l) != l_undef) {
if (l.var() == mk_true().var()) {
assigned.push_back(l);
unsigned is_true = s().value(l) == l_true;
if (bits[!is_true][i]) {
// expect a conflict later on.
@ -91,7 +93,9 @@ namespace bv {
} while (curr != v);
zero_one_bits const& _bits = m_zero_one_bits[v];
SASSERT(_bits.size() == num_bits);
if (_bits.size() != num_bits)
std::cout << v << " " << _bits.size() << " " << num_bits << "\n";
VERIFY(_bits.size() == num_bits);
bool_vector already_found;
already_found.resize(bv_sz, false);
for (auto& zo : _bits) {

View file

@ -354,23 +354,6 @@ namespace bv {
sat::literal_vector lits;
switch (c.m_kind) {
case bv_justification::kind_t::eq2bit:
++s_count;
// std::cout << "eq2bit " << s_count << "\n";
#if 0
if (s_count == 1899) {
std::cout << "eq2bit " << mk_bounded_pp(var2expr(c.m_v1), m) << " == " << mk_bounded_pp(var2expr(c.m_v2), m) << "\n";
std::cout << mk_bounded_pp(literal2expr(~c.m_antecedent), m, 4) << "\n";
std::cout << mk_bounded_pp(literal2expr(c.m_consequent), m, 4) << "\n";
std::cout << literal2expr(c.m_consequent) << "\n";
#if 0
solver_ref slv = mk_smt2_solver(m, ctx.s().params());
slv->assert_expr(eq);
slv->assert_expr(literal2expr(c.m_antecedent));
slv->assert_expr(literal2expr(~c.m_consequent));
slv->display(std::cout) << "(check-sat)\n";
#endif
}
#endif
lits.push_back(~leq);
lits.push_back(~c.m_antecedent);
lits.push_back(c.m_consequent);

View file

@ -204,6 +204,7 @@ namespace bv {
svector<propagation_item> m_prop_queue;
unsigned_vector m_prop_queue_lim;
unsigned m_prop_queue_head { 0 };
sat::literal m_true { sat::null_literal };
// internalize
void insert_bv2a(bool_var bv, atom * a) { m_bool_var2atom.setx(bv, a, 0); }
@ -294,6 +295,7 @@ namespace bv {
bool propagate_bits(var_pos entry);
bool propagate_eq_occurs(eq_occurs const& occ);
numeral const& power2(unsigned i) const;
sat::literal mk_true();
// invariants

View file

@ -308,7 +308,7 @@ namespace euf {
euf::enode* nb = n->get_arg(1);
m_egraph.merge(na, nb, c);
}
else if (n->merge_enabled()) {
else if (n->merge_enabled() && n->num_parents() > 0) {
euf::enode* nb = sign ? mk_false() : mk_true();
m_egraph.merge(n, nb, c);
}

View file

@ -63,7 +63,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
obj_map<app, sat::literal> m_app2lit;
u_map<app*> m_lit2app;
unsigned_vector m_cache_lim;
ptr_vector<app> m_cache_trail;
app_ref_vector m_cache_trail;
obj_hashtable<expr> m_interface_vars;
sat::solver_core & m_solver;
atom2bool_var & m_map;
@ -85,6 +85,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
imp(ast_manager & _m, params_ref const & p, sat::solver_core & s, atom2bool_var & map, dep2asm_map& dep2asm, bool default_external):
m(_m),
pb(m),
m_cache_trail(m),
m_solver(s),
m_map(map),
m_dep2asm(dep2asm),
@ -95,7 +96,8 @@ struct goal2sat::imp : public sat::sat_internalizer {
m_true = sat::null_literal;
}
~imp() override {}
~imp() override {
}
sat::cut_simplifier* aig() {
@ -258,7 +260,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
m_map.pop(n);
unsigned k = m_cache_lim[m_cache_lim.size() - n];
for (unsigned i = m_cache_trail.size(); i-- > k; ) {
app* t = m_cache_trail[i];
app* t = m_cache_trail.get(i);
sat::literal lit;
if (m_app2lit.find(t, lit)) {
m_app2lit.remove(t);