28#include <alib/multimap>
68template <
class SymbolTypeT = DefaultSymbolType,
class StateTypeT = DefaultStateType >
69class MultiInitialStateNFA final :
public core::Components < MultiInitialStateNFA < SymbolTypeT, StateTypeT >, ext::set < SymbolTypeT >, component::Set, InputAlphabet, ext::set < StateTypeT >, component::Set, std::tuple < States, InitialStates, FinalStates > > {
118 return this->
template accessComponent < InitialStates > ( ).get ( );
127 return std::move ( this->
template accessComponent < InitialStates > ( ).
get ( ) );
138 return this->
template accessComponent < InitialStates > ( ).add ( std::move ( state ) );
147 this->
template accessComponent < InitialStates > ( ).set ( std::move ( states ) );
158 this->
template accessComponent < InitialStates > ( ).remove ( state );
167 return this->
template accessComponent < States > ( ).get ( );
176 return std::move ( this->
template accessComponent < States > ( ).
get ( ) );
187 return this->
template accessComponent < States > ( ).add ( std::move ( state ) );
196 this->
template accessComponent < States > ( ).set ( std::move ( states ) );
207 this->
template accessComponent < States > ( ).remove ( state );
216 return this->
template accessComponent < FinalStates > ( ).get ( );
225 return std::move ( this->
template accessComponent < FinalStates > ( ).
get ( ) );
236 return this->
template accessComponent < FinalStates > ( ).add ( std::move ( state ) );
245 this->
template accessComponent < FinalStates > ( ).set ( std::move ( states ) );
256 this->
template accessComponent < FinalStates > ( ).remove ( state );
265 return this->
template accessComponent < InputAlphabet > ( ).get ( );
274 return std::move ( this->
template accessComponent < InputAlphabet > ( ).
get ( ) );
285 return this->
template accessComponent < InputAlphabet > ( ).add ( std::move ( symbol ) );
294 this->
template accessComponent < InputAlphabet > ( ).add ( std::move ( symbols ) );
303 this->
template accessComponent < InputAlphabet > ( ).set ( std::move ( symbols ) );
314 this->
template accessComponent < InputAlphabet > ( ).remove ( symbol );
430 return out <<
"(MultiInitialStateNFA"
431 <<
" states = " << instance.
getStates ( )
456template <
class SymbolType,
class StateType >
467template <
class SymbolType,
class StateType >
468MultiInitialStateNFA < SymbolType, StateType >::MultiInitialStateNFA (
ext::set < StateType > states,
ext::set < SymbolType > inputAlphabet,
ext::set < StateType > initialStates,
ext::set < StateType > finalStates ) :
core::Components <
MultiInitialStateNFA,
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 ) ) {
471template <
class SymbolType,
class StateType >
475template <
class SymbolType,
class StateType >
477 transitions.insert ( other.getTransitions ( ).begin ( ), other.getTransitions ( ).end ( ) );
480template <
class SymbolType,
class StateType >
485template <
class SymbolType,
class StateType >
487 if ( ! getStates ( ).contains ( from ) )
490 if ( ! getInputAlphabet ( ).contains ( input ) )
493 if ( ! getStates ( ).contains ( to ) )
496 auto upper_bound = transitions.upper_bound (
ext::tie ( from, input ) );
497 auto lower_bound = transitions.lower_bound (
ext::tie ( from, input ) );
498 auto iter = std::lower_bound ( lower_bound, upper_bound, to, [ ] (
const auto & transition,
const auto & target ) {
return transition.second < target; } );
499 if ( iter != upper_bound && to >= iter->second )
503 transitions.insert ( iter,
std::make_pair ( std::move ( key ), std::move ( to ) ) );
507template <
class SymbolType,
class StateType >
509 auto upper_bound = transitions.upper_bound (
ext::tie ( from, input ) );
510 auto lower_bound = transitions.lower_bound (
ext::tie ( from, input ) );
511 auto iter = std::find_if ( lower_bound, upper_bound, [ & ] (
const auto & transition ) {
return transition.second == to; } );
512 if ( iter == upper_bound )
515 transitions.erase ( iter );
519template <
class SymbolType,
class StateType >
524template <
class SymbolType,
class StateType >
526 return std::move ( transitions );
529template <
class SymbolType,
class StateType >
531 if ( ! getStates ( ).contains ( from ) )
537template <
class SymbolType,
class StateType >
539 if ( ! getStates ( ).contains ( to ) )
545 if ( transition.second == to )
546 transitionsToState.
insert ( transition );
548 return transitionsToState;
551template <
class SymbolType,
class StateType >
553 if ( transitions.empty ( ) )
556 for (
auto iter = transitions.begin ( ); std::next ( iter ) != transitions.end ( ); ++ iter )
557 if ( iter->first == std::next ( iter )->first )
560 return getInitialStates ( ).size ( ) == 1;
563template <
class SymbolType,
class StateType >
565 return isDeterministic ( ) && transitions.size ( ) == getInputAlphabet ( ).size ( ) * getStates ( ).size ( );
578template <
class SymbolType,
class StateType >
591 if ( transition.first.second == symbol )
625template <
class SymbolType,
class StateType >
637 if (
automaton.getInitialStates ( ).contains ( state ) )
640 if (
automaton.getFinalStates ( ).contains ( state ) )
644 if ( transition.first.first == state || transition.second == state )
678template <
class SymbolType,
class StateType >
702 return automaton.template accessComponent < automaton::States > ( ).get ( ).contains ( state );
721template <
class SymbolType,
class StateType >
745 return automaton.template accessComponent < automaton::States > ( ).get ( ).contains ( state );
763template <
class SymbolType,
class StateType >
778 res.addTransition ( std::move ( from ), std::move ( input ), std::move ( target ) );
static ext::set< DefaultSymbolType > normalizeAlphabet(ext::set< SymbolType > &&symbols)
Definition: SymbolNormalize.h:50
static DefaultSymbolType normalizeSymbol(SymbolType &&symbol)
Definition: SymbolNormalize.h:68
Definition: AutomatonException.h:15
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
Nondeterministic finite automaton with multiple initial states. Accepts regular languages.
Definition: MultiInitialStateNFA.h:69
void setStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:195
StateTypeT StateType
Definition: MultiInitialStateNFA.h:72
void removeFinalState(const StateType &state)
Definition: MultiInitialStateNFA.h:255
void removeState(const StateType &state)
Definition: MultiInitialStateNFA.h:206
bool removeTransition(const StateType &from, const SymbolType &input, const StateType &to)
Removes a transition from the automaton.
Definition: MultiInitialStateNFA.h:508
void addInputSymbols(ext::set< SymbolType > symbols)
Definition: MultiInitialStateNFA.h:293
ext::set< StateType > && getInitialStates() &&
Definition: MultiInitialStateNFA.h:126
bool isDeterministic() const
Determines whether the automaton is deterministic.
Definition: MultiInitialStateNFA.h:552
bool addInitialState(StateType state)
Definition: MultiInitialStateNFA.h:137
SymbolTypeT SymbolType
Definition: MultiInitialStateNFA.h:71
bool addState(StateType state)
Definition: MultiInitialStateNFA.h:186
bool addFinalState(StateType state)
Definition: MultiInitialStateNFA.h:235
ext::set< StateType > && getStates() &&
Definition: MultiInitialStateNFA.h:175
bool addInputSymbol(SymbolType symbol)
Definition: MultiInitialStateNFA.h:284
void setInitialStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:146
void setFinalStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:244
ext::set< SymbolType > && getInputAlphabet() &&
Definition: MultiInitialStateNFA.h:273
const ext::set< StateType > & getInitialStates() const &
Definition: MultiInitialStateNFA.h:117
const ext::set< StateType > & getStates() const &
Definition: MultiInitialStateNFA.h:166
const ext::multimap< ext::pair< StateType, SymbolType >, StateType > & getTransitions() const &
Definition: MultiInitialStateNFA.h:520
const ext::set< StateType > & getFinalStates() const &
Definition: MultiInitialStateNFA.h:215
MultiInitialStateNFA()
Creates a new instance of the automaton.
Definition: MultiInitialStateNFA.h:472
auto getTransitionsFromState(const StateType &from) const
Definition: MultiInitialStateNFA.h:530
ext::multimap< ext::pair< StateType, SymbolType >, StateType > getTransitionsToState(const StateType &to) const
Definition: MultiInitialStateNFA.h:538
ext::set< StateType > && getFinalStates() &&
Definition: MultiInitialStateNFA.h:224
friend ext::ostream & operator<<(ext::ostream &out, const MultiInitialStateNFA &instance)
Definition: MultiInitialStateNFA.h:429
void setInputAlphabet(ext::set< SymbolType > symbols)
Definition: MultiInitialStateNFA.h:302
void removeInitialState(const StateType &state)
Definition: MultiInitialStateNFA.h:157
const ext::set< SymbolType > & getInputAlphabet() const &
Definition: MultiInitialStateNFA.h:264
bool addTransition(StateType from, SymbolType input, StateType to)
Add a transition to the automaton.
Definition: MultiInitialStateNFA.h:486
void removeInputSymbol(const SymbolType &symbol)
Definition: MultiInitialStateNFA.h:313
bool operator==(const MultiInitialStateNFA &other) const
Definition: MultiInitialStateNFA.h:417
bool isTotal() const
Determines whether the automaton is total deterministic.
Definition: MultiInitialStateNFA.h:564
Nondeterministic finite automaton. Accepts regular languages.
Definition: NFA.h:66
Definition: MultiInitialStateNFA.h:446
Definition: components.hpp:181
static bool used(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateNFA.h:732
static bool available(const automaton::MultiInitialStateNFA< SymbolType, StateType > &automaton, const StateType &state)
Definition: MultiInitialStateNFA.h:744
static void valid(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateNFA.h:754
static bool used(const automaton::MultiInitialStateNFA< SymbolType, StateType > &automaton, const SymbolType &symbol)
Definition: MultiInitialStateNFA.h:589
static bool available(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const SymbolType &)
Definition: MultiInitialStateNFA.h:605
static void valid(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const SymbolType &)
Definition: MultiInitialStateNFA.h:615
static bool available(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateNFA.h:658
static bool used(const automaton::MultiInitialStateNFA< SymbolType, StateType > &automaton, const StateType &state)
Definition: MultiInitialStateNFA.h:636
static void valid(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateNFA.h:668
static void valid(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateNFA.h:711
static bool available(const automaton::MultiInitialStateNFA< SymbolType, StateType > &automaton, const StateType &state)
Definition: MultiInitialStateNFA.h:701
static bool used(const automaton::MultiInitialStateNFA< SymbolType, StateType > &, const StateType &)
Definition: MultiInitialStateNFA.h:689
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
Definition: ToGrammar.h:31
constexpr bool isMultiInitialStateNFA
Definition: MultiInitialStateNFA.h:465
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
SliceComp< Ts ... > slice_comp(const Ts &... inst)
Definition: functional.hpp:95
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::MultiInitialStateNFA< > eval(automaton::MultiInitialStateNFA< SymbolType, StateType > &&value)
Definition: MultiInitialStateNFA.h:765
Definition: normalize.hpp:13