mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 01:25:31 +00:00
speed-up handling of cnf input to inc_sat_solver
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
9bd4050e0c
commit
b8d18c6c6d
7 changed files with 133 additions and 57 deletions
|
@ -29,8 +29,17 @@ void expr2var::insert(expr * n, var v) {
|
|||
TRACE("expr2var", tout << "interpreted:\n" << mk_ismt2_pp(n, m()) << "\n";);
|
||||
m_interpreted_vars = true;
|
||||
}
|
||||
m().inc_ref(n);
|
||||
m_mapping.insert(n, v);
|
||||
unsigned idx = m_id2map.get(n->get_id(), UINT_MAX);
|
||||
if (idx == UINT_MAX) {
|
||||
m().inc_ref(n);
|
||||
idx = m_mapping.size();
|
||||
m_mapping.push_back(key_value(n, v));
|
||||
m_id2map.setx(n->get_id(), idx, UINT_MAX);
|
||||
}
|
||||
else {
|
||||
m_mapping[idx] = key_value(n, v);
|
||||
}
|
||||
|
||||
m_recent_exprs.push_back(n);
|
||||
}
|
||||
|
||||
|
@ -40,20 +49,22 @@ expr2var::expr2var(ast_manager & m):
|
|||
}
|
||||
|
||||
expr2var::~expr2var() {
|
||||
dec_ref_map_keys(m(), m_mapping);
|
||||
for (auto & kv : m_mapping) {
|
||||
m().dec_ref(kv.m_key);
|
||||
}
|
||||
}
|
||||
|
||||
expr2var::var expr2var::to_var(expr * n) const {
|
||||
var v = UINT_MAX;
|
||||
m_mapping.find(n, v);
|
||||
var v = m_id2map.get(n->get_id(), UINT_MAX);
|
||||
if (v != UINT_MAX) {
|
||||
v = m_mapping[v].m_value;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
void expr2var::display(std::ostream & out) const {
|
||||
obj_map<expr, var>::iterator it = m_mapping.begin();
|
||||
obj_map<expr, var>::iterator end = m_mapping.end();
|
||||
for (; it != end; ++it) {
|
||||
out << mk_ismt2_pp(it->m_key, m()) << " -> " << it->m_value << "\n";
|
||||
for (auto const& kv : m_mapping) {
|
||||
out << mk_ismt2_pp(kv.m_key, m()) << " -> " << kv.m_value << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -68,8 +79,11 @@ void expr2var::mk_inv(expr_ref_vector & var2expr) const {
|
|||
}
|
||||
|
||||
void expr2var::reset() {
|
||||
dec_ref_map_keys(m(), m_mapping);
|
||||
SASSERT(m_mapping.empty());
|
||||
for (auto & kv : m_mapping) {
|
||||
m().dec_ref(kv.m_key);
|
||||
}
|
||||
m_mapping.reset();
|
||||
m_id2map.reset();
|
||||
m_recent_exprs.reset();
|
||||
m_recent_lim.reset();
|
||||
m_interpreted_vars = false;
|
||||
|
@ -83,8 +97,15 @@ void expr2var::pop(unsigned num_scopes) {
|
|||
if (num_scopes > 0) {
|
||||
unsigned sz = m_recent_lim[m_recent_lim.size() - num_scopes];
|
||||
for (unsigned i = sz; i < m_recent_exprs.size(); ++i) {
|
||||
m_mapping.erase(m_recent_exprs[i]);
|
||||
m().dec_ref(m_recent_exprs[i]);
|
||||
expr* n = m_recent_exprs[i];
|
||||
unsigned idx = m_id2map[n->get_id()];
|
||||
if (idx + 1 != m_mapping.size()) {
|
||||
m_id2map[m_mapping.back().m_key->get_id()] = idx;
|
||||
m_mapping[idx] = m_mapping.back();
|
||||
}
|
||||
m_id2map[n->get_id()] = UINT_MAX;
|
||||
m_mapping.pop_back();
|
||||
m().dec_ref(n);
|
||||
}
|
||||
m_recent_exprs.shrink(sz);
|
||||
m_recent_lim.shrink(m_recent_lim.size() - num_scopes);
|
||||
|
|
|
@ -32,12 +32,14 @@ Notes:
|
|||
class expr2var {
|
||||
public:
|
||||
typedef unsigned var;
|
||||
typedef obj_map<expr, var> expr2var_mapping;
|
||||
typedef expr2var_mapping::iterator iterator;
|
||||
typedef obj_map<expr, var>::key_data key_value;
|
||||
typedef key_value const* iterator;
|
||||
typedef ptr_vector<expr>::const_iterator recent_iterator;
|
||||
protected:
|
||||
ast_manager & m_manager;
|
||||
expr2var_mapping m_mapping;
|
||||
|
||||
unsigned_vector m_id2map;
|
||||
svector<key_value> m_mapping;
|
||||
ptr_vector<expr> m_recent_exprs;
|
||||
unsigned_vector m_recent_lim;
|
||||
bool m_interpreted_vars;
|
||||
|
@ -51,7 +53,7 @@ public:
|
|||
|
||||
var to_var(expr * n) const;
|
||||
|
||||
bool is_var(expr * n) const { return m_mapping.contains(n); }
|
||||
bool is_var(expr * n) const { return m_id2map.get(n->get_id(), UINT_MAX) != UINT_MAX; }
|
||||
|
||||
void display(std::ostream & out) const;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue