diff --git a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.hxx b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.hxx index fd68ccb4f96dafcbb952f653a76974f599b53f5e..e6056c43abaaa71cbf46cc18d1924b0753044449 100644 --- a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.hxx +++ b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.hxx @@ -25,7 +25,7 @@ void addRetTransition(const ext::set < ext::pair < StateType, StateType > > & fr } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void retInitial(const ext::set < ext::pair < StateType, StateType > > & state, const ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > & pdaSymbol, const ext::variant < EpsilonType, InputSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic, ext::map < ext::tuple < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType >, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > >, ext::set < ext::pair < StateType, StateType > > > & rubbishReturnTransitions ) { +void retInitial(const ext::set < ext::pair < StateType, StateType > > & state, const ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > & pdaSymbol, const ext::variant < EpsilonType, InputSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic, ext::set < ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > > > & rubbishReturnTransitions ) { const ext::set<ext::pair<StateType, StateType>> & S = state; ext::set<ext::pair<StateType, StateType>> S1; @@ -45,14 +45,14 @@ void retInitial(const ext::set < ext::pair < StateType, StateType > > & state, c } } - if ( S1.empty ( ) ) - rubbishReturnTransitions.insert ( std::make_pair ( ext::make_tuple ( state, input, pdaSymbol ), std::move ( S1 ) ) ); - else + if ( ! S1.empty ( ) ) addRetTransition ( state, input, pdaSymbol, std::move ( S1 ), deterministic ); + else + rubbishReturnTransitions.insert(ext::make_pair(state, pdaSymbol ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void ret(const ext::set < ext::pair < StateType, StateType > > & state, const ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > & pdaSymbol, const ext::variant < EpsilonType, InputSymbolType > & input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic, ext::map < ext::tuple < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType >, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > >, ext::set < ext::pair < StateType, StateType > > > & rubbishReturnTransitions) { +void ret(const ext::set < ext::pair < StateType, StateType > > & state, const ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > & pdaSymbol, const ext::variant < EpsilonType, InputSymbolType > & input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic, ext::set < ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > > > & rubbishReturnTransitions) { const ext::set<ext::pair<StateType, StateType>> & S = state; const ext::set<ext::pair<StateType, StateType>>& S1 = pdaSymbol.first; @@ -98,10 +98,10 @@ void ret(const ext::set < ext::pair < StateType, StateType > > & state, const ex } } - if ( S2.empty ( ) ) - rubbishReturnTransitions.insert(std::make_pair(ext::make_tuple(state, input, pdaSymbol), std::move ( S2 ) ) ); - else + if ( ! S2.empty ( ) ) addRetTransition(state, input, pdaSymbol, std::move ( S2 ), deterministic); + else + rubbishReturnTransitions.insert(ext::make_pair(state, pdaSymbol ) ); } template < class InputSymbolType, class EpsilonType, class StateType > @@ -114,7 +114,7 @@ void addCallTransition(const ext::set < ext::pair < StateType, StateType > > & f } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void call(const ext::set < ext::pair < StateType, StateType > > & state, const ext::variant < EpsilonType, InputSymbolType > & input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic, ext::map < ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > > > > & rubbishCallTransitions) { +void call(const ext::set < ext::pair < StateType, StateType > > & state, const ext::variant < EpsilonType, InputSymbolType > & input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic ) { const ext::set < ext::pair < StateType, StateType > > & S = state; ext::set < StateType > R = retrieveDSubSet(S); @@ -133,9 +133,7 @@ void call(const ext::set < ext::pair < StateType, StateType > > & state, const e } } - if ( R1.empty ( ) ) - rubbishCallTransitions.insert(std::make_pair(ext::make_pair(state, input), ext::make_pair( createIdentity ( std::move ( R1 ) ), ext::make_pair(state, input)))); - else + if ( ! R1.empty ( ) ) addCallTransition ( state, input, createIdentity ( std::move ( R1 ) ), ext::make_pair ( state, input ), deterministic); } @@ -148,7 +146,7 @@ void addLocalTransition ( const ext::set < ext::pair < StateType, StateType > > } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void local(const ext::set < ext::pair < StateType, StateType > > & state, const ext::variant < EpsilonType, InputSymbolType > & input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic, ext::map < ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & rubbishLocalTransitions ) { +void local(const ext::set < ext::pair < StateType, StateType > > & state, const ext::variant < EpsilonType, InputSymbolType > & input, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext::pair < ext::set < ext::pair < StateType, StateType > >, ext::variant < EpsilonType, InputSymbolType > >, ext::set < ext::pair < StateType, StateType > > > & deterministic ) { const ext::set<ext::pair<StateType, StateType>> & S = state; ext::set<ext::pair<StateType, StateType>> S1; @@ -167,9 +165,7 @@ void local(const ext::set < ext::pair < StateType, StateType > > & state, const } } - if ( S1.empty ( ) ) - rubbishLocalTransitions.insert ( std::make_pair ( ext::make_pair ( state, input ), std::move ( S1 ) ) ); - else + if ( ! S1.empty ( ) ) addLocalTransition ( state, input, std::move ( S1 ), deterministic ); } @@ -210,14 +206,11 @@ automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext:: automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, DeterministicPushdownStoreSymbolType, DeterministicStateType > d ( initialLabel, bottom ); d.setInputAlphabet ( n.getInputAlphabet ( ) ); - ext::set < DeterministicStateType > rubbishStates = { DeterministicStateType { } }; - ext::map < ext::tuple < DeterministicStateType, ext::variant<EpsilonType, InputSymbolType>, DeterministicPushdownStoreSymbolType >, DeterministicStateType > rubbishReturnTransitions; - ext::map < ext::pair < DeterministicStateType, ext::variant<EpsilonType, InputSymbolType>>, ext::pair < DeterministicStateType, DeterministicPushdownStoreSymbolType > > rubbishCallTransitions; - ext::map < ext::pair < DeterministicStateType, ext::variant<EpsilonType, InputSymbolType>>, DeterministicStateType > rubbishLocalTransitions; + ext::set < ext::pair < DeterministicStateType, DeterministicPushdownStoreSymbolType > > rubbishReturnTransitions; for(;;) { - ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> stateSymbols = existsDirtyStateSymbol(d, rubbishStates, rubbishCallTransitions, rubbishReturnTransitions, n); - ext::set<DeterministicStateType> states = existsDirtyState(d, rubbishStates, rubbishCallTransitions, rubbishLocalTransitions, n); + ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> stateSymbols = existsDirtyStateSymbol(d, rubbishReturnTransitions, n); + ext::set<DeterministicStateType> states = existsDirtyState(d, n); if(stateSymbols.empty() && states.empty()) break; @@ -247,10 +240,10 @@ automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext:: ext::set<ext::variant<EpsilonType, InputSymbolType>>& callPart = std::get<1>(partitioning); for(const auto& symbol : localPart) { - local(state, symbol, n, d, rubbishLocalTransitions); + local(state, symbol, n, d); } for(const auto& symbol : callPart) { - call(state, symbol, n, d, rubbishCallTransitions); + call(state, symbol, n, d); } } } @@ -265,10 +258,7 @@ automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, ext:: } if ( common::GlobalData::verbose ) { - common::Streams::log << "Rubbish states: " << rubbishStates << std::endl; common::Streams::log << "Rubbish return transitions: " << rubbishReturnTransitions << std::endl; - common::Streams::log << "Rubbish call transitions: " << rubbishCallTransitions << std::endl; - common::Streams::log << "Rubbish local transitions:" << rubbishLocalTransitions << std::endl; } return d; diff --git a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.hxx b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.hxx index d21e605022c44b612d5fba40d8406b6998b057b1..db51182c14b30aae1a33af1bda48d933a22e8c9e 100644 --- a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.hxx +++ b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.hxx @@ -175,14 +175,11 @@ automaton::VisiblyPushdownDPDA < InputSymbolType, ext::pair < ext::set < ext::pa d.setLocalInputAlphabet(n.getLocalInputAlphabet()); d.setReturnInputAlphabet(n.getReturnInputAlphabet()); - ext::set < DeterministicStateType > rubbishStates = { DeterministicStateType { } }; - ext::map < ext::tuple < DeterministicStateType, InputSymbolType, DeterministicPushdownStoreSymbolType >, DeterministicStateType > rubbishReturnTransitions; - ext::map < ext::pair < DeterministicStateType, InputSymbolType>, ext::pair < DeterministicStateType, DeterministicPushdownStoreSymbolType > > rubbishCallTransitions; - ext::map < ext::pair < DeterministicStateType, InputSymbolType>, DeterministicStateType > rubbishLocalTransitions; + ext::set < ext::pair < DeterministicStateType, DeterministicPushdownStoreSymbolType > > rubbishReturnTransitions; for(;;) { - ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> stateSymbols = existsDirtyStateSymbol(d, rubbishStates, rubbishCallTransitions, rubbishReturnTransitions, n); - ext::set<DeterministicStateType> states = existsDirtyState(d, rubbishStates, rubbishCallTransitions, rubbishLocalTransitions, n); + ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> stateSymbols = existsDirtyStateSymbol(d, rubbishReturnTransitions, n); + ext::set<DeterministicStateType> states = existsDirtyState(d, n); if(stateSymbols.empty() && states.empty()) break; diff --git a/alib2algo/src/automaton/determinize/common/RHDPDACommon.h b/alib2algo/src/automaton/determinize/common/RHDPDACommon.h index d0db39d3138cf98abba89e7b19b6e96375165170..cd71bd533c281c5e79c8a6b177e9c364ba34e2b7 100644 --- a/alib2algo/src/automaton/determinize/common/RHDPDACommon.h +++ b/alib2algo/src/automaton/determinize/common/RHDPDACommon.h @@ -32,21 +32,12 @@ ext::set<ext::pair<StateType, StateType>> createIdentity(const ext::set<StateTyp return id; } -template<class T, class StateType, class InputSymbolType, class DeterministicPushdownStoreSymbolType, class R> -ext::set<ext::set<ext::pair<StateType,StateType>>> existsDirtyState(const T& d, const ext::set<ext::set<ext::pair<StateType,StateType>>>& rubbishStates, const ext::map<ext::pair< ext::set<ext::pair<StateType, StateType>>, InputSymbolType>, DeterministicPushdownStoreSymbolType >& rubbishCallTransitions, const ext::map<ext::pair<ext::set<ext::pair<StateType,StateType>>, InputSymbolType>, ext::set<ext::pair<StateType,StateType>>>& rubbishLocalTransitions, const R& n) { - ext::set<ext::set<ext::pair<StateType,StateType>>> dirtyStates; +template<class T, class R> +ext::set < typename T::StateType_t > existsDirtyState(const T& d, const R& n) { + ext::set < typename T::StateType_t > dirtyStates; - ext::set<ext::set<ext::pair<StateType,StateType>>> states = d.getStates(); - states.insert(rubbishStates.begin(), rubbishStates.end()); - - auto callTransitions = d.getCallTransitions(); - callTransitions.insert(rubbishCallTransitions.begin(), rubbishCallTransitions.end()); - - auto localTransitions = d.getLocalTransitions(); - localTransitions.insert(rubbishLocalTransitions.begin(), rubbishLocalTransitions.end()); - - for(const ext::set<ext::pair<StateType,StateType>>& state : states) { - const ext::set<StateType> dSubSet = retrieveDSubSet(state); + for(const typename T::StateType_t & state : d.getStates ( ) ) { + auto dSubSet = retrieveDSubSet(state); bool originalCallsLocals = false; for(const auto& transition : n.getCallTransitions()) { @@ -65,13 +56,13 @@ ext::set<ext::set<ext::pair<StateType,StateType>>> existsDirtyState(const T& d, if(!originalCallsLocals) continue; bool deterministicCallLocals = false; - for(const auto& transition : callTransitions) { + for(const auto& transition : d.getCallTransitions ( ) ) { if(state == transition.first.first) { deterministicCallLocals = true; break; } } - if(deterministicCallLocals) for(const auto& transition : localTransitions) { + if(deterministicCallLocals) for(const auto& transition : d.getLocalTransitions ( ) ) { if(state == transition.first.first) { deterministicCallLocals = true; break; @@ -118,20 +109,11 @@ ext::set < DeterministicStateType > localClosure ( const DeterministicStateType return closed; } -template<class T, class DeterministicStateType, class InputSymbolType, class DeterministicPushdownStoreSymbolType, class R> -ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> existsDirtyStateSymbol(const T& d, const ext::set<DeterministicStateType>& rubbishStates, const ext::map < ext::pair < DeterministicStateType, InputSymbolType>, ext::pair < DeterministicStateType, DeterministicPushdownStoreSymbolType > > & rubbishCallTransitions, const ext::map < ext::tuple < DeterministicStateType, InputSymbolType, DeterministicPushdownStoreSymbolType >, DeterministicStateType > & rubbishReturnTransitions, const R& n) { +template<class T, class DeterministicStateType, class DeterministicPushdownStoreSymbolType, class R> +ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> existsDirtyStateSymbol(const T& d, const ext::set < ext::pair < DeterministicStateType, DeterministicPushdownStoreSymbolType > > & rubbishReturnTransitions, const R& n) { ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType>> dirtyStateSymbols; - ext::set<DeterministicStateType> states = d.getStates(); - states.insert(rubbishStates.begin(), rubbishStates.end()); - - auto callTransitions = d.getCallTransitions(); - callTransitions.insert(rubbishCallTransitions.begin(), rubbishCallTransitions.end()); - - auto returnTransitions = d.getReturnTransitions(); - returnTransitions.insert(rubbishReturnTransitions.begin(), rubbishReturnTransitions.end()); - - for(const DeterministicStateType& state : states) { + for(const DeterministicStateType& state : d.getStates ( ) ) { bool originalPops = false; auto dSubSet = retrieveDSubSet(state); @@ -147,7 +129,7 @@ ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType> ext::set<DeterministicPushdownStoreSymbolType> topSymbols; for(const DeterministicStateType& localState : lc) { - for(const auto& transition : callTransitions) { + for(const auto& transition : d.getCallTransitions ( ) ) { const auto& to = transition.second; if(localState != to.first) continue; @@ -158,12 +140,18 @@ ext::set<ext::pair<DeterministicStateType, DeterministicPushdownStoreSymbolType> topSymbols.insert(d.getBottomOfTheStackSymbol()); } - for(const auto& transition : returnTransitions) { + for(const auto& transition : d.getReturnTransitions ( ) ) { if(state != std::get<0>(transition.first)) continue; topSymbols.erase(std::get<2>(transition.first)); } + for ( const auto & transition : rubbishReturnTransitions ) { + if(state != transition.first) continue; + + topSymbols.erase(transition.second); + } + for(const DeterministicPushdownStoreSymbolType& topSymbol : topSymbols) dirtyStateSymbols.insert(ext::make_pair(state, topSymbol)); } diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h index e97e795fcbf0d1dc31a23d41f883d74ea3542a6f..f31b863374ff223e41d5dda997ebb0017d4b1f04 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h @@ -50,6 +50,8 @@ protected: ext::map < ext::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, StateType > localTransitions; public: + using StateType_t = StateType; + explicit RealTimeHeightDeterministicDPDA ( ext::set < StateType > states, ext::set < InputSymbolType > inputAlphabet, ext::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType bottomOfTheStackSymbol, ext::set < StateType > finalStates ); explicit RealTimeHeightDeterministicDPDA ( StateType initialState, PushdownStoreSymbolType bottomOfTheStackSymbol ); diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h index ea11c6f3ab8f032d31bbeafa0378d811c84d97b7..1a9bb228c945da8fc4fccf4ad37fbb0f93a5fe10 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h +++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h @@ -51,6 +51,8 @@ protected: ext::map < ext::pair < StateType, InputSymbolType >, StateType > localTransitions; public: + using StateType_t = StateType; + explicit VisiblyPushdownDPDA ( ext::set < StateType > states, ext::set < InputSymbolType > callAlphabet, ext::set < InputSymbolType > returnAlphabet, ext::set < InputSymbolType > localAlphabet, ext::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType bottomOfTheStackSymbol, ext::set < StateType > finalStates ); explicit VisiblyPushdownDPDA ( StateType initialSymbol, PushdownStoreSymbolType bottomOfTheStackSymbol );