28#include <alib/multimap>
74template <
class SymbolTypeT = DefaultSymbolType,
class StateTypeT = DefaultStateType >
75class MultiInitialStateEpsilonNFA final :
public core::Components < MultiInitialStateEpsilonNFA < SymbolTypeT, StateTypeT >, ext::set < SymbolTypeT >, component::Set, InputAlphabet, ext::set < StateTypeT >, component::Set, std::tuple < States, InitialStates, FinalStates > > {
136 return this->
template accessComponent < InitialStates > ( ).get ( );
145 return std::move ( this->
template accessComponent < InitialStates > ( ).
get ( ) );
156 return this->
template accessComponent < InitialStates > ( ).add ( std::move ( state ) );
165 this->
template accessComponent < InitialStates > ( ).set ( std::move ( states ) );
176 this->
template accessComponent < InitialStates > ( ).remove ( state );
185 return this->
template accessComponent < States > ( ).get ( );
194 return std::move ( this->
template accessComponent < States > ( ).
get ( ) );
205 return this->
template accessComponent < States > ( ).add ( std::move ( state ) );
214 this->
template accessComponent < States > ( ).set ( std::move ( states ) );
225 this->
template accessComponent < States > ( ).remove ( state );
234 return this->
template accessComponent < FinalStates > ( ).get ( );
243 return std::move ( this->
template accessComponent < FinalStates > ( ).
get ( ) );
254 return this->
template accessComponent < FinalStates > ( ).add ( std::move ( state ) );
263 this->
template accessComponent < FinalStates > ( ).set ( std::move ( states ) );
274 this->
template accessComponent < FinalStates > ( ).remove ( state );
283 return this->
template accessComponent < InputAlphabet > ( ).get ( );
292 return std::move ( this->
template accessComponent < InputAlphabet > ( ).
get ( ) );
303 return this->
template accessComponent < InputAlphabet > ( ).add ( std::move ( symbol ) );
312 this->
template accessComponent < InputAlphabet > ( ).add ( std::move ( symbols ) );
321 this->
template accessComponent < InputAlphabet > ( ).set ( std::move ( symbols ) );
332 this->
template accessComponent < InputAlphabet > ( ).remove ( symbol );
561 return out <<
"(MultiInitialStateEpsilonNFA"
562 <<
" states = " << instance.
getStates ( )
587template <
class SymbolType,
class StateType >
598template<
class SymbolType,
class StateType >
599MultiInitialStateEpsilonNFA < SymbolType, StateType >::MultiInitialStateEpsilonNFA (
ext::set < StateType > states,
ext::set < SymbolType > inputAlphabet,
ext::set < StateType > initialStates,
ext::set < StateType > finalStates ) :
core::Components <
MultiInitialStateEpsilonNFA,
ext::set < SymbolType >, component::Set, InputAlphabet,
ext::set < StateType >, component::Set, std::tuple < States, InitialStates, FinalStates > > ( std::move ( inputAlphabet ), std::move ( states ), std::move ( initialStates ), std::move ( finalStates ) ) {
602template<
class SymbolType,
class StateType >
606template<
class SymbolType,
class StateType >
611template<
class SymbolType,
class StateType >
613 for (
const auto & transition : other.getTransitions ( ) ) {
615 transitions.insert ( key, transition.second );
619template<
class SymbolType,
class StateType >
621 for (
const auto & transition : other.getTransitions ( ) ) {
623 transitions.insert ( key, transition.second );
627template<
class SymbolType,
class StateType >
629 for (
const auto & transition : other.getTransitions ( ) ) {
631 transitions.insert( key, transition.second );
635template<
class SymbolType,
class StateType >
637 if ( ! getStates ( ).contains ( from ) )
640 if ( ! input.is_epsilon ( ) && !getInputAlphabet ( ).contains ( input ) )
643 if ( ! getStates ( ).contains ( to ) )
646 auto upper_bound = transitions.upper_bound (
ext::tie ( from, input ) );
647 auto lower_bound = transitions.lower_bound (
ext::tie ( from, input ) );
648 auto iter = std::lower_bound ( lower_bound, upper_bound, to, [ ] (
const auto & transition,
const auto & target ) {
return transition.second < target; } );
649 if ( iter != upper_bound && to >= iter->second )
653 transitions.insert ( iter,
std::make_pair ( std::move ( key ), std::move ( to ) ) );
657template<
class SymbolType,
class StateType >
661 return addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) );
664template<
class SymbolType,
class StateType >
668 return addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) );
671template<
class SymbolType,
class StateType >
673 auto upper_bound = transitions.upper_bound (
ext::tie ( from, input ) );
674 auto lower_bound = transitions.lower_bound (
ext::tie ( from, input ) );
675 auto iter = std::find_if ( lower_bound, upper_bound, [ & ] (
const auto & transition ) {
return transition.second == to; } );
676 if ( iter == upper_bound )
679 transitions.erase ( iter );
683template<
class SymbolType,
class StateType >
687 return addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) );
690template<
class SymbolType,
class StateType >
694 return addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) );
697template<
class SymbolType,
class StateType >
702template<
class SymbolType,
class StateType >
704 return std::move ( transitions );
707template<
class SymbolType,
class StateType >
712 if ( transition.first.second.is_epsilon ( ) )
713 result.insert ( transition.first.first, transition.second );
718template<
class SymbolType,
class StateType >
723 if ( ! transition.first.second.is_epsilon ( ) )
724 result.insert (
ext::make_pair ( transition.first.first, transition.first.second.getSymbol ( ) ), transition.second );
729template<
class SymbolType,
class StateType >
731 if ( ! getStates ( ).contains ( from ) )
737 if ( transition.first.first == from )
738 transitionsFromState.
insert ( transition );
740 return transitionsFromState;
743template<
class SymbolType,
class StateType >
745 if ( ! getStates ( ).contains ( from ) )
751 for (
const auto & transition : transitions.equal_range ( key ) )
752 res.insert ( transition.first.first, transition.second );
757template<
class SymbolType,
class StateType >
759 if ( ! getStates ( ).contains ( from ) )
765 if ( ( transition.first.first == from ) && ! transition.first.second.is_epsilon ( ) )
766 transitionsFromState.
insert (
ext::make_pair ( transition.first.first, transition.first.second.getSymbol ( ) ), transition.second );
768 return transitionsFromState;
771template<
class SymbolType,
class StateType >
773 if ( ! getStates ( ).contains ( to ) )
779 if ( transition.second == to )
780 transitionsToState.
insert ( transition.first, to );
782 return transitionsToState;
785template<
class SymbolType,
class StateType >
787 if ( ! getStates ( ).contains ( to ) )
793 if ( transition.second == to && transition.first.second.is_epsilon ( ) )
794 transitionsToState.
insert ( transition.first.first, to );
796 return transitionsToState;
799template<
class SymbolType,
class StateType >
801 if ( ! getStates ( ).contains ( to ) )
807 if ( transition.second == to && ! transition.first.second.is_epsilon ( ) )
808 transitionsToState.
insert (
ext::make_pair ( transition.first.first, transition.first.second.getSymbol ( ) ), to );
810 return transitionsToState;
813template<
class SymbolType,
class StateType >
816 if ( transition.first.second.is_epsilon ( ) )
822template<
class SymbolType,
class StateType >
824 if ( transitions.empty ( ) )
827 for (
auto iter = transitions.begin ( ); std::next ( iter ) != transitions.end ( ); ++ iter )
828 if ( iter->first == std::next ( iter )->first )
831 return isEpsilonFree ( ) && getInitialStates ( ).size ( ) == 1;
834template<
class SymbolType,
class StateType >
836 return isDeterministic ( ) && transitions.size ( ) == getInputAlphabet ( ).size ( ) * getStates ( ).size ( );
849template<
class SymbolType,
class StateType >
862 if ( ! transition.first.second.is_epsilon ( ) && ( transition.first.second.getSymbol ( ) == symbol ) )
896template<
class SymbolType,
class StateType >
908 if (
automaton.getInitialStates ( ).contains ( state ) )
911 if (
automaton.getFinalStates ( ).contains ( state ) )
915 if ( ( transition.first.first == state ) || transition.second == state )
949template<
class SymbolType,
class StateType >
973 return automaton.template accessComponent < automaton::States > ( ).get ( ).contains ( state );
992template<
class SymbolType,
class StateType >
1016 return automaton.template accessComponent < automaton::States > ( ).get ( ).contains ( state );
1034template<
class SymbolType,
class StateType >
1049 res.addTransition ( std::move ( from ), std::move ( input ), std::move ( target ) );
static ext::set< DefaultSymbolType > normalizeAlphabet(ext::set< SymbolType > &&symbols)
Definition: SymbolNormalize.h:50
Definition: AutomatonException.h:15
static common::symbol_or_epsilon< DefaultSymbolType > normalizeSymbolEpsilon(common::symbol_or_epsilon< SymbolType > &&symbol)
Definition: AutomatonNormalize.h:81
static DefaultStateType normalizeState(StateType &&state)
Definition: AutomatonNormalize.h:76
static ext::multiset< DefaultStateType > normalizeStates(ext::multiset< StateType > &&states)
Definition: AutomatonNormalize.h:49
Deterministic finite automaton. Accepts regular languages.
Definition: DFA.h:71
Epsilon nondeterministic finite automaton. Accepts regular languages.
Definition: EpsilonNFA.h:74
Epsilon nondeterministic finite automaton. Accepts regular languages.
Definition: MultiInitialStateEpsilonNFA.h:75
ext::set< StateType > && getInitialStates() &&
Definition: MultiInitialStateEpsilonNFA.h:144
void removeState(const StateType &state)
Definition: MultiInitialStateEpsilonNFA.h:224
bool addFinalState(StateType state)
Definition: MultiInitialStateEpsilonNFA.h:253
bool removeTransition(StateType from, common::symbol_or_epsilon< SymbolType > input, StateType to)
Removes a transition to the automaton.
Definition: MultiInitialStateEpsilonNFA.h:672
friend ext::ostream & operator<<(ext::ostream &out, const MultiInitialStateEpsilonNFA &instance)
Definition: MultiInitialStateEpsilonNFA.h:560
bool addInputSymbol(SymbolType symbol)
Definition: MultiInitialStateEpsilonNFA.h:302
const ext::set< SymbolType > & getInputAlphabet() const &
Definition: MultiInitialStateEpsilonNFA.h:282
ext::multimap< StateType, StateType > getEpsilonTransitionsToState(const StateType &to) const
Definition: MultiInitialStateEpsilonNFA.h:786
ext::set< StateType > && getFinalStates() &&
Definition: MultiInitialStateEpsilonNFA.h:242
bool isDeterministic() const
Determines whether the automaton is deterministic.
Definition: MultiInitialStateEpsilonNFA.h:823
MultiInitialStateEpsilonNFA()
Creates a new instance of the automaton with a concrete initial state.
Definition: MultiInitialStateEpsilonNFA.h:603
bool isEpsilonFree() const
Determines whether the automaton is without epsilon transitions.
Definition: MultiInitialStateEpsilonNFA.h:814
ext::multimap< ext::pair< StateType, SymbolType >, StateType > getSymbolTransitionsFromState(const StateType &from) const
Definition: MultiInitialStateEpsilonNFA.h:758
const ext::set< StateType > & getInitialStates() const &
Definition: MultiInitialStateEpsilonNFA.h:135
bool addInitialState(StateType state)
Definition: MultiInitialStateEpsilonNFA.h:155
void setInputAlphabet(ext::set< SymbolType > symbols)
Definition: MultiInitialStateEpsilonNFA.h:320
void setFinalStates(ext::set< StateType > states)
Definition: MultiInitialStateEpsilonNFA.h:262
ext::multimap< StateType, StateType > getEpsilonTransitionsFromState(const StateType &from) const
Definition: MultiInitialStateEpsilonNFA.h:744
void removeInitialState(const StateType &state)
Definition: MultiInitialStateEpsilonNFA.h:175
ext::set< StateType > && getStates() &&
Definition: MultiInitialStateEpsilonNFA.h:193
const ext::set< StateType > & getStates() const &
Definition: MultiInitialStateEpsilonNFA.h:184
bool addState(StateType state)
Definition: MultiInitialStateEpsilonNFA.h:204
void removeFinalState(const StateType &state)
Definition: MultiInitialStateEpsilonNFA.h:273
ext::multimap< ext::pair< StateType, SymbolType >, StateType > getSymbolTransitionsToState(const StateType &to) const
Definition: MultiInitialStateEpsilonNFA.h:800
ext::multimap< StateType, StateType > getEpsilonTransitions() const
Definition: MultiInitialStateEpsilonNFA.h:708
void addInputSymbols(ext::set< SymbolType > symbols)
Definition: MultiInitialStateEpsilonNFA.h:311
void setStates(ext::set< StateType > states)
Definition: MultiInitialStateEpsilonNFA.h:213
bool addTransition(StateType from, common::symbol_or_epsilon< SymbolType > input, StateType to)
Add a transition to the automaton.
Definition: MultiInitialStateEpsilonNFA.h:636
ext::multimap< ext::pair< StateType, SymbolType >, StateType > getSymbolTransitions() const
Definition: MultiInitialStateEpsilonNFA.h:719
void setInitialStates(ext::set< StateType > states)
Definition: MultiInitialStateEpsilonNFA.h:164
const ext::multimap< ext::pair< StateType, common::symbol_or_epsilon< SymbolType > >, StateType > & getTransitions() const &
Definition: MultiInitialStateEpsilonNFA.h:698
ext::multimap< ext::pair< StateType, common::symbol_or_epsilon< SymbolType > >, StateType > getTransitionsToState(const StateType &to) const
Definition: MultiInitialStateEpsilonNFA.h:772
ext::multimap< ext::pair< StateType, common::symbol_or_epsilon< SymbolType > >, StateType > getTransitionsFromState(const StateType &from) const
Definition: MultiInitialStateEpsilonNFA.h:730
bool isTotal() const
Determines whether the automaton is total deterministic.
Definition: MultiInitialStateEpsilonNFA.h:835
SymbolTypeT SymbolType
Definition: MultiInitialStateEpsilonNFA.h:77
const ext::set< StateType > & getFinalStates() const &
Definition: MultiInitialStateEpsilonNFA.h:233
bool operator==(const MultiInitialStateEpsilonNFA &other) const
Definition: MultiInitialStateEpsilonNFA.h:548
StateTypeT StateType
Definition: MultiInitialStateEpsilonNFA.h:78
void removeInputSymbol(const SymbolType &symbol)
Definition: MultiInitialStateEpsilonNFA.h:331
ext::set< SymbolType > && getInputAlphabet() &&
Definition: MultiInitialStateEpsilonNFA.h:291
Nondeterministic finite automaton with multiple initial states. Accepts regular languages.
Definition: MultiInitialStateNFA.h:69
Nondeterministic finite automaton. Accepts regular languages.
Definition: NFA.h:66
Definition: MultiInitialStateEpsilonNFA.h:577
Definition: symbol_or_epsilon.hpp:24
Definition: components.hpp:181
static bool used(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &automaton, const SymbolType &symbol)
Definition: MultiInitialStateEpsilonNFA.h:860
static void valid(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const SymbolType &)
Definition: MultiInitialStateEpsilonNFA.h:886
static bool available(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const SymbolType &)
Definition: MultiInitialStateEpsilonNFA.h:876
static void valid(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateEpsilonNFA.h:939
static bool available(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateEpsilonNFA.h:929
static bool used(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &automaton, const StateType &state)
Definition: MultiInitialStateEpsilonNFA.h:907
static bool available(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &automaton, const StateType &state)
Definition: MultiInitialStateEpsilonNFA.h:1015
static void valid(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateEpsilonNFA.h:1025
static bool used(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateEpsilonNFA.h:1003
static bool used(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateEpsilonNFA.h:960
static bool available(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &automaton, const StateType &state)
Definition: MultiInitialStateEpsilonNFA.h:972
static void valid(const automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateEpsilonNFA.h:982
Definition: setComponents.hpp:26
Class extending the multimap class from the standard library. Original reason is to allow printing of...
Definition: multimap.hpp:48
iterator insert(const T &key, const R &value)
Insert variant with explicit key and value parameters.
Definition: multimap.hpp:118
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Definition: BarSymbol.cpp:12
typename T::StateType StateType
Definition: ToGrammarLeftRG.h:64
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
return res
Definition: MinimizeByPartitioning.h:145
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 bool isMultiInitialStateEpsilonNFA
Definition: MultiInitialStateEpsilonNFA.h:596
Definition: Permutation.hpp:18
Definition: normalize.hpp:10
Definition: sigHandler.cpp:20
constexpr tuple< Elements &... > tie(Elements &... args) noexcept
Helper of extended tuple of references construction. The tuple is constructed to reffer to values in ...
Definition: tuple.hpp:218
reference_mover< T > make_mover(T ¶m)
Move adaptor construction function specialized to lvalue reference parameter.
Definition: iterator.hpp:468
std::string to_string(const T &value)
To string method designated for objects that can be casted to string.
Definition: string.hpp:131
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
auto & get(ext::ptr_array< Type, N > &tpl)
Specialisation of get function for pointer arrays.
Definition: ptr_array.hpp:693
static automaton::MultiInitialStateEpsilonNFA< > eval(automaton::MultiInitialStateEpsilonNFA< SymbolType, StateType > &&value)
Definition: MultiInitialStateEpsilonNFA.h:1036
Definition: normalize.hpp:13