3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 17:15:31 +00:00

Merge branch 'polysat' of https://github.com/Z3Prover/z3 into polysat

This commit is contained in:
Clemens Eisenhofer 2022-12-16 10:14:10 +01:00
commit d5bc4b84a7
9 changed files with 430 additions and 45 deletions

View file

@ -1859,7 +1859,8 @@ void tst_polysat() {
// test_polysat::test_parity1b();
// test_polysat::test_parity2();
// test_polysat::test_parity3();
test_polysat::test_parity4();
// test_polysat::test_parity4();
// test_polysat::test_parity4(32);
test_polysat::test_parity4(256);
// test_polysat::test_ineq2();
// test_polysat::test_ineq_non_axiom4(32, 3); // stuck in viable refinement loop

View file

@ -117,8 +117,8 @@ namespace polysat {
static void test_univariate() {
std::cout << "\ntest_univariate\n";
unsigned bw = 32;
rational modulus = rational::power_of_two(bw);
unsigned const bw = 32;
rational const modulus = rational::power_of_two(bw);
auto factory = mk_univariate_bitblast_factory();
auto solver = (*factory)(bw);
@ -182,6 +182,111 @@ namespace polysat {
std::cout << "status: " << solver->check() << "\n";
std::cout << "core: " << solver->unsat_core() << "\n";
}
static void test_univariate_minmax() {
std::cout << "\ntest_univariate_min\n";
unsigned const bw = 32;
auto factory = mk_univariate_bitblast_factory();
auto solver = (*factory)(bw);
vector<rational> lhs;
vector<rational> rhs;
rational min;
rational max;
solver->push();
// c0: 123 <= 2x + 10
lhs.clear();
lhs.push_back(rational(123));
rhs.clear();
rhs.push_back(rational(10));
rhs.push_back(rational(2));
solver->add_ule(lhs, rhs, false, 0);
std::cout << "status: " << solver->check() << "\n";
std::cout << "model: " << solver->model() << "\n";
VERIFY(solver->find_min(min));
std::cout << "find_min: " << min << "\n";
VERIFY(min == 57); // 57*2 + 10 = 124; 56*2 + 10 = 122
VERIFY(solver->find_max(max));
std::cout << "find_max: " << max << "\n";
solver->push();
solver->add_ugt_const(max, false, 5);
VERIFY(solver->check() == l_false);
solver->pop(1);
solver->push();
// c1: 127 <= x
lhs.clear();
lhs.push_back(rational(127));
rhs.clear();
rhs.push_back(rational(0));
rhs.push_back(rational(1));
solver->add_ule(lhs, rhs, false, 1);
std::cout << "status: " << solver->check() << "\n";
std::cout << "model: " << solver->model() << "\n";
VERIFY(solver->find_min(min));
std::cout << "find_min: " << min << "\n";
VERIFY(min == 127);
VERIFY(solver->find_max(max));
std::cout << "find_max: " << max << "\n";
solver->add_ugt_const(max, false, 5);
VERIFY(solver->check() == l_false);
solver->pop(1);
// c2: umul_ovfl(2, x)
lhs.clear();
lhs.push_back(rational(2));
rhs.clear();
rhs.push_back(rational(0));
rhs.push_back(rational(1));
solver->add_umul_ovfl(lhs, rhs, false, 2);
std::cout << "status: " << solver->check() << "\n";
std::cout << "model: " << solver->model() << "\n";
VERIFY(solver->find_min(min));
std::cout << "find_min: " << min << "\n";
solver->push();
solver->add_ult_const(min, false, 5);
VERIFY(solver->check() == l_false);
solver->pop(1);
VERIFY(solver->find_max(max));
std::cout << "find_max: " << max << "\n";
solver->add_ugt_const(max, false, 5);
VERIFY(solver->check() == l_false);
solver->pop(1);
// c3: umul_ovfl(2, x)
lhs.clear();
lhs.push_back(rational(2));
rhs.clear();
rhs.push_back(rational(0));
rhs.push_back(rational(1));
solver->add_umul_ovfl(lhs, rhs, false, 3);
std::cout << "status: " << solver->check() << "\n";
std::cout << "model: " << solver->model() << "\n";
VERIFY(solver->find_min(min));
std::cout << "find_min: " << min << "\n";
solver->push();
solver->add_ult_const(min, false, 5);
VERIFY(solver->check() == l_false);
solver->pop(1);
VERIFY(solver->find_max(max));
std::cout << "find_max: " << max << "\n";
solver->add_ugt_const(max, false, 5);
VERIFY(solver->check() == l_false);
}
}
@ -189,5 +294,6 @@ namespace polysat {
void tst_viable() {
polysat::test1();
polysat::test_univariate();
polysat::test_univariate_minmax();
polysat::test2(); // takes long
}