mirror of
https://github.com/Z3Prover/z3
synced 2025-04-07 09:55:19 +00:00
move to single path mode for search
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
8f85df05ed
commit
a328366c7d
|
@ -43,17 +43,18 @@ namespace bv {
|
||||||
}
|
}
|
||||||
|
|
||||||
void sls::init_repair() {
|
void sls::init_repair() {
|
||||||
m_repair_down.reset();
|
m_repair_down = UINT_MAX;
|
||||||
m_repair_up.reset();
|
m_repair_up.reset();
|
||||||
|
m_repair_roots.reset();
|
||||||
for (auto* e : m_terms.assertions()) {
|
for (auto* e : m_terms.assertions()) {
|
||||||
if (!m_eval.bval0(e)) {
|
if (!m_eval.bval0(e)) {
|
||||||
m_eval.set(e, true);
|
m_eval.set(e, true);
|
||||||
m_repair_down.insert(e->get_id());
|
m_repair_roots.insert(e->get_id());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (app* t : m_terms.terms())
|
for (app* t : m_terms.terms())
|
||||||
if (t && !eval_is_correct(t))
|
if (t && !eval_is_correct(t))
|
||||||
m_repair_down.insert(t->get_id());
|
m_repair_roots.insert(t->get_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
void sls::reinit_eval() {
|
void sls::reinit_eval() {
|
||||||
|
@ -78,15 +79,27 @@ namespace bv {
|
||||||
|
|
||||||
std::pair<bool, app*> sls::next_to_repair() {
|
std::pair<bool, app*> sls::next_to_repair() {
|
||||||
app* e = nullptr;
|
app* e = nullptr;
|
||||||
if (!m_repair_down.empty()) {
|
if (m_repair_down != UINT_MAX) {
|
||||||
unsigned index = m_rand(m_repair_down.size());
|
e = m_terms.term(m_repair_down);
|
||||||
e = m_terms.term(m_repair_down.elem_at(index));
|
m_repair_down = UINT_MAX;
|
||||||
|
return { true, e };
|
||||||
}
|
}
|
||||||
else if (!m_repair_up.empty()) {
|
|
||||||
|
if (!m_repair_up.empty()) {
|
||||||
|
unsigned index = m_rand(m_repair_up.size());
|
||||||
|
m_repair_up.remove(index);
|
||||||
|
e = m_terms.term(m_repair_up.elem_at(index));
|
||||||
|
return { false, e };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_repair_roots.empty()) {
|
||||||
unsigned index = m_rand(m_repair_up.size());
|
unsigned index = m_rand(m_repair_up.size());
|
||||||
e = m_terms.term(m_repair_up.elem_at(index));
|
e = m_terms.term(m_repair_up.elem_at(index));
|
||||||
|
m_repair_roots.remove(index);
|
||||||
|
return { true, e };
|
||||||
}
|
}
|
||||||
return { !m_repair_down.empty(), e };
|
|
||||||
|
return { false, nullptr };
|
||||||
}
|
}
|
||||||
|
|
||||||
lbool sls::search() {
|
lbool sls::search() {
|
||||||
|
@ -97,35 +110,19 @@ namespace bv {
|
||||||
auto [down, e] = next_to_repair();
|
auto [down, e] = next_to_repair();
|
||||||
if (!e)
|
if (!e)
|
||||||
return l_true;
|
return l_true;
|
||||||
bool is_correct = eval_is_correct(e);
|
if (eval_is_correct(e))
|
||||||
if (is_correct) {
|
continue;
|
||||||
if (down)
|
|
||||||
m_repair_down.remove(e->get_id());
|
trace_repair(down, e);
|
||||||
else
|
|
||||||
m_repair_up.remove(e->get_id());
|
if (down)
|
||||||
}
|
try_repair_down(e);
|
||||||
else {
|
else
|
||||||
IF_VERBOSE(20, verbose_stream() << (down ? "d #" : "u #")
|
try_repair_up(e);
|
||||||
<< e->get_id() << ": "
|
|
||||||
<< mk_bounded_pp(e, m, 1) << " ";
|
|
||||||
if (bv.is_bv(e)) verbose_stream() << m_eval.wval0(e) << " " << (m_eval.is_fixed0(e)?"fixed ":" ");
|
|
||||||
if (m.is_bool(e)) verbose_stream() << m_eval.bval0(e) << " ";
|
|
||||||
verbose_stream() << "\n");
|
|
||||||
if (down)
|
|
||||||
try_repair_down(e);
|
|
||||||
else
|
|
||||||
try_repair_up(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return l_undef;
|
return l_undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sls::trace() {
|
|
||||||
IF_VERBOSE(2, verbose_stream()
|
|
||||||
<< "(bvsls :restarts " << m_stats.m_restarts
|
|
||||||
<< " :repair-down " << m_repair_down.size()
|
|
||||||
<< " :repair-up " << m_repair_up.size() << ")\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
lbool sls::operator()() {
|
lbool sls::operator()() {
|
||||||
lbool res = l_undef;
|
lbool res = l_undef;
|
||||||
|
@ -147,29 +144,21 @@ namespace bv {
|
||||||
unsigned n = e->get_num_args();
|
unsigned n = e->get_num_args();
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
unsigned s = m_rand(n);
|
unsigned s = m_rand(n);
|
||||||
for (unsigned i = 0; i < n; ++i)
|
for (unsigned i = 0; i < n; ++i) {
|
||||||
if (try_repair_down(e, (i + s) % n))
|
auto j = (i + s) % n;
|
||||||
|
if (m_eval.try_repair(e, j)) {
|
||||||
|
set_repair_down(e->get_arg(j));
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_repair_down.remove(e->get_id());
|
|
||||||
m_repair_up.insert(e->get_id());
|
m_repair_up.insert(e->get_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sls::try_repair_down(app* e, unsigned i) {
|
|
||||||
expr* child = e->get_arg(i);
|
|
||||||
bool was_repaired = m_eval.try_repair(e, i);
|
|
||||||
if (was_repaired) {
|
|
||||||
m_repair_down.insert(child->get_id());
|
|
||||||
for (auto p : m_terms.parents(child))
|
|
||||||
m_repair_up.insert(p->get_id());
|
|
||||||
}
|
|
||||||
return was_repaired;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sls::try_repair_up(app* e) {
|
void sls::try_repair_up(app* e) {
|
||||||
m_repair_up.remove(e->get_id());
|
|
||||||
if (m_terms.is_assertion(e) || !m_eval.repair_up(e))
|
if (m_terms.is_assertion(e) || !m_eval.repair_up(e))
|
||||||
m_repair_down.insert(e->get_id());
|
m_repair_roots.insert(e->get_id());
|
||||||
else {
|
else {
|
||||||
if (!eval_is_correct(e)) {
|
if (!eval_is_correct(e)) {
|
||||||
verbose_stream() << "incorrect eval #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
|
verbose_stream() << "incorrect eval #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
|
||||||
|
@ -225,10 +214,10 @@ namespace bv {
|
||||||
out << e->get_id() << ": " << mk_bounded_pp(e, m, 1) << " ";
|
out << e->get_id() << ": " << mk_bounded_pp(e, m, 1) << " ";
|
||||||
if (m_eval.is_fixed0(e))
|
if (m_eval.is_fixed0(e))
|
||||||
out << "f ";
|
out << "f ";
|
||||||
if (m_repair_down.contains(e->get_id()))
|
|
||||||
out << "d ";
|
|
||||||
if (m_repair_up.contains(e->get_id()))
|
if (m_repair_up.contains(e->get_id()))
|
||||||
out << "u ";
|
out << "u ";
|
||||||
|
if (m_repair_roots.contains(e->get_id()))
|
||||||
|
out << "r ";
|
||||||
if (bv.is_bv(e))
|
if (bv.is_bv(e))
|
||||||
out << m_eval.wval0(e);
|
out << m_eval.wval0(e);
|
||||||
else if (m.is_bool(e))
|
else if (m.is_bool(e))
|
||||||
|
@ -244,4 +233,21 @@ namespace bv {
|
||||||
m_config.m_max_restarts = p.max_restarts();
|
m_config.m_max_restarts = p.max_restarts();
|
||||||
m_rand.set_seed(p.random_seed());
|
m_rand.set_seed(p.random_seed());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sls::trace_repair(bool down, expr* e) {
|
||||||
|
IF_VERBOSE(20,
|
||||||
|
verbose_stream() << (down ? "d #" : "u #")
|
||||||
|
<< e->get_id() << ": "
|
||||||
|
<< mk_bounded_pp(e, m, 1) << " ";
|
||||||
|
if (bv.is_bv(e)) verbose_stream() << m_eval.wval0(e) << " " << (m_eval.is_fixed0(e) ? "fixed " : " ");
|
||||||
|
if (m.is_bool(e)) verbose_stream() << m_eval.bval0(e) << " ";
|
||||||
|
verbose_stream() << "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void sls::trace() {
|
||||||
|
IF_VERBOSE(2, verbose_stream()
|
||||||
|
<< "(bvsls :restarts " << m_stats.m_restarts
|
||||||
|
<< " :repair-up " << m_repair_up.size()
|
||||||
|
<< " :repair-roots " << m_repair_roots.size() << ")\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,8 @@ namespace bv {
|
||||||
sls_terms m_terms;
|
sls_terms m_terms;
|
||||||
sls_eval m_eval;
|
sls_eval m_eval;
|
||||||
sls_stats m_stats;
|
sls_stats m_stats;
|
||||||
indexed_uint_set m_repair_down, m_repair_up;
|
indexed_uint_set m_repair_up, m_repair_roots;
|
||||||
|
unsigned m_repair_down = UINT_MAX;
|
||||||
ptr_vector<expr> m_todo;
|
ptr_vector<expr> m_todo;
|
||||||
random_gen m_rand;
|
random_gen m_rand;
|
||||||
config m_config;
|
config m_config;
|
||||||
|
@ -54,13 +55,13 @@ namespace bv {
|
||||||
bool eval_is_correct(app* e);
|
bool eval_is_correct(app* e);
|
||||||
void try_repair_down(app* e);
|
void try_repair_down(app* e);
|
||||||
void try_repair_up(app* e);
|
void try_repair_up(app* e);
|
||||||
|
void set_repair_down(expr* e) { m_repair_down = e->get_id(); }
|
||||||
bool try_repair_down(app* e, unsigned i);
|
|
||||||
|
|
||||||
lbool search();
|
lbool search();
|
||||||
void reinit_eval();
|
void reinit_eval();
|
||||||
void init_repair();
|
void init_repair();
|
||||||
void trace();
|
void trace();
|
||||||
|
void trace_repair(bool down, expr* e);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
sls(ast_manager& m);
|
sls(ast_manager& m);
|
||||||
|
|
Loading…
Reference in a new issue