* 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

@ -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
{