twaalgos: filter accepting sinks in oe combiner
This commit is contained in:
parent
00ad02070b
commit
6ebbb93024
2 changed files with 20 additions and 4 deletions
|
|
@ -28,8 +28,8 @@
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
outedge_combiner::outedge_combiner(const twa_graph_ptr& aut)
|
outedge_combiner::outedge_combiner(const twa_graph_ptr& aut, unsigned sink)
|
||||||
: aut_(aut), vars_(bddtrue)
|
: aut_(aut), vars_(bddtrue), acc_sink_(sink)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,6 +50,9 @@ namespace spot
|
||||||
bdd out = bddtrue;
|
bdd out = bddtrue;
|
||||||
for (unsigned d: aut_->univ_dests(e.dst))
|
for (unsigned d: aut_->univ_dests(e.dst))
|
||||||
{
|
{
|
||||||
|
if (d == acc_sink_)
|
||||||
|
continue;
|
||||||
|
|
||||||
auto p = state_to_var.emplace(d, 0);
|
auto p = state_to_var.emplace(d, 0);
|
||||||
if (p.second)
|
if (p.second)
|
||||||
{
|
{
|
||||||
|
|
@ -78,7 +81,17 @@ namespace spot
|
||||||
{
|
{
|
||||||
bdd cond = bdd_exist(cube, vars_);
|
bdd cond = bdd_exist(cube, vars_);
|
||||||
bdd dest = bdd_existcomp(cube, vars_);
|
bdd dest = bdd_existcomp(cube, vars_);
|
||||||
while (dest != bddtrue)
|
|
||||||
|
if (dest == bddtrue)
|
||||||
|
{
|
||||||
|
// if dest is bddtrue then the accepting sink is the only
|
||||||
|
// destination for this edge, in that case don't filter it out
|
||||||
|
assert(acc_sink_ != -1u);
|
||||||
|
aut_->new_edge(st, acc_sink_, cond);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
{
|
{
|
||||||
assert(bdd_low(dest) == bddfalse);
|
assert(bdd_low(dest) == bddfalse);
|
||||||
auto it = var_to_state.find(bdd_var(dest));
|
auto it = var_to_state.find(bdd_var(dest));
|
||||||
|
|
@ -86,6 +99,8 @@ namespace spot
|
||||||
univ_dest.push_back(it->second);
|
univ_dest.push_back(it->second);
|
||||||
dest = bdd_high(dest);
|
dest = bdd_high(dest);
|
||||||
}
|
}
|
||||||
|
while (dest != bddtrue);
|
||||||
|
|
||||||
std::sort(univ_dest.begin(), univ_dest.end());
|
std::sort(univ_dest.begin(), univ_dest.end());
|
||||||
aut_->new_univ_edge(st, univ_dest.begin(), univ_dest.end(), cond);
|
aut_->new_univ_edge(st, univ_dest.begin(), univ_dest.end(), cond);
|
||||||
univ_dest.clear();
|
univ_dest.clear();
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,9 @@ namespace spot
|
||||||
std::map<unsigned, int> state_to_var;
|
std::map<unsigned, int> state_to_var;
|
||||||
std::map<int, unsigned> var_to_state;
|
std::map<int, unsigned> var_to_state;
|
||||||
bdd vars_;
|
bdd vars_;
|
||||||
|
unsigned acc_sink_;
|
||||||
public:
|
public:
|
||||||
outedge_combiner(const twa_graph_ptr& aut);
|
outedge_combiner(const twa_graph_ptr& aut, unsigned sink = -1u);
|
||||||
~outedge_combiner();
|
~outedge_combiner();
|
||||||
bdd operator()(unsigned st);
|
bdd operator()(unsigned st);
|
||||||
void new_dests(unsigned st, bdd out) const;
|
void new_dests(unsigned st, bdd out) const;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue