61 template <
class SymbolType,
class StateType >
76 template <
class SymbolType,
class StateType >
88 template <
class SymbolType,
class StateType >
104 template <
class SymbolType,
class StateType >
108 template <
class SymbolType,
class StateType >
112template <
class SymbolType,
class StateType >
128 refactor[transition.first.first].
insert(
std::make_pair(transition.first.second, transition.second));
134 const StateType *firstNonfinal =
nullptr;
138 firstNonfinal = &state;
139 toEquivalentStates.
insert(std::pair<StateType, StateType>(state, *firstNonfinal));
143 toEquivalentStates.
insert(std::pair<StateType, StateType>(state, *firstFinal));
147 unsigned prevSize = 0;
150 const StateType& from = toEquivalentStates.find(transition.first)->second;
153 for(
const std::pair<const SymbolType, StateType> & transitionFromState : transition.second)
154 transitionFunction.insert(
std::make_pair(transitionFromState.first, toEquivalentStates.find(transitionFromState.second)->second));
160 print_progress ( dfa, minimizedTransitionFunction, steps );
162 if (minimizedTransitionFunction.size() == prevSize)
165 prevSize = minimizedTransitionFunction.size();
166 toEquivalentStates.clear();
169 for(
const StateType& target : transition.second)
172 minimizedTransitionFunction.clear();
179 if ( transition.second.count ( initialState ) )
180 return transition.first.first;
181 throw std::logic_error (
"Initial group not identified." );
189 result.addState(transition.first.first);
191 result.addFinalState(transition.first.first);
195 for(
const std::pair<SymbolType, StateType>& transitionFromState : transition.first.second)
196 result.addTransition(transition.first.first, transitionFromState.first, transitionFromState.second);
201#define RESETSS(x) {(x).clear(); (x).str("");}
203template <
class SymbolType,
class StateType >
212 for(
const auto& kv: minimizedTransitionFunction) {
213 for(
const auto& state : kv.second) {
215 for(
const auto& transition : kv.first.second) {
222 size_t stateWidth = 1;
223 size_t stateMapWidth = 1;
229 colWidths[symbol] = ss.
str().size();
232 for(
const auto& kv : printMap) {
233 ss << kv.first.first;
234 stateWidth =
std::max(stateWidth, ss.
str().size());
237 ss << kv.first.second;
238 stateMapWidth =
std::max(stateMapWidth, ss.
str().size());
242 auto it = kv.second.find(symbol);
243 if(it != kv.second.end()) {
245 colWidths[symbol] =
std::max(colWidths[symbol], ss.
str().size());
261 for(
const auto& kv : printMap) {
262 ss << kv.first.first;
266 ss << kv.first.second;
271 auto it = kv.second.find(symbol);
272 if(it != kv.second.end()) {
287template <
class SymbolType,
class StateType >
299 for (
const auto & state : dfta.
getStates())
300 stateOccurences[state];
304 for (
size_t i = 0;
i < from.size ( ); ++
i)
311 const StateType *firstNonfinal =
nullptr;
315 firstNonfinal = &state;
317 toEquivalentStates.
insert(std::pair<StateType, StateType>(state, *firstNonfinal));
322 toEquivalentStates.
insert(std::pair<StateType, StateType>(state, *firstFinal));
326 unsigned prevSize = 0;
329 for(
const auto & occurencesOfState : stateOccurences) {
330 const StateType & state = occurencesOfState.first;
331 const StateType & equivalentState = toEquivalentStates.find(state) ->
second;
334 for(
const auto & transitionOccurences : occurencesOfState.second) {
335 const auto & transition = transitionOccurences.first;
336 for (
size_t i : transitionOccurences.second) {
338 fromWithoutCurrent.
erase(fromWithoutCurrent.
begin()+
i);
339 keyTransitionsPart[
ext::make_tuple(transition.first.first, fromWithoutCurrent, toEquivalentStates.find(transition.second)->second)].
insert(
i);
343 minimizedTransitionFunction [
std::make_pair ( equivalentState, keyTransitionsPart ) ].
insert(state);
346 if (minimizedTransitionFunction.size() == prevSize)
349 prevSize = minimizedTransitionFunction.size();
350 toEquivalentStates.clear();
351 for(
const auto & transition : minimizedTransitionFunction)
352 for(
const StateType & target : transition.second)
355 minimizedTransitionFunction.clear();
360 for (
const auto & transition : minimizedTransitionFunction) {
361 const auto & state = *(transition.second.begin());
364 result.addFinalState(state);
369 from.reserve(transition.first.second.size());
370 for (
const StateType & state : transition.first.second)
371 from.push_back(toEquivalentStates.find(state)->second);
373 result.addTransition(transition.first.first, from, toEquivalentStates.find(transition.second)->second);
#define RESETSS(x)
Definition: Minimize.h:201
Deterministic finite automaton. Accepts regular languages.
Definition: DFA.h:71
const ext::set< StateType > & getFinalStates() const &
Definition: DFA.h:183
const ext::map< ext::pair< StateType, SymbolType >, StateType > & getTransitions() const &
Definition: DFA.h:473
const StateType & getInitialState() const &
Definition: DFA.h:105
const ext::set< SymbolType > & getInputAlphabet() const &
Definition: DFA.h:232
const ext::set< StateType > & getStates() const &
Definition: DFA.h:134
Nondeterministic finite tree automaton without epsilon transitions. Accepts regular tree languages.
Definition: DFTA.h:74
const ext::map< ext::pair< common::ranked_symbol< SymbolType >, ext::vector< StateType > >, StateType > & getTransitions() const &
Definition: DFTA.h:289
const ext::set< common::ranked_symbol< SymbolType > > & getInputAlphabet() const &
Definition: DFTA.h:203
const ext::set< StateType > & getFinalStates() const &
Definition: DFTA.h:154
const ext::set< StateType > & getStates() const &
Definition: DFTA.h:105
Definition: Minimize.h:51
static automaton::DFTA< SymbolType, StateType > minimize(const automaton::DFTA< SymbolType, StateType > &dfta)
Definition: Minimize.h:89
static automaton::DFA< SymbolType, StateType > minimize(const automaton::DFA< SymbolType, StateType > &dfa)
Definition: Minimize.h:62
static bool verbose
Verbose flag. Some algorithms print additional runtime information about internal datastructures or t...
Definition: GlobalData.h:24
static ext::reference_wrapper< ext::ostream > log
Standard loging stream. Mapped to descriptor 4.
Definition: GlobalData.h:78
Class extending the map class from the standard library. Original reason is to allow printing of the ...
Definition: map.hpp:48
std::pair< iterator, bool > insert(const T &key, const R &value)
Insert variant with explicit key and value parameters.
Definition: map.hpp:118
std::string str() const &
Definition: sstream.cpp:29
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: vector.hpp:125
iterator erase(iterator pos)
Removes element from the container at position given by parameter pos.
Definition: vector.hpp:323
typename T::StateType StateType
Definition: ToGrammarLeftRG.h:64
int i
Definition: AllEpsilonClosure.h:118
typename T::SymbolType SymbolType
Definition: SingleInitialStateEpsilonTransition.h:72
transition first second
Definition: MinimizeByPartitioning.h:143
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
Definition: ToGrammar.h:31
constexpr const T & max(const T &a)
Root case of maximum computation. The maximum from one value is the value itself.
Definition: algorithm.hpp:278
constexpr auto make_tuple(Elements &&... args)
Helper of extended tuple construction. The tuple is constructed from values pack, types are deduced.
Definition: tuple.hpp:203
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79