mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
Refactor verbose logging and fix logic in range adjustment functions in sls bv modules
This commit is contained in:
parent
02393c3a5a
commit
0308a92ea6
5 changed files with 81 additions and 112 deletions
|
@ -885,15 +885,15 @@ namespace sls {
|
|||
auto const& uninterp = terms.uninterp_occurs(e);
|
||||
if (uninterp.empty())
|
||||
return false;
|
||||
for (auto e : uninterp)
|
||||
verbose_stream() << mk_bounded_pp(e, m) << " ";
|
||||
verbose_stream() << "\n";
|
||||
// for (auto e : uninterp)
|
||||
// verbose_stream() << mk_bounded_pp(e, m) << " ";
|
||||
// verbose_stream() << "\n";
|
||||
|
||||
expr* t = uninterp[m_rand() % uninterp.size()];
|
||||
|
||||
auto& v = wval(t);
|
||||
if (v.set_random(m_rand)) {
|
||||
verbose_stream() << "set random " << mk_bounded_pp(t, m) << "\n";
|
||||
//verbose_stream() << "set random " << mk_bounded_pp(t, m) << "\n";
|
||||
ctx.new_value_eh(t);
|
||||
return true;
|
||||
}
|
||||
|
@ -1908,8 +1908,8 @@ namespace sls {
|
|||
// set a outside of [hi:lo] to random values with preference to 0 or 1 bits
|
||||
//
|
||||
bool bv_eval::try_repair_extract(bvect const& e, bvval& a, unsigned lo) {
|
||||
//verbose_stream() << "repair extract a[" << lo << ":" << lo + e.bw - 1 << "] = " << e << "\n";
|
||||
if (m_rand(m_config.m_prob_randomize_extract) <= 100) {
|
||||
// verbose_stream() << "repair extract a[" << lo << ":" << lo + e.bw - 1 << "] = " << e << "\n";
|
||||
if (false && m_rand(m_config.m_prob_randomize_extract) <= 100) {
|
||||
a.get_variant(m_tmp, m_rand);
|
||||
if (0 == (m_rand(2))) {
|
||||
auto bit = 0 == (m_rand(2));
|
||||
|
@ -1927,11 +1927,11 @@ namespace sls {
|
|||
for (unsigned i = 0; i < e.bw; ++i)
|
||||
m_tmp.set(i + lo, e.get(i));
|
||||
m_tmp.set_bw(a.bw);
|
||||
//verbose_stream() << a << " := " << m_tmp << "\n";
|
||||
// verbose_stream() << a << " := " << m_tmp << "\n";
|
||||
if (m_rand(5) != 0 && a.try_set(m_tmp))
|
||||
return true;
|
||||
bool ok = a.set_random(m_rand);
|
||||
//verbose_stream() << "set random " << ok << " " << a << "\n";
|
||||
// verbose_stream() << "set random " << ok << " " << a << "\n";
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
@ -1982,7 +1982,7 @@ namespace sls {
|
|||
|
||||
for (unsigned i = 0; i < v.nw; ++i) {
|
||||
if (0 != (v.fixed[i] & (v.bits()[i] ^ v.eval[i]))) {
|
||||
verbose_stream() << "Fail to set " << mk_bounded_pp(e, m) << " " << i << " " << v.fixed[i] << " " << v.bits()[i] << " " << v.eval[i] << "\n";
|
||||
//verbose_stream() << "Fail to set " << mk_bounded_pp(e, m) << " " << i << " " << v.fixed[i] << " " << v.bits()[i] << " " << v.eval[i] << "\n";
|
||||
v.bits().copy_to(v.nw, v.eval);
|
||||
|
||||
return false;
|
||||
|
@ -1991,9 +1991,9 @@ namespace sls {
|
|||
//verbose_stream() << "repair up " << mk_bounded_pp(e, m) << " " << v << "\n";
|
||||
if (v.commit_eval())
|
||||
return true;
|
||||
verbose_stream() << "could not repair up " << mk_bounded_pp(e, m) << " " << v << "\n";
|
||||
for (expr* arg : *to_app(e))
|
||||
verbose_stream() << mk_bounded_pp(arg, m) << " " << wval(arg) << "\n";
|
||||
//verbose_stream() << "could not repair up " << mk_bounded_pp(e, m) << " " << v << "\n";
|
||||
//for (expr* arg : *to_app(e))
|
||||
// verbose_stream() << mk_bounded_pp(arg, m) << " " << wval(arg) << "\n";
|
||||
v.bits().copy_to(v.nw, v.eval);
|
||||
return false;
|
||||
}
|
||||
|
@ -2007,12 +2007,6 @@ namespace sls {
|
|||
void bv_eval::commit_eval(expr* p, app* e) {
|
||||
if (!bv.is_bv(e))
|
||||
return;
|
||||
|
||||
if (e->get_id() == 5) {
|
||||
//verbose_stream() << e->get_id() << " " << mk_bounded_pp(e, m) << " " << wval(e) << "\n";
|
||||
//verbose_stream() << "parent " << mk_bounded_pp(p, m) << " := " << wval(p) << "\n";
|
||||
}
|
||||
//
|
||||
SASSERT(wval(e).commit_eval());
|
||||
VERIFY(wval(e).commit_eval());
|
||||
}
|
||||
|
@ -2103,7 +2097,7 @@ namespace sls {
|
|||
bool is_true = ctx.is_true(e);
|
||||
bool is_true_new = bval1(to_app(e));
|
||||
bool is_true_old = bval1_tmp(to_app(e));
|
||||
verbose_stream() << "parent " << mk_bounded_pp(e, m) << " " << is_true << " " << is_true_new << " " << is_true_old << "\n";
|
||||
// verbose_stream() << "parent " << mk_bounded_pp(e, m) << " " << is_true << " " << is_true_new << " " << is_true_old << "\n";
|
||||
if (is_true == is_true_new && is_true_new != is_true_old)
|
||||
++make_count;
|
||||
if (is_true == is_true_old && is_true_new != is_true_old)
|
||||
|
|
|
@ -41,8 +41,6 @@ namespace sls {
|
|||
ev.m_fixed.setx(a->get_id(), true, false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
for (auto e : ctx.subterms())
|
||||
propagate_range_up(e);
|
||||
}
|
||||
|
|
|
@ -166,10 +166,10 @@ namespace sls {
|
|||
else if (bv.is_bv(e)) {
|
||||
log(e, true, false);
|
||||
IF_VERBOSE(5, verbose_stream() << "repair-up "; trace_repair(true, e));
|
||||
verbose_stream() << "set random " << m_eval.wval(e) << " --> ";
|
||||
//verbose_stream() << "set random " << m_eval.wval(e) << " --> ";
|
||||
auto& v = m_eval.wval(e);
|
||||
m_eval.set_random(e);
|
||||
verbose_stream() << m_eval.wval(e) << "\n";
|
||||
//verbose_stream() << m_eval.wval(e) << "\n";
|
||||
ctx.new_value_eh(e);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -592,59 +592,86 @@ namespace sls {
|
|||
return index;
|
||||
}
|
||||
|
||||
// The least a' >= a, such that the fixed bits in bits agree with a'.
|
||||
// 0 if there is no such a'.
|
||||
void bv_valuation::inf_feasible(bvect& a) const {
|
||||
unsigned lo_index = diff_index(a);
|
||||
|
||||
if (lo_index != 0) {
|
||||
lo_index--;
|
||||
SASSERT(a.get(lo_index) != m_bits.get(lo_index));
|
||||
SASSERT(fixed.get(lo_index));
|
||||
for (unsigned i = 0; i <= lo_index; ++i) {
|
||||
if (!fixed.get(i))
|
||||
a.set(i, false);
|
||||
else if (fixed.get(i))
|
||||
a.set(i, m_bits.get(i));
|
||||
}
|
||||
if (!a.get(lo_index)) {
|
||||
for (unsigned i = lo_index + 1; i < bw; ++i)
|
||||
if (!fixed.get(i) && !a.get(i)) {
|
||||
a.set(i, true);
|
||||
break;
|
||||
}
|
||||
if (lo_index == 0)
|
||||
return;
|
||||
--lo_index;
|
||||
|
||||
// decrement a[lo_index:0] maximally
|
||||
SASSERT(a.get(lo_index) != m_bits.get(lo_index));
|
||||
SASSERT(fixed.get(lo_index));
|
||||
for (unsigned i = 0; i <= lo_index; ++i) {
|
||||
if (!fixed.get(i))
|
||||
a.set(i, false);
|
||||
else if (fixed.get(i))
|
||||
a.set(i, m_bits.get(i));
|
||||
}
|
||||
|
||||
// the previous value of a[lo_index] was 0.
|
||||
// a[lo_index:0] was incremented, so no need to adjust bits a[:lo_index+1]
|
||||
if (a.get(lo_index))
|
||||
return;
|
||||
|
||||
// find the minimal increment within a[:lo_index+1]
|
||||
for (unsigned i = lo_index + 1; i < bw; ++i) {
|
||||
if (!fixed.get(i) && !a.get(i)) {
|
||||
a.set(i, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// there is no feasiable value a' >= a, so find the least
|
||||
// feasiable value a' >= 0.
|
||||
for (unsigned i = 0; i < bw; ++i)
|
||||
if (!fixed.get(i))
|
||||
a.set(i, false);
|
||||
}
|
||||
|
||||
// The greatest a' <= a, such that the fixed bits in bits agree with a'.
|
||||
// the greatest a' <= -1 if there is no such a'.
|
||||
|
||||
void bv_valuation::sup_feasible(bvect& a) const {
|
||||
unsigned hi_index = diff_index(a);
|
||||
if (hi_index != 0) {
|
||||
hi_index--;
|
||||
SASSERT(a.get(hi_index) != m_bits.get(hi_index));
|
||||
SASSERT(fixed.get(hi_index));
|
||||
for (unsigned i = 0; i <= hi_index; ++i) {
|
||||
if (!fixed.get(i))
|
||||
a.set(i, true);
|
||||
else if (fixed.get(i))
|
||||
a.set(i, m_bits.get(i));
|
||||
}
|
||||
if (a.get(hi_index)) {
|
||||
for (unsigned i = hi_index + 1; i < bw; ++i)
|
||||
if (!fixed.get(i) && a.get(i)) {
|
||||
a.set(i, false);
|
||||
break;
|
||||
}
|
||||
if (hi_index == 0)
|
||||
return;
|
||||
--hi_index;
|
||||
SASSERT(a.get(hi_index) != m_bits.get(hi_index));
|
||||
SASSERT(fixed.get(hi_index));
|
||||
|
||||
// increment a[hi_index:0] maximally
|
||||
for (unsigned i = 0; i <= hi_index; ++i) {
|
||||
if (!fixed.get(i))
|
||||
a.set(i, true);
|
||||
else if (fixed.get(i))
|
||||
a.set(i, m_bits.get(i));
|
||||
}
|
||||
|
||||
// If a[hi_index:0] was decremented, then no need to adjust bits a[:hi_index+1]
|
||||
if (!a.get(hi_index))
|
||||
return;
|
||||
|
||||
// find the minimal decrement within a[:hi_index+1]
|
||||
for (unsigned i = hi_index + 1; i < bw; ++i) {
|
||||
if (!fixed.get(i) && a.get(i)) {
|
||||
a.set(i, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// a[hi_index:0] was incremented, but a[:hi_index+1] cannot be decremented.
|
||||
|
||||
|
||||
}
|
||||
|
||||
void bv_valuation::tighten_range() {
|
||||
|
||||
// verbose_stream() << "tighten " << m_lo << " " << m_hi << " " << m_bits << "\n";
|
||||
if (m_lo == m_hi)
|
||||
return;
|
||||
|
||||
if (!in_range(m_bits))
|
||||
m_bits = m_lo;
|
||||
|
||||
if (is_zero(m_hi))
|
||||
return;
|
||||
|
||||
|
@ -658,59 +685,8 @@ namespace sls {
|
|||
add1(hi1);
|
||||
hi1.copy_to(nw, m_hi);
|
||||
|
||||
/*
|
||||
unsigned lo_index = 0, hi_index = 0;
|
||||
for (unsigned i = nw; i-- > 0; ) {
|
||||
auto lo_diff = (fixed[i] & (m_bits[i] ^ m_lo[i]));
|
||||
if (lo_diff != 0 && lo_index == 0)
|
||||
lo_index = 1 + i * 8 * sizeof(digit_t) + log2(lo_diff);
|
||||
auto hi_diff = (fixed[i] & (m_bits[i] ^ hi1[i]));
|
||||
if (hi_diff != 0 && hi_index == 0)
|
||||
hi_index = 1 + i * 8 * sizeof(digit_t) + log2(hi_diff);
|
||||
}
|
||||
|
||||
if (lo_index != 0) {
|
||||
lo_index--;
|
||||
SASSERT(m_lo.get(lo_index) != m_bits.get(lo_index));
|
||||
SASSERT(fixed.get(lo_index));
|
||||
for (unsigned i = 0; i <= lo_index; ++i) {
|
||||
if (!fixed.get(i))
|
||||
m_lo.set(i, false);
|
||||
else if (fixed.get(i))
|
||||
m_lo.set(i, m_bits.get(i));
|
||||
}
|
||||
if (!m_bits.get(lo_index)) {
|
||||
for (unsigned i = lo_index + 1; i < bw; ++i)
|
||||
if (!fixed.get(i) && !m_lo.get(i)) {
|
||||
m_lo.set(i, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hi_index != 0) {
|
||||
hi_index--;
|
||||
SASSERT(hi1.get(hi_index) != m_bits.get(hi_index));
|
||||
SASSERT(fixed.get(hi_index));
|
||||
for (unsigned i = 0; i <= hi_index; ++i) {
|
||||
if (!fixed.get(i))
|
||||
hi1.set(i, true);
|
||||
else if (fixed.get(i))
|
||||
hi1.set(i, m_bits.get(i));
|
||||
}
|
||||
if (m_bits.get(hi_index)) {
|
||||
for (unsigned i = hi_index + 1; i < bw; ++i)
|
||||
if (!fixed.get(i) && hi1.get(i)) {
|
||||
hi1.set(i, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
add1(hi1);
|
||||
hi1.copy_to(nw, m_hi);
|
||||
}
|
||||
*/
|
||||
|
||||
if (has_range() && !in_range(m_bits))
|
||||
m_bits = m_lo;
|
||||
m_lo.copy_to(nw, m_bits);
|
||||
|
||||
if (mod(lo() + 1, rational::power_of_two(bw)) == hi())
|
||||
for (unsigned i = 0; i < nw; ++i)
|
||||
|
@ -720,6 +696,7 @@ namespace sls {
|
|||
if (hi() < rational::power_of_two(i))
|
||||
fixed.set(i, true);
|
||||
|
||||
// verbose_stream() << "post tighten " << m_lo << " " << m_hi << " " << m_bits << "\n";
|
||||
SASSERT(well_formed());
|
||||
}
|
||||
|
||||
|
|
|
@ -166,8 +166,8 @@ namespace sls {
|
|||
bool has_range() const { return m_lo != m_hi; }
|
||||
void tighten_range();
|
||||
|
||||
void save_value() { m_tmp = m_bits; }
|
||||
void restore_value() { m_bits = m_tmp; }
|
||||
void save_value() { m_bits.copy_to(nw, m_tmp); }
|
||||
void restore_value() { m_tmp.copy_to(nw, m_bits); }
|
||||
|
||||
void clear_overflow_bits(bvect& bits) const {
|
||||
SASSERT(nw > 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue