Skip to content

Commit a328366

Browse files
move to single path mode for search
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
1 parent 8f85df0 commit a328366

File tree

2 files changed

+61
-54
lines changed

2 files changed

+61
-54
lines changed

src/ast/sls/bv_sls.cpp

+57-51
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,18 @@ namespace bv {
4343
}
4444

4545
void sls::init_repair() {
46-
m_repair_down.reset();
46+
m_repair_down = UINT_MAX;
4747
m_repair_up.reset();
48+
m_repair_roots.reset();
4849
for (auto* e : m_terms.assertions()) {
4950
if (!m_eval.bval0(e)) {
5051
m_eval.set(e, true);
51-
m_repair_down.insert(e->get_id());
52+
m_repair_roots.insert(e->get_id());
5253
}
5354
}
5455
for (app* t : m_terms.terms())
5556
if (t && !eval_is_correct(t))
56-
m_repair_down.insert(t->get_id());
57+
m_repair_roots.insert(t->get_id());
5758
}
5859

5960
void sls::reinit_eval() {
@@ -78,15 +79,27 @@ namespace bv {
7879

7980
std::pair<bool, app*> sls::next_to_repair() {
8081
app* e = nullptr;
81-
if (!m_repair_down.empty()) {
82-
unsigned index = m_rand(m_repair_down.size());
83-
e = m_terms.term(m_repair_down.elem_at(index));
82+
if (m_repair_down != UINT_MAX) {
83+
e = m_terms.term(m_repair_down);
84+
m_repair_down = UINT_MAX;
85+
return { true, e };
8486
}
85-
else if (!m_repair_up.empty()) {
87+
88+
if (!m_repair_up.empty()) {
8689
unsigned index = m_rand(m_repair_up.size());
90+
m_repair_up.remove(index);
8791
e = m_terms.term(m_repair_up.elem_at(index));
92+
return { false, e };
8893
}
89-
return { !m_repair_down.empty(), e };
94+
95+
if (!m_repair_roots.empty()) {
96+
unsigned index = m_rand(m_repair_up.size());
97+
e = m_terms.term(m_repair_up.elem_at(index));
98+
m_repair_roots.remove(index);
99+
return { true, e };
100+
}
101+
102+
return { false, nullptr };
90103
}
91104

92105
lbool sls::search() {
@@ -97,35 +110,19 @@ namespace bv {
97110
auto [down, e] = next_to_repair();
98111
if (!e)
99112
return l_true;
100-
bool is_correct = eval_is_correct(e);
101-
if (is_correct) {
102-
if (down)
103-
m_repair_down.remove(e->get_id());
104-
else
105-
m_repair_up.remove(e->get_id());
106-
}
107-
else {
108-
IF_VERBOSE(20, verbose_stream() << (down ? "d #" : "u #")
109-
<< e->get_id() << ": "
110-
<< mk_bounded_pp(e, m, 1) << " ";
111-
if (bv.is_bv(e)) verbose_stream() << m_eval.wval0(e) << " " << (m_eval.is_fixed0(e)?"fixed ":" ");
112-
if (m.is_bool(e)) verbose_stream() << m_eval.bval0(e) << " ";
113-
verbose_stream() << "\n");
114-
if (down)
115-
try_repair_down(e);
116-
else
117-
try_repair_up(e);
118-
}
113+
if (eval_is_correct(e))
114+
continue;
115+
116+
trace_repair(down, e);
117+
118+
if (down)
119+
try_repair_down(e);
120+
else
121+
try_repair_up(e);
119122
}
120123
return l_undef;
121124
}
122125

123-
void sls::trace() {
124-
IF_VERBOSE(2, verbose_stream()
125-
<< "(bvsls :restarts " << m_stats.m_restarts
126-
<< " :repair-down " << m_repair_down.size()
127-
<< " :repair-up " << m_repair_up.size() << ")\n");
128-
}
129126

130127
lbool sls::operator()() {
131128
lbool res = l_undef;
@@ -147,29 +144,21 @@ namespace bv {
147144
unsigned n = e->get_num_args();
148145
if (n > 0) {
149146
unsigned s = m_rand(n);
150-
for (unsigned i = 0; i < n; ++i)
151-
if (try_repair_down(e, (i + s) % n))
147+
for (unsigned i = 0; i < n; ++i) {
148+
auto j = (i + s) % n;
149+
if (m_eval.try_repair(e, j)) {
150+
set_repair_down(e->get_arg(j));
152151
return;
152+
}
153+
}
153154
}
154-
m_repair_down.remove(e->get_id());
155155
m_repair_up.insert(e->get_id());
156156
}
157157

158-
bool sls::try_repair_down(app* e, unsigned i) {
159-
expr* child = e->get_arg(i);
160-
bool was_repaired = m_eval.try_repair(e, i);
161-
if (was_repaired) {
162-
m_repair_down.insert(child->get_id());
163-
for (auto p : m_terms.parents(child))
164-
m_repair_up.insert(p->get_id());
165-
}
166-
return was_repaired;
167-
}
168-
169158
void sls::try_repair_up(app* e) {
170-
m_repair_up.remove(e->get_id());
159+
171160
if (m_terms.is_assertion(e) || !m_eval.repair_up(e))
172-
m_repair_down.insert(e->get_id());
161+
m_repair_roots.insert(e->get_id());
173162
else {
174163
if (!eval_is_correct(e)) {
175164
verbose_stream() << "incorrect eval #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
@@ -225,10 +214,10 @@ namespace bv {
225214
out << e->get_id() << ": " << mk_bounded_pp(e, m, 1) << " ";
226215
if (m_eval.is_fixed0(e))
227216
out << "f ";
228-
if (m_repair_down.contains(e->get_id()))
229-
out << "d ";
230217
if (m_repair_up.contains(e->get_id()))
231218
out << "u ";
219+
if (m_repair_roots.contains(e->get_id()))
220+
out << "r ";
232221
if (bv.is_bv(e))
233222
out << m_eval.wval0(e);
234223
else if (m.is_bool(e))
@@ -244,4 +233,21 @@ namespace bv {
244233
m_config.m_max_restarts = p.max_restarts();
245234
m_rand.set_seed(p.random_seed());
246235
}
236+
237+
void sls::trace_repair(bool down, expr* e) {
238+
IF_VERBOSE(20,
239+
verbose_stream() << (down ? "d #" : "u #")
240+
<< e->get_id() << ": "
241+
<< mk_bounded_pp(e, m, 1) << " ";
242+
if (bv.is_bv(e)) verbose_stream() << m_eval.wval0(e) << " " << (m_eval.is_fixed0(e) ? "fixed " : " ");
243+
if (m.is_bool(e)) verbose_stream() << m_eval.bval0(e) << " ";
244+
verbose_stream() << "\n");
245+
}
246+
247+
void sls::trace() {
248+
IF_VERBOSE(2, verbose_stream()
249+
<< "(bvsls :restarts " << m_stats.m_restarts
250+
<< " :repair-up " << m_repair_up.size()
251+
<< " :repair-roots " << m_repair_roots.size() << ")\n");
252+
}
247253
}

src/ast/sls/bv_sls.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ namespace bv {
4444
sls_terms m_terms;
4545
sls_eval m_eval;
4646
sls_stats m_stats;
47-
indexed_uint_set m_repair_down, m_repair_up;
47+
indexed_uint_set m_repair_up, m_repair_roots;
48+
unsigned m_repair_down = UINT_MAX;
4849
ptr_vector<expr> m_todo;
4950
random_gen m_rand;
5051
config m_config;
@@ -54,13 +55,13 @@ namespace bv {
5455
bool eval_is_correct(app* e);
5556
void try_repair_down(app* e);
5657
void try_repair_up(app* e);
57-
58-
bool try_repair_down(app* e, unsigned i);
58+
void set_repair_down(expr* e) { m_repair_down = e->get_id(); }
5959

6060
lbool search();
6161
void reinit_eval();
6262
void init_repair();
6363
void trace();
64+
void trace_repair(bool down, expr* e);
6465

6566
public:
6667
sls(ast_manager& m);

0 commit comments

Comments
 (0)