3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-01 12:55:52 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-05-03 12:41:14 -07:00
commit dc879dc3fb
74 changed files with 585 additions and 259 deletions

View file

@ -1246,8 +1246,8 @@ namespace dd {
}
else {
set_mark(r);
m_todo.pop_back();
m_todo.push_back(lo(r)).push_back(hi(r));
m_todo.push_back(lo(r));
m_todo.push_back(hi(r));
}
}
return max_d;

View file

@ -89,7 +89,7 @@ class hilbert_basis {
reslimit& m_limit;
vector<num_vector> m_ineqs; // set of asserted inequalities
bool_vector m_iseq; // inequalities that are equalities
num_vector m_store; // store of vectors
mutable num_vector m_store; // store of vectors
svector<offset_t> m_basis; // vector of current basis
svector<offset_t> m_free_list; // free list of unused storage
svector<offset_t> m_active; // active set

View file

@ -23,21 +23,30 @@ bool const_iterator_mon::get_factors(factor& k, factor& j, rational& sign) const
std::sort(k_vars.begin(), k_vars.end());
std::sort(j_vars.begin(), j_vars.end());
if (false && m_num_failures > 10) {
for (bool& m : m_mask) m = true;
m_mask[0] = false;
m_full_factorization_returned = true;
return false;
}
if (k_vars.size() == 1) {
k.set(k_vars[0], factor_type::VAR);
} else {
unsigned i;
if (!m_ff->find_canonical_monic_of_vars(k_vars, i)) {
++m_num_failures;
return false;
}
k.set(i, factor_type::MON);
}
m_num_failures = 0;
if (j_vars.size() == 1) {
j.set(j_vars[0], factor_type::VAR);
} else {
unsigned i;
if (!m_ff->find_canonical_monic_of_vars(j_vars, i)) {
++m_num_failures;
return false;
}
j.set(i, factor_type::MON);
@ -46,7 +55,7 @@ bool const_iterator_mon::get_factors(factor& k, factor& j, rational& sign) const
}
factorization const_iterator_mon::operator*() const {
if (m_full_factorization_returned == false) {
if (!m_full_factorization_returned) {
return create_full_factorization(m_ff->m_monic);
}
factor j, k; rational sign;

View file

@ -30,12 +30,12 @@ struct factorization_factory;
enum class factor_type { VAR, MON };
class factor {
lpvar m_var;
factor_type m_type;
bool m_sign;
lpvar m_var{ UINT_MAX };
factor_type m_type{ factor_type::VAR };
bool m_sign{ false };
public:
factor(): factor(false) {}
factor(bool sign): m_var(UINT_MAX), m_type(factor_type::VAR), m_sign(sign) {}
factor(bool sign): m_sign(sign) {}
explicit factor(lpvar v, factor_type t) : m_var(v), m_type(t), m_sign(false) {}
unsigned var() const { return m_var; }
factor_type type() const { return m_type; }
@ -77,9 +77,10 @@ public:
struct const_iterator_mon {
// fields
bool_vector m_mask;
mutable bool_vector m_mask;
const factorization_factory * m_ff;
bool m_full_factorization_returned;
mutable bool m_full_factorization_returned;
mutable unsigned m_num_failures{ 0 };
// typedefs
typedef const_iterator_mon self_type;

View file

@ -61,7 +61,7 @@ namespace lp {
return true;
const lar_term* t = lra.terms()[i];
impq delta = get_cube_delta_for_term(*t);
TRACE("cube", lra.print_term_as_indices(*t, tout); tout << ", delta = " << delta;);
TRACE("cube", lra.print_term_as_indices(*t, tout); tout << ", delta = " << delta << "\n";);
if (is_zero(delta))
return true;
return lra.tighten_term_bounds_by_delta(tv::term(i), delta);

View file

@ -2331,15 +2331,16 @@ namespace lp {
v = flv;
}
m_incorrect_columns.insert(j);
TRACE("cube", tout << "new val = " << v << "\n";);
TRACE("cube", tout << "new val = " << v << " column: " << j << "\n";);
}
if (m_incorrect_columns.size()) {
if (!m_incorrect_columns.empty()) {
fix_terms_with_rounded_columns();
m_incorrect_columns.clear();
}
}
void lar_solver::fix_terms_with_rounded_columns() {
for (unsigned i = 0; i < m_terms.size(); i++) {
if (!term_is_used_as_row(i))
continue;
@ -2357,8 +2358,10 @@ namespace lp {
m_mpq_lar_core_solver.m_r_solver.update_x(j, v);
}
}
SASSERT(ax_is_correct());
}
// return true if all y coords are zeroes
bool lar_solver::sum_first_coords(const lar_term& t, mpq& val) const {
val = zero_of_type<mpq>();

View file

@ -66,7 +66,7 @@ namespace lp_api {
lp::constraint_index get_constraint(bool b) const { return m_constraints[b]; }
inf_rational get_value(bool is_true) const {
if (is_true)
if (is_true != get_lit().sign())
return inf_rational(m_value); // v >= value or v <= value
if (m_is_int) {
SASSERT(m_value.is_int());

View file

@ -34,7 +34,7 @@ public:
void flush() {
SASSERT(b.size() == A.size());
unsigned sz = A.size();
auto sz = A.size();
for (unsigned i = 0; i < sz; i++) {
svector<numeral> & as = A[i];
m.del(b[i]);

View file

@ -4096,7 +4096,7 @@ namespace polynomial {
// select a new random value in GF(p) that is not in vals, and store it in r
void peek_fresh(scoped_numeral_vector const & vals, unsigned p, scoped_numeral & r) {
SASSERT(vals.size() < p); // otherwise we can't keep the fresh value
unsigned sz = vals.size();
auto sz = vals.size();
while (true) {
m().set(r, rand() % p);
// check if fresh value...
@ -6240,7 +6240,7 @@ namespace polynomial {
}
void reset() {
unsigned sz = m_xs.size();
auto sz = m_xs.size();
for (unsigned i = 0; i < sz; i++) {
m_max_degree[m_xs[i]] = 0;
}

View file

@ -2126,7 +2126,7 @@ namespace upolynomial {
}
frame_stack.push_back(drs_frame(parent_idx, sz, true));
// right child
translate(sz, p_stack.end() - sz, p_aux);
translate(sz, p_stack.data() + p_stack.size() - sz, p_aux);
normalize(p_aux);
for (unsigned i = 0; i < sz; i++) {
p_stack.push_back(numeral());
@ -2226,7 +2226,7 @@ namespace upolynomial {
drs_frame & fr = frame_stack.back();
unsigned sz = fr.m_size;
SASSERT(sz <= p_stack.size());
numeral const * p = p_stack.end() - sz;
numeral const * p = p_stack.data() + p_stack.size() - sz;
TRACE("upolynomial", tout << "processing frame #" << frame_stack.size() - 1 << "\n"
<< "first: " << fr.m_first << ", left: " << fr.m_left << ", sz: " << fr.m_size << ", parent_idx: ";
if (fr.m_parent_idx == UINT_MAX) tout << "<null>"; else tout << fr.m_parent_idx;

View file

@ -39,8 +39,9 @@ namespace opt {
class model_based_opt {
public:
struct var {
unsigned m_id;
unsigned m_id { 0 };
rational m_coeff;
var() {}
var(unsigned id, rational const& c): m_id(id), m_coeff(c) {}
struct compare {
bool operator()(var x, var y) {