mirror of
https://github.com/Z3Prover/z3
synced 2025-08-17 08:42:15 +00:00
Signed-off-by: Lev Nachmanson <levnach@hotmail.com> add explanations to hnf cuts Signed-off-by: Lev Nachmanson <levnach@hotmail.com> nits and virtual methods (#68) * local Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method in bound propagator Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> cleanup from std::cout Signed-off-by: Lev Nachmanson <levnach@hotmail.com> handle the case when the number of terms is greater than the number of variables in hnf Signed-off-by: Lev Nachmanson <levnach@hotmail.com> method name's fix Signed-off-by: Lev Nachmanson <levnach@hotmail.com> restore hnf_cutter to work with m_row_count <= m_column_count Signed-off-by: Lev Nachmanson <levnach@hotmail.com> tune addition of rational numbers (#70) * log quantifiers only if present Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge and fix some warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * set new arith as default for LIA Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * local Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method in bound propagator Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * prepare for mixed integer-real Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix default tactic usage Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> give shorter explanations, call hnf only when have a not integral var Signed-off-by: Lev Nachmanson <levnach@hotmail.com> overhaul of mpq (#71) * log quantifiers only if present Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge and fix some warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * set new arith as default for LIA Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * local Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method in bound propagator Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * prepare for mixed integer-real Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix default tactic usage Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * overhaul of mpz/mpq Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disabled temporary setting Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove prints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> fix for 32 bit build (#72) * log quantifiers only if present Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge and fix some warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * set new arith as default for LIA Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * local Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method in bound propagator Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * prepare for mixed integer-real Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix default tactic usage Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * overhaul of mpz/mpq Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disabled temporary setting Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove prints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * customize for 64 bit Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> yes (#74) * log quantifiers only if present Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge and fix some warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * set new arith as default for LIA Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * local Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method in bound propagator Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * prepare for mixed integer-real Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix default tactic usage Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * overhaul of mpz/mpq Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disabled temporary setting Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove prints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * customize for 64 bit Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * customize for 64 bit Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * more refactor Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> fix the merge Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fixes in maximize_term untested Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fix compilation (#75) * log quantifiers only if present Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge and fix some warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * set new arith as default for LIA Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * local Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method in bound propagator Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * prepare for mixed integer-real Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix default tactic usage Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * overhaul of mpz/mpq Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disabled temporary setting Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove prints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * customize for 64 bit Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * customize for 64 bit Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * more refactor Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * relax check Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * change for gcc Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * merge Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
169 lines
4 KiB
C++
169 lines
4 KiB
C++
|
|
/*++
|
|
Copyright (c) 2015 Microsoft Corporation
|
|
|
|
--*/
|
|
|
|
#include "math/simplex/sparse_matrix_def.h"
|
|
#include "math/simplex/simplex.h"
|
|
#include "math/simplex/simplex_def.h"
|
|
#include "util/mpq_inf.h"
|
|
#include "util/vector.h"
|
|
#include "util/rational.h"
|
|
#include "util/rlimit.h"
|
|
|
|
#define R rational
|
|
typedef simplex::simplex<simplex::mpz_ext> Simplex;
|
|
typedef simplex::sparse_matrix<simplex::mpz_ext> sparse_matrix;
|
|
|
|
static vector<R> vec(int i, int j) {
|
|
vector<R> nv;
|
|
nv.resize(2);
|
|
nv[0] = R(i);
|
|
nv[1] = R(j);
|
|
return nv;
|
|
}
|
|
|
|
// static vector<R> vec(int i, int j, int k) {
|
|
// vector<R> nv = vec(i, j);
|
|
// nv.push_back(R(k));
|
|
// return nv;
|
|
// }
|
|
|
|
// static vector<R> vec(int i, int j, int k, int l) {
|
|
// vector<R> nv = vec(i, j, k);
|
|
// nv.push_back(R(l));
|
|
// return nv;
|
|
// }
|
|
|
|
/// static vector<R> vec(int i, int j, int k, int l, int x) {
|
|
/// vector<R> nv = vec(i, j, k, l);
|
|
/// nv.push_back(R(x));
|
|
/// return nv;
|
|
/// }
|
|
|
|
// static vector<R> vec(int i, int j, int k, int l, int x, int y) {
|
|
// vector<R> nv = vec(i, j, k, l, x);
|
|
// nv.push_back(R(y));
|
|
// return nv;
|
|
// }
|
|
|
|
// static vector<R> vec(int i, int j, int k, int l, int x, int y, int z) {
|
|
// vector<R> nv = vec(i, j, k, l, x, y);
|
|
// nv.push_back(R(z));
|
|
// return nv;
|
|
// }
|
|
|
|
|
|
|
|
void add_row(Simplex& S, vector<R> const& _v, R const& _b, bool is_eq = false) {
|
|
unsynch_mpz_manager m;
|
|
unsigned_vector vars;
|
|
vector<R> v(_v);
|
|
R b(_b);
|
|
R l(denominator(b));
|
|
scoped_mpz_vector coeffs(m);
|
|
for (unsigned i = 0; i < v.size(); ++i) {
|
|
l = lcm(l, denominator(v[i]));
|
|
vars.push_back(i);
|
|
S.ensure_var(i);
|
|
}
|
|
b *= l;
|
|
b.neg();
|
|
for (unsigned i = 0; i < v.size(); ++i) {
|
|
v[i] *= l;
|
|
coeffs.push_back(v[i].to_mpq().numerator());
|
|
}
|
|
unsigned nv = S.get_num_vars();
|
|
vars.push_back(nv);
|
|
vars.push_back(nv+1);
|
|
S.ensure_var(nv);
|
|
S.ensure_var(nv+1);
|
|
coeffs.push_back(mpz(-1));
|
|
coeffs.push_back(b.to_mpq().numerator());
|
|
mpq_inf one(mpq(1),mpq(0));
|
|
mpq_inf zero(mpq(0),mpq(0));
|
|
ENSURE(vars.size() == coeffs.size());
|
|
S.set_lower(nv, zero);
|
|
if (is_eq) S.set_upper(nv, zero);
|
|
S.set_lower(nv+1, one);
|
|
S.set_upper(nv+1, one);
|
|
S.add_row(nv, coeffs.size(), vars.c_ptr(), coeffs.c_ptr());
|
|
}
|
|
|
|
static void feas(Simplex& S) {
|
|
S.display(std::cout);
|
|
lbool is_sat = S.make_feasible();
|
|
std::cout << "feasible: " << is_sat << "\n";
|
|
S.display(std::cout);
|
|
}
|
|
|
|
static void test1() {
|
|
reslimit rl;
|
|
Simplex S(rl);
|
|
add_row(S, vec(1,0), R(1));
|
|
add_row(S, vec(0,1), R(1));
|
|
add_row(S, vec(1,1), R(1));
|
|
feas(S);
|
|
}
|
|
|
|
static void test2() {
|
|
reslimit rl; Simplex S(rl);
|
|
add_row(S, vec(1, 0), R(1));
|
|
add_row(S, vec(0, 1), R(1));
|
|
add_row(S, vec(1, 1), R(1), true);
|
|
feas(S);
|
|
}
|
|
|
|
static void test3() {
|
|
reslimit rl; Simplex S(rl);
|
|
add_row(S, vec(-1, 0), R(-1));
|
|
add_row(S, vec(0, -1), R(-1));
|
|
add_row(S, vec(1, 1), R(1), true);
|
|
feas(S);
|
|
}
|
|
|
|
static void test4() {
|
|
reslimit rl; Simplex S(rl);
|
|
add_row(S, vec(1, 0), R(1));
|
|
add_row(S, vec(0, -1), R(-1));
|
|
add_row(S, vec(1, 1), R(1), true);
|
|
feas(S);
|
|
}
|
|
|
|
void tst_simplex() {
|
|
reslimit rl; Simplex S(rl);
|
|
|
|
std::cout << "simplex\n";
|
|
|
|
lbool is_sat = S.make_feasible();
|
|
std::cout << "feasible: " << is_sat << "\n";
|
|
|
|
unsynch_mpz_manager m;
|
|
unsynch_mpq_inf_manager em;
|
|
scoped_mpz_vector coeffs(m);
|
|
svector<unsigned> vars;
|
|
for (unsigned i = 0; i < 5; ++i) {
|
|
S.ensure_var(i);
|
|
vars.push_back(i);
|
|
coeffs.push_back(mpz(i+1));
|
|
}
|
|
|
|
// Simplex::row r = S.add_row(1, coeffs.size(), vars.c_ptr(), coeffs.c_ptr());
|
|
is_sat = S.make_feasible();
|
|
std::cout << "feasible: " << is_sat << "\n";
|
|
S.display(std::cout);
|
|
_scoped_numeral<unsynch_mpq_inf_manager> num(em);
|
|
num = std::make_pair(mpq(1), mpq(0));
|
|
S.set_lower(0, num);
|
|
S.set_upper(0, num);
|
|
|
|
is_sat = S.make_feasible();
|
|
std::cout << "feasible: " << is_sat << "\n";
|
|
S.display(std::cout);
|
|
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
}
|