3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-18 20:03:38 +00:00
This commit is contained in:
Nikolaj Bjorner 2023-01-10 14:42:19 -08:00
parent 2bd933d87f
commit b700dbffce

View file

@ -377,9 +377,10 @@ private:
solver_ref m_solver; solver_ref m_solver;
ast_manager& m_manager; ast_manager& m_manager;
scoped_ptr<ast_manager> m_serialize_manager;
params_ref m_params; params_ref m_params;
sref_vector<model> m_models; sref_vector<model> m_models;
expr_ref_vector m_core; scoped_ptr<expr_ref_vector> m_core;
unsigned m_num_threads; unsigned m_num_threads;
statistics m_stats; statistics m_stats;
task_queue m_queue; task_queue m_queue;
@ -409,7 +410,7 @@ private:
m_conquer_delay = pp.conquer_delay(); m_conquer_delay = pp.conquer_delay();
m_exn_code = 0; m_exn_code = 0;
m_params.set_bool("override_incremental", true); m_params.set_bool("override_incremental", true);
m_core.reset(); m_core = nullptr;
} }
void log_branches(lbool status) { void log_branches(lbool status) {
@ -436,10 +437,15 @@ private:
void collect_core(expr_ref_vector const& core) { void collect_core(expr_ref_vector const& core) {
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
ast_translation tr(core.get_manager(), m_manager); if (!m_serialize_manager)
m_serialize_manager = alloc(ast_manager, core.get_manager(), true);
m_core = nullptr;
m_core = alloc(expr_ref_vector, *m_serialize_manager);
ast_translation tr(core.get_manager(), *m_serialize_manager);
expr_ref_vector core1(tr(core)); expr_ref_vector core1(tr(core));
for (expr* c : core1) { for (expr* c : core1) {
if (!m_core.contains(c)) m_core.push_back(c); if (!m_core->contains(c))
m_core->push_back(c);
} }
} }
@ -463,11 +469,12 @@ private:
s.get_solver().get_model(mdl); s.get_solver().get_model(mdl);
} }
if (mdl) { if (mdl) {
// serialize access to m_serialize_manager
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
if (&s.m() != &m_manager) { if (!m_serialize_manager)
ast_translation tr(s.m(), m_manager); m_serialize_manager = alloc(ast_manager, s.m(), true);
mdl = mdl->translate(tr); ast_translation tr(s.m(), *m_serialize_manager);
} mdl = mdl->translate(tr);
m_models.push_back(mdl.get()); m_models.push_back(mdl.get());
} }
else if (m_models.empty()) { else if (m_models.empty()) {
@ -738,9 +745,14 @@ private:
if (m_exn_code == -1) if (m_exn_code == -1)
throw default_exception(std::move(m_exn_msg)); throw default_exception(std::move(m_exn_msg));
if (m_exn_code != 0) if (m_exn_code != 0)
throw z3_error(m_exn_code); throw z3_error(m_exn_code);
// retrieve model. The ast manager of the model is m_serialize_manager.
// the asts have to be translated into m_manager.
if (!m_models.empty()) { if (!m_models.empty()) {
mdl = m_models.back(); mdl = m_models.back();
ast_translation tr(mdl->get_manager(), m_manager);
mdl = mdl->translate(tr);
return l_true; return l_true;
} }
if (m_has_undef) if (m_has_undef)
@ -770,8 +782,7 @@ public:
parallel_tactic(solver* s, params_ref const& p) : parallel_tactic(solver* s, params_ref const& p) :
m_solver(s), m_solver(s),
m_manager(s->get_manager()), m_manager(s->get_manager()),
m_params(p), m_params(p) {
m_core(m_manager) {
init(); init();
} }
@ -806,10 +817,13 @@ public:
g->add(concat(fmc.get(), model2model_converter(mdl.get()))); g->add(concat(fmc.get(), model2model_converter(mdl.get())));
} }
break; break;
case l_false: case l_false:
SASSERT(!g->proofs_enabled()); SASSERT(!g->proofs_enabled());
for (expr * c : m_core) { if (m_core) {
lcore = m.mk_join(lcore, m.mk_leaf(bool2dep.find(c))); ast_translation tr(m_core->get_manager(), m);
expr_ref_vector core(tr(*m_core));
for (expr * c : core)
lcore = m.mk_join(lcore, m.mk_leaf(bool2dep.find(c)));
} }
g->assert_expr(m.mk_false(), pr, lcore); g->assert_expr(m.mk_false(), pr, lcore);
break; break;