diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp index 2949b9f3d45bc1b94bbb900da4ac63b2961cd69b..75286026260aa442e94a9f8d651771a32bea8be9 100644 --- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp +++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp @@ -14,9 +14,9 @@ namespace automaton { namespace transform { -auto AutomataUnionEpsilonTransitionEpsilonNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > &, const automaton::EpsilonNFA < > & > ( AutomataUnionEpsilonTransition::unification ); -auto AutomataUnionEpsilonTransitionNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataUnionEpsilonTransition::unification ); -auto AutomataUnionEpsilonTransitionDFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataUnionEpsilonTransition::unification ); +auto AutomataUnionEpsilonTransitionEpsilonNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, ext::pair < DefaultStateType, unsigned > >, const automaton::EpsilonNFA < > &, const automaton::EpsilonNFA < > & > ( AutomataUnionEpsilonTransition::unification ); +auto AutomataUnionEpsilonTransitionNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, ext::pair < DefaultStateType, unsigned > >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataUnionEpsilonTransition::unification ); +auto AutomataUnionEpsilonTransitionDFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, ext::pair < DefaultStateType, unsigned > >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataUnionEpsilonTransition::unification ); } /* namespace transform */ diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h index 0592e51cb18a2acf54661080baeaacc785dd5656..fc9c144f09f7909107522f1babda92f62abef738 100644 --- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h +++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h @@ -47,139 +47,127 @@ public: * @return epsilon nondeterministic FA representing the union of two automata */ template < class SymbolType, class EpsilonType, class StateType > - static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second); + static automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second); /** * @overload */ template < class SymbolType, class EpsilonType = DefaultEpsilonType, class StateType > - static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second); + static automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second); /** * @overload */ template < class SymbolType, class EpsilonType = DefaultEpsilonType, class StateType > - static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > unification(const automaton::DFA < SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second); + static automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > unification(const automaton::DFA < SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second); }; template < class SymbolType, class EpsilonType, class StateType > -automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > AutomataUnionEpsilonTransition::unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second) { - static StateType firstDefault ( 1 ); - static StateType secondDefault ( 2 ); +automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > AutomataUnionEpsilonTransition::unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second) { + unsigned firstDefault = 1; + unsigned secondDefault = 2; - ext::set<StateType> states; - for(const auto& q : first.getStates()) - states.insert(StateType(firstDefault, q)); - for(const auto& q : second.getStates()) - states.insert(StateType(secondDefault, q)); - - StateType q0 = common::createUnique(label::InitialStateLabel::instance < StateType > ( ), states); - automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res(q0); + ext::pair < StateType, unsigned > q0 = ext::make_pair ( label::InitialStateLabel::instance < StateType > ( ), 0 ); + automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > res ( q0 ); for(const auto& a : first.getInputAlphabet()) res.addInputSymbol(a); for(const auto& a : second.getInputAlphabet()) res.addInputSymbol(a); - for(const auto& q : states) - res.addState(q); + for ( const auto & q : first.getStates ( ) ) + res.addState ( ext::make_pair ( q, firstDefault ) ); + for ( const auto & q : second.getStates ( ) ) + res.addState ( ext::make_pair ( q, secondDefault ) ); for(const auto& q : first.getFinalStates()) - res.addFinalState(StateType(firstDefault, q)); + res.addFinalState ( ext::make_pair ( q, firstDefault ) ); for(const auto& q : second.getFinalStates()) - res.addFinalState(StateType(secondDefault, q)); + res.addFinalState ( ext::make_pair ( q, secondDefault ) ); - res.addTransition(q0, StateType(firstDefault, first.getInitialState())); - res.addTransition(q0, StateType(secondDefault, second.getInitialState())); + res.addTransition ( q0, ext::make_pair ( first.getInitialState ( ), firstDefault ) ); + res.addTransition ( q0, ext::make_pair ( second.getInitialState ( ), secondDefault ) ); for(const auto& t : first.getTransitions()) for(const auto& q : t.second) - res.addTransition(StateType(firstDefault, t.first.first), t.first.second, StateType(firstDefault, q)); + res.addTransition ( ext::make_pair ( t.first.first, firstDefault ), t.first.second, ext::make_pair ( q, firstDefault ) ); for(const auto& t : second.getTransitions()) for(const auto& q : t.second) - res.addTransition(StateType(secondDefault, t.first.first), t.first.second, StateType(secondDefault, q)); + res.addTransition ( ext::make_pair ( t.first.first, secondDefault ), t.first.second, ext::make_pair ( q, secondDefault ) ); return res; } template < class SymbolType, class EpsilonType, class StateType > -automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > AutomataUnionEpsilonTransition::unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second) { - static StateType firstDefault ( 1 ); - static StateType secondDefault ( 2 ); - - ext::set<StateType> states; - for(const auto& q : first.getStates()) - states.insert(StateType(firstDefault, q)); - for(const auto& q : second.getStates()) - states.insert(StateType(secondDefault, q)); +automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > AutomataUnionEpsilonTransition::unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second) { + unsigned firstDefault = 1; + unsigned secondDefault = 2; - StateType q0 = common::createUnique(label::InitialStateLabel::instance < StateType > ( ), states); - automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res(q0); + ext::pair < StateType, unsigned > q0 = ext::make_pair ( label::InitialStateLabel::instance < StateType > ( ), 0 ); + automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > res ( q0 ); for(const auto& a : first.getInputAlphabet()) res.addInputSymbol(a); for(const auto& a : second.getInputAlphabet()) res.addInputSymbol(a); - for(const auto& q : states) - res.addState(q); + for ( const auto & q : first.getStates ( ) ) + res.addState ( ext::make_pair ( q, firstDefault ) ); + for ( const auto & q : second.getStates ( ) ) + res.addState ( ext::make_pair ( q, secondDefault ) ); for(const auto& q : first.getFinalStates()) - res.addFinalState(StateType(firstDefault, q)); + res.addFinalState ( ext::make_pair ( q, firstDefault ) ); for(const auto& q : second.getFinalStates()) - res.addFinalState(StateType(secondDefault, q)); + res.addFinalState ( ext::make_pair ( q, secondDefault ) ); - res.addTransition(q0, StateType(firstDefault, first.getInitialState())); - res.addTransition(q0, StateType(secondDefault, second.getInitialState())); + res.addTransition ( q0, ext::make_pair ( first.getInitialState ( ), firstDefault ) ); + res.addTransition ( q0, ext::make_pair ( second.getInitialState ( ), secondDefault ) ); for(const auto& t : first.getTransitions()) for(const auto& q : t.second) - res.addTransition(StateType(firstDefault, t.first.first), t.first.second, StateType(firstDefault, q)); + res.addTransition ( ext::make_pair ( t.first.first, firstDefault ), t.first.second, ext::make_pair ( q, firstDefault ) ); for(const auto& t : second.getTransitions()) for(const auto& q : t.second) - res.addTransition(StateType(secondDefault, t.first.first), t.first.second, StateType(secondDefault, q)); + res.addTransition ( ext::make_pair ( t.first.first, secondDefault ), t.first.second, ext::make_pair ( q, secondDefault ) ); return res; } template < class SymbolType, class EpsilonType, class StateType > -automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > AutomataUnionEpsilonTransition::unification(const automaton::DFA< SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second) { - static StateType firstDefault ( 1 ); - static StateType secondDefault ( 2 ); - - ext::set<StateType> states; - for(const auto& q : first.getStates()) - states.insert(StateType(firstDefault, q)); - for(const auto& q : second.getStates()) - states.insert(StateType(secondDefault, q)); +automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > AutomataUnionEpsilonTransition::unification(const automaton::DFA< SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second) { + unsigned firstDefault = 1; + unsigned secondDefault = 2; - StateType q0 = common::createUnique(label::InitialStateLabel::instance < StateType > ( ), states); - automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res(q0); + ext::pair < StateType, unsigned > q0 = ext::make_pair ( label::InitialStateLabel::instance < StateType > ( ), 0 ); + automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > res ( q0 ); for(const auto& a : first.getInputAlphabet()) res.addInputSymbol(a); for(const auto& a : second.getInputAlphabet()) res.addInputSymbol(a); - for(const auto& q : states) - res.addState(q); + for ( const auto & q : first.getStates ( ) ) + res.addState ( ext::make_pair ( q, firstDefault ) ); + for ( const auto & q : second.getStates ( ) ) + res.addState ( ext::make_pair ( q, secondDefault ) ); for(const auto& q : first.getFinalStates()) - res.addFinalState(StateType(firstDefault, q)); + res.addFinalState ( ext::make_pair ( q, firstDefault ) ); for(const auto& q : second.getFinalStates()) - res.addFinalState(StateType(secondDefault, q)); + res.addFinalState ( ext::make_pair ( q, secondDefault ) ); - res.addTransition(q0, StateType(firstDefault, first.getInitialState())); - res.addTransition(q0, StateType(secondDefault, second.getInitialState())); + res.addTransition ( q0, ext::make_pair ( first.getInitialState ( ), firstDefault ) ); + res.addTransition ( q0, ext::make_pair ( second.getInitialState ( ), secondDefault ) ); for(const auto& t : first.getTransitions()) - res.addTransition(StateType(firstDefault, t.first.first), t.first.second, StateType(firstDefault, t.second)); + res.addTransition ( ext::make_pair ( t.first.first, firstDefault ), t.first.second, ext::make_pair ( t.second, firstDefault ) ); for(const auto& t : second.getTransitions()) - res.addTransition(StateType(secondDefault, t.first.first), t.first.second, StateType(secondDefault, t.second)); + res.addTransition ( ext::make_pair ( t.first.first, secondDefault ), t.first.second, ext::make_pair ( t.second, secondDefault ) ); return res; }