tgba_digraph: add a copy constructor, and obsolete dupexp
* src/tgba/tgbagraph.hh, src/tgba/tgbagraph.cc: Add a copy constructor, and some method to purge unreachable states. * src/graph/graph.hh (defrag_states): Erase transition of removed states. * src/tgbaalgos/complete.cc, src/tgbaalgos/compsusp.cc, src/tgbaalgos/dtgbacomp.cc, src/tgbaalgos/simulation.cc, src/tgbatest/checkpsl.cc, src/tgbatest/emptchk.cc, src/tgbatest/ltl2tgba.cc: Adjust to use make_tgba_digraph() instead of tgba_dupexp_dfs() or tgba_dupexp_bfs(). * src/tgbaalgos/dupexp.cc, src/tgbaalgos/dupexp.hh: Use make_tgba_digraph() when possible. * src/tgbatest/det.test, src/tgbatest/sim.test: Adjust expected results.
This commit is contained in:
parent
971788fdbe
commit
923785f76a
14 changed files with 128 additions and 27 deletions
|
|
@ -18,7 +18,6 @@
|
|||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "complete.hh"
|
||||
#include "dupexp.hh"
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
|
@ -105,7 +104,12 @@ namespace spot
|
|||
|
||||
tgba_digraph_ptr tgba_complete(const const_tgba_ptr& aut)
|
||||
{
|
||||
tgba_digraph_ptr res = tgba_dupexp_dfs(aut);
|
||||
auto res = make_tgba_digraph(aut);
|
||||
res->prop_copy(aut,
|
||||
true, // state based
|
||||
true, // single acc
|
||||
true, // inherently_weak
|
||||
true); // deterministic
|
||||
tgba_complete_here(res);
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
#include "minimize.hh"
|
||||
#include "simulation.hh"
|
||||
#include "safety.hh"
|
||||
#include "dupexp.hh"
|
||||
#include "ltlast/allnodes.hh"
|
||||
#include "ltlvisit/tostring.hh"
|
||||
#include "ltlvisit/clone.hh"
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "dtgbacomp.hh"
|
||||
#include "dupexp.hh"
|
||||
#include "sccinfo.hh"
|
||||
|
||||
namespace spot
|
||||
|
|
@ -26,9 +25,12 @@ namespace spot
|
|||
tgba_digraph_ptr dtgba_complement_nonweak(const const_tgba_ptr& aut)
|
||||
{
|
||||
// Clone the original automaton.
|
||||
tgba_digraph_ptr res = tgba_dupexp_dfs(aut);
|
||||
|
||||
|
||||
auto res = make_tgba_digraph(aut);
|
||||
res->prop_copy(aut,
|
||||
false, // state based
|
||||
false, // single acc
|
||||
false, // inherently_weak
|
||||
false); // deterministic
|
||||
// Copy the old acceptance condition before we replace it.
|
||||
acc_cond oldacc = aut->acc(); // Copy it!
|
||||
|
||||
|
|
@ -36,6 +38,9 @@ namespace spot
|
|||
// automaton will only have one acceptance set.
|
||||
// This changes aut->acc();
|
||||
res->set_single_acceptance_set();
|
||||
// The resulting automaton is weak.
|
||||
res->prop_inherently_weak();
|
||||
res->prop_state_based_acc();
|
||||
|
||||
unsigned num_sets = oldacc.num_sets();
|
||||
unsigned n = res->num_states();
|
||||
|
|
@ -108,8 +113,7 @@ namespace spot
|
|||
tgba_digraph_ptr dtgba_complement_weak(const const_tgba_ptr& aut)
|
||||
{
|
||||
// Clone the original automaton.
|
||||
tgba_digraph_ptr res = tgba_dupexp_dfs(aut);
|
||||
|
||||
auto res = make_tgba_digraph(aut);
|
||||
res->prop_copy(aut,
|
||||
true, // state based
|
||||
true, // single acc
|
||||
|
|
|
|||
|
|
@ -21,10 +21,12 @@
|
|||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "dupexp.hh"
|
||||
#include "tgba/tgbagraph.hh"
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include "reachiter.hh"
|
||||
#include "dotty.hh"
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
|
@ -119,6 +121,20 @@ namespace spot
|
|||
tgba_digraph_ptr
|
||||
tgba_dupexp_dfs(const const_tgba_ptr& aut, std::vector<const state*>& rel)
|
||||
{
|
||||
auto aa = std::dynamic_pointer_cast<const spot::tgba_digraph>(aut);
|
||||
if (aa)
|
||||
{
|
||||
aa->get_init_state_number(); // Create an initial state if needed.
|
||||
auto res = make_tgba_digraph(aa);
|
||||
unsigned ns = aa->num_states();
|
||||
rel.reserve(ns);
|
||||
// The state numbers are common to both automata, but
|
||||
// the state pointers are to the older one.
|
||||
for (unsigned n = 0; n < ns; ++n)
|
||||
rel.push_back(aa->state_from_number(n));
|
||||
return res;
|
||||
}
|
||||
|
||||
dupexp_iter_save<tgba_reachable_iterator_depth_first> di(aut, rel);
|
||||
di.run();
|
||||
return di.result();
|
||||
|
|
|
|||
|
|
@ -23,7 +23,10 @@
|
|||
#ifndef SPOT_TGBAALGOS_DUPEXP_HH
|
||||
# define SPOT_TGBAALGOS_DUPEXP_HH
|
||||
|
||||
# include "tgba/tgbagraph.hh"
|
||||
# include "misc/common.hh"
|
||||
# include "tgba/fwd.hh"
|
||||
# include "tgba/tgba.hh"
|
||||
# include <vector>
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
|
|
|||
|
|
@ -256,7 +256,6 @@ namespace spot
|
|||
scc_info_.reset(new scc_info(a_));
|
||||
old_a_ = a_;
|
||||
|
||||
|
||||
// Replace all the acceptance conditions by their complements.
|
||||
// (In the case of Cosimulation, we also flip the transitions.)
|
||||
{
|
||||
|
|
@ -298,6 +297,8 @@ namespace spot
|
|||
else
|
||||
t.acc = acc;
|
||||
}
|
||||
if (Cosimulation)
|
||||
a_->set_init_state(old_a_->get_init_state_number());
|
||||
}
|
||||
size_a_ = ns;
|
||||
}
|
||||
|
|
@ -435,7 +436,7 @@ namespace spot
|
|||
|
||||
// When we Cosimulate, we add a special flag to differentiate
|
||||
// the initial state from the other.
|
||||
if (Cosimulation && src == 0)
|
||||
if (Cosimulation && src == a_->get_init_state_number())
|
||||
res |= bdd_initial;
|
||||
|
||||
return res;
|
||||
|
|
@ -696,6 +697,8 @@ namespace spot
|
|||
}
|
||||
}
|
||||
|
||||
res->purge_unreachable_states();
|
||||
|
||||
delete gb;
|
||||
res->prop_copy(original_,
|
||||
false, // state-based acc forced below
|
||||
|
|
@ -835,6 +838,8 @@ namespace spot
|
|||
bdd res = bddfalse;
|
||||
|
||||
unsigned scc = scc_info_->scc_of(src);
|
||||
if (scc == -1U) // Unreachable
|
||||
return bddfalse;
|
||||
bool sccacc = scc_info_->is_accepting_scc(scc);
|
||||
|
||||
for (auto& t: a_->out(src))
|
||||
|
|
@ -1353,12 +1358,13 @@ namespace spot
|
|||
|
||||
direct_simulation<true, Sba> cosimul(res);
|
||||
res = cosimul.run();
|
||||
next.set_size(res);
|
||||
|
||||
if (Sba)
|
||||
res = scc_filter_states(res);
|
||||
else
|
||||
res = scc_filter(res, false);
|
||||
|
||||
next.set_size(res);
|
||||
}
|
||||
while (prev != next);
|
||||
return res;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue