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
|
|
@ -1,5 +1,5 @@
|
|||
// -*- 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).
|
||||
//
|
||||
// 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/>.
|
||||
|
||||
#include <spot/twaalgos/relabel.hh>
|
||||
#include <spot/twa/formula2bdd.hh>
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
|
@ -29,17 +30,46 @@ namespace spot
|
|||
std::vector<int> vars;
|
||||
std::set<int> newvars;
|
||||
vars.reserve(relmap->size());
|
||||
bool bool_subst = false;
|
||||
|
||||
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 newv = aut->register_ap(p.second);
|
||||
bdd_setpair(pairs, oldv, newv);
|
||||
vars.emplace_back(oldv);
|
||||
newvars.insert(newv);
|
||||
if (p.second.is(op::ap))
|
||||
{
|
||||
int newv = aut->register_ap(p.second);
|
||||
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;
|
||||
}
|
||||
}
|
||||
for (auto& t: aut->edges())
|
||||
t.cond = bdd_replace(t.cond, pairs);
|
||||
// Erase all the old variable that are not reused in the new set.
|
||||
if (!bool_subst)
|
||||
for (auto& t: aut->edges())
|
||||
t.cond = bdd_replace(t.cond, pairs);
|
||||
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
|
||||
// p0)
|
||||
for (auto v: vars)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// -*- 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).
|
||||
//
|
||||
// This file is part of Spot, a model checking library.
|
||||
|
|
@ -24,8 +24,13 @@
|
|||
|
||||
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
|
||||
relabel_here(twa_graph_ptr& aut,
|
||||
relabeling_map* relmap);
|
||||
relabel_here(twa_graph_ptr& aut, relabeling_map* relmap);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue