3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-11 05:30:51 +00:00

Nikolaj implemented lm_lt on dd::pdd

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2020-01-09 09:57:19 -08:00
parent d1e9998332
commit d6a246777a
5 changed files with 224 additions and 92 deletions

View file

@ -143,90 +143,179 @@ void test_iterator() {
class test {
public :
static void order() {
std::cout << "order\n";
pdd_manager m(4);
unsigned va = 0;
unsigned vb = 1;
unsigned vc = 2;
unsigned vd = 3;
pdd a = m.mk_var(va);
pdd b = m.mk_var(vb);
pdd c = m.mk_var(vc);
pdd d = m.mk_var(vd);
pdd p = a + b;
std::cout << p << "\n";
unsigned i = 0;
for (auto const& m : p) {
std::cout << m << "\n";
SASSERT(i != 0 ||( m.vars.size() == 1 && m.vars[0] == vb));
SASSERT(i != 1 ||( m.vars.size() == 1 && m.vars[0] == va));
i++;
}
pdd ccbbaa = c*c*b*b*a*a;
pdd ccbbba = c*c*b*b*b*a;
p = ccbbaa + ccbbba;
std::cout << "order\n";
pdd_manager m(4);
unsigned va = 0;
unsigned vb = 1;
unsigned vc = 2;
unsigned vd = 3;
pdd a = m.mk_var(va);
pdd b = m.mk_var(vb);
pdd c = m.mk_var(vc);
pdd d = m.mk_var(vd);
pdd p = a + b;
std::cout << p << "\n";
unsigned i = 0;
for (auto const& m : p) {
std::cout << m << "\n";
SASSERT(i != 0 ||( m.vars.size() == 1 && m.vars[0] == vb));
SASSERT(i != 1 ||( m.vars.size() == 1 && m.vars[0] == va));
i++;
}
pdd ccbbaa = c*c*b*b*a*a;
pdd ccbbba = c*c*b*b*b*a;
p = ccbbaa + ccbbba;
i = 0;
std::cout << "p = " << p << "\n";
for (auto const& m : p) {
std::cout << m << "\n";
SASSERT(i != 0 ||( m.vars.size() == 6 && m.vars[4] == vb)); // the first one has to be ccbbba
SASSERT(i != 1 ||( m.vars.size() == 6 && m.vars[4] == va)); // the second one has to be ccbbaa
i++;
}
pdd dcbba = d*c*b*b*a;
pdd dd = d * d;
p = dcbba + ccbbba + dd;
vector<unsigned> v;
std::cout << "p = " << p << "\n";
unsigned k = p.index();
std::cout << "pdd(k) = " << pdd(k, m) << "\n";
k = m.first_leading(k);
do {
if (m.is_val(k)) {
SASSERT(m.val(k).is_one());
break;
i = 0;
std::cout << "p = " << p << "\n";
for (auto const& m : p) {
std::cout << m << "\n";
SASSERT(i != 0 ||( m.vars.size() == 6 && m.vars[4] == vb)); // the first one has to be ccbbba
SASSERT(i != 1 ||( m.vars.size() == 6 && m.vars[4] == va)); // the second one has to be ccbbaa
i++;
}
v.push_back(m.var(k));
pdd dcbba = d*c*b*b*a;
pdd dd = d * d;
p = dcbba + ccbbba + dd;
vector<unsigned> v;
std::cout << "p = " << p << "\n";
unsigned k = p.index();
std::cout << "pdd(k) = " << pdd(k, m) << "\n";
std::cout << "push v" << m.var(k) << "\n";
k = m.next_leading(k);
} while(true);
auto it = v.begin();
std::cout << "v" << *it;
it++;
for( ; it != v.end(); it ++) {
std::cout << "*v" << *it;
}
SASSERT(v.size() == 6);
SASSERT(v[0] == vc);
std::cout << "\n";
v.reset();
p = d*c*c*d + b*c*c*b + d*d*d;
k = p.index();
std::cout << "pdd(k) = " << pdd(k, m) << "\n";
k = m.first_leading(k);
do {
if (m.is_val(k)) {
SASSERT(m.val(k).is_one());
break;
k = m.first_leading(k);
do {
if (m.is_val(k)) {
SASSERT(m.val(k).is_one());
break;
}
v.push_back(m.var(k));
std::cout << "pdd(k) = " << pdd(k, m) << "\n";
std::cout << "push v" << m.var(k) << "\n";
k = m.next_leading(k);
} while(true);
auto it = v.begin();
std::cout << "v" << *it;
it++;
for( ; it != v.end(); it ++) {
std::cout << "*v" << *it;
}
v.push_back(m.var(k));
SASSERT(v.size() == 6);
SASSERT(v[0] == vc);
std::cout << "\n";
v.reset();
p = d*c*c*d + b*c*c*b + d*d*d;
k = p.index();
std::cout << "pdd(k) = " << pdd(k, m) << "\n";
std::cout << "push v" << m.var(k) << "\n";
k = m.next_leading(k);
} while(true);
it = v.begin();
std::cout << "v" << *it;
it++;
for( ; it != v.end(); it ++) {
std::cout << "*v" << *it;
}
SASSERT(v.size() == 4);
SASSERT(v[0] == vd);
std::cout << "\n";
k = m.first_leading(k);
do {
if (m.is_val(k)) {
SASSERT(m.val(k).is_one());
break;
}
v.push_back(m.var(k));
std::cout << "pdd(k) = " << pdd(k, m) << "\n";
std::cout << "push v" << m.var(k) << "\n";
k = m.next_leading(k);
} while(true);
it = v.begin();
std::cout << "v" << *it;
it++;
for( ; it != v.end(); it ++) {
std::cout << "*v" << *it;
}
SASSERT(v.size() == 4);
SASSERT(v[0] == vd);
std::cout << "\n";
}
}
static void order_lm() {
std::cout << "order_lm\n";
pdd_manager m(4);
unsigned va = 0;
unsigned vb = 1;
unsigned vc = 2;
unsigned vd = 3;
pdd a = m.mk_var(va);
pdd b = m.mk_var(vb);
pdd c = m.mk_var(vc);
pdd d = m.mk_var(vd);
pdd p = a + b;
std::cout << p << "\n";
unsigned i = 0;
for (auto const& m : p) {
std::cout << m << "\n";
SASSERT(i != 0 ||( m.vars.size() == 1 && m.vars[0] == vb));
SASSERT(i != 1 ||( m.vars.size() == 1 && m.vars[0] == va));
i++;
}
pdd ccbbaa = c*c*b*b*a*a;
pdd ccbbba = c*c*b*b*b*a;
p = ccbbaa + ccbbba;
i = 0;
std::cout << "p = " << p << "\n";
for (auto const& m : p) {
std::cout << m << "\n";
SASSERT(i != 0 ||( m.vars.size() == 6 && m.vars[4] == vb)); // the first one has to be ccbbba
SASSERT(i != 1 ||( m.vars.size() == 6 && m.vars[4] == va)); // the second one has to be ccbbaa
i++;
}
pdd dcbba = d*c*b*b*a;
pdd dd = d * d;
pdd p0 = p + dd;
std::cout << p0 << " > " << p << "\n";
SASSERT(m.lm_lt(p, p0));
SASSERT(m.lm_lt(p0 + a * b, p0 + b * b));
// vector<unsigned> v;
// std::cout << "p = " << p << "\n";
// unsigned k = p.index();
// std::cout << "pdd(k) = " << pdd(k, m) << "\n";
// k = m.first_leading(k);
// do {
// if (m.is_val(k)) {
// SASSERT(m.val(k).is_one());
// break;
// }
// v.push_back(m.var(k));
// std::cout << "pdd(k) = " << pdd(k, m) << "\n";
// std::cout << "push v" << m.var(k) << "\n";
// k = m.next_leading(k);
// } while(true);
// auto it = v.begin();
// std::cout << "v" << *it;
// it++;
// for( ; it != v.end(); it ++) {
// std::cout << "*v" << *it;
// }
// SASSERT(v.size() == 6);
// SASSERT(v[0] == vc);
// std::cout << "\n";
// v.reset();
// p = d*c*c*d + b*c*c*b + d*d*d;
// k = p.index();
// std::cout << "pdd(k) = " << pdd(k, m) << "\n";
// k = m.first_leading(k);
// do {
// if (m.is_val(k)) {
// SASSERT(m.val(k).is_one());
// break;
// }
// v.push_back(m.var(k));
// std::cout << "pdd(k) = " << pdd(k, m) << "\n";
// std::cout << "push v" << m.var(k) << "\n";
// k = m.next_leading(k);
// } while(true);
// it = v.begin();
// std::cout << "v" << *it;
// it++;
// for( ; it != v.end(); it ++) {
// std::cout << "*v" << *it;
// }
// SASSERT(v.size() == 4);
// SASSERT(v[0] == vd);
// std::cout << "\n";
}
};
}
@ -239,4 +328,5 @@ void tst_pdd() {
dd::test_reset();
dd::test_iterator();
dd::test::order();
dd::test::order_lm();
}