mirror of
https://github.com/Z3Prover/z3
synced 2025-05-01 12:55:52 +00:00
merge
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
commit
dc879dc3fb
74 changed files with 585 additions and 259 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue