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

change the add_var_bound() signature

Signed-off-by: Lev <levnach@hotmail.com>
This commit is contained in:
Lev 2018-11-07 16:23:21 -08:00 committed by Lev Nachmanson
parent 1c8f28c2e9
commit c9be7b89c1
6 changed files with 367 additions and 122 deletions

View file

@ -2682,7 +2682,8 @@ void test_term() {
vector<std::pair<mpq, var_index>> term_one;
term_one.push_back(std::make_pair(mpq(1), one));
solver.add_constraint(term_one, lconstraint_kind::EQ, mpq(0));
explanation e;
solver.add_constraint(term_one, lconstraint_kind::EQ, mpq(0), e);
vector<std::pair<mpq, var_index>> term_ls;
term_ls.push_back(std::pair<mpq, var_index>(mpq(1), x));
@ -2694,13 +2695,13 @@ void test_term() {
ls.push_back(std::pair<mpq, var_index>(mpq(1), x));
ls.push_back(std::pair<mpq, var_index>(mpq(1), y));
ls.push_back(std::pair<mpq, var_index>(mpq(1), z));
solver.add_constraint(ls, lconstraint_kind::EQ, mpq(0));
solver.add_constraint(ls, lconstraint_kind::EQ, mpq(0), e);
ls.clear();
ls.push_back(std::pair<mpq, var_index>(mpq(1), x));
solver.add_constraint(ls, lconstraint_kind::LT, mpq(0));
solver.add_constraint(ls, lconstraint_kind::LT, mpq(0), e);
ls.push_back(std::pair<mpq, var_index>(mpq(2), y));
solver.add_constraint(ls, lconstraint_kind::GT, mpq(0));
solver.add_constraint(ls, lconstraint_kind::GT, mpq(0), e);
auto status = solver.solve();
std::cout << lp_status_to_string(status) << std::endl;
std::unordered_map<var_index, mpq> model;
@ -2717,6 +2718,7 @@ void test_term() {
void test_evidence_for_total_inf_simple(argument_parser & args_parser) {
lar_solver solver;
explanation e;
var_index x = solver.add_var(0, false);
var_index y = solver.add_var(1, false);
solver.add_var_bound(x, LE, mpq(-1));
@ -2725,10 +2727,11 @@ void test_evidence_for_total_inf_simple(argument_parser & args_parser) {
ls.push_back(std::pair<mpq, var_index>(mpq(1), x));
ls.push_back(std::pair<mpq, var_index>(mpq(1), y));
solver.add_constraint(ls, GE, mpq(1));
solver.add_constraint(ls, GE, mpq(1), e);
ls.pop_back();
ls.push_back(std::pair<mpq, var_index>(- mpq(1), y));
solver.add_constraint(ls, lconstraint_kind::GE, mpq(0));
solver.add_constraint(ls, lconstraint_kind::GE, mpq(0), e);
auto status = solver.solve();
std::cout << lp_status_to_string(status) << std::endl;
std::unordered_map<var_index, mpq> model;
@ -2772,7 +2775,7 @@ void test_bound_propagation_one_small_sample1() {
coeffs.push_back(std::pair<mpq, var_index>(mpq(-1), c));
ls.add_constraint(coeffs, LE, zero_of_type<mpq>());
vector<implied_bound> ev;
ls.add_var_bound(a, LE, mpq(1));
ls.add_var_bound(a, LE, mpq(1), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -2823,9 +2826,10 @@ void test_bound_propagation_one_row() {
vector<std::pair<mpq, var_index>> c;
c.push_back(std::pair<mpq, var_index>(mpq(1), x0));
c.push_back(std::pair<mpq, var_index>(mpq(-1), x1));
ls.add_constraint(c, EQ, one_of_type<mpq>());
explanation e;
ls.add_constraint(c, EQ, one_of_type<mpq>(), e);
vector<implied_bound> ev;
ls.add_var_bound(x0, LE, mpq(1));
ls.add_var_bound(x0, LE, mpq(1), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -2837,11 +2841,12 @@ void test_bound_propagation_one_row_with_bounded_vars() {
vector<std::pair<mpq, var_index>> c;
c.push_back(std::pair<mpq, var_index>(mpq(1), x0));
c.push_back(std::pair<mpq, var_index>(mpq(-1), x1));
ls.add_constraint(c, EQ, one_of_type<mpq>());
explanation e;
ls.add_constraint(c, EQ, one_of_type<mpq>(), e);
vector<implied_bound> ev;
ls.add_var_bound(x0, GE, mpq(-3));
ls.add_var_bound(x0, LE, mpq(3));
ls.add_var_bound(x0, LE, mpq(1));
ls.add_var_bound(x0, GE, mpq(-3), e);
ls.add_var_bound(x0, LE, mpq(3), e);
ls.add_var_bound(x0, LE, mpq(1), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -2853,9 +2858,10 @@ void test_bound_propagation_one_row_mixed() {
vector<std::pair<mpq, var_index>> c;
c.push_back(std::pair<mpq, var_index>(mpq(1), x0));
c.push_back(std::pair<mpq, var_index>(mpq(-1), x1));
ls.add_constraint(c, EQ, one_of_type<mpq>());
explanation e;
ls.add_constraint(c, EQ, one_of_type<mpq>(), e);
vector<implied_bound> ev;
ls.add_var_bound(x1, LE, mpq(1));
ls.add_var_bound(x1, LE, mpq(1), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -2870,15 +2876,16 @@ void test_bound_propagation_two_rows() {
c.push_back(std::pair<mpq, var_index>(mpq(1), x));
c.push_back(std::pair<mpq, var_index>(mpq(2), y));
c.push_back(std::pair<mpq, var_index>(mpq(3), z));
ls.add_constraint(c, GE, one_of_type<mpq>());
explanation e;
ls.add_constraint(c, GE, one_of_type<mpq>(), e);
c.clear();
c.push_back(std::pair<mpq, var_index>(mpq(3), x));
c.push_back(std::pair<mpq, var_index>(mpq(2), y));
c.push_back(std::pair<mpq, var_index>(mpq(y), z));
ls.add_constraint(c, GE, one_of_type<mpq>());
ls.add_var_bound(x, LE, mpq(2));
ls.add_constraint(c, GE, one_of_type<mpq>(), e);
ls.add_var_bound(x, LE, mpq(2), e);
vector<implied_bound> ev;
ls.add_var_bound(y, LE, mpq(1));
ls.add_var_bound(y, LE, mpq(1), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -2891,14 +2898,15 @@ void test_total_case_u() {
unsigned y = ls.add_var(1, false);
unsigned z = ls.add_var(2, false);
vector<std::pair<mpq, var_index>> c;
explanation e;
c.push_back(std::pair<mpq, var_index>(mpq(1), x));
c.push_back(std::pair<mpq, var_index>(mpq(2), y));
c.push_back(std::pair<mpq, var_index>(mpq(3), z));
ls.add_constraint(c, LE, one_of_type<mpq>());
ls.add_var_bound(x, GE, zero_of_type<mpq>());
ls.add_var_bound(y, GE, zero_of_type<mpq>());
ls.add_constraint(c, LE, one_of_type<mpq>(), e);
ls.add_var_bound(x, GE, zero_of_type<mpq>(), e);
ls.add_var_bound(y, GE, zero_of_type<mpq>(), e);
vector<implied_bound> ev;
ls.add_var_bound(z, GE, zero_of_type<mpq>());
ls.add_var_bound(z, GE, zero_of_type<mpq>(), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -2917,15 +2925,16 @@ void test_total_case_l(){
unsigned y = ls.add_var(1, false);
unsigned z = ls.add_var(2, false);
vector<std::pair<mpq, var_index>> c;
explanation e;
c.push_back(std::pair<mpq, var_index>(mpq(1), x));
c.push_back(std::pair<mpq, var_index>(mpq(2), y));
c.push_back(std::pair<mpq, var_index>(mpq(3), z));
ls.add_constraint(c, GE, one_of_type<mpq>());
ls.add_var_bound(x, LE, one_of_type<mpq>());
ls.add_var_bound(y, LE, one_of_type<mpq>());
ls.add_constraint(c, GE, one_of_type<mpq>(), e);
ls.add_var_bound(x, LE, one_of_type<mpq>(), e);
ls.add_var_bound(y, LE, one_of_type<mpq>(), e);
ls.settings().presolve_with_double_solver_for_lar = true;
vector<implied_bound> ev;
ls.add_var_bound(z, LE, zero_of_type<mpq>());
ls.add_var_bound(z, LE, zero_of_type<mpq>(), e);
ls.solve();
my_bound_propagator bp(ls);
ls.propagate_bounds_for_touched_rows(bp);
@ -3507,8 +3516,9 @@ void test_maximize_term() {
term_ls.push_back(std::pair<mpq, var_index>(mpq(2), y));
unsigned term_2x_pl_2y = solver.add_term(term_ls);
solver.add_var_bound(term_x_min_y, LE, zero_of_type<mpq>());
solver.add_var_bound(term_2x_pl_2y, LE, mpq(5));
explanation e;
solver.add_var_bound(term_x_min_y, LE, zero_of_type<mpq>(), e);
solver.add_var_bound(term_2x_pl_2y, LE, mpq(5), e);
solver.find_feasible_solution();
lp_assert(solver.get_status() == lp_status::OPTIMAL);
solver.print_constraints(std::cout);

View file

@ -386,17 +386,17 @@ namespace lp {
return ret;
}
void add_constraint_to_solver(lar_solver * solver, formula_constraint & fc) {
void add_constraint_to_solver(lar_solver * solver, formula_constraint & fc, explanation& e) {
vector<std::pair<mpq, var_index>> ls;
for (auto & it : fc.m_coeffs) {
ls.push_back(std::make_pair(it.first, solver->add_var(register_name(it.second), false)));
}
solver->add_constraint(ls, fc.m_kind, fc.m_right_side);
solver->add_constraint(ls, fc.m_kind, fc.m_right_side, e);
}
explanation e;
void fill_lar_solver(lar_solver * solver) {
for (formula_constraint & fc : m_constraints)
add_constraint_to_solver(solver, fc);
add_constraint_to_solver(solver, fc, e);
}