autfilt: new --separate-sets option
* src/twaalgos/sepsets.cc, src/twaalgos/sepsets.hh: New files. * src/twaalgos/Makefile.am: Add them. * src/twa/acc.hh (get_acceptance): Add a non-const version. * src/bin/autfilt.cc: Add the --separate-sets option. * src/tests/sepsets.test: New file. * src/tests/Makefile.am: Add it.
This commit is contained in:
parent
5ed321fc19
commit
3d1ccdc45e
7 changed files with 222 additions and 1 deletions
|
|
@ -73,6 +73,7 @@ twaalgos_HEADERS = \
|
|||
scc.hh \
|
||||
sccinfo.hh \
|
||||
se05.hh \
|
||||
sepsets.hh \
|
||||
simulation.hh \
|
||||
stats.hh \
|
||||
stripacc.hh \
|
||||
|
|
@ -130,6 +131,7 @@ libtwaalgos_la_SOURCES = \
|
|||
sccinfo.cc \
|
||||
sccfilter.cc \
|
||||
se05.cc \
|
||||
sepsets.cc \
|
||||
simulation.cc \
|
||||
stats.cc \
|
||||
stripacc.cc \
|
||||
|
|
|
|||
101
src/twaalgos/sepsets.cc
Normal file
101
src/twaalgos/sepsets.cc
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
// -*- coding: utf-8 -*-
|
||||
// Copyright (C) 2015 Laboratoire de Recherche et
|
||||
// Développement de l'Epita.
|
||||
//
|
||||
// This file is part of Spot, a model checking library.
|
||||
//
|
||||
// Spot is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Spot is distributed in the hope that it will be useful, but WITHOUT
|
||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
// License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "sepsets.hh"
|
||||
#include "sccinfo.hh"
|
||||
|
||||
|
||||
namespace spot
|
||||
{
|
||||
namespace
|
||||
{
|
||||
static acc_cond::mark_t common_sets(const const_twa_graph_ptr& aut)
|
||||
{
|
||||
auto p = aut->get_acceptance().used_inf_fin_sets();
|
||||
return p.first & p.second;
|
||||
}
|
||||
}
|
||||
|
||||
bool has_separate_sets(const const_twa_graph_ptr& aut)
|
||||
{
|
||||
return common_sets(aut) == 0U;
|
||||
}
|
||||
|
||||
twa_graph_ptr
|
||||
separate_sets_here(const twa_graph_ptr& aut)
|
||||
{
|
||||
auto common = common_sets(aut);
|
||||
if (common == 0U)
|
||||
return aut;
|
||||
// Each Fin(first) should be replaced by Fin(second).
|
||||
std::vector<std::pair<acc_cond::mark_t, acc_cond::mark_t>> map;
|
||||
{
|
||||
unsigned base = aut->acc().add_sets(common.count());
|
||||
for (auto s: common.sets())
|
||||
map.emplace_back(acc_cond::mark_t({s}),
|
||||
acc_cond::mark_t({base++}));
|
||||
}
|
||||
|
||||
// Fix the acceptance condition
|
||||
auto& code = aut->acc().get_acceptance();
|
||||
// If code were empty, then common would have been 0.
|
||||
assert (!code.empty());
|
||||
acc_cond::acc_word* pos = &code.back();
|
||||
acc_cond::acc_word* start = &code.front();
|
||||
while (pos > start)
|
||||
{
|
||||
switch (pos->op)
|
||||
{
|
||||
case acc_cond::acc_op::Or:
|
||||
case acc_cond::acc_op::And:
|
||||
--pos;
|
||||
break;
|
||||
case acc_cond::acc_op::Fin:
|
||||
case acc_cond::acc_op::FinNeg:
|
||||
if ((pos[-1].mark & common) == 0U)
|
||||
break;
|
||||
for (auto p: map)
|
||||
if (pos[-1].mark & p.first)
|
||||
{
|
||||
pos[-1].mark -= p.first;
|
||||
pos[-1].mark |= p.second;
|
||||
}
|
||||
/* fall through */
|
||||
case acc_cond::acc_op::Inf:
|
||||
case acc_cond::acc_op::InfNeg:
|
||||
pos -= 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Fix the transitions
|
||||
for (auto& t: aut->transitions())
|
||||
{
|
||||
if ((t.acc & common) == 0U)
|
||||
continue;
|
||||
for (auto p: map)
|
||||
if (t.acc & p.first)
|
||||
t.acc |= p.second;
|
||||
}
|
||||
return aut;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
36
src/twaalgos/sepsets.hh
Normal file
36
src/twaalgos/sepsets.hh
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// -*- coding: utf-8 -*-
|
||||
// Copyright (C) 2015 Laboratoire de Recherche et Développement
|
||||
// de l'Epita.
|
||||
//
|
||||
// This file is part of Spot, a model checking library.
|
||||
//
|
||||
// Spot is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Spot is distributed in the hope that it will be useful, but WITHOUT
|
||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
// License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "twa/twagraph.hh"
|
||||
|
||||
namespace spot
|
||||
{
|
||||
/// \brief Whether the Inf and Fin numbers are disjoints
|
||||
SPOT_API bool
|
||||
has_separate_sets(const const_twa_graph_ptr& aut);
|
||||
|
||||
/// \brief Separate the Fin and Inf sets used by an automaton
|
||||
///
|
||||
/// This makes sure that the numbers used a Fin and Inf are
|
||||
/// disjoints.
|
||||
SPOT_API twa_graph_ptr
|
||||
separate_sets_here(const twa_graph_ptr& aut);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue