mirror of
https://github.com/Z3Prover/z3
synced 2026-03-20 11:55:49 +00:00
Replace dep_tracker uint_set with scoped_dependency_manager<dep_source> in seq_nielsen (#9014)
* Initial plan * replace dep_tracker uint_set with scoped_dependency_manager<dep_source> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * fix test build: update dep_tracker usages in test files and seq_state.h 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:
parent
39bf6af870
commit
ef22ae8871
7 changed files with 184 additions and 142 deletions
|
|
@ -319,7 +319,8 @@ static void test_generate_constraints_ab_star() {
|
|||
euf::snode* x = sg.mk_var(symbol("x"));
|
||||
expr_ref re = mk_ab_star(m, seq);
|
||||
euf::snode* regex = sg.mk(re);
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_manager dm;
|
||||
seq::dep_tracker dep = dm.mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
seq::str_mem mem(x, regex, nullptr, 0, dep);
|
||||
|
||||
vector<seq::int_constraint> out;
|
||||
|
|
@ -364,7 +365,8 @@ static void test_generate_constraints_bounded_loop() {
|
|||
expr_ref ab = mk_to_re_ab(m, seq);
|
||||
expr_ref re(seq.re.mk_loop(ab, 1, 3), m);
|
||||
euf::snode* regex = sg.mk(re);
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_manager dm;
|
||||
seq::dep_tracker dep = dm.mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
seq::str_mem mem(x, regex, nullptr, 0, dep);
|
||||
|
||||
vector<seq::int_constraint> out;
|
||||
|
|
@ -400,7 +402,8 @@ static void test_generate_constraints_stride_one() {
|
|||
// full_seq: stride=1 → no modular constraint
|
||||
expr_ref re(seq.re.mk_full_seq(str_sort), m);
|
||||
euf::snode* regex = sg.mk(re);
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_manager dm;
|
||||
seq::dep_tracker dep = dm.mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
seq::str_mem mem(x, regex, nullptr, 0, dep);
|
||||
|
||||
vector<seq::int_constraint> out;
|
||||
|
|
@ -422,7 +425,8 @@ static void test_generate_constraints_fixed_length() {
|
|||
euf::snode* x = sg.mk_var(symbol("x"));
|
||||
expr_ref re = mk_to_re_ab(m, seq); // fixed len 2
|
||||
euf::snode* regex = sg.mk(re);
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_manager dm;
|
||||
seq::dep_tracker dep = dm.mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
seq::str_mem mem(x, regex, nullptr, 0, dep);
|
||||
|
||||
vector<seq::int_constraint> out;
|
||||
|
|
@ -444,19 +448,24 @@ static void test_generate_constraints_dep_propagated() {
|
|||
euf::snode* x = sg.mk_var(symbol("x"));
|
||||
expr_ref re = mk_ab_star(m, seq);
|
||||
euf::snode* regex = sg.mk(re);
|
||||
seq::dep_tracker dep; dep.insert(7);
|
||||
seq::dep_manager dm;
|
||||
seq::dep_tracker dep = dm.mk_leaf({seq::dep_source::kind::mem, 7});
|
||||
seq::str_mem mem(x, regex, nullptr, 0, dep);
|
||||
|
||||
vector<seq::int_constraint> out;
|
||||
parikh.generate_parikh_constraints(mem, out);
|
||||
|
||||
// all generated constraints must carry bit 7 in their dependency
|
||||
// all generated constraints must carry dep_source{mem,7} in their dependency
|
||||
for (auto const& ic : out) {
|
||||
SASSERT(!ic.m_dep.empty());
|
||||
seq::dep_tracker d7; d7.insert(7);
|
||||
SASSERT(d7.subset_of(ic.m_dep));
|
||||
SASSERT(ic.m_dep != nullptr);
|
||||
vector<seq::dep_source, false> vs;
|
||||
dm.linearize(ic.m_dep, vs);
|
||||
bool found = false;
|
||||
for (auto const& d : vs)
|
||||
if (d.m_kind == seq::dep_source::kind::mem && d.index == 7) found = true;
|
||||
SASSERT(found);
|
||||
}
|
||||
std::cout << " all constraints carry dep bit 7\n";
|
||||
std::cout << " all constraints carry dep {mem,7}\n";
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
|
@ -565,7 +574,7 @@ static void test_check_conflict_valid_k_exists() {
|
|||
ng.add_str_mem(x, regex);
|
||||
|
||||
// lb=3, ub=5: length 4 is achievable (k=2) → no conflict
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_tracker dep = ng.dep_mgr().mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
ng.root()->add_lower_int_bound(x, 3, dep);
|
||||
ng.root()->add_upper_int_bound(x, 5, dep);
|
||||
|
||||
|
|
@ -593,7 +602,7 @@ static void test_check_conflict_no_valid_k() {
|
|||
ng.add_str_mem(x, regex);
|
||||
|
||||
// lb=3, ub=3: only odd length 3 — never a multiple of 2 → conflict
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_tracker dep = ng.dep_mgr().mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
ng.root()->add_lower_int_bound(x, 3, dep);
|
||||
ng.root()->add_upper_int_bound(x, 3, dep);
|
||||
|
||||
|
|
@ -621,7 +630,7 @@ static void test_check_conflict_abc_star() {
|
|||
ng.add_str_mem(x, regex);
|
||||
|
||||
// lb=5, ub=5 → no valid k (5 is not a multiple of 3) → conflict
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_tracker dep = ng.dep_mgr().mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
ng.root()->add_lower_int_bound(x, 5, dep);
|
||||
ng.root()->add_upper_int_bound(x, 5, dep);
|
||||
|
||||
|
|
@ -648,7 +657,7 @@ static void test_check_conflict_stride_one_never_conflicts() {
|
|||
euf::snode* regex = sg.mk(re);
|
||||
ng.add_str_mem(x, regex);
|
||||
|
||||
seq::dep_tracker dep; dep.insert(0);
|
||||
seq::dep_tracker dep = ng.dep_mgr().mk_leaf({seq::dep_source::kind::mem, 0});
|
||||
ng.root()->add_lower_int_bound(x, 7, dep);
|
||||
ng.root()->add_upper_int_bound(x, 7, dep);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue