3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-25 20:46:01 +00:00

test and fix viable2

This commit is contained in:
Nikolaj Bjorner 2021-11-14 20:55:12 -08:00
parent 4261345503
commit 69a17d0c60
4 changed files with 90 additions and 8 deletions

View file

@ -8,9 +8,24 @@ namespace polysat {
reslimit lim;
};
struct scoped_solverv : public solver_scopev, public solver {
class scoped_solverv : public solver_scopev, public solver {
public:
viable2 v;
scoped_solverv(): solver(lim), v(*this) {}
~scoped_solverv() {
for (unsigned i = m_trail.size(); i-- > 0;) {
switch (m_trail[i]) {
case trail_instr_t::viable_add_i:
v.pop_viable();
break;
case trail_instr_t::viable_rem_i:
v.push_viable();
break;
default:
break;
}
}
}
};
static void test1() {
@ -37,8 +52,66 @@ namespace polysat {
std::cout << s.v.find_viable(xv, val) << " " << val << "\n";
}
static void test2() {
static void add_interval(scoped_solverv& s, pvar xv, pdd x, unsigned lo, unsigned len) {
if (lo == 0)
s.v.intersect(xv, s.ule(x, len - 1));
else if (lo + len == 8)
s.v.intersect(xv, s.ule(lo, x));
else
s.v.intersect(xv, ~s.ule(x - ((lo + len)%8), x - lo));
}
static bool member(unsigned i, unsigned lo, unsigned len) {
return (lo <= i && i < lo + len) ||
(lo + len >= 8 && i < ((lo + len) % 8));
}
static bool member(unsigned i, vector<std::pair<unsigned, unsigned>> const& intervals) {
for (auto [lo, len] : intervals)
if (!member(i, lo, len))
return false;
return true;
}
static void validate_intervals(scoped_solverv& s, pvar xv, vector<std::pair<unsigned, unsigned>> const& intervals) {
for (unsigned i = 0; i < 8; ++i) {
bool mem1 = member(i, intervals);
bool mem2 = s.v.is_viable(xv, rational(i));
if (mem1 != mem2)
std::cout << "test violation: " << i << " member of all intervals " << mem1 << " viable: " << mem2 << "\n";
SASSERT(mem1 == mem2);
}
}
static void test_intervals(vector<std::pair<unsigned, unsigned>> const& intervals) {
scoped_solverv s;
auto xv = s.add_var(3);
auto x = s.var(xv);
s.v.push(3);
for (auto const& [lo, len] : intervals)
add_interval(s, xv, x, lo, len);
std::cout << intervals << "\n";
//std::cout << s.v << "\n";
validate_intervals(s, xv, intervals);
}
static void test_intervals(unsigned count, vector<std::pair<unsigned, unsigned>>& intervals) {
if (count == 0) {
test_intervals(intervals);
return;
}
for (unsigned lo1 = 0; lo1 < 8; ++lo1) {
for (unsigned len1 = 1; len1 <= 8; ++len1) {
intervals.push_back(std::make_pair(lo1, len1));
test_intervals(count - 1, intervals);
intervals.pop_back();
}
}
}
static void test2() {
vector<std::pair<unsigned, unsigned>> intervals;
test_intervals(3, intervals);
}
}