Skip to content

Commit d774f07

Browse files
add eval field to sls-valuation to track temporary values.
1 parent 8f139e8 commit d774f07

9 files changed

+339
-336
lines changed

src/ast/sls/bv_sls.cpp

+23-21
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ namespace bv {
5252
m_repair_roots.insert(e->get_id());
5353
}
5454
}
55-
for (app* t : m_terms.terms())
56-
if (t && !eval_is_correct(t))
57-
m_repair_roots.insert(t->get_id());
5855
}
5956

6057
void sls::reinit_eval() {
@@ -67,7 +64,7 @@ namespace bv {
6764
return m_eval.bval0(e);
6865
}
6966
else if (bv.is_bv(e)) {
70-
auto& w = m_eval.wval0(e);
67+
auto& w = m_eval.wval(e);
7168
if (w.fixed.get(i) || should_keep())
7269
return w.get_bit(i);
7370
}
@@ -142,17 +139,21 @@ namespace bv {
142139

143140
void sls::try_repair_down(app* e) {
144141
unsigned n = e->get_num_args();
145-
if (n > 0) {
146-
unsigned s = m_rand(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));
151-
return;
152-
}
142+
if (n == 0) {
143+
m_eval.wval(e).commit_eval();
144+
m_repair_up.insert(e->get_id());
145+
}
146+
147+
unsigned s = m_rand(n);
148+
for (unsigned i = 0; i < n; ++i) {
149+
auto j = (i + s) % n;
150+
if (m_eval.try_repair(e, j)) {
151+
set_repair_down(e->get_arg(j));
152+
return;
153153
}
154154
}
155-
m_repair_up.insert(e->get_id());
155+
156+
// search a new root / random walk to repair
156157
}
157158

158159
void sls::try_repair_up(app* e) {
@@ -174,8 +175,10 @@ namespace bv {
174175
return false;
175176
if (m.is_bool(e))
176177
return m_eval.bval0(e) == m_eval.bval1(e);
177-
if (bv.is_bv(e))
178-
return m_eval.wval0(e).eq(m_eval.wval1(e));
178+
if (bv.is_bv(e)) {
179+
auto const& v = m_eval.wval(e);
180+
return v.eval == v.bits();
181+
}
179182
UNREACHABLE();
180183
return false;
181184
}
@@ -187,9 +190,8 @@ namespace bv {
187190
if (!eval_is_correct(to_app(e))) {
188191
verbose_stream() << "missed evaluation #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
189192
if (bv.is_bv(e)) {
190-
auto const& v0 = m_eval.wval0(e);
191-
auto const& v1 = m_eval.wval1(to_app(e));
192-
verbose_stream() << v0 << "\n" << v1 << "\n";
193+
auto const& v = m_eval.wval(e);
194+
verbose_stream() << v << "\n" << v.eval << "\n";
193195
}
194196
}
195197
if (!is_uninterp_const(e))
@@ -199,7 +201,7 @@ namespace bv {
199201
if (m.is_bool(e))
200202
mdl->register_decl(f, m.mk_bool_val(m_eval.bval0(e)));
201203
else if (bv.is_bv(e)) {
202-
auto const& v = m_eval.wval0(e);
204+
auto const& v = m_eval.wval(e);
203205
rational n = v.get_value();
204206
mdl->register_decl(f, bv.mk_numeral(n, v.bw));
205207
}
@@ -219,7 +221,7 @@ namespace bv {
219221
if (m_repair_roots.contains(e->get_id()))
220222
out << "r ";
221223
if (bv.is_bv(e))
222-
out << m_eval.wval0(e);
224+
out << m_eval.wval(e);
223225
else if (m.is_bool(e))
224226
out << (m_eval.bval0(e)?"T":"F");
225227
out << "\n";
@@ -239,7 +241,7 @@ namespace bv {
239241
verbose_stream() << (down ? "d #" : "u #")
240242
<< e->get_id() << ": "
241243
<< mk_bounded_pp(e, m, 1) << " ";
242-
if (bv.is_bv(e)) verbose_stream() << m_eval.wval0(e) << " " << (m_eval.is_fixed0(e) ? "fixed " : " ");
244+
if (bv.is_bv(e)) verbose_stream() << m_eval.wval(e) << " " << (m_eval.is_fixed0(e) ? "fixed " : " ");
243245
if (m.is_bool(e)) verbose_stream() << m_eval.bval0(e) << " ";
244246
verbose_stream() << "\n");
245247
}

src/ast/sls/bv_sls.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ namespace bv {
9999
/**
100100
* Retrieve valuation
101101
*/
102-
sls_valuation const& wval(expr* e) const { return m_eval.wval0(e); }
102+
sls_valuation const& wval(expr* e) const { return m_eval.wval(e); }
103103

104104
model_ref get_model();
105105

0 commit comments

Comments
 (0)