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:
parent
d1e9998332
commit
d6a246777a
5 changed files with 224 additions and 92 deletions
246
src/test/pdd.cpp
246
src/test/pdd.cpp
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue