mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 03:45:51 +00:00
add cancel to hnf_cutter
Signed-off-by: Lev Nachmanson <levnach@hotmail.com> exit earlier on a large matrix in hnf_cutter Signed-off-by: Lev Nachmanson <levnach@hotmail.com> call hnf only for the boundary points Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fix a bug in hnf_cutter initialization Signed-off-by: Lev Nachmanson <levnach@hotmail.com> initialize has_bounds in lar_solver::get_equality_for_term_on_corrent_x Signed-off-by: Lev Nachmanson <levnach@hotmail.com> initialize has_bounds in lar_solver::get_equality_for_term_on_corrent_x Signed-off-by: Lev Nachmanson <levnach@hotmail.com> initialize has_bounds in lar_solver::get_equality_for_term_on_corrent_x Signed-off-by: Lev Nachmanson <levnach@hotmail.com> initialize has_bounds in lar_solver::get_equality_for_term_on_corrent_x Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fixes in determinant_of_rectangular_matrix calculations Signed-off-by: Lev Nachmanson <levnach@hotmail.com> changes in debug code Signed-off-by: Lev Nachmanson <levnach@hotmail.com> init m_hnf_cut_period from globals settings Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fix some warnings Signed-off-by: Lev Nachmanson <levnach@hotmail.com> Lev2 (#66) * 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> remove a comment Signed-off-by: Lev Nachmanson <levnach@hotmail.com> simplify gomory cut return's logic Signed-off-by: Lev Nachmanson <levnach@hotmail.com> simplify uniformly int_solver::check() Signed-off-by: Lev Nachmanson <levnach@hotmail.com> making new arith solver default for LIA (#67) * 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> remove chase_cut_solver Signed-off-by: Lev Nachmanson <levnach@hotmail.com> remove integer_domain Signed-off-by: Lev Nachmanson <levnach@hotmail.com> restore call for find_cube() Signed-off-by: Lev Nachmanson <levnach@hotmail.com> remove a method Signed-off-by: Lev Nachmanson <levnach@hotmail.com> remove some debug code Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
82eb80de6d
commit
9be49ff6ff
17 changed files with 300 additions and 4144 deletions
|
@ -11,7 +11,6 @@ Abstract:
|
|||
|
||||
Author:
|
||||
Lev Nachmanson (levnach)
|
||||
Nikolaj Bjorner (nbjorner)
|
||||
|
||||
Revision History:
|
||||
|
||||
|
@ -33,13 +32,21 @@ class hnf_cutter {
|
|||
vector<mpq> m_right_sides;
|
||||
unsigned m_row_count;
|
||||
unsigned m_column_count;
|
||||
std::function<unsigned ()> m_random_next;
|
||||
lp_settings & m_settings;
|
||||
public:
|
||||
hnf_cutter(std::function<unsigned()> random) : m_random_next(random) {}
|
||||
hnf_cutter(lp_settings & settings) : m_row_count(0), m_column_count(0), m_settings(settings) {}
|
||||
|
||||
unsigned row_count() const {
|
||||
return m_row_count;
|
||||
}
|
||||
|
||||
const vector<const lar_term*>& terms() const { return m_terms; }
|
||||
const vector<mpq> & right_sides() const { return m_right_sides; }
|
||||
void clear() {
|
||||
// m_A will be filled from scratch in init_matrix_A
|
||||
m_var_register.clear();
|
||||
m_terms.clear();
|
||||
m_right_sides.clear();
|
||||
m_row_count = m_column_count = 0;
|
||||
}
|
||||
void add_term(const lar_term* t, const mpq &rs) {
|
||||
|
@ -95,15 +102,14 @@ public:
|
|||
int ret = -1;
|
||||
int n = 0;
|
||||
for (int i = 0; i < static_cast<int>(b.size()); i++) {
|
||||
if (!is_int(b[i])) {
|
||||
if (n == 0 ) {
|
||||
lp_assert(ret == -1);
|
||||
n = 1;
|
||||
if (is_int(b[i])) continue;
|
||||
if (n == 0 ) {
|
||||
lp_assert(ret == -1);
|
||||
n = 1;
|
||||
ret = i;
|
||||
} else {
|
||||
if (m_settings.random_next() % (++n) == 0) {
|
||||
ret = i;
|
||||
} else {
|
||||
if (m_random_next() % (++n) == 0) {
|
||||
ret = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -144,11 +150,28 @@ public:
|
|||
t.add_monomial(row[j], m_var_register.local_var_to_user_var(j));
|
||||
}
|
||||
}
|
||||
|
||||
lia_move create_cut(lar_term& t, mpq& k, explanation& ex, bool & upper) {
|
||||
#ifdef Z3DEBUG
|
||||
vector<mpq> transform_to_local_columns(const vector<impq> & x) const {
|
||||
vector<mpq> ret;
|
||||
lp_assert(m_column_count <= m_var_register.size());
|
||||
for (unsigned j = 0; j < m_column_count;j++) {
|
||||
lp_assert(is_zero(x[m_var_register.local_var_to_user_var(j)].y));
|
||||
ret.push_back(x[m_var_register.local_var_to_user_var(j)].x);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
lia_move create_cut(lar_term& t, mpq& k, explanation& ex, bool & upper
|
||||
#ifdef Z3DEBUG
|
||||
,
|
||||
const vector<mpq> & x0
|
||||
#endif
|
||||
) {
|
||||
init_matrix_A();
|
||||
svector<unsigned> basis_rows;
|
||||
mpq d = hnf_calc::determinant_of_rectangular_matrix(m_A, basis_rows);
|
||||
if (m_settings.get_cancel_flag())
|
||||
return lia_move::undef;
|
||||
if (basis_rows.size() < m_A.row_count())
|
||||
m_A.shrink_to_rank(basis_rows);
|
||||
|
||||
|
@ -156,10 +179,10 @@ public:
|
|||
// general_matrix A_orig = m_A;
|
||||
|
||||
vector<mpq> b = create_b(basis_rows);
|
||||
vector<mpq> bcopy = b;
|
||||
lp_assert(m_A * x0 == b);
|
||||
// vector<mpq> bcopy = b;
|
||||
find_h_minus_1_b(h.W(), b);
|
||||
|
||||
lp_assert(bcopy == h.W().take_first_n_columns(b.size()) * b);
|
||||
// lp_assert(bcopy == h.W().take_first_n_columns(b.size()) * b);
|
||||
int cut_row = find_cut_row_index(b);
|
||||
if (cut_row == -1) {
|
||||
return lia_move::undef;
|
||||
|
@ -181,7 +204,6 @@ public:
|
|||
vector<mpq> row(m_A.column_count());
|
||||
get_ei_H_minus_1(cut_row, h.W(), row);
|
||||
vector<mpq> f = row * m_A;
|
||||
|
||||
fill_term(f, t);
|
||||
k = floor(b[cut_row]);
|
||||
upper = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue