3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-12 17:06:14 +00:00

simplify lar_solver::get_model

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2018-08-11 20:17:56 +08:00
parent fa5d10b6dd
commit 0dbe8982ce
4 changed files with 12 additions and 9 deletions

View file

@ -1489,7 +1489,7 @@ public:
} }
lp::var_index vi = m_theory_var2var_index[v]; lp::var_index vi = m_theory_var2var_index[v];
if (m_variable_values.count(vi) > 0) if (vi < m_variable_values.size())
return m_variable_values[vi]; return m_variable_values[vi];
if (!m_solver->is_term(vi)) { if (!m_solver->is_term(vi)) {
@ -1505,7 +1505,7 @@ public:
if (m_solver->is_term(wi)) { if (m_solver->is_term(wi)) {
const lp::lar_term& term = m_solver->get_term(wi); const lp::lar_term& term = m_solver->get_term(wi);
for (const auto & i : term) { for (const auto & i : term) {
if (m_variable_values.count(i.var()) > 0) { if (i.var() < m_variable_values.size()) {
result += m_variable_values[i.var()] * coeff * i.coeff(); result += m_variable_values[i.var()] * coeff * i.coeff();
} }
else { else {
@ -1517,7 +1517,7 @@ public:
result += m_variable_values[wi] * coeff; result += m_variable_values[wi] * coeff;
} }
} }
m_variable_values[vi] = result; m_term_values[vi] = result;
return result; return result;
} }

View file

@ -1252,15 +1252,18 @@ void lar_solver::get_infeasibility_explanation_for_inf_sign(
void lar_solver::get_model(std::unordered_map<var_index, mpq> & variable_values) const { void lar_solver::get_model(std::unordered_map<var_index, mpq> & variable_values) const {
lp_assert(m_mpq_lar_core_solver.m_r_solver.calc_current_x_is_feasible_include_non_basis()); lp_assert(m_mpq_lar_core_solver.m_r_solver.calc_current_x_is_feasible_include_non_basis());
if (m_status != lp_status::OPTIMAL)
return;
mpq delta = mpq(1, 2); // start from 0.5 to have less clashes mpq delta = mpq(1, 2); // start from 0.5 to have less clashes
unsigned i; unsigned i;
unsigned n = m_mpq_lar_core_solver.m_r_x.size();
variable_values.resize(n);
do { do {
// 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); delta = m_mpq_lar_core_solver.find_delta_for_strict_bounds(delta);
TRACE("get_model", tout << "delta=" << delta << "size = " << m_mpq_lar_core_solver.m_r_x.size() << std::endl;); for (i = 0; i < n; 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);
mpq x = rp.x + delta * rp.y; mpq x = rp.x + delta * rp.y;

View file

@ -24,9 +24,9 @@ struct solver::imp {
vector<mon_eq> m_monomials; vector<mon_eq> m_monomials;
unsigned_vector m_monomials_lim; unsigned_vector m_monomials_lim;
lp::lar_solver& m_solver;
imp(lp::lar_solver& s, reslimit& lim, params_ref const& p) imp(lp::lar_solver& s, reslimit& lim, params_ref const& p)
// : : m_solver(s)
// s(s),
// m_limit(lim), // m_limit(lim),
// m_params(p) // m_params(p)
{ {

View file

@ -29,8 +29,8 @@ namespace nra {
scoped_ptr<scoped_anum> m_zero; scoped_ptr<scoped_anum> m_zero;
vector<mon_eq> m_monomials; vector<mon_eq> m_monomials;
unsigned_vector m_monomials_lim; unsigned_vector m_monomials_lim;
mutable std::unordered_map<lp::var_index, rational> m_variable_values; // current model mutable vector<rational> m_variable_values; // current model
mutable std::unordered_map<lp::var_index, rational> m_term_values;
imp(lp::lar_solver& s, reslimit& lim, params_ref const& p): imp(lp::lar_solver& s, reslimit& lim, params_ref const& p):
s(s), s(s),
m_limit(lim), m_limit(lim),