Skip to content

Commit 5455603

Browse files
na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
1 parent 9888d87 commit 5455603

File tree

5 files changed

+36
-15
lines changed

5 files changed

+36
-15
lines changed

src/ast/sls/bv_sls.cpp

+17-2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ namespace bv {
138138
void sls::try_repair_down(app* e) {
139139

140140
if (eval_is_correct(e)) {
141+
// if (bv.is_bv(e))
142+
// verbose_stream() << mk_pp(e, m) << " := " << m_eval.wval(e) << "\n";
141143
m_repair_roots.remove(m_repair_root);
142144
m_repair_root = UINT_MAX;
143145
return;
@@ -147,7 +149,6 @@ namespace bv {
147149
if (n == 0) {
148150
auto& v = m_eval.wval(e);
149151
v.commit_eval();
150-
verbose_stream() << mk_pp(e, m) << " := " << v << "\n";
151152
for (auto p : m_terms.parents(e))
152153
m_repair_up.insert(p->get_id());
153154
m_repair_roots.remove(m_repair_root);
@@ -193,11 +194,25 @@ namespace bv {
193194
return false;
194195
}
195196

197+
198+
bool sls::re_eval_is_correct(app* e) {
199+
if (!m_eval.can_eval1(e))
200+
return false;
201+
if (m.is_bool(e))
202+
return m_eval.bval0(e) == m_eval.bval1(e);
203+
if (bv.is_bv(e)) {
204+
auto const& v = m_eval.eval(e);
205+
return v.eval == v.bits();
206+
}
207+
UNREACHABLE();
208+
return false;
209+
}
210+
196211
model_ref sls::get_model() {
197212
model_ref mdl = alloc(model, m);
198213
auto& terms = m_eval.sort_assertions(m_terms.assertions());
199214
for (expr* e : terms) {
200-
if (!eval_is_correct(to_app(e))) {
215+
if (!re_eval_is_correct(to_app(e))) {
201216
verbose_stream() << "missed evaluation #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
202217
if (bv.is_bv(e)) {
203218
auto const& v = m_eval.wval(e);

src/ast/sls/bv_sls.h

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ namespace bv {
5454
std::pair<bool, app*> next_to_repair();
5555

5656
bool eval_is_correct(app* e);
57+
bool re_eval_is_correct(app* e);
5758
void try_repair_down(app* e);
5859
void try_repair_up(app* e);
5960
void set_repair_down(expr* e) { m_repair_down = e->get_id(); }

src/ast/sls/bv_sls_eval.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,6 @@ namespace bv {
299299
sls_valuation& sls_eval::eval(app* e) const {
300300
auto& val = *m_values[e->get_id()];
301301
eval(e, val);
302-
verbose_stream() << "eval " << mk_pp(e, m) << " := " << val << " " << val.eval << "\n";
303302
return val;
304303
}
305304

@@ -1021,7 +1020,6 @@ namespace bv {
10211020
unsigned parity_e = b.parity(e);
10221021
unsigned parity_b = b.parity(b.bits());
10231022

1024-
verbose_stream() << e << " := " << a << " * " << b << "\n";
10251023
if (b.is_zero(e)) {
10261024
a.get_variant(m_tmp, m_rand);
10271025
for (unsigned i = 0; i < b.bw - parity_b; ++i)
@@ -1092,14 +1090,16 @@ namespace bv {
10921090
y.set_bw(0);
10931091
// x*a + y*b = 1
10941092

1093+
tb.set_bw(b.bw);
1094+
tb.set_bw(0);
10951095
#if Z3DEBUG
10961096
b.get(y);
10971097
if (parity_b > 0)
10981098
b.shift_right(y, parity_b);
10991099
a.set_mul(m_tmp, tb, y);
11001100
SASSERT(a.is_one(m_tmp));
11011101
#endif
1102-
b.get(m_tmp2);
1102+
e.copy_to(b.nw, m_tmp2);
11031103
if (parity_e > 0 && parity_b > 0)
11041104
b.shift_right(m_tmp2, std::min(parity_b, parity_e));
11051105
a.set_mul(m_tmp, tb, m_tmp2);

src/ast/sls/sls_valuation.cpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,8 @@ namespace bv {
338338
}
339339

340340
void sls_valuation::min_feasible(bvect& out) const {
341-
if (m_lo < m_hi) {
342-
for (unsigned i = 0; i < nw; ++i)
343-
out[i] = m_lo[i];
344-
}
341+
if (m_lo < m_hi)
342+
m_lo.copy_to(nw, out);
345343
else {
346344
for (unsigned i = 0; i < nw; ++i)
347345
out[i] = fixed[i] & m_bits[i];
@@ -351,8 +349,7 @@ namespace bv {
351349

352350
void sls_valuation::max_feasible(bvect& out) const {
353351
if (m_lo < m_hi) {
354-
for (unsigned i = 0; i < nw; ++i)
355-
out[i] = m_hi[i];
352+
m_hi.copy_to(nw, out);
356353
sub1(out);
357354
}
358355
else {
@@ -386,8 +383,7 @@ namespace bv {
386383
}
387384

388385
void sls_valuation::get(bvect& dst) const {
389-
for (unsigned i = 0; i < nw; ++i)
390-
dst[i] = m_bits[i];
386+
m_bits.copy_to(nw, dst);
391387
}
392388

393389
digit_t sls_valuation::random_bits(random_gen& rand) {

src/ast/sls/sls_valuation.h

+11-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ namespace bv {
3737
bvect(unsigned sz) : svector(sz, (unsigned)0) {}
3838
void set_bw(unsigned bw);
3939

40+
void copy_to(unsigned nw, bvect & dst) const {
41+
SASSERT(nw <= this->size());
42+
for (unsigned i = 0; i < nw; ++i)
43+
dst[i] = (*this)[i];
44+
}
45+
4046
void set(unsigned bit_idx, bool val) {
4147
auto _val = static_cast<digit_t>(0 - static_cast<digit_t>(val));
4248
get_bit_word(bit_idx) ^= (_val ^ get_bit_word(bit_idx)) & get_pos_mask(bit_idx);
@@ -282,8 +288,11 @@ namespace bv {
282288

283289
std::ostream& display(std::ostream& out) const {
284290
out << m_bits;
285-
out << " fix:";
286-
out << fixed;
291+
out << " ev: " << eval;
292+
if (!is_zero(fixed)) {
293+
out << " fix:";
294+
out << fixed;
295+
}
287296
if (m_lo != m_hi)
288297
out << " [" << m_lo << ", " << m_hi << "[";
289298
return out;

0 commit comments

Comments
 (0)