relabel_here: make it compatible with relabel_bse
* spot/twaalgos/relabel.cc: Deal with the cases where the substitution value is a Boolean formula. * spot/twaalgos/relabel.hh: Improve documentation. * tests/python/relabel.py: Add more tests. * python/spot/impl.i: Add bindings for are_isomorphic for the above test. * NEWS: Mention the news.
This commit is contained in:
parent
819cd7b8b6
commit
0bc1dd4446
5 changed files with 79 additions and 16 deletions
13
NEWS
13
NEWS
|
|
@ -114,15 +114,20 @@ New in spot 2.3.4.dev (not yet released)
|
||||||
- The function spot::streett_to_generalized_buchi() is now able to
|
- The function spot::streett_to_generalized_buchi() is now able to
|
||||||
work on automatons with Streett-like acceptance.
|
work on automatons with Streett-like acceptance.
|
||||||
|
|
||||||
Python:
|
- spot::relabel_here() was used on automata to rename atomic
|
||||||
|
propositions, it can now replace atomic propositions by Boolean
|
||||||
- The 'spot.gen' package exports the functions from libspotgen.
|
subformula. This makes it possible to use relabeling maps
|
||||||
See https://spot.lrde.epita.fr/ipynb/gen.html for examples.
|
produced by relabel_bse() on formulas.
|
||||||
|
|
||||||
- twa_graph::copy_state_names_from() can be used to copy the state
|
- twa_graph::copy_state_names_from() can be used to copy the state
|
||||||
names from another automaton, honoring "original-states" if
|
names from another automaton, honoring "original-states" if
|
||||||
present.
|
present.
|
||||||
|
|
||||||
|
Python:
|
||||||
|
|
||||||
|
- The 'spot.gen' package exports the functions from libspotgen.
|
||||||
|
See https://spot.lrde.epita.fr/ipynb/gen.html for examples.
|
||||||
|
|
||||||
Bugs fixed:
|
Bugs fixed:
|
||||||
|
|
||||||
- We have fixed new cases where translating multiple formula in a
|
- We have fixed new cases where translating multiple formula in a
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@
|
||||||
#include <spot/twaalgos/dtwasat.hh>
|
#include <spot/twaalgos/dtwasat.hh>
|
||||||
#include <spot/twaalgos/relabel.hh>
|
#include <spot/twaalgos/relabel.hh>
|
||||||
#include <spot/twaalgos/word.hh>
|
#include <spot/twaalgos/word.hh>
|
||||||
|
#include <spot/twaalgos/are_isomorphic.hh>
|
||||||
|
|
||||||
#include <spot/parseaut/public.hh>
|
#include <spot/parseaut/public.hh>
|
||||||
|
|
||||||
|
|
@ -584,6 +585,7 @@ def state_is_accepting(self, src) -> "bool":
|
||||||
%include <spot/twaalgos/relabel.hh>
|
%include <spot/twaalgos/relabel.hh>
|
||||||
%include <spot/twaalgos/word.hh>
|
%include <spot/twaalgos/word.hh>
|
||||||
%template(list_bdd) std::list<bdd>;
|
%template(list_bdd) std::list<bdd>;
|
||||||
|
%include <spot/twaalgos/are_isomorphic.hh>
|
||||||
|
|
||||||
%pythonprepend spot::twa::dtwa_complement %{
|
%pythonprepend spot::twa::dtwa_complement %{
|
||||||
from warnings import warn
|
from warnings import warn
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2015, 2016 Laboratoire de Recherche et Développement
|
// Copyright (C) 2015, 2016, 2017 Laboratoire de Recherche et Développement
|
||||||
// de l'Epita (LRDE).
|
// de l'Epita (LRDE).
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include <spot/twaalgos/relabel.hh>
|
#include <spot/twaalgos/relabel.hh>
|
||||||
|
#include <spot/twa/formula2bdd.hh>
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
|
|
@ -29,17 +30,46 @@ namespace spot
|
||||||
std::vector<int> vars;
|
std::vector<int> vars;
|
||||||
std::set<int> newvars;
|
std::set<int> newvars;
|
||||||
vars.reserve(relmap->size());
|
vars.reserve(relmap->size());
|
||||||
|
bool bool_subst = false;
|
||||||
|
|
||||||
for (auto& p: *relmap)
|
for (auto& p: *relmap)
|
||||||
{
|
{
|
||||||
|
if (!p.first.is(op::ap))
|
||||||
|
throw std::runtime_error
|
||||||
|
("relabel_here: old labels should be atomic propositions");
|
||||||
|
if (!p.second.is_boolean())
|
||||||
|
throw std::runtime_error
|
||||||
|
("relabel_here: new labels should be Boolean formulas");
|
||||||
|
|
||||||
int oldv = aut->register_ap(p.first);
|
int oldv = aut->register_ap(p.first);
|
||||||
int newv = aut->register_ap(p.second);
|
|
||||||
bdd_setpair(pairs, oldv, newv);
|
|
||||||
vars.emplace_back(oldv);
|
vars.emplace_back(oldv);
|
||||||
|
if (p.second.is(op::ap))
|
||||||
|
{
|
||||||
|
int newv = aut->register_ap(p.second);
|
||||||
newvars.insert(newv);
|
newvars.insert(newv);
|
||||||
|
bdd_setpair(pairs, oldv, newv);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p.second.traverse([&](const formula& f)
|
||||||
|
{
|
||||||
|
if (f.is(op::ap))
|
||||||
|
newvars.insert(aut->register_ap(f));
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
bdd newb = formula_to_bdd(p.second, d, aut);
|
||||||
|
bdd_setbddpair(pairs, oldv, newb);
|
||||||
|
bool_subst = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!bool_subst)
|
||||||
for (auto& t: aut->edges())
|
for (auto& t: aut->edges())
|
||||||
t.cond = bdd_replace(t.cond, pairs);
|
t.cond = bdd_replace(t.cond, pairs);
|
||||||
// Erase all the old variable that are not reused in the new set.
|
else
|
||||||
|
for (auto& t: aut->edges())
|
||||||
|
t.cond = bdd_veccompose(t.cond, pairs);
|
||||||
|
|
||||||
|
// Erase all the old variables that are not reused in the new set.
|
||||||
// (E.g., if we relabel a&p0 into p0&p1 we should not unregister
|
// (E.g., if we relabel a&p0 into p0&p1 we should not unregister
|
||||||
// p0)
|
// p0)
|
||||||
for (auto v: vars)
|
for (auto v: vars)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2015 Laboratoire de Recherche et Développement de
|
// Copyright (C) 2015, 2017 Laboratoire de Recherche et Développement de
|
||||||
// l'Epita (LRDE).
|
// l'Epita (LRDE).
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
|
|
@ -24,8 +24,13 @@
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
/// replace atomic propositions in an automaton
|
/// \brief replace atomic propositions in an automaton
|
||||||
|
///
|
||||||
|
/// The relabeling map \a relmap should have keys that are atomic
|
||||||
|
/// propositions, and values that are Boolean formulas.
|
||||||
|
///
|
||||||
|
/// This function is typically used with maps produced by relabel()
|
||||||
|
/// or relabel_bse().
|
||||||
SPOT_API void
|
SPOT_API void
|
||||||
relabel_here(twa_graph_ptr& aut,
|
relabel_here(twa_graph_ptr& aut, relabeling_map* relmap);
|
||||||
relabeling_map* relmap);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# -*- mode: python; coding: utf-8 -*-
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
# Copyright (C) 2015 Laboratoire de Recherche et Développement
|
# Copyright (C) 2015, 2017 Laboratoire de Recherche et Développement
|
||||||
# de l'Epita
|
# de l'Epita
|
||||||
#
|
#
|
||||||
# This file is part of Spot, a model checking library.
|
# This file is part of Spot, a model checking library.
|
||||||
|
|
@ -30,3 +30,24 @@ print(res)
|
||||||
assert(res == """#define p0 a & b
|
assert(res == """#define p0 a & b
|
||||||
#define p1 c
|
#define p1 c
|
||||||
GFp0 -> (FGp0 & Gp1)""")
|
GFp0 -> (FGp0 & Gp1)""")
|
||||||
|
|
||||||
|
|
||||||
|
autg = g.translate()
|
||||||
|
spot.relabel_here(autg, m)
|
||||||
|
assert str(autg.ap()) == '(a, b, c)'
|
||||||
|
assert spot.isomorphism_checker.are_isomorphic(autg, f.translate())
|
||||||
|
|
||||||
|
a = spot.formula('a')
|
||||||
|
u = spot.formula('a U b')
|
||||||
|
m[a] = u
|
||||||
|
try:
|
||||||
|
spot.relabel_here(autg, m)
|
||||||
|
except RuntimeError as e:
|
||||||
|
assert "new labels" in str(e)
|
||||||
|
|
||||||
|
m = spot.relabeling_map()
|
||||||
|
m[u] = a
|
||||||
|
try:
|
||||||
|
spot.relabel_here(autg, m)
|
||||||
|
except RuntimeError as e:
|
||||||
|
assert "old labels" in str(e)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue