Skip to content

Commit

Permalink
na
Browse files Browse the repository at this point in the history
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
  • Loading branch information
NikolajBjorner committed Mar 5, 2024
1 parent 9888d87 commit 5455603
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 15 deletions.
19 changes: 17 additions & 2 deletions src/ast/sls/bv_sls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ namespace bv {
void sls::try_repair_down(app* e) {

if (eval_is_correct(e)) {
// if (bv.is_bv(e))
// verbose_stream() << mk_pp(e, m) << " := " << m_eval.wval(e) << "\n";
m_repair_roots.remove(m_repair_root);
m_repair_root = UINT_MAX;
return;
Expand All @@ -147,7 +149,6 @@ namespace bv {
if (n == 0) {
auto& v = m_eval.wval(e);
v.commit_eval();
verbose_stream() << mk_pp(e, m) << " := " << v << "\n";
for (auto p : m_terms.parents(e))
m_repair_up.insert(p->get_id());
m_repair_roots.remove(m_repair_root);
Expand Down Expand Up @@ -193,11 +194,25 @@ namespace bv {
return false;
}


bool sls::re_eval_is_correct(app* e) {
if (!m_eval.can_eval1(e))
return false;
if (m.is_bool(e))
return m_eval.bval0(e) == m_eval.bval1(e);
if (bv.is_bv(e)) {
auto const& v = m_eval.eval(e);
return v.eval == v.bits();
}
UNREACHABLE();
return false;
}

model_ref sls::get_model() {
model_ref mdl = alloc(model, m);
auto& terms = m_eval.sort_assertions(m_terms.assertions());
for (expr* e : terms) {
if (!eval_is_correct(to_app(e))) {
if (!re_eval_is_correct(to_app(e))) {
verbose_stream() << "missed evaluation #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
if (bv.is_bv(e)) {
auto const& v = m_eval.wval(e);
Expand Down
1 change: 1 addition & 0 deletions src/ast/sls/bv_sls.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ namespace bv {
std::pair<bool, app*> next_to_repair();

bool eval_is_correct(app* e);
bool re_eval_is_correct(app* e);
void try_repair_down(app* e);
void try_repair_up(app* e);
void set_repair_down(expr* e) { m_repair_down = e->get_id(); }
Expand Down
6 changes: 3 additions & 3 deletions src/ast/sls/bv_sls_eval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,6 @@ namespace bv {
sls_valuation& sls_eval::eval(app* e) const {
auto& val = *m_values[e->get_id()];
eval(e, val);
verbose_stream() << "eval " << mk_pp(e, m) << " := " << val << " " << val.eval << "\n";
return val;
}

Expand Down Expand Up @@ -1021,7 +1020,6 @@ namespace bv {
unsigned parity_e = b.parity(e);
unsigned parity_b = b.parity(b.bits());

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

tb.set_bw(b.bw);
tb.set_bw(0);
#if Z3DEBUG
b.get(y);
if (parity_b > 0)
b.shift_right(y, parity_b);
a.set_mul(m_tmp, tb, y);
SASSERT(a.is_one(m_tmp));
#endif
b.get(m_tmp2);
e.copy_to(b.nw, m_tmp2);
if (parity_e > 0 && parity_b > 0)
b.shift_right(m_tmp2, std::min(parity_b, parity_e));
a.set_mul(m_tmp, tb, m_tmp2);
Expand Down
12 changes: 4 additions & 8 deletions src/ast/sls/sls_valuation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,10 +338,8 @@ namespace bv {
}

void sls_valuation::min_feasible(bvect& out) const {
if (m_lo < m_hi) {
for (unsigned i = 0; i < nw; ++i)
out[i] = m_lo[i];
}
if (m_lo < m_hi)
m_lo.copy_to(nw, out);
else {
for (unsigned i = 0; i < nw; ++i)
out[i] = fixed[i] & m_bits[i];
Expand All @@ -351,8 +349,7 @@ namespace bv {

void sls_valuation::max_feasible(bvect& out) const {
if (m_lo < m_hi) {
for (unsigned i = 0; i < nw; ++i)
out[i] = m_hi[i];
m_hi.copy_to(nw, out);
sub1(out);
}
else {
Expand Down Expand Up @@ -386,8 +383,7 @@ namespace bv {
}

void sls_valuation::get(bvect& dst) const {
for (unsigned i = 0; i < nw; ++i)
dst[i] = m_bits[i];
m_bits.copy_to(nw, dst);
}

digit_t sls_valuation::random_bits(random_gen& rand) {
Expand Down
13 changes: 11 additions & 2 deletions src/ast/sls/sls_valuation.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ namespace bv {
bvect(unsigned sz) : svector(sz, (unsigned)0) {}
void set_bw(unsigned bw);

void copy_to(unsigned nw, bvect & dst) const {
SASSERT(nw <= this->size());
for (unsigned i = 0; i < nw; ++i)
dst[i] = (*this)[i];
}

void set(unsigned bit_idx, bool val) {
auto _val = static_cast<digit_t>(0 - static_cast<digit_t>(val));
get_bit_word(bit_idx) ^= (_val ^ get_bit_word(bit_idx)) & get_pos_mask(bit_idx);
Expand Down Expand Up @@ -282,8 +288,11 @@ namespace bv {

std::ostream& display(std::ostream& out) const {
out << m_bits;
out << " fix:";
out << fixed;
out << " ev: " << eval;
if (!is_zero(fixed)) {
out << " fix:";
out << fixed;
}
if (m_lo != m_hi)
out << " [" << m_lo << ", " << m_hi << "[";
return out;
Expand Down

0 comments on commit 5455603

Please sign in to comment.