diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 0349b69cff776d5a9b2a7bed104abcd5dc68bdf8..a9081c58e4ca52cd3d8871e93124e39f8495d72c 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -172,6 +172,7 @@ TESTS_twa = \ det.test \ neverclaimread.test \ hoaparse.test \ + optba.test \ complete.test \ remfin.test \ dstar.test \ diff --git a/src/tests/optba.test b/src/tests/optba.test new file mode 100755 index 0000000000000000000000000000000000000000..0d2945c2a6cdbbe2e151438c3b65ba36d66e6395 --- /dev/null +++ b/src/tests/optba.test @@ -0,0 +1,163 @@ +#!/bin/sh +# -*- coding: utf-8 -*- +# Copyright (C) 2015 Laboratoire de Recherche et Développement de +# l'Epita (LRDE). +# +# This file is part of Spot, a model checking library. +# +# Spot is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Spot is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. ./defs + +# This is a case where autfilt is used to optimize BA, but used to +# produce a larger one. See issue #79. + +autfilt=../../bin/autfilt + +# ltldo -s -f '!(((p1 W c1) U Gp2) || (GXc2 <-> F!F!c1))' 'ltl3ba -M0' +cat >input < goto accept_S1 + :: ((!(c1)) && (!(p1))) -> goto T0_S2 + :: ((!(c1)) && (!(p2))) -> goto T0_S3 + :: ((true)) -> goto T0_S4 + :: ((!(c1)) && (!(p1)) && (!(p2))) -> goto T0_S5 + :: ((!(c1)) && (!(p1))) -> goto T0_S6 + :: ((!(c1)) && (!(p2))) -> goto T0_S7 + :: ((true)) -> goto T0_S8 + fi; +accept_S1: + if + :: ((!(c1)) && (c2)) -> goto accept_S1 + :: ((c2)) -> goto T0_S9 + fi; +T0_S2: + if + :: ((c2) && (!(p2))) -> goto T0_S9 + :: ((c2)) -> goto T0_S2 + fi; +T0_S3: + if + :: ((!(c1)) && (c2) && (!(p1))) -> goto accept_S1 + :: ((!(c1)) && (c2)) -> goto T0_S3 + fi; +T0_S4: + if + :: ((!(c1)) && (c2) && (!(p1)) && (!(p2))) -> goto accept_S1 + :: ((!(c1)) && (c2) && (!(p1))) -> goto T0_S2 + :: ((!(c1)) && (c2) && (!(p2))) -> goto T0_S3 + :: ((c2) && (!(p2))) -> goto T0_S10 + :: ((!(c1)) && (c2) && (!(p2))) -> goto accept_S11 + :: ((c2)) -> goto T0_S4 + fi; +T0_S5: + if + :: ((true)) -> goto T0_S5 + :: ((!(c2))) -> goto T0_S12 + fi; +T0_S6: + if + :: ((!(p2))) -> goto T0_S5 + :: ((true)) -> goto T0_S6 + :: ((!(c2)) && (!(p2))) -> goto T0_S12 + :: ((!(c2))) -> goto T0_S13 + fi; +T0_S7: + if + :: ((!(c1)) && (!(p1))) -> goto T0_S5 + :: ((!(c1))) -> goto T0_S7 + :: ((!(c1)) && (!(c2)) && (!(p1))) -> goto T0_S12 + :: ((!(c1)) && (!(c2))) -> goto T0_S14 + fi; +T0_S8: + if + :: ((!(c1)) && (!(p1)) && (!(p2))) -> goto T0_S5 + :: ((!(c1)) && (!(p1))) -> goto T0_S6 + :: ((!(c1)) && (!(p2))) -> goto T0_S7 + :: ((!(c1)) && (!(c2)) && (!(p1)) && (!(p2))) -> goto T0_S12 + :: ((!(c1)) && (!(c2)) && (!(p1))) -> goto T0_S13 + :: ((!(c1)) && (!(c2)) && (!(p2))) -> goto T0_S14 + :: ((!(c2))) -> goto T0_S18 + :: ((true)) -> goto T0_S8 + fi; +T0_S9: + if + :: ((!(c1)) && (c2)) -> goto accept_S1 + :: ((c2)) -> goto T0_S9 + fi; +T0_S10: + if + :: ((!(c1)) && (c2) && (!(p1)) && (!(p2))) -> goto accept_S1 + :: ((!(c1)) && (c2) && (!(p1))) -> goto T0_S2 + :: ((!(c1)) && (c2) && (!(p2))) -> goto T0_S3 + :: ((c2)) -> goto T0_S10 + :: ((!(c1)) && (c2)) -> goto accept_S11 + fi; +accept_S11: + if + :: ((!(c1)) && (c2) && (!(p1)) && (!(p2))) -> goto accept_S1 + :: ((!(c1)) && (c2) && (!(p1))) -> goto T0_S2 + :: ((!(c1)) && (c2) && (!(p2))) -> goto T0_S3 + :: ((c2) && (!(p2))) -> goto T0_S10 + :: ((!(c1)) && (c2) && (!(p2))) -> goto accept_S11 + :: ((c2)) -> goto T0_S4 + fi; +T0_S12: + if + :: ((true)) -> goto T0_S12 + :: ((c1)) -> goto accept_S15 + fi; +T0_S13: + if + :: ((!(p2))) -> goto T0_S12 + :: ((c1) && (!(p2))) -> goto accept_S15 + :: ((true)) -> goto T0_S13 + fi; +T0_S14: + if + :: ((!(c1)) && (!(p1))) -> goto T0_S12 + :: ((!(c1))) -> goto T0_S14 + fi; +accept_S15: + if + :: ((c1)) -> goto accept_S15 + fi; +accept_S16: + if + :: ((c1) && (!(p2))) -> goto accept_S16 + :: ((c1)) -> goto T0_S17 + fi; +T0_S17: + if + :: ((c1) && (!(p2))) -> goto accept_S16 + :: ((c1)) -> goto T0_S17 + fi; +T0_S18: + if + :: ((!(c1)) && (!(p1)) && (!(p2))) -> goto T0_S12 + :: ((!(c1)) && (!(p1))) -> goto T0_S13 + :: ((!(c1)) && (!(p2))) -> goto T0_S14 + :: ((c1)) -> goto T0_S17 + :: ((true)) -> goto T0_S18 + fi; +} +EOF + +# 18 states is fine for transition-based acceptance +test `$autfilt --exclusive-ap=c1,c2 --high --small --stats=%s input` = 18 + +# But we should have 19 with Büchi acceptance, not 20. +test `$autfilt --exclusive-ap=c1,c2 --high --small -B --stats=%s input` = 19 diff --git a/src/twaalgos/postproc.cc b/src/twaalgos/postproc.cc index 9ed0d2263848a02a0cf8b384974ec4ba20f7204d..0b4b019e89b603dab6a11d4cdd680840854e2f26 100644 --- a/src/twaalgos/postproc.cc +++ b/src/twaalgos/postproc.cc @@ -109,6 +109,8 @@ namespace spot twa_graph_ptr postprocessor::do_ba_simul(const twa_graph_ptr& a, int opt) { + if (ba_simul_ <= 0) + return a; switch (opt) { case 0: @@ -130,8 +132,6 @@ namespace spot degen_reset_, degen_order_, degen_cache_, degen_lskip_, degen_lowinit_); - if (ba_simul_ <= 0) - return d; return do_ba_simul(d, ba_simul_); } @@ -243,11 +243,18 @@ namespace spot // at hard levels if we want a small output. if (!dba || (level_ == High && PREF_ == Small)) { - sim = do_simul(a, simul_); - // Degeneralize the result of the simulation if needed. - // No need to do that if tba_determinisation_ will be used. - if (type_ == BA && !tba_determinisation_) - sim = do_degen(sim); + if (type_ == BA && a->is_sba() && !tba_determinisation_) + { + sim = do_ba_simul(a, ba_simul_); + } + else + { + sim = do_simul(a, simul_); + // Degeneralize the result of the simulation if needed. + // No need to do that if tba_determinisation_ will be used. + if (type_ == BA && !tba_determinisation_) + sim = do_degen(sim); + } } // If WDBA failed, but the simulation returned a deterministic @@ -401,7 +408,6 @@ namespace spot sim = nullptr; } - if (type_ == TGBA && level_ == High && scc_filter_ != 0) { if (dba && !dba_is_minimal) // WDBA is already clean.