mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
commit
05c4ea82ce
|
@ -15,7 +15,7 @@ public:
|
||||||
T a;
|
T a;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
while (it->next(a, i)) {
|
while (it->next(a, i)) {
|
||||||
coeff.emplace_back(a, i);
|
coeff.push_back(std::make_pair(a, i));
|
||||||
}
|
}
|
||||||
print_linear_combination_of_column_indices(coeff, out);
|
print_linear_combination_of_column_indices(coeff, out);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1259,7 +1259,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
void get_model(std::unordered_map<var_index, mpq> & variable_values) const {
|
void get_model(std::unordered_map<var_index, mpq> & variable_values) const {
|
||||||
mpq delta = mpq(1, 2); // start from 0.5 to have less clashes
|
mpq delta = m_mpq_lar_core_solver.find_delta_for_strict_bounds(mpq(1, 2)); // start from 0.5 to have less clashes
|
||||||
lean_assert(m_status == OPTIMAL);
|
lean_assert(m_status == OPTIMAL);
|
||||||
unsigned i;
|
unsigned i;
|
||||||
do {
|
do {
|
||||||
|
@ -1267,7 +1267,6 @@ public:
|
||||||
// different pairs have to produce different singleton values
|
// different pairs have to produce different singleton values
|
||||||
std::unordered_set<impq> set_of_different_pairs;
|
std::unordered_set<impq> set_of_different_pairs;
|
||||||
std::unordered_set<mpq> set_of_different_singles;
|
std::unordered_set<mpq> set_of_different_singles;
|
||||||
delta = m_mpq_lar_core_solver.find_delta_for_strict_bounds(delta);
|
|
||||||
for (i = 0; i < m_mpq_lar_core_solver.m_r_x.size(); i++ ) {
|
for (i = 0; i < m_mpq_lar_core_solver.m_r_x.size(); i++ ) {
|
||||||
const numeric_pair<mpq> & rp = m_mpq_lar_core_solver.m_r_x[i];
|
const numeric_pair<mpq> & rp = m_mpq_lar_core_solver.m_r_x[i];
|
||||||
set_of_different_pairs.insert(rp);
|
set_of_different_pairs.insert(rp);
|
||||||
|
@ -1543,7 +1542,5 @@ public:
|
||||||
quick_xplain::run(explanation, *this);
|
quick_xplain::run(explanation, *this);
|
||||||
lean_assert(this->explanation_is_correct(explanation));
|
lean_assert(this->explanation_is_correct(explanation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,31 +16,36 @@ const impq & lp_bound_propagator::get_upper_bound(unsigned j) const {
|
||||||
return m_lar_solver.m_mpq_lar_core_solver.m_r_upper_bounds()[j];
|
return m_lar_solver.m_mpq_lar_core_solver.m_r_upper_bounds()[j];
|
||||||
}
|
}
|
||||||
void lp_bound_propagator::try_add_bound(const mpq & v, unsigned j, bool is_low, bool coeff_before_j_is_pos, unsigned row_or_term_index, bool strict) {
|
void lp_bound_propagator::try_add_bound(const mpq & v, unsigned j, bool is_low, bool coeff_before_j_is_pos, unsigned row_or_term_index, bool strict) {
|
||||||
j = m_lar_solver.adjust_column_index_to_term_index(j);
|
unsigned term_j = m_lar_solver.adjust_column_index_to_term_index(j);
|
||||||
|
mpq w = v;
|
||||||
|
if (term_j != j) {
|
||||||
|
j = term_j;
|
||||||
|
w += m_lar_solver.get_term(term_j).m_v; // when terms are turned into the columns they "lose" the right side, at this moment they aquire it back
|
||||||
|
}
|
||||||
lconstraint_kind kind = is_low? GE : LE;
|
lconstraint_kind kind = is_low? GE : LE;
|
||||||
if (strict)
|
if (strict)
|
||||||
kind = static_cast<lconstraint_kind>(kind / 2);
|
kind = static_cast<lconstraint_kind>(kind / 2);
|
||||||
|
|
||||||
if (!bound_is_interesting(j, kind, v))
|
if (!bound_is_interesting(j, kind, w))
|
||||||
return;
|
return;
|
||||||
unsigned k; // index to ibounds
|
unsigned k; // index to ibounds
|
||||||
if (is_low) {
|
if (is_low) {
|
||||||
if (try_get_val(m_improved_low_bounds, j, k)) {
|
if (try_get_val(m_improved_low_bounds, j, k)) {
|
||||||
auto & found_bound = m_ibounds[k];
|
auto & found_bound = m_ibounds[k];
|
||||||
if (v > found_bound.m_bound || (v == found_bound.m_bound && found_bound.m_strict == false && strict))
|
if (w > found_bound.m_bound || (w == found_bound.m_bound && found_bound.m_strict == false && strict))
|
||||||
found_bound = implied_bound(v, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict);
|
found_bound = implied_bound(w, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict);
|
||||||
} else {
|
} else {
|
||||||
m_improved_low_bounds[j] = m_ibounds.size();
|
m_improved_low_bounds[j] = m_ibounds.size();
|
||||||
m_ibounds.push_back(implied_bound(v, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict));
|
m_ibounds.push_back(implied_bound(w, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict));
|
||||||
}
|
}
|
||||||
} else { // the upper bound case
|
} else { // the upper bound case
|
||||||
if (try_get_val(m_improved_upper_bounds, j, k)) {
|
if (try_get_val(m_improved_upper_bounds, j, k)) {
|
||||||
auto & found_bound = m_ibounds[k];
|
auto & found_bound = m_ibounds[k];
|
||||||
if (v < found_bound.m_bound || (v == found_bound.m_bound && found_bound.m_strict == false && strict))
|
if (w < found_bound.m_bound || (w == found_bound.m_bound && found_bound.m_strict == false && strict))
|
||||||
found_bound = implied_bound(v, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict);
|
found_bound = implied_bound(w, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict);
|
||||||
} else {
|
} else {
|
||||||
m_improved_upper_bounds[j] = m_ibounds.size();
|
m_improved_upper_bounds[j] = m_ibounds.size();
|
||||||
m_ibounds.push_back(implied_bound(v, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict));
|
m_ibounds.push_back(implied_bound(w, j, is_low, coeff_before_j_is_pos, row_or_term_index, strict));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue