* src/tgbaalgos/magic.cc: Add a bit state hashing version.

* src/tgbaalgos/se05.cc: Add a bit state hashing version.
* src/tgbaalgos/magic.hh: Make them public.
* src/tgbatest/ltl2tgba.cc: Add the two new emptiness checks.
* src/tgbatest/emptchk.test: Incorporate tests of src/tgbatest/dfs.test.
* src/tgbatest/dfs.test: Introduce new characteristic explicit tests.
This commit is contained in:
Denis Poitrenaud 2004-11-15 12:16:59 +00:00
parent ca6084160e
commit 3ea9771942
7 changed files with 395 additions and 74 deletions

View file

@ -25,6 +25,14 @@
set -e
# All examples are TBA (i.e. they have a unique
# accepting condition). Accepting arcs are
# represented by double arrows.
#
# s1=>s2->s3->(large composant from s4 to s9)
# ^ |
# |_______|
cat >blue_counter <<'EOF'
acc = a;
s1, s2,, a;
@ -72,6 +80,11 @@ EOF
run 0 ./ltl2tgba -emagic_search -X blue_counter
run 0 ./ltl2tgba -ese05_search -X blue_counter
# s1->s2->s3->(large composant from s4 to s9)
# ^ ||
# ||______||
# ||______||
cat >blue_last <<'EOF'
acc = a;
s1, s2,,;
@ -119,6 +132,14 @@ EOF
run 0 ./ltl2tgba -emagic_search -X blue_last
run 0 ./ltl2tgba -ese05_search -X blue_last
# _______
# | |
# | v
# s1->s2->s3->(large composant from s4 to s9)
# || ^
# ||______||
# ||______||
cat >red <<'EOF'
acc = a;
s1, s2,,;

View file

@ -43,8 +43,12 @@ expect_ce()
expect_ce_do -ecouvreur99_shy -f -D "$1"
expect_ce_do -emagic_search "$1"
expect_ce_do -emagic_search -f "$1"
run 0 ./ltl2tgba -ebsh_magic_search "$1"
run 0 ./ltl2tgba -ebsh_magic_search -f "$1"
run 0 ./ltl2tgba -ese05_search "$1"
run 0 ./ltl2tgba -ese05_search -f "$1"
run 0 ./ltl2tgba -ebsh_se05_search "$1"
run 0 ./ltl2tgba -ebsh_se05_search -f "$1"
# Expect multiple accepting runs
test `./ltl2tgba -emagic_search_repeated "$1" | grep Prefix: | wc -l` -ge $2
test `./ltl2tgba -ese05_search_repeated "$1" | grep Prefix: | wc -l` -ge $2
@ -62,8 +66,12 @@ expect_no()
run 0 ./ltl2tgba -Ecouvreur99_shy -f -D "$1"
run 0 ./ltl2tgba -Emagic_search "$1"
run 0 ./ltl2tgba -Emagic_search -f "$1"
run 0 ./ltl2tgba -Ebsh_magic_search "$1"
run 0 ./ltl2tgba -Ebsh_magic_search -f "$1"
run 0 ./ltl2tgba -Ese05_search "$1"
run 0 ./ltl2tgba -Ese05_search -f "$1"
run 0 ./ltl2tgba -Ebsh_se05_search "$1"
run 0 ./ltl2tgba -Ebsh_se05_search -f "$1"
test `./ltl2tgba -emagic_search_repeated "!($1)" |
grep Prefix: | wc -l` -ge $2
test `./ltl2tgba -ese05_search_repeated "!($1)" |

View file

@ -115,8 +115,16 @@ syntax(char* prog)
<< " couvreur99_shy" << std::endl
<< " magic_search" << std::endl
<< " magic_search_repeated" << std::endl
<< " bsh_magic_search[(heap size in Mo - 10Mo by default)]"
<< std::endl
<< " bsh_magic_search_repeated[(heap size in MB - 10MB"
<< " by default)]" << std::endl
<< " se05_search" << std::endl
<< " se05_search_repeated" << std::endl;
<< " se05_search_repeated" << std::endl
<< " bsh_se05_search[(heap size in MB - 10MB by default)]"
<< std::endl
<< " bsh_se05_search_repeated[(heap size in MB - 10MB"
<< " by default)]" << std::endl;
exit(2);
}
@ -134,9 +142,11 @@ main(int argc, char** argv)
int output = 0;
int formula_index = 0;
std::string echeck_algo;
enum { None, Couvreur, Couvreur2, MagicSearch, Se04Search } echeck = None;
enum { None, Couvreur, Couvreur2, MagicSearch, Se05Search } echeck = None;
enum { NoneDup, BFS, DFS } dupexp = NoneDup;
bool magic_many = false;
bool bit_state_hashing = false;
int heap_size = 10*1024*1024;
bool expect_counter_example = false;
bool from_file = false;
int reduc_aut = spot::Reduce_None;
@ -174,23 +184,33 @@ main(int argc, char** argv)
degeneralize_opt = true;
}
else if (!strncmp(argv[formula_index], "-e", 2))
{
if (argv[formula_index][2] != 0)
echeck_algo = argv[formula_index] + 2;
else
echeck_algo = "couvreur99";
expect_counter_example = true;
output = -1;
}
{
if (argv[formula_index][2] != 0)
{
char *p = strchr(argv[formula_index], '(');
if (p && sscanf(p+1, "%d)", &heap_size) == 1)
*p = '\0';
echeck_algo = argv[formula_index] + 2;
}
else
echeck_algo = "couvreur99";
expect_counter_example = true;
output = -1;
}
else if (!strncmp(argv[formula_index], "-E", 2))
{
if (argv[formula_index][2] != 0)
echeck_algo = argv[formula_index] + 2;
else
echeck_algo = "couvreur99";
expect_counter_example = false;
output = -1;
}
{
if (argv[formula_index][2] != 0)
{
char *p = strchr(argv[formula_index], '(');
if (p && sscanf(p+1, "%d)", &heap_size) == 1)
*p = '\0';
echeck_algo = argv[formula_index] + 2;
}
else
echeck_algo = "couvreur99";
expect_counter_example = false;
output = -1;
}
else if (!strcmp(argv[formula_index], "-f"))
{
fm_opt = true;
@ -344,17 +364,43 @@ main(int argc, char** argv)
degeneralize_opt = true;
magic_many = true;
}
else if (echeck_algo == "bsh_magic_search")
{
echeck = MagicSearch;
degeneralize_opt = true;
bit_state_hashing = true;
}
else if (echeck_algo == "bsh_magic_search_repeated")
{
echeck = MagicSearch;
degeneralize_opt = true;
bit_state_hashing = true;
magic_many = true;
}
else if (echeck_algo == "se05_search")
{
echeck = Se04Search;
echeck = Se05Search;
degeneralize_opt = true;
}
else if (echeck_algo == "se05_search_repeated")
{
echeck = Se04Search;
echeck = Se05Search;
degeneralize_opt = true;
magic_many = true;
}
else if (echeck_algo == "bsh_se05_search")
{
echeck = Se05Search;
degeneralize_opt = true;
bit_state_hashing = true;
}
else if (echeck_algo == "bsh_se05_search_repeated")
{
echeck = Se05Search;
degeneralize_opt = true;
bit_state_hashing = true;
magic_many = true;
}
else
{
std::cerr << "unknown emptiness-check: " << echeck_algo << std::endl;
@ -575,15 +621,22 @@ main(int argc, char** argv)
ec = new spot::couvreur99_check_shy(a);
break;
case MagicSearch:
ec_a = degeneralized;
ec = spot::explicit_magic_search(degeneralized);
break;
case MagicSearch:
ec_a = degeneralized;
if (bit_state_hashing)
ec = spot::bit_state_hashing_magic_search(
degeneralized, heap_size);
else
ec = spot::explicit_magic_search(degeneralized);
break;
case Se04Search:
ec_a = degeneralized;
ec = spot::explicit_se05_search(degeneralized);
break;
case Se05Search:
ec_a = degeneralized;
if (bit_state_hashing)
ec = spot::bit_state_hashing_se05_search(degeneralized, heap_size);
else
ec = spot::explicit_se05_search(degeneralized);
break;
}
if (ec)
@ -593,13 +646,23 @@ main(int argc, char** argv)
spot::emptiness_check_result* res = ec->check();
if (!graph_run_opt)
ec->print_stats(std::cout);
if (expect_counter_example != !!res)
if (expect_counter_example != !!res &&
(!bit_state_hashing || !expect_counter_example))
exit_code = 1;
if (!res)
{
std::cout << "no accepting run found" << std::endl;
break;
std::cout << "no accepting run found";
if (bit_state_hashing && expect_counter_example)
{
std::cout << " even if expected" << std::endl;
std::cout << "this is maybe due to the use of the bit "
<< "state hashing technic" << std::endl;
std::cout << "you can try to increase the heap size "
<< "or use an explicit storage" << std::endl;
}
std::cout << std::endl;
break;
}
else
{