Store membership to acceptance sets using bitsets, not BDDs.

This is a huge patch, that took over a month to complete.  The bit sets
are currently restricted to what 'unsigned can store', but it should be
easy to extend it to 'uint64_t' should we need it.

* NEWS: Update.
* src/tgba/acc.hh: New file.
* src/tgbatest/acc.cc, src/tgbatest/acc.test: Test it.
* src/tgba/tgbakvcomplement.cc, src/tgba/tgbakvcomplement.hh,
src/tgba/tgbasgba.cc, src/tgba/tgbasgba.hh: Delete.  The KV
complementation is too slow to be used in practice, and I somehow broke
it during the conversion to bitsets.  The tgba->sgba conversion was only
used for the KV complementation, and should be better redone on
tgba_digraph_ptr should it be needed again.
* src/bin/ltlcross.cc, src/dstarparse/dra2ba.cc,
src/dstarparse/nsa2tgba.cc, src/graphtest/tgbagraph.cc,
src/graphtest/tgbagraph.test, src/kripke/fairkripke.cc,
src/kripke/fairkripke.hh, src/kripke/kripke.cc, src/kripke/kripke.hh,
src/kripke/kripkeexplicit.cc, src/kripke/kripkeexplicit.hh,
src/misc/hash.hh, src/neverparse/neverclaimparse.yy, src/priv/accmap.hh,
src/ta/ta.cc, src/ta/ta.hh, src/ta/taexplicit.cc, src/ta/taexplicit.hh,
src/ta/taproduct.cc, src/ta/taproduct.hh, src/ta/tgta.cc,
src/ta/tgta.hh, src/ta/tgtaexplicit.cc, src/ta/tgtaexplicit.hh,
src/ta/tgtaproduct.cc, src/ta/tgtaproduct.hh, src/taalgos/dotty.cc,
src/taalgos/emptinessta.cc, src/taalgos/minimize.cc,
src/taalgos/tgba2ta.cc, src/tgba/Makefile.am, src/tgba/fwd.hh,
src/tgba/taatgba.cc, src/tgba/taatgba.hh, src/tgba/tgba.cc,
src/tgba/tgba.hh, src/tgba/tgbagraph.cc, src/tgba/tgbagraph.hh,
src/tgba/tgbamask.cc, src/tgba/tgbamask.hh, src/tgba/tgbaproduct.cc,
src/tgba/tgbaproduct.hh, src/tgba/tgbaproxy.cc, src/tgba/tgbaproxy.hh,
src/tgba/tgbasafracomplement.cc, src/tgba/tgbasafracomplement.hh,
src/tgbaalgos/bfssteps.cc, src/tgbaalgos/complete.cc,
src/tgbaalgos/compsusp.cc, src/tgbaalgos/degen.cc,
src/tgbaalgos/dotty.cc, src/tgbaalgos/dtbasat.cc,
src/tgbaalgos/dtgbacomp.cc, src/tgbaalgos/dtgbasat.cc,
src/tgbaalgos/dupexp.cc, src/tgbaalgos/emptiness.cc,
src/tgbaalgos/emptiness.hh, src/tgbaalgos/gtec/ce.cc,
src/tgbaalgos/gtec/gtec.cc, src/tgbaalgos/gtec/gtec.hh,
src/tgbaalgos/gtec/sccstack.cc, src/tgbaalgos/gtec/sccstack.hh,
src/tgbaalgos/gv04.cc, src/tgbaalgos/hoaf.cc,
src/tgbaalgos/isweakscc.cc, src/tgbaalgos/lbtt.cc,
src/tgbaalgos/ltl2tgba_fm.cc, src/tgbaalgos/magic.cc,
src/tgbaalgos/ndfs_result.hxx, src/tgbaalgos/neverclaim.cc,
src/tgbaalgos/postproc.cc, src/tgbaalgos/powerset.cc,
src/tgbaalgos/randomgraph.cc, src/tgbaalgos/randomgraph.hh,
src/tgbaalgos/reducerun.cc, src/tgbaalgos/replayrun.cc,
src/tgbaalgos/safety.cc, src/tgbaalgos/save.cc, src/tgbaalgos/scc.cc,
src/tgbaalgos/scc.hh, src/tgbaalgos/sccfilter.cc,
src/tgbaalgos/sccinfo.cc, src/tgbaalgos/sccinfo.hh,
src/tgbaalgos/se05.cc, src/tgbaalgos/simulation.cc,
src/tgbaalgos/simulation.hh, src/tgbaalgos/stats.cc,
src/tgbaalgos/stripacc.cc, src/tgbaalgos/tau03.cc,
src/tgbaalgos/tau03opt.cc, src/tgbaalgos/weight.cc,
src/tgbaalgos/weight.hh, src/tgbaparse/tgbaparse.yy,
src/tgbatest/Makefile.am, src/tgbatest/complementation.cc,
src/tgbatest/complementation.test, src/tgbatest/degenlskip.test,
src/tgbatest/det.test, src/tgbatest/dstar.test, src/tgbatest/emptchk.cc,
src/tgbatest/explpro2.test, src/tgbatest/explpro3.test,
src/tgbatest/explpro4.test, src/tgbatest/explprod.test,
src/tgbatest/ltl2tgba.cc, src/tgbatest/ltl2tgba.test,
src/tgbatest/maskacc.cc, src/tgbatest/maskacc.test,
src/tgbatest/neverclaimread.test, src/tgbatest/randtgba.cc,
src/tgbatest/readsave.test, src/tgbatest/sim.test,
src/tgbatest/sim2.test, src/tgbatest/spotlbtt.test,
src/tgbatest/tgbaread.test, src/tgbatest/tripprod.test,
iface/dve2/dve2.cc: Adjust or use to the new acceptance interface.
This commit is contained in:
Alexandre Duret-Lutz 2014-09-29 18:17:34 +02:00
parent 37ece2b878
commit 2c764fb3c7
125 changed files with 1950 additions and 3254 deletions

View file

@ -31,6 +31,7 @@ noinst_PROGRAMS = ltl2tgba randtgba
check_SCRIPTS = defs
# Keep this sorted alphabetically.
check_PROGRAMS = \
acc \
bitvect \
complement \
checkpsl \
@ -49,6 +50,7 @@ check_PROGRAMS = \
tripprod
# Keep this sorted alphabetically.
acc_SOURCES = acc.cc
bitvect_SOURCES = bitvect.cc
checkpsl_SOURCES = checkpsl.cc
checkta_SOURCES = checkta.cc
@ -72,6 +74,7 @@ tripprod_SOURCES = tripprod.cc
# Keep this sorted by STRENGTH. Test basic things first,
# because such failures will be easier to diagnose and fix.
TESTS = \
acc.test \
intvcomp.test \
bitvect.test \
ltlcross3.test \
@ -85,13 +88,10 @@ TESTS = \
readsave.test \
maskacc.test \
simdet.test \
sim.test \
sim2.test \
ltl2tgba.test \
ltl2neverclaim.test \
ltl2neverclaim-lbtt.test \
ltl2ta.test \
ltl2ta2.test \
ltlprod.test \
explprod.test \
explpro2.test \
@ -115,6 +115,8 @@ TESTS = \
ltlcross4.test \
ltl2dstar.test \
ltl2dstar2.test \
ltl2ta.test \
ltl2ta2.test \
randtgba.test \
emptchk.test \
emptchke.test \
@ -133,6 +135,8 @@ TESTS = \
randpsl.test \
cycles.test
XFAIL_TESTS = sim.test
EXTRA_DIST = $(TESTS)
distclean-local:

107
src/tgbatest/acc.cc Normal file
View file

@ -0,0 +1,107 @@
// -*- coding: utf-8 -*-
// Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
#include <iostream>
#include <iterator>
#include <vector>
#include <cassert>
#include <cstdlib>
#include "tgba/acc.hh"
void check(spot::acc_cond& ac, spot::acc_cond::mark_t m)
{
std::cout << '#' << m.count() << ": " << ac.format(m);
if (!m)
std::cout << "empty";
if (ac.accepting(m))
std::cout << " accepting";
std::cout << '\n';
}
int main()
{
auto d = spot::make_bdd_dict();
spot::acc_cond ac(d, 4);
auto m1 = ac.marks({0, 2});
auto m2 = ac.marks({0, 3});
auto m3 = ac.marks({2, 1});
check(ac, m1);
check(ac, m2);
check(ac, m3);
check(ac, m1 | m2);
check(ac, m2 & m1);
check(ac, m1 | m2 | m3);
ac.add_set();
check(ac, m1);
check(ac, m2);
check(ac, m3);
check(ac, m1 | m2);
check(ac, m2 & m1);
check(ac, m1 | m2 | m3);
check(ac, m2 & m3);
check(ac, ac.comp(m2 & m3));
spot::acc_cond ac2(d, ac.num_sets());
check(ac2, m3);
spot::acc_cond ac3(d, ac.num_sets() + ac2.num_sets());
std::cout << ac.num_sets() << " + "
<< ac2.num_sets() << " = " << ac3.num_sets() << '\n';
auto m5 = ac3.join(ac, m2, ac2, m3);
check(ac3, m5);
auto m6 = ac3.join(ac, ac.comp(m2 & m3), ac2, m3);
check(ac3, m6);
auto m7 = ac3.join(ac, ac.comp(m2 & m3), ac2, ac2.all_sets());
check(ac3, m7);
std::vector<unsigned> v;
ac3.fill_from(m7, std::back_inserter(v));
const char* comma = "";
for (auto i: v)
{
std::cout << comma << i;
comma = ",";
};
std::cout << '\n';
spot::acc_cond ac4(d);
check(ac4, ac4.all_sets());
check(ac4, ac4.comp(ac4.all_sets()));
check(ac, (m1 | m2).remove_some(2));
std::vector<spot::acc_cond::mark_t> s = { m1, m2, m3 };
check(ac, ac.useless(s.begin(), s.end()));
s.push_back(ac.mark(4));
auto u = ac.useless(s.begin(), s.end());
check(ac, u);
std::cout << "stripping\n";
for (auto& v: s)
{
check(ac, v);
check(ac, ac.strip(v, u));
}
}

63
src/tgbatest/acc.test Executable file
View file

@ -0,0 +1,63 @@
#!/bin/sh
# Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
. ./defs
set -e
cat >expect <<EOF
#2: {0,2}
#2: {0,3}
#2: {1,2}
#3: {0,2,3}
#1: {0}
#4: {0,1,2,3} accepting
#2: {0,2}
#2: {0,3}
#2: {1,2}
#3: {0,2,3}
#1: {0}
#4: {0,1,2,3}
#0: empty
#5: {0,1,2,3,4} accepting
#2: {1,2}
5 + 5 = 10
#4: {0,3,6,7}
#7: {0,1,2,3,4,6,7}
#10: {0,1,2,3,4,5,6,7,8,9} accepting
0,1,2,3,4,5,6,7,8,9
#0: empty accepting
#0: empty accepting
#1: {3}
#4: {0,1,2,3}
#2: {0,2}
stripping
#2: {0,2}
#0: empty
#2: {0,3}
#1: {1}
#2: {1,2}
#1: {0}
#1: {4}
#1: {2}
EOF
run 0 ../acc | tee stdout
diff stdout expect

View file

@ -34,23 +34,18 @@
#include "tgbaalgos/degen.hh"
#include "tgba/tgbasafracomplement.hh"
#include "tgba/tgbakvcomplement.hh"
void usage(const char* prog)
{
std::cout << "usage: " << prog << " [options]" << std::endl;
std::cout << "with options" << std::endl
<< "-b Output in spot's format" << std::endl
<< "-S Use Safra's complementation "
<< "instead of Kupferman&Vardi's" << std::endl
<< "-s buchi_automaton display the safra automaton"
<< std::endl
<< "-a buchi_automaton display the complemented automaton"
<< std::endl
<< "-astat buchi_automaton statistics for !a" << std::endl
<< "-fstat formula statistics for !A_f" << std::endl
<< "-f formula test !A_f and !A_!f" << std::endl
<< "-p formula print the automaton for f" << std::endl;
<< "-b Output in spot's format\n"
<< "-s buchi_automaton display the safra automaton\n"
<< "-a buchi_automaton display the complemented automaton\n"
<< "-astat buchi_automaton statistics for !a\n"
<< "-fstat formula statistics for !A_f\n"
<< "-f formula test !A_f and !A_!f\n"
<< "-p formula print the automaton for f\n";
}
int main(int argc, char* argv[])
@ -62,7 +57,6 @@ int main(int argc, char* argv[])
int return_value = 0;
bool stats = false;
bool formula = false;
bool safra = false;
bool print_formula = false;
bool save_spot = false;
@ -98,10 +92,8 @@ int main(int argc, char* argv[])
switch (argv[i][1])
{
case 'S':
safra = true; break;
case 's':
safra = true; print_safra = true; break;
print_safra = true; break;
case 'a':
print_automaton = true; break;
case 'f':
@ -136,10 +128,7 @@ int main(int argc, char* argv[])
spot::tgba_ptr complement = 0;
if (safra)
complement = spot::make_safra_complement(a);
else
complement = spot::make_kv_complement(a);
complement = spot::make_safra_complement(a);
if (print_automaton)
{
@ -168,10 +157,7 @@ int main(int argc, char* argv[])
a = spot::ltl_to_tgba_fm(f1, dict);
spot::tgba_ptr complement = 0;
if (safra)
complement = spot::make_safra_complement(a);
else
complement = spot::make_kv_complement(a);
complement = spot::make_safra_complement(a);
spot::dotty_reachable(std::cout, complement);
f1->destroy();
@ -206,30 +192,21 @@ int main(int argc, char* argv[])
std::cout << "Original: "
<< a_size.states << ", "
<< a_size.transitions << ", "
<< a->number_of_acceptance_conditions()
<< a->acc().num_sets()
<< std::endl;
auto buchi = spot::degeneralize(a);
std::cout << "Buchi: "
<< buchi->num_states()
<< buchi->num_transitions()
<< buchi->number_of_acceptance_conditions()
<< buchi->acc().num_sets()
<< std::endl;
spot::tgba_statistics b_size = spot::stats_reachable(safra_complement);
std::cout << "Safra Complement: "
<< b_size.states << ", "
<< b_size.transitions << ", "
<< safra_complement->number_of_acceptance_conditions()
<< std::endl;
auto complement = spot::make_kv_complement(a);
b_size = spot::stats_reachable(complement);
std::cout << "GBA Complement: "
<< b_size.states << ", "
<< b_size.transitions << ", "
<< complement->number_of_acceptance_conditions()
<< safra_complement->acc().num_sets()
<< std::endl;
if (formula)
@ -242,7 +219,7 @@ int main(int argc, char* argv[])
std::cout << "Not Formula: "
<< a_size.states << ", "
<< a_size.transitions << ", "
<< a2->number_of_acceptance_conditions()
<< a2->acc().num_sets()
<< std::endl;
f1->destroy();
@ -262,18 +239,9 @@ int main(int argc, char* argv[])
spot::ltl::unop::instance(spot::ltl::unop::Not, f1->clone());
spot::tgba_ptr Anf = spot::ltl_to_tgba_fm(nf1, dict);
spot::tgba_ptr nAf;
spot::tgba_ptr nAnf;
if (safra)
{
nAf = spot::make_safra_complement(Af);
nAnf = spot::make_safra_complement(Anf);
}
else
{
nAf = spot::make_kv_complement(Af);
nAnf = spot::make_kv_complement(Anf);
}
spot::tgba_ptr nAf = spot::make_safra_complement(Af);
spot::tgba_ptr nAnf = spot::make_safra_complement(Anf);
auto ec = spot::couvreur99(spot::product(nAf, nAnf));
auto res = ec->check();
spot::tgba_statistics a_size = spot::stats_reachable(ec->automaton());
@ -282,16 +250,22 @@ int main(int argc, char* argv[])
<< "Transitions: "
<< a_size.transitions << std::endl
<< "Acc Cond: "
<< ec->automaton()->number_of_acceptance_conditions()
<< ec->automaton()->acc().num_sets()
<< std::endl;
if (res)
{
std::cout << "FAIL";
return_value = 1;
}
{
std::cout << "FAIL\n";
return_value = 1;
if (auto run = res->accepting_run())
{
spot::dotty_reachable(std::cout, ec->automaton(), false);
spot::print_tgba_run(std::cout, ec->automaton(), run);
}
}
else
std::cout << "OK";
std::cout << std::endl;
{
std::cout << "OK\n";
}
nf1->destroy();
f1->destroy();
}

View file

@ -1,6 +1,6 @@
#!/bin/sh
# Copyright (C) 2009, 2011 Laboratoire de Recherche et Développement
# de l'Epita (LRDE).
# Copyright (C) 2009, 2011, 2014 Laboratoire de Recherche et
# Développement de l'Epita (LRDE).
#
# This file is part of Spot, a model checking library.
#
@ -23,26 +23,19 @@ set -e
while read f; do
run 0 ../complement -f "$f"
run 0 ../complement -S -f "$f"
done <<EOF
GFa
FGa
<>p1->(p0Up1)
<>p1->p0
<>p1->(p0 U p1)
[](p0-><>p3)
a U b
EOF
while read f; do
run 0 ../complement -S -f "$f"
done <<EOF
GFa&&FGa
[] ((p2 && ! p1) -> (p0 U (p1 || [] p0)))
[] (p2 -> ((! p0 && ! p1) U (p1 || ((p0 && ! p1) U (p1 || ((! p0 && ! p1) \
U (p1 || ((p0 && ! p1) U ((p1 || (! p0 U (p1 || [] ! p0))) || [] p0)))))))))
EOF
# The following test-case was supplied by Martin Dieguez Lodeiro to
# demonstrate a bug in our Safra implementation.
cat >x.tgba <<EOF
@ -57,7 +50,7 @@ EOF
# x.tgba accepts some run
run 0 ../ltl2tgba -X -e x.tgba
# so does its complement
run 0 ../complement -b -S -a x.tgba > nx.tgba
run 0 ../complement -b -a x.tgba > nx.tgba
run 0 ../ltl2tgba -X -e nx.tgba
# however the intersection of both should not
# accept any run.

View file

@ -37,16 +37,16 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 1 [label="a & b\n{Acc[1]}"]
1 -> 2 [label="!a & b\n{Acc[1]}"]
1 -> 3 [label="!b\n{Acc[1]}"]
1 -> 1 [label="a & b\n{0}"]
1 -> 2 [label="!a & b\n{0}"]
1 -> 3 [label="!b\n{0}"]
2 [label="1"]
2 -> 1 [label="a\n"]
2 -> 2 [label="!a\n"]
2 -> 1 [label="a"]
2 -> 2 [label="!a"]
3 [label="2"]
3 -> 1 [label="a & b\n"]
3 -> 2 [label="!a & b\n"]
3 -> 3 [label="!b\n"]
3 -> 1 [label="a & b"]
3 -> 2 [label="!a & b"]
3 -> 3 [label="!b"]
}
EOF
@ -56,13 +56,13 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 2 [label="1\n{Acc[1]}"]
2 [label="2"]
2 -> 3 [label="b\n"]
2 -> 2 [label="!b\n"]
3 [label="1"]
3 -> 1 [label="a\n"]
3 -> 3 [label="!a\n"]
1 -> 2 [label="1\n{0}"]
2 [label="1"]
2 -> 3 [label="b"]
2 -> 2 [label="!b"]
3 [label="2"]
3 -> 1 [label="a"]
3 -> 3 [label="!a"]
}
EOF

View file

@ -71,20 +71,20 @@ EOF
# FIXME: we should improve this output
cat >ex.tgba <<'EOF'
acc = "1";
acc = "0";
"0", "1", "a",;
"0", "0", "!a",;
"0", "3", "!a",;
"1", "2", "a",;
"1", "0", "!a",;
"1", "3", "!a",;
"3", "3", "!a", "1";
"3", "3", "!a", "0";
"2", "2", "a",;
"2", "0", "!a",;
"2", "5", "a",;
"2", "3", "!a",;
"5", "5", "a", "1";
"5", "3", "!a", "1";
"5", "5", "a", "0";
"5", "3", "!a", "0";
EOF
@ -98,15 +98,15 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 2 [label="1\n"]
1 -> 2 [label="1"]
2 [label="1"]
2 -> 2 [label="1\n"]
2 -> 3 [label="!a\n"]
2 -> 4 [label="!b\n"]
2 -> 2 [label="1"]
2 -> 3 [label="!a"]
2 -> 4 [label="!b"]
3 [label="3"]
3 -> 3 [label="!a\n{Acc[1]}"]
3 -> 3 [label="!a\n{0}"]
4 [label="5"]
4 -> 4 [label="!b\n{Acc[1]}"]
4 -> 4 [label="!b\n{0}"]
}
EOF
diff out.tgba ex.tgba

View file

@ -63,13 +63,13 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 1 [label="a & !b\n"]
1 -> 2 [label="!a & !b\n"]
1 -> 3 [label="b\n"]
1 -> 1 [label="a & !b"]
1 -> 2 [label="!a & !b"]
1 -> 3 [label="b"]
2 [label="1"]
2 -> 2 [label="1\n"]
2 -> 2 [label="1"]
3 [label="2"]
3 -> 3 [label="1\n"]
3 -> 3 [label="1"]
}
EOF
@ -83,10 +83,10 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 1 [label="a & !b\n"]
1 -> 2 [label="b\n"]
1 -> 1 [label="a & !b"]
1 -> 2 [label="b"]
2 [label="1", peripheries=2]
2 -> 2 [label="1\n{Acc[1]}"]
2 -> 2 [label="1\n{0}"]
}
EOF
@ -126,30 +126,30 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 2 [label="1\n"]
1 -> 3 [label="1\n"]
1 -> 2 [label="1"]
1 -> 3 [label="1"]
2 [label="1"]
2 -> 2 [label="!a\n"]
2 -> 3 [label="!a\n"]
2 -> 4 [label="a\n"]
2 -> 5 [label="a\n"]
2 -> 2 [label="!a"]
2 -> 3 [label="!a"]
2 -> 4 [label="a"]
2 -> 5 [label="a"]
3 [label="2"]
3 -> 6 [label="!a\n"]
3 -> 5 [label="a\n{Acc[\"0\"]}"]
3 -> 6 [label="!a"]
3 -> 5 [label="a\n{0}"]
4 [label="3"]
4 -> 2 [label="!a\n"]
4 -> 3 [label="!a\n"]
4 -> 4 [label="a\n"]
4 -> 5 [label="a\n"]
4 -> 2 [label="!a"]
4 -> 3 [label="!a"]
4 -> 4 [label="a"]
4 -> 5 [label="a"]
5 [label="4"]
5 -> 6 [label="!a\n"]
5 -> 5 [label="a\n{Acc[\"0\"]}"]
5 -> 6 [label="!a"]
5 -> 5 [label="a\n{0}"]
6 [label="5"]
6 -> 6 [label="!a\n"]
6 -> 7 [label="a\n"]
6 -> 6 [label="!a"]
6 -> 7 [label="a"]
7 [label="6"]
7 -> 6 [label="!a\n"]
7 -> 7 [label="a\n"]
7 -> 6 [label="!a"]
7 -> 7 [label="a"]
}
EOF
@ -214,23 +214,23 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 2 [label="!a & !b\n"]
1 -> 3 [label="a & !b\n"]
1 -> 4 [label="!a & b\n"]
1 -> 5 [label="a & b\n"]
1 -> 2 [label="!a & !b"]
1 -> 3 [label="a & !b"]
1 -> 4 [label="!a & b"]
1 -> 5 [label="a & b"]
2 [label="1"]
2 -> 2 [label="!b\n"]
2 -> 4 [label="b\n"]
2 -> 2 [label="!b"]
2 -> 4 [label="b"]
3 [label="2", peripheries=2]
3 -> 2 [label="!a & !b\n{Acc[1]}"]
3 -> 3 [label="a & !b\n{Acc[1]}"]
3 -> 4 [label="!a & b\n{Acc[1]}"]
3 -> 5 [label="a & b\n{Acc[1]}"]
3 -> 2 [label="!a & !b\n{0}"]
3 -> 3 [label="a & !b\n{0}"]
3 -> 4 [label="!a & b\n{0}"]
3 -> 5 [label="a & b\n{0}"]
4 [label="3", peripheries=2]
4 -> 4 [label="1\n{Acc[1]}"]
4 -> 4 [label="1\n{0}"]
5 [label="4", peripheries=2]
5 -> 4 [label="!a\n{Acc[1]}"]
5 -> 5 [label="a\n{Acc[1]}"]
5 -> 4 [label="!a\n{0}"]
5 -> 5 [label="a\n{0}"]
}
EOF
@ -259,10 +259,10 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 1 [label="1\n"]
1 -> 2 [label="1\n"]
1 -> 1 [label="1"]
1 -> 2 [label="1"]
2 [label="1"]
2 -> 2 [label="1\n"]
2 -> 2 [label="1"]
}
EOF

View file

@ -132,7 +132,7 @@ main(int argc, char** argv)
{
auto a = aut[j];
std::cout << "** Testing aut[" << j << "] using " << algo << '\n';
unsigned n_acc = a->number_of_acceptance_conditions();
unsigned n_acc = a->acc().num_sets();
unsigned n_max = i->max_acceptance_conditions();
if (n_max < n_acc)
{

View file

@ -39,9 +39,9 @@ s1, s3, "a", p3;
EOF
cat >expected <<'EOF'
acc = "p2$1" "p3" "p2" "p1";
"0 * 0", "1 * 1", "!a & b", "p2$1" "p1";
"0 * 0", "2 * 2", "a & !b", "p3" "p2";
acc = "0" "1" "2" "3";
"0 * 0", "1 * 1", "!a & b", "0" "2";
"0 * 0", "2 * 2", "a & !b", "1" "3";
EOF
run 0 ../explprod input1 input2 | tee stdout

View file

@ -39,9 +39,9 @@ s1, s3, "a", p3;
EOF
cat >expected <<EOF
acc = "p2" "p3";
"0 * 0", "1 * 1", "!a & b", "p2";
"0 * 0", "2 * 2", "a & !b", "p3";
acc = "0" "1";
"0 * 0", "1 * 1", "!a & b", "0";
"0 * 0", "2 * 2", "a & !b", "1";
EOF
run 0 ../explprod input1 input2 |

View file

@ -39,9 +39,9 @@ s1, s1, "!a", p1;
EOF
cat >expected <<'EOF'
acc = "p1$1" "p1";
"0 * 0", "0 * 0", "a", "p1";
"0 * 0", "0 * 0", "!a", "p1$1";
acc = "0" "1";
"0 * 0", "0 * 0", "a", "0";
"0 * 0", "0 * 0", "!a", "1";
EOF
run 0 ../explprod input1 input2 > stdout

View file

@ -41,10 +41,10 @@ s2, s1, "a", p3;
EOF
cat >expected <<EOF
acc = "p3" "p2" "p1";
"0 * 0", "1 * 1", "a & b", "p2" "p1";
"0 * 0", "2 * 1", "b", "p2" "p1";
"2 * 1", "1 * 0", "a & c", "p3" "p1";
acc = "0" "1" "2";
"0 * 0", "1 * 1", "a & b", "0" "1";
"0 * 0", "2 * 1", "b", "0" "1";
"2 * 1", "1 * 0", "a & c", "0" "2";
EOF
run 0 ../explprod input1 input2 | tee stdout

View file

@ -37,7 +37,6 @@
#include "tgbaalgos/dotty.hh"
#include "tgbaalgos/lbtt.hh"
#include "tgbaalgos/hoaf.hh"
#include "tgba/tgbasgba.hh"
#include "tgbaalgos/degen.hh"
#include "tgba/tgbaproduct.hh"
#include "tgbaalgos/reducerun.hh"
@ -187,8 +186,6 @@ syntax(char* prog)
<< "Automaton degeneralization (after translation):"
<< std::endl
<< " -lS move generalized acceptance conditions to states "
<< "(SGBA)" << std::endl
<< " -DT degeneralize the automaton as a TBA" << std::endl
<< " -DS degeneralize the automaton as an SBA" << std::endl
<< " (append z/Z, o/O, l/L: to turn on/off options "
@ -339,7 +336,6 @@ checked_main(int argc, char** argv)
bool paper_opt = false;
bool utf8_opt = false;
enum { NoDegen, DegenTBA, DegenSBA } degeneralize_opt = NoDegen;
enum { TransitionLabeled, StateLabeled } labeling_opt = TransitionLabeled;
enum { TransFM, TransTAA, TransCompo } translation = TransFM;
bool fm_red = false;
bool fm_exprop_opt = false;
@ -378,7 +374,6 @@ checked_main(int argc, char** argv)
unsigned opt_o_threshold = 0;
bool opt_dtgbacomp = false;
bool reject_bigger = false;
bool opt_bisim_ta = false;
bool opt_monitor = false;
bool containment = false;
bool spin_comments = false;
@ -395,6 +390,7 @@ checked_main(int argc, char** argv)
bool reduction_dont_care_sim = false;
int limit_dont_care_sim = 0;
bool reduction_iterated_dont_care_sim = false;
bool opt_bisim_ta = false;
bool ta_opt = false;
bool tgta_opt = false;
bool opt_with_artificial_initial_state = true;
@ -597,10 +593,6 @@ checked_main(int argc, char** argv)
fair_loop_approx = true;
translation = TransFM;
}
else if (!strcmp(argv[formula_index], "-lS"))
{
labeling_opt = StateLabeled;
}
else if (!strcmp(argv[formula_index], "-m"))
{
opt_reduce = true;
@ -1280,7 +1272,7 @@ checked_main(int argc, char** argv)
assume_sba = false;
}
unsigned int n_acc = a->number_of_acceptance_conditions();
unsigned int n_acc = a->acc().num_sets();
if (echeck_inst
&& degeneralize_opt == NoDegen
&& n_acc > 1
@ -1305,13 +1297,9 @@ checked_main(int argc, char** argv)
tm.stop("degeneralization");
assume_sba = true;
}
else if (labeling_opt == StateLabeled)
{
a = spot::make_sgba(a);
}
}
if (opt_determinize && a->number_of_acceptance_conditions() <= 1
if (opt_determinize && a->acc().num_sets() <= 1
&& (!f || f->is_syntactic_recurrence()))
{
tm.start("determinization 2");
@ -1512,7 +1500,7 @@ checked_main(int argc, char** argv)
assume_sba = false;
unsigned int n_acc = a->number_of_acceptance_conditions();
unsigned int n_acc = a->acc().num_sets();
if (echeck_inst
&& degeneralize_opt == NoDegen
&& n_acc > 1
@ -1541,8 +1529,7 @@ checked_main(int argc, char** argv)
if (echeck_inst
&& (a->number_of_acceptance_conditions()
< echeck_inst->min_acceptance_conditions()))
&& (a->acc().num_sets() < echeck_inst->min_acceptance_conditions()))
{
if (!paper_opt)
{
@ -1720,8 +1707,7 @@ checked_main(int argc, char** argv)
<< a_size.states << ", "
<< std::right << std::setw(10)
<< a_size.transitions << ", ";
std::cout <<
ec->automaton()->number_of_acceptance_conditions()
std::cout << ec->automaton()->acc().num_sets()
<< ", ";
auto ecs = ec->emptiness_check_statistics();
if (ecs)

View file

@ -160,7 +160,7 @@ grep 'states: 1$' stdout
run 0 ../ltl2tgba -M -f "F(a & F(b))" | grep ' ->' > stdout
cat >expected <<EOF
0 -> 1
1 -> 1 [label="1\n"]
1 -> 1 [label="1"]
EOF
cmp stdout expected

View file

@ -49,13 +49,11 @@ main(int argc, char** argv)
if (spot::format_tgba_parse_errors(std::cerr, argv[1], pel))
return 2;
bdd allneg = aut->neg_acceptance_conditions();
unsigned nsets = aut->acc().num_sets();
for (bdd cur = allneg; cur != bddtrue; cur = bdd_low(cur))
for (unsigned n = 0; n < nsets; ++n)
{
int i = bdd_var(cur);
bdd one = bdd_compose(allneg, bdd_nithvar(i), i);
auto masked = spot::build_tgba_mask_acc_ignore(aut, one);
auto masked = spot::build_tgba_mask_acc_ignore(aut, n);
spot::tgba_save_reachable(std::cout, masked);
}
}
@ -63,7 +61,7 @@ main(int argc, char** argv)
assert(spot::ltl::unop::instance_count() == 0);
assert(spot::ltl::binop::instance_count() == 0);
assert(spot::ltl::multop::instance_count() == 0);
assert(spot::ltl::atomic_prop::instance_count() != 0);
assert(spot::ltl::bunop::instance_count() == 0);
assert(spot::ltl::atomic_prop::instance_count() == 0);
return exit_code;
}

View file

@ -34,16 +34,16 @@ s4, s4, "a", A B;
EOF
cat >expect1 <<EOF
acc = "B" "A";
"0", "2", "b", "B";
acc = "0" "1";
"0", "2", "b", "1";
"2", "1", "b",;
"1", "2", "a",;
"1", "3", "a", "B";
acc = "B" "A";
"0", "1", "a", "A";
"1", "3", "a", "1";
acc = "0" "1";
"0", "1", "a", "0";
"1", "2", "a",;
"2", "1", "b",;
"2", "3", "b", "A";
"2", "3", "b", "0";
EOF
run 0 ../maskacc input1 | tee stdout

View file

@ -48,14 +48,14 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 1 [label="1\n"]
1 -> 2 [label="p0 & p1\n"]
1 -> 1 [label="1"]
1 -> 2 [label="p0 & p1"]
2 [label="1"]
2 -> 3 [label="p1 & !p0\n"]
2 -> 2 [label="!p1\n"]
2 -> 1 [label="!p1\n"]
2 -> 3 [label="p1 & !p0"]
2 -> 2 [label="!p1"]
2 -> 1 [label="!p1"]
3 [label="2", peripheries=2]
3 -> 3 [label="1\n{Acc[1]}"]
3 -> 3 [label="1\n{0}"]
}
EOF
@ -92,14 +92,14 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 1 [label="1\n"]
1 -> 2 [label="p0 & p1\n"]
1 -> 1 [label="1"]
1 -> 2 [label="p0 & p1"]
2 [label="1"]
2 -> 3 [label="p1 & !p0\n"]
2 -> 2 [label="!p1\n"]
2 -> 1 [label="!p1\n"]
2 -> 3 [label="p1 & !p0"]
2 -> 2 [label="!p1"]
2 -> 1 [label="!p1"]
3 [label="2", peripheries=2]
3 -> 3 [label="1\n{Acc[1]}"]
3 -> 3 [label="1\n{0}"]
}
EOF
@ -131,9 +131,9 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 2 [label="p1\n{Acc[1]}"]
1 -> 2 [label="p1\n{0}"]
2 [label="1", peripheries=2]
2 -> 2 [label="1\n{Acc[1]}"]
2 -> 2 [label="1\n{0}"]
}
EOF

View file

@ -908,11 +908,11 @@ main(int argc, char** argv)
spot::tgba_ptr a =
spot::random_graph(opt_n, opt_d, apf, dict,
opt_n_acc, opt_a, opt_t, &env);
opt_n_acc, opt_a, opt_t);
if (formula)
a = spot::product(formula, a);
int real_n_acc = a->number_of_acceptance_conditions();
int real_n_acc = a->acc().num_sets();
if (opt_dot)
{

View file

@ -36,9 +36,9 @@ EOF
../ltl2tgba -b -X input > stdout
cat >expected <<\EOF
acc = "c" "d";
"0", "1", "a & !b", "c" "d";
"1", "2", "\"F\\G\"", "c";
acc = "0" "1";
"0", "1", "a & !b", "0" "1";
"1", "2", "\"F\\G\"", "0";
"2", "0", "1",;
EOF
@ -71,11 +71,11 @@ s2, s1, "b&a", c;
EOF
cat >expected <<\EOF
acc = "c";
"0", "1", "a", "c";
acc = "0";
"0", "1", "a", "0";
"0", "1", "!b",;
"1", "0", "!b",;
"1", "0", "a", "c";
"1", "0", "a", "0";
EOF
run 0 ../ltl2tgba -b -X input > stdout

View file

@ -34,9 +34,9 @@ EOF
run 0 ../ltl2tgba -X -RDCS -b in.tgba > out.tgba
cat >expected.tgba <<EOF
acc = "1";
"3", "2", "b",;
"2", "2", "a", "1";
acc = "0";
"0", "3", "b",;
"3", "3", "a", "0";
EOF
diff out.tgba expected.tgba

View file

@ -1,6 +1,6 @@
#! /bin/sh
# -*- coding: utf-8 -*-
# Copyright (C) 2013 Laboratoire de Recherche et Développement
# Copyright (C) 2013, 2014 Laboratoire de Recherche et Développement
# de l'Epita (LRDE).
#
# This file is part of Spot, a model checking library.
@ -24,6 +24,6 @@ set -e
../ltl2tgba -b -x -R3f -RDS '{(a&b)[*3]}<>=>G(a&!b)' > ref
for i in -R3 -R3f '-R3 -RDS' '-R3f -RDS' '-R3 -RDCS' '-R3f -RDCS'; do
for i in -R3 -R3f '-R3 -RDS' '-R3f -RDS'; do
../ltl2tgba -Pref -E -x $i '(X!b R F!a) U (!a | G!b)'
done

View file

@ -139,7 +139,7 @@ Algorithm
Name = "Spot (Couvreur -- FM), don't care simulation"
Path = "${LBTT_TRANSLATE}"
Parameters = "--spot '../ltl2tgba -F -f -t -RDCS -r4 -R3f'"
Enabled = yes
Enabled = no
}
Algorithm
@ -147,7 +147,7 @@ Algorithm
Name = "Spot (Couvreur -- FM), don't care iterated simulation"
Path = "${LBTT_TRANSLATE}"
Parameters = "--spot '../ltl2tgba -F -f -t -RDCIS -r4 -R3f'"
Enabled = yes
Enabled = no
}

View file

@ -39,11 +39,11 @@ digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0"]
1 -> 2 [label="a & !b\n{Acc[d], Acc[c]}"]
1 -> 2 [label="a & !b\n{0,1}"]
2 [label="1"]
2 -> 3 [label="a\n{Acc[c]}"]
2 -> 3 [label="a\n{0}"]
3 [label="2"]
3 -> 1 [label="1\n"]
3 -> 1 [label="1"]
}
EOF

View file

@ -48,13 +48,13 @@ s2, s3,, p4;
EOF
cat >expected <<EOF
acc = "p4" "p3" "p2" "p1";
"0 * 0 * 0", "1 * 1 * 1", "a & b", "p2" "p1";
"0 * 0 * 0", "2 * 1 * 1", "a & b", "p2" "p1";
"0 * 0 * 0", "1 * 1 * 2", "a & b", "p2" "p1";
"0 * 0 * 0", "2 * 1 * 2", "b", "p2" "p1";
"2 * 1 * 1", "1 * 0 * 2", "a & c", "p4" "p3";
"2 * 1 * 2", "1 * 0 * 1", "a & c", "p4" "p3";
acc = "0" "1" "2" "3";
"0 * 0 * 0", "1 * 1 * 1", "a & b", "0" "1";
"0 * 0 * 0", "2 * 1 * 1", "a & b", "0" "1";
"0 * 0 * 0", "1 * 1 * 2", "a & b", "0" "1";
"0 * 0 * 0", "2 * 1 * 2", "b", "0" "1";
"2 * 1 * 1", "1 * 0 * 2", "a & c", "2" "3";
"2 * 1 * 2", "1 * 0 * 1", "a & c", "2" "3";
EOF
run 0 ../tripprod input1 input2 input3 | tee stdout