degen: learn to work on generalized-Co-Büchi as well

* spot/twaalgos/degen.hh, spot/twaalgos/degen.cc: Adjust
degeneralize() and degeneralize_tba() to work on generalized-co-Büchi.
* NEWS: Mention this.
* spot/twaalgos/cobuchi.hh, spot/twaalgos/cobuchi.cc (to_nca): Use
degeneralization on generalized-co-Büchi.
* spot/twaalgos/postproc.cc: Use degeneralization for generalized
co-Büchi as well.
* bin/autfilt.cc: Improve chain products of co-Büchi automata by using
generalization if too many colors are needed.
* tests/core/prodchain.test, tests/python/pdegen.py: Add test cases.
This commit is contained in:
Alexandre Duret-Lutz 2022-09-07 14:36:23 +02:00
parent fe3ebd370b
commit bdac53511a
9 changed files with 169 additions and 81 deletions

View file

@ -149,6 +149,9 @@ tc.assertEqual(spot.is_partially_degeneralizable(de), [])
df = spot.partial_degeneralize(f, [0, 1])
df.equivalent_to(f)
tc.assertEqual(str(df.acc()), '(1, Fin(0))')
df2 = spot.degeneralize(f)
df.equivalent_to(f)
tc.assertEqual(str(df2.acc()), '(1, Fin(0))')
try:
df = spot.partial_degeneralize(f, [0, 1, 2])
@ -206,6 +209,16 @@ pdaut7 = spot.partial_degeneralize(aut7, sets)
tc.assertTrue(pdaut7.equivalent_to(aut7))
tc.assertEqual(daut7.num_states(), 10)
tc.assertEqual(pdaut7.num_states(), 10)
ddaut7 = spot.dualize(aut7)
ddaut7a = spot.scc_filter(spot.dualize(spot.degeneralize_tba(ddaut7)))
tc.assertTrue(ddaut7a.equivalent_to(aut7))
tc.assertEqual(ddaut7a.num_states(), daut7.num_states())
ddaut7b = spot.scc_filter(spot.dualize(spot.to_nca(ddaut7)))
tc.assertTrue(ddaut7b.equivalent_to(aut7))
tc.assertEqual(ddaut7b.num_states(), daut7.num_states())
ddaut7c = spot.scc_filter(spot.dualize(spot.to_dca(ddaut7)))
tc.assertTrue(ddaut7c.equivalent_to(aut7))
tc.assertEqual(ddaut7c.num_states(), daut7.num_states())
aut8 = spot.automaton("""HOA: v1 States: 8 Start: 0 AP: 3 "p0" "p1" "p2"
acc-name: generalized-Buchi 5 Acceptance: 5 Inf(0)&Inf(1)&Inf(2)&Inf(3)&Inf(4)
@ -482,4 +495,4 @@ State: 1
[0] 0 {0}
State: 2
[!0] 0
--END--""")
--END--""")