mirror of
https://github.com/Z3Prover/z3
synced 2025-05-08 08:15:47 +00:00
Merge pull request #1732 from levnach/upbranch
fix in theory_lra.cpp get_value
This commit is contained in:
commit
ca8183da33
4 changed files with 25 additions and 32 deletions
|
@ -1168,7 +1168,9 @@ public:
|
||||||
if (m_variable_values.count(vi) > 0)
|
if (m_variable_values.count(vi) > 0)
|
||||||
return m_variable_values[vi];
|
return m_variable_values[vi];
|
||||||
|
|
||||||
SASSERT (m_solver->is_term(vi));
|
if(!m_solver->is_term(vi))
|
||||||
|
return rational::zero();
|
||||||
|
|
||||||
m_todo_terms.push_back(std::make_pair(vi, rational::one()));
|
m_todo_terms.push_back(std::make_pair(vi, rational::one()));
|
||||||
rational result(0);
|
rational result(0);
|
||||||
while (!m_todo_terms.empty()) {
|
while (!m_todo_terms.empty()) {
|
||||||
|
|
|
@ -1507,11 +1507,6 @@ bool lar_solver::column_is_fixed(unsigned j) const {
|
||||||
return m_mpq_lar_core_solver.column_is_fixed(j);
|
return m_mpq_lar_core_solver.column_is_fixed(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool lar_solver::ext_var_is_int(var_index ext_var) const {
|
|
||||||
return m_var_register.external_is_int(ext_var);
|
|
||||||
}
|
|
||||||
|
|
||||||
// below is the initialization functionality of lar_solver
|
// below is the initialization functionality of lar_solver
|
||||||
|
|
||||||
bool lar_solver::strategy_is_undecided() const {
|
bool lar_solver::strategy_is_undecided() const {
|
||||||
|
|
|
@ -155,8 +155,6 @@ public:
|
||||||
|
|
||||||
bool var_is_int(var_index v) const;
|
bool var_is_int(var_index v) const;
|
||||||
|
|
||||||
bool ext_var_is_int(var_index ext_var) const;
|
|
||||||
|
|
||||||
void add_non_basic_var_to_core_fields(unsigned ext_j, bool is_int);
|
void add_non_basic_var_to_core_fields(unsigned ext_j, bool is_int);
|
||||||
|
|
||||||
void add_new_var_to_core_fields_for_doubles(bool register_in_basis);
|
void add_new_var_to_core_fields_for_doubles(bool register_in_basis);
|
||||||
|
|
|
@ -19,19 +19,19 @@ Revision History:
|
||||||
#pragma once
|
#pragma once
|
||||||
namespace lp {
|
namespace lp {
|
||||||
class ext_var_info {
|
class ext_var_info {
|
||||||
unsigned m_internal_j; // the internal index
|
unsigned m_external_j; // the internal index
|
||||||
bool m_is_integer;
|
bool m_is_integer;
|
||||||
public:
|
public:
|
||||||
ext_var_info() {}
|
ext_var_info() {}
|
||||||
ext_var_info(unsigned j): ext_var_info(j, true) {}
|
ext_var_info(unsigned j): ext_var_info(j, true) {}
|
||||||
ext_var_info(unsigned j , bool is_int) : m_internal_j(j), m_is_integer(is_int) {}
|
ext_var_info(unsigned j , bool is_int) : m_external_j(j), m_is_integer(is_int) {}
|
||||||
unsigned internal_j() const { return m_internal_j;}
|
unsigned external_j() const { return m_external_j;}
|
||||||
bool is_integer() const {return m_is_integer;}
|
bool is_integer() const {return m_is_integer;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class var_register {
|
class var_register {
|
||||||
svector<unsigned> m_local_to_external;
|
svector<ext_var_info> m_local_to_external;
|
||||||
std::unordered_map<unsigned, ext_var_info> m_external_to_local;
|
std::unordered_map<unsigned, unsigned> m_external_to_local;
|
||||||
public:
|
public:
|
||||||
unsigned add_var(unsigned user_var) {
|
unsigned add_var(unsigned user_var) {
|
||||||
return add_var(user_var, true);
|
return add_var(user_var, true);
|
||||||
|
@ -39,19 +39,23 @@ public:
|
||||||
unsigned add_var(unsigned user_var, bool is_int) {
|
unsigned add_var(unsigned user_var, bool is_int) {
|
||||||
auto t = m_external_to_local.find(user_var);
|
auto t = m_external_to_local.find(user_var);
|
||||||
if (t != m_external_to_local.end()) {
|
if (t != m_external_to_local.end()) {
|
||||||
return t->second.internal_j();
|
return t->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned j = size();
|
m_local_to_external.push_back(ext_var_info(user_var, is_int));
|
||||||
m_external_to_local[user_var] = ext_var_info(j, is_int);
|
return m_external_to_local[user_var] = size() - 1;
|
||||||
m_local_to_external.push_back(user_var);
|
|
||||||
return j;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const svector<unsigned> & vars() const { return m_local_to_external; }
|
svector<unsigned> vars() const {
|
||||||
|
svector<unsigned> ret;
|
||||||
|
for (const auto& p : m_local_to_external) {
|
||||||
|
ret.push_back(p.external_j());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned local_to_external(unsigned local_var) const {
|
unsigned local_to_external(unsigned local_var) const {
|
||||||
return m_local_to_external[local_var];
|
return m_local_to_external[local_var].external_j();
|
||||||
}
|
}
|
||||||
unsigned size() const {
|
unsigned size() const {
|
||||||
return m_local_to_external.size();
|
return m_local_to_external.size();
|
||||||
|
@ -64,13 +68,7 @@ public:
|
||||||
unsigned external_to_local(unsigned j) const {
|
unsigned external_to_local(unsigned j) const {
|
||||||
auto it = m_external_to_local.find(j);
|
auto it = m_external_to_local.find(j);
|
||||||
lp_assert(it != m_external_to_local.end());
|
lp_assert(it != m_external_to_local.end());
|
||||||
return it->second.internal_j();
|
return it->second;
|
||||||
}
|
|
||||||
|
|
||||||
bool external_is_int(unsigned j) const {
|
|
||||||
auto it = m_external_to_local.find(j);
|
|
||||||
lp_assert(it != m_external_to_local.end());
|
|
||||||
return it->second.is_integer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool external_is_used(unsigned ext_j) const {
|
bool external_is_used(unsigned ext_j) const {
|
||||||
|
@ -82,7 +80,7 @@ public:
|
||||||
auto it = m_external_to_local.find(ext_j);
|
auto it = m_external_to_local.find(ext_j);
|
||||||
if ( it == m_external_to_local.end())
|
if ( it == m_external_to_local.end())
|
||||||
return false;
|
return false;
|
||||||
local_j = it->second.internal_j();
|
local_j = it->second;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,19 +88,19 @@ public:
|
||||||
auto it = m_external_to_local.find(ext_j);
|
auto it = m_external_to_local.find(ext_j);
|
||||||
if ( it == m_external_to_local.end())
|
if ( it == m_external_to_local.end())
|
||||||
return false;
|
return false;
|
||||||
local_j = it->second.internal_j();
|
local_j = it->second;
|
||||||
is_int = it->second.is_integer();
|
is_int = m_local_to_external[local_j].is_integer();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool local_is_int(unsigned j) const {
|
bool local_is_int(unsigned j) const {
|
||||||
return external_is_int(m_local_to_external[j]);
|
return m_local_to_external[j].is_integer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void shrink(unsigned shrunk_size) {
|
void shrink(unsigned shrunk_size) {
|
||||||
for (unsigned j = size(); j-- > shrunk_size;) {
|
for (unsigned j = size(); j-- > shrunk_size;) {
|
||||||
m_external_to_local.erase(m_local_to_external[j]);
|
m_external_to_local.erase(m_local_to_external[j].external_j());
|
||||||
}
|
}
|
||||||
m_local_to_external.resize(shrunk_size);
|
m_local_to_external.resize(shrunk_size);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue