3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-06 22:23:22 +00:00

slicing replay was utterly broken

This commit is contained in:
Jakob Rath 2023-08-18 15:10:23 +02:00
parent d3b5974448
commit 1033c7e536

View file

@ -203,11 +203,14 @@ namespace polysat {
unsigned const target_size = m_scopes[target_lvl]; unsigned const target_size = m_scopes[target_lvl];
m_scopes.shrink(target_lvl); m_scopes.shrink(target_lvl);
unsigned_vector replay_add_var; unsigned_vector replay_add_var;
svector<std::pair<extract_args, pvar>> replay_extract; svector<trail_item> replay_trail;
svector<std::pair<extract_args, pvar>> replay_extract_trail;
svector<concat_info> replay_concat_trail;
unsigned num_replay_concat = 0; unsigned num_replay_concat = 0;
for (unsigned i = m_trail.size(); i-- > target_size; ) { for (unsigned i = m_trail.size(); i-- > target_size; ) {
switch (m_trail[i]) { switch (m_trail[i]) {
case trail_item::add_var: case trail_item::add_var:
replay_trail.push_back(trail_item::add_var);
replay_add_var.push_back(width(m_var2slice.back())); replay_add_var.push_back(width(m_var2slice.back()));
undo_add_var(); undo_add_var();
break; break;
@ -215,12 +218,14 @@ namespace polysat {
undo_split_core(); undo_split_core();
break; break;
case trail_item::mk_extract: { case trail_item::mk_extract: {
replay_trail.push_back(trail_item::mk_extract);
extract_args const& args = m_extract_trail.back(); extract_args const& args = m_extract_trail.back();
replay_extract.push_back({args, m_extract_dedup[args]}); replay_extract_trail.push_back({args, m_extract_dedup[args]});
undo_mk_extract(); undo_mk_extract();
break; break;
} }
case trail_item::mk_concat: case trail_item::mk_concat:
replay_trail.push_back(trail_item::mk_concat);
num_replay_concat++; num_replay_concat++;
break; break;
case trail_item::set_value_node: case trail_item::set_value_node:
@ -237,42 +242,35 @@ namespace polysat {
m_dep_lit.shrink(m_dep_size_trail[target_lvl]); m_dep_lit.shrink(m_dep_size_trail[target_lvl]);
m_dep_slice.shrink(m_dep_size_trail[target_lvl]); m_dep_slice.shrink(m_dep_size_trail[target_lvl]);
m_dep_size_trail.shrink(target_lvl); m_dep_size_trail.shrink(target_lvl);
m_trail.shrink(target_size);
// replay add_var/mk_extract/mk_concat in the same order // replay add_var/mk_extract/mk_concat in the same order
// (only until polysat::solver supports proper garbage collection of variables) // (only until polysat::solver supports proper garbage collection of variables)
unsigned add_var_idx = replay_add_var.size(); unsigned add_var_idx = replay_add_var.size();
unsigned extract_idx = replay_extract.size(); unsigned extract_idx = replay_extract_trail.size();
unsigned concat_idx = m_concat_trail.size() - num_replay_concat; unsigned concat_idx = m_concat_trail.size() - num_replay_concat;
for (unsigned i = target_size; i < m_trail.size(); ++i) { for (auto it = replay_trail.rbegin(); it != replay_trail.rend(); ++it) {
switch (m_trail[i]) { switch (*it) {
case trail_item::add_var: { case trail_item::add_var: {
unsigned const sz = replay_add_var[--add_var_idx]; unsigned const sz = replay_add_var[--add_var_idx];
add_var(sz); add_var(sz);
break; break;
} }
case trail_item::split_core:
/* do nothing */
break;
case trail_item::mk_extract: { case trail_item::mk_extract: {
auto const [args, v] = replay_extract[--extract_idx]; auto const [args, v] = replay_extract_trail[--extract_idx];
this->replay_extract(args, v); replay_extract(args, v);
break; break;
} }
case trail_item::mk_concat: { case trail_item::mk_concat: {
NOT_IMPLEMENTED_YET();
auto const ci = m_concat_trail[concat_idx++]; auto const ci = m_concat_trail[concat_idx++];
num_replay_concat++; num_replay_concat++;
replay_concat(ci.num_args, &m_concat_args[ci.args_idx], ci.v); replay_concat(ci.num_args, &m_concat_args[ci.args_idx], ci.v);
break; break;
} }
case trail_item::set_value_node:
/* do nothing */
break;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
} }
m_concat_trail.shrink(m_concat_trail.size() - num_replay_concat);
m_concat_args.shrink(m_concat_trail.empty() ? 0 : m_concat_trail.back().next_args_idx());
m_trail.shrink(target_size);
SASSERT(invariant()); SASSERT(invariant());
} }
@ -1269,15 +1267,16 @@ namespace polysat {
add_concat_node(sv, concat); add_concat_node(sv, concat);
slices.reset(); slices.reset();
// Note about the early return above: // don't mess with the concat_trail during replay
// all such variables should have been introduced by mk_extract or mk_concat, so replay will properly restore them if (replay_var == null_var) {
concat_info ci; concat_info ci;
ci.v = v; ci.v = v;
ci.num_args = num_args; ci.num_args = num_args;
ci.args_idx = m_concat_args.size(); ci.args_idx = m_concat_args.size();
m_concat_trail.push_back(ci); m_concat_trail.push_back(ci);
for (unsigned i = 0; i < num_args; ++i) for (unsigned i = 0; i < num_args; ++i)
m_concat_args.push_back(args[i]); m_concat_args.push_back(args[i]);
}
m_trail.push_back(trail_item::mk_concat); m_trail.push_back(trail_item::mk_concat);
return v; return v;