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:
parent
9a975a4523
commit
8412ecbdbf
22 changed files with 156 additions and 164 deletions
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue