Properly handle "simulated-states" property in twagraph::defrag_states.

* spot/twa/twagraph.cc: Implement the change.
* spot/twaalgos/simulation.hh: Improve documentation.
* tests/python/simstate.py: Improve the test.
* doc/org/concepts.org: Typo.
This commit is contained in:
Maximilien Colange 2017-06-05 14:43:29 +02:00
parent acbb51062a
commit 4f8a8f7305
4 changed files with 38 additions and 2 deletions

View file

@ -1128,7 +1128,7 @@ Here is a list of named properties currently used inside Spot:
| ~highlight-edges~ | ~std::map<unsigned, unsigned>~ | map of (edge number, color number) for highlighting the output | | ~highlight-edges~ | ~std::map<unsigned, unsigned>~ | map of (edge number, color number) for highlighting the output |
| ~highlight-states~ | ~std::map<unsigned, unsigned>~ | map of (state number, color number) for highlighting the output | | ~highlight-states~ | ~std::map<unsigned, unsigned>~ | map of (state number, color number) for highlighting the output |
| ~incomplete-states~ | ~std::set<unsigned>~ | set of states numbers that should be displayed as incomplete (used internally by ~print_dot()~ when truncating large automata) | | ~incomplete-states~ | ~std::set<unsigned>~ | set of states numbers that should be displayed as incomplete (used internally by ~print_dot()~ when truncating large automata) |
| ~degen-levels~ | ~std::vector<unsigned>~ | level associated to each state by the degenaralization algorithm | | ~degen-levels~ | ~std::vector<unsigned>~ | level associated to each state by the degeneralization algorithm |
| ~simulated-states~ | ~std::vector<unsigned>~ | map states of the original automaton to states if the current automaton in the result of simulation-based reductions | | ~simulated-states~ | ~std::vector<unsigned>~ | map states of the original automaton to states if the current automaton in the result of simulation-based reductions |
Objects referenced via named properties are automatically destroyed Objects referenced via named properties are automatically destroyed

View file

@ -620,6 +620,16 @@ namespace spot
} }
dl->resize(used_states); dl->resize(used_states);
} }
if (auto ss = get_named_prop<std::vector<unsigned>>("simulated-states"))
{
for (auto& s : *ss)
{
if (s >= newst.size())
s = -1U;
else
s = newst[s];
}
}
init_number_ = newst[init_number_]; init_number_ = newst[init_number_];
g_.defrag_states(std::move(newst), used_states); g_.defrag_states(std::move(newst), used_states);
} }

View file

@ -1,5 +1,5 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2012, 2013, 2014, 2015 Laboratoire de Recherche et // Copyright (C) 2012, 2013, 2014, 2015, 2017 Laboratoire de Recherche et
// Développement de l'Epita (LRDE). // Développement de l'Epita (LRDE).
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
@ -64,6 +64,12 @@ namespace spot
/// acceptance conditions than necessary, and running scc_filter() /// acceptance conditions than necessary, and running scc_filter()
/// again afterwards will remove these superfluous conditions. /// again afterwards will remove these superfluous conditions.
/// ///
/// The resulting automaton has a named property "simulated-states", that is a
/// vector mapping each state of the input to a state of the output. Note that
/// some input states may be mapped to -1, as a by-product of improved
/// determinism. Typically, if the language of q1 is included in the language
/// of q2, only a transition to q2 will be built.
///
/// \param automaton the automaton to simulate. /// \param automaton the automaton to simulate.
/// \return a new automaton which is at worst a copy of the received /// \return a new automaton which is at worst a copy of the received
/// one /// one

View file

@ -166,3 +166,23 @@ State: 11 "{₀[1#1]{₁[0#0,0#1]{₂[1#0]₂}₁}₀}"
[0&1] 9 {1} [0&1] 9 {1}
[!0&1] 1 {1} [!0&1] 1 {1}
--END--""" --END--"""
a = spot.translate('!Gp0 xor FG((p0 W Gp1) M p1)')
a = spot.degeneralize_tba(a)
b = spot.simulation(a)
b.set_init_state(1)
b.purge_unreachable_states()
b.copy_state_names_from(a)
assert b.to_str() == """HOA: v1
States: 1
Start: 0
AP: 2 "p0" "p1"
acc-name: Buchi
Acceptance: 1 Inf(0)
properties: trans-labels explicit-labels trans-acc complete
properties: deterministic stutter-invariant
--BODY--
State: 0 "[1,8,9]"
[1] 0
[!1] 0 {0}
--END--"""