3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-02 07:16:17 +00:00

Refactor dyn_ack.cpp to use structured bindings for app_pair/app_triple (#8359)

* Initial plan

* Refactor dyn_ack.cpp to use C++17 structured bindings

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

* Rename structured binding variables from app1/app2/app3 to a1/a2/a3

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
Copilot 2026-01-28 19:39:25 -08:00 committed by GitHub
parent 3f9fa59811
commit ebed679287
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -175,8 +175,9 @@ namespace smt {
void dyn_ack_manager::reset_app_pairs() {
for (app_pair& p : m_app_pairs) {
m.dec_ref(p.first);
m.dec_ref(p.second);
auto [a1, a2] = p;
m.dec_ref(a1);
m.dec_ref(a2);
}
m_app_pairs.reset();
}
@ -282,10 +283,12 @@ namespace smt {
}
bool operator()(app_pair const & p1, app_pair const & p2) const {
auto [a1_1, a1_2] = p1;
auto [a2_1, a2_2] = p2;
unsigned n1 = 0;
unsigned n2 = 0;
m_app_pair2num_occs.find(p1.first, p1.second, n1);
m_app_pair2num_occs.find(p2.first, p2.second, n2);
m_app_pair2num_occs.find(a1_1, a1_2, n1);
m_app_pair2num_occs.find(a2_1, a2_2, n2);
SASSERT(n1 > 0);
SASSERT(n2 > 0);
return n1 > n2;
@ -301,32 +304,33 @@ namespace smt {
svector<app_pair>::iterator it2 = it;
for (; it != end; ++it) {
app_pair & p = *it;
auto [a1, a2] = p;
if (m_instantiated.contains(p)) {
TRACE(dyn_ack, tout << "1) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
m.dec_ref(p.first);
m.dec_ref(p.second);
SASSERT(!m_app_pair2num_occs.contains(p.first, p.second));
TRACE(dyn_ack, tout << "1) erasing:\n" << mk_pp(a1, m) << "\n" << mk_pp(a2, m) << "\n";);
m.dec_ref(a1);
m.dec_ref(a2);
SASSERT(!m_app_pair2num_occs.contains(a1, a2));
continue;
}
unsigned num_occs = 0;
m_app_pair2num_occs.find(p.first, p.second, num_occs);
// The following invariant is not true. p.first and
// p.second may have been instantiated, and removed from
m_app_pair2num_occs.find(a1, a2, num_occs);
// The following invariant is not true. a1 and
// a2 may have been instantiated, and removed from
// m_app_pair2num_occs, but not from m_app_pairs.
//
// SASSERT(num_occs > 0);
num_occs = static_cast<unsigned>(num_occs * m_params.m_dack_gc_inv_decay);
if (num_occs <= 1) {
TRACE(dyn_ack, tout << "2) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
m_app_pair2num_occs.erase(p.first, p.second);
m.dec_ref(p.first);
m.dec_ref(p.second);
TRACE(dyn_ack, tout << "2) erasing:\n" << mk_pp(a1, m) << "\n" << mk_pp(a2, m) << "\n";);
m_app_pair2num_occs.erase(a1, a2);
m.dec_ref(a1);
m.dec_ref(a2);
continue;
}
*it2 = p;
++it2;
SASSERT(num_occs > 0);
m_app_pair2num_occs.insert(p.first, p.second, num_occs);
m_app_pair2num_occs.insert(a1, a2, num_occs);
if (num_occs >= m_params.m_dack_threshold)
m_to_instantiate.push_back(p);
}
@ -353,18 +357,20 @@ namespace smt {
m_context.m_stats.m_num_del_dyn_ack++;
app_pair p((app*)nullptr,(app*)nullptr);
if (m_clause2app_pair.find(cls, p)) {
SASSERT(p.first && p.second);
auto [a1, a2] = p;
SASSERT(a1 && a2);
m_instantiated.erase(p);
m_clause2app_pair.erase(cls);
SASSERT(!m_app_pair2num_occs.contains(p.first, p.second));
SASSERT(!m_app_pair2num_occs.contains(a1, a2));
return;
}
app_triple tr(0,0,0);
if (m_triple.m_clause2apps.find(cls, tr)) {
SASSERT(tr.first && tr.second && tr.third);
auto [a1, a2, a3] = tr;
SASSERT(a1 && a2 && a3);
m_triple.m_instantiated.erase(tr);
m_triple.m_clause2apps.erase(cls);
SASSERT(!m_triple.m_app2num_occs.contains(tr.first, tr.second, tr.third));
SASSERT(!m_triple.m_app2num_occs.contains(a1, a2, a3));
return;
}
}
@ -450,9 +456,10 @@ namespace smt {
void dyn_ack_manager::reset_app_triples() {
for (app_triple& p : m_triple.m_apps) {
m.dec_ref(p.first);
m.dec_ref(p.second);
m.dec_ref(p.third);
auto [a1, a2, a3] = p;
m.dec_ref(a1);
m.dec_ref(a2);
m.dec_ref(a3);
}
m_triple.m_apps.reset();
}
@ -510,10 +517,12 @@ namespace smt {
}
bool operator()(app_triple const & p1, app_triple const & p2) const {
auto [a1_1, a1_2, a1_3] = p1;
auto [a2_1, a2_2, a2_3] = p2;
unsigned n1 = 0;
unsigned n2 = 0;
m_app_triple2num_occs.find(p1.first, p1.second, p1.third, n1);
m_app_triple2num_occs.find(p2.first, p2.second, p2.third, n2);
m_app_triple2num_occs.find(a1_1, a1_2, a1_3, n1);
m_app_triple2num_occs.find(a2_1, a2_2, a2_3, n2);
SASSERT(n1 > 0);
SASSERT(n2 > 0);
return n1 > n2;
@ -529,34 +538,35 @@ namespace smt {
svector<app_triple>::iterator it2 = it;
for (; it != end; ++it) {
app_triple & p = *it;
auto [a1, a2, a3] = p;
if (m_triple.m_instantiated.contains(p)) {
TRACE(dyn_ack, tout << "1) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
m.dec_ref(p.first);
m.dec_ref(p.second);
m.dec_ref(p.third);
SASSERT(!m_triple.m_app2num_occs.contains(p.first, p.second, p.third));
TRACE(dyn_ack, tout << "1) erasing:\n" << mk_pp(a1, m) << "\n" << mk_pp(a2, m) << "\n";);
m.dec_ref(a1);
m.dec_ref(a2);
m.dec_ref(a3);
SASSERT(!m_triple.m_app2num_occs.contains(a1, a2, a3));
continue;
}
unsigned num_occs = 0;
m_triple.m_app2num_occs.find(p.first, p.second, p.third, num_occs);
// The following invariant is not true. p.first and
// p.second may have been instantiated, and removed from
m_triple.m_app2num_occs.find(a1, a2, a3, num_occs);
// The following invariant is not true. a1 and
// a2 may have been instantiated, and removed from
// m_app_triple2num_occs, but not from m_app_triples.
//
// SASSERT(num_occs > 0);
num_occs = static_cast<unsigned>(num_occs * m_params.m_dack_gc_inv_decay);
if (num_occs <= 1) {
TRACE(dyn_ack, tout << "2) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
m_triple.m_app2num_occs.erase(p.first, p.second, p.third);
m.dec_ref(p.first);
m.dec_ref(p.second);
m.dec_ref(p.third);
TRACE(dyn_ack, tout << "2) erasing:\n" << mk_pp(a1, m) << "\n" << mk_pp(a2, m) << "\n";);
m_triple.m_app2num_occs.erase(a1, a2, a3);
m.dec_ref(a1);
m.dec_ref(a2);
m.dec_ref(a3);
continue;
}
*it2 = p;
++it2;
SASSERT(num_occs > 0);
m_triple.m_app2num_occs.insert(p.first, p.second, p.third, num_occs);
m_triple.m_app2num_occs.insert(a1, a2, a3, num_occs);
if (num_occs >= m_params.m_dack_threshold)
m_triple.m_to_instantiate.push_back(p);
}
@ -572,8 +582,9 @@ namespace smt {
bool dyn_ack_manager::check_invariant() const {
for (auto const& kv : m_clause2app_pair) {
app_pair const & p = kv.get_value();
auto [a1, a2] = p;
SASSERT(m_instantiated.contains(p));
SASSERT(!m_app_pair2num_occs.contains(p.first, p.second));
SASSERT(!m_app_pair2num_occs.contains(a1, a2));
}
return true;