Commit 77cef16c authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

dtgbasat: Improve handling of weaks SCC in the ref automaton

* src/tgbaalgos/dtgbasat.cc: Here.
parent 795c6e48
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "ltlenv/defaultenv.hh" #include "ltlenv/defaultenv.hh"
#include "misc/tmpfile.hh" #include "misc/tmpfile.hh"
#include "misc/satsolver.hh" #include "misc/satsolver.hh"
#include "isweakscc.hh"
// If the following DEBUG macro is set to 1, the temporary files used // If the following DEBUG macro is set to 1, the temporary files used
// to communicate with the SAT-solver will be left in the current // to communicate with the SAT-solver will be left in the current
...@@ -373,6 +374,8 @@ namespace spot ...@@ -373,6 +374,8 @@ namespace spot
int i = i2->second; int i = i2->second;
d.int_to_state[i] = i2->first; d.int_to_state[i] = i2->first;
unsigned i_scc = sm_.scc_of_state(i2->first); unsigned i_scc = sm_.scc_of_state(i2->first);
bool is_weak = is_weak_scc(sm_, i_scc);
for (int j = 1; j <= d.cand_size; ++j) for (int j = 1; j <= d.cand_size; ++j)
{ {
for (dict::state_map::const_iterator k2 = seen.begin(); for (dict::state_map::const_iterator k2 = seen.begin();
...@@ -383,11 +386,11 @@ namespace spot ...@@ -383,11 +386,11 @@ namespace spot
continue; continue;
for (int l = 1; l <= d.cand_size; ++l) for (int l = 1; l <= d.cand_size; ++l)
{ {
size_t sf = d.all_cand_acc.size(); size_t sfp = is_weak ? 1 : d.all_ref_acc.size();
for (size_t f = 0; f < sf; ++f) for (size_t fp = 0; fp < sfp; ++fp)
{ {
size_t sfp = d.all_ref_acc.size(); size_t sf = d.all_cand_acc.size();
for (size_t fp = 0; fp < sfp; ++fp) for (size_t f = 0; f < sf; ++f)
{ {
path p(j, i, l, k, path p(j, i, l, k,
d.all_cand_acc[f], d.all_cand_acc[f],
...@@ -630,11 +633,14 @@ namespace spot ...@@ -630,11 +633,14 @@ namespace spot
// cycle, so they must belong to the same SCC. // cycle, so they must belong to the same SCC.
if (sm.scc_of_state(d.int_to_state[q2p]) != q1p_scc) if (sm.scc_of_state(d.int_to_state[q2p]) != q1p_scc)
continue; continue;
bool is_weak = is_weak_scc(sm, q1p_scc);
bool is_acc = sm.accepting(q1p_scc);
for (int q1 = 1; q1 <= d.cand_size; ++q1) for (int q1 = 1; q1 <= d.cand_size; ++q1)
for (int q2 = 1; q2 <= d.cand_size; ++q2) for (int q2 = 1; q2 <= d.cand_size; ++q2)
{ {
size_t sf = d.all_cand_acc.size(); size_t sf = d.all_cand_acc.size();
size_t sfp = d.all_ref_acc.size(); size_t sfp = is_weak ? 1 : d.all_ref_acc.size();
for (size_t f = 0; f < sf; ++f) for (size_t f = 0; f < sf; ++f)
for (size_t fp = 0; fp < sfp; ++fp) for (size_t fp = 0; fp < sfp; ++fp)
{ {
...@@ -676,8 +682,10 @@ namespace spot ...@@ -676,8 +682,10 @@ namespace spot
if (dp == q1p && q3 == q1) // (11,12) loop if (dp == q1p && q3 == q1) // (11,12) loop
{ {
bdd unio = curacc | d.all_ref_acc[fp]; if ((!is_acc) ||
if (unio != all_acc) (!is_weak &&
(curacc |
d.all_ref_acc[fp]) != all_acc))
{ {
#if DEBUG #if DEBUG
dout << "(11) " << p << " ∧ " dout << "(11) " << p << " ∧ "
...@@ -771,7 +779,8 @@ namespace spot ...@@ -771,7 +779,8 @@ namespace spot
bdd f2 = p.acc_cand | bdd f2 = p.acc_cand |
d.all_cand_acc[f]; d.all_cand_acc[f];
bdd f2p = p.acc_ref | curacc; bdd f2p = is_weak ? bddfalse
: p.acc_ref | curacc;
path p2(p.src_cand, p.src_ref, path p2(p.src_cand, p.src_ref,
q3, dp, f2, f2p); q3, dp, f2, f2p);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment