3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-28 19:35:50 +00:00

add priority queue to instantiation

This commit is contained in:
Nikolaj Bjorner 2021-01-31 16:17:52 -08:00
parent 22b0c3aa70
commit 46f754c43d
19 changed files with 1138 additions and 541 deletions

View file

@ -1843,7 +1843,7 @@ namespace q {
typedef svector<backtrack_point> backtrack_stack;
class interpreter {
egraph & m_egraph;
euf::solver& ctx;
ast_manager & m;
mam & m_mam;
bool m_use_filters;
@ -1976,8 +1976,8 @@ namespace q {
#define INIT_ARGS_SIZE 16
public:
interpreter(egraph & ctx, mam & ma, bool use_filters):
m_egraph(ctx),
interpreter(euf::solver& ctx, mam & ma, bool use_filters):
ctx(ctx),
m(ctx.get_manager()),
m_mam(ma),
m_use_filters(use_filters) {
@ -2002,7 +2002,7 @@ namespace q {
for (enode* app : t->get_candidates()) {
TRACE("trigger_bug", tout << "candidate\n" << mk_ismt2_pp(app->get_expr(), m) << "\n";);
if (!app->is_marked1() && app->is_cgr()) {
if (m_egraph.resource_limits_exceeded() || !execute_core(t, app))
if (ctx.resource_limits_exceeded() || !execute_core(t, app))
return;
app->mark1();
}
@ -2017,7 +2017,7 @@ namespace q {
TRACE("trigger_bug", tout << "candidate\n" << mk_ismt2_pp(app->get_expr(), m) << "\n";);
if (app->is_cgr()) {
TRACE("trigger_bug", tout << "is_cgr\n";);
if (m_egraph.resource_limits_exceeded() || !execute_core(t, app))
if (ctx.resource_limits_exceeded() || !execute_core(t, app))
return;
}
}
@ -2059,7 +2059,7 @@ namespace q {
for (enode* p : euf::enode_parents(n)) {
if (p->get_decl() == f &&
i < p->num_args() &&
m_egraph.is_relevant(p) &&
ctx.is_relevant(p) &&
p->is_cgr() &&
p->get_arg(i)->get_root() == n)
v->push_back(p);
@ -2080,7 +2080,7 @@ namespace q {
enode_vector * v = mk_enode_vector();
for (enode* p : euf::enode_parents(n)) {
if (p->get_decl() == j2->m_decl &&
m_egraph.is_relevant(p) &&
ctx.is_relevant(p) &&
p->num_args() > j2->m_arg_pos &&
p->is_cgr() &&
p->get_arg(j2->m_arg_pos)->get_root() == n) {
@ -2090,7 +2090,7 @@ namespace q {
if (p2->get_decl() == f &&
num_args == n->num_args() &&
num_args == p2->num_args() &&
m_egraph.is_relevant(p2) &&
ctx.is_relevant(p2) &&
p2->is_cgr() &&
i < num_args &&
p2->get_arg(i)->get_root() == p) {
@ -2104,7 +2104,7 @@ namespace q {
enode * interpreter::init_continue(cont const * c, unsigned expected_num_args) {
func_decl * lbl = c->m_label;
unsigned min_sz = m_egraph.enodes_of(lbl).size();
unsigned min_sz = ctx.get_egraph().enodes_of(lbl).size();
unsigned short num_args = c->m_num_args;
enode * r;
// quick filter... check if any of the joint points have zero parents...
@ -2172,8 +2172,8 @@ namespace q {
TRACE("mam_bug", tout << "m_top: " << m_top << ", m_backtrack_stack.size(): " << m_backtrack_stack.size() << "\n";
tout << *c << "\n";);
bp.m_to_recycle = nullptr;
bp.m_it = m_egraph.enodes_of(lbl).begin();
bp.m_end = m_egraph.enodes_of(lbl).end();
bp.m_it = ctx.get_egraph().enodes_of(lbl).begin();
bp.m_end = ctx.get_egraph().enodes_of(lbl).end();
}
else {
SASSERT(!best_v->empty());
@ -2184,7 +2184,7 @@ namespace q {
// find application with the right number of arguments
for (; bp.m_it != bp.m_end; ++bp.m_it) {
enode * curr = *bp.m_it;
if (curr->num_args() == expected_num_args && m_egraph.is_relevant(curr))
if (curr->num_args() == expected_num_args && ctx.is_relevant(curr))
break;
}
if (bp.m_it == bp.m_end)
@ -2262,7 +2262,7 @@ namespace q {
#endif
// It doesn't make sense to process an irrelevant enode.
TRACE("mam_execute_core", tout << "EXEC " << t->get_root_lbl()->get_name() << "\n";);
SASSERT(m_egraph.is_relevant(n));
SASSERT(ctx.is_relevant(n));
m_pattern_instances.reset();
m_min_top_generation.reset();
m_max_top_generation.reset();
@ -2623,8 +2623,8 @@ namespace q {
goto backtrack;
cgr_common:
m_n1 = m_egraph.get_enode_eq_to(static_cast<const get_cgr *>(m_pc)->m_label, static_cast<const get_cgr *>(m_pc)->m_num_args, m_args.c_ptr());
if (!m_n1 || !m_egraph.is_relevant(m_n1))
m_n1 = ctx.get_egraph().get_enode_eq_to(static_cast<const get_cgr *>(m_pc)->m_label, static_cast<const get_cgr *>(m_pc)->m_num_args, m_args.c_ptr());
if (!m_n1 || !ctx.is_relevant(m_n1))
goto backtrack;
update_max_generation(m_n1, nullptr);
m_registers[static_cast<const get_cgr *>(m_pc)->m_oreg] = m_n1;
@ -2652,7 +2652,7 @@ namespace q {
if (since_last_check++ > 100) {
since_last_check = 0;
if (m_egraph.resource_limits_exceeded()) {
if (ctx.resource_limits_exceeded()) {
// Soft timeout...
// Cleanup before exiting
while (m_top != 0) {
@ -2752,8 +2752,8 @@ namespace q {
const cont * c = static_cast<const cont*>(bp.m_instr);
// bp.m_it may reference an enode in [begin_enodes_of(lbl), end_enodes_of(lbl))
// This enodes are not necessarily relevant.
// So, we must check whether m_egraph.is_relevant(m_app) is true or not.
if (m_app->num_args() == c->m_num_args && m_egraph.is_relevant(m_app)) {
// So, we must check whether ctx.is_relevant(m_app) is true or not.
if (m_app->num_args() == c->m_num_args && ctx.is_relevant(m_app)) {
// update the pattern instance
SASSERT(!m_pattern_instances.empty());
if (m_pattern_instances.size() == m_max_top_generation.size()) {
@ -3143,7 +3143,7 @@ namespace q {
SASSERT(m_is_clbl[lbl_id]);
unsigned h = m_lbl_hasher(lbl);
for (enode* app : m_egraph.enodes_of(lbl)) {
if (m_egraph.is_relevant(app)) {
if (ctx.is_relevant(app)) {
update_lbls(app, h);
TRACE("mam_bug", tout << "updating labels of: #" << app->get_expr_id() << "\n";
tout << "new_elem: " << h << "\n";
@ -3185,7 +3185,7 @@ namespace q {
SASSERT(is_plbl(lbl));
unsigned h = m_lbl_hasher(lbl);
for (enode * app : m_egraph.enodes_of(lbl)) {
if (m_egraph.is_relevant(app))
if (ctx.is_relevant(app))
update_children_plbls(app, h);
}
}
@ -3397,7 +3397,7 @@ namespace q {
tout << "updating pc labels " << plbl->get_name() << " " <<
static_cast<unsigned>(n->get_lbl_hash()) << "\n";
tout << "#" << n->get_expr_id() << " " << n->get_root()->get_lbls() << "\n";
tout << "relevant: " << m_egraph.is_relevant(n) << "\n";);
tout << "relevant: " << ctx.is_relevant(n) << "\n";);
update_pc(m_lbl_hasher(plbl), n->get_lbl_hash(), new_path, qa, mp);
continue;
}
@ -3553,7 +3553,7 @@ namespace q {
if (filter.may_contain(m_lbl_hasher(lbl)) &&
!curr_parent->is_marked1() &&
(curr_parent_cg == curr_parent || !is_eq(curr_parent_cg, curr_parent_root)) &&
m_egraph.is_relevant(curr_parent)
ctx.is_relevant(curr_parent)
) {
path_tree * curr_tree = t;
while (curr_tree) {
@ -3711,7 +3711,7 @@ namespace q {
SASSERT(!m_egraph.enodes_of(lbl).empty());
m_interpreter.init(tmp_tree);
for (enode * app : m_egraph.enodes_of(lbl))
if (m_egraph.is_relevant(app))
if (ctx.is_relevant(app))
m_interpreter.execute_core(tmp_tree, app);
m_tmp_trees[lbl_id] = nullptr;
dealloc(tmp_tree);
@ -3728,7 +3728,7 @@ namespace q {
m_use_filters(use_filters),
m_ct_manager(m_lbl_hasher, ctx),
m_compiler(m_egraph, m_ct_manager, m_lbl_hasher, use_filters),
m_interpreter(m_egraph, *this, use_filters),
m_interpreter(ctx, *this, use_filters),
m_trees(m, m_compiler, ctx),
m_region(ctx.get_region()) {
DEBUG_CODE(m_trees.set_egraph(&m_egraph););
@ -3802,7 +3802,7 @@ namespace q {
m_interpreter.init(t);
func_decl * lbl = t->get_root_lbl();
for (enode * curr : m_egraph.enodes_of(lbl)) {
if (use_irrelevant || m_egraph.is_relevant(curr))
if (use_irrelevant || ctx.is_relevant(curr))
m_interpreter.execute_core(t, curr);
}
}