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:
parent
d3b5974448
commit
1033c7e536
1 changed files with 24 additions and 25 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue