Skip to content
Snippets Groups Projects
Commit 866daa2a authored by Jan Trávníček's avatar Jan Trávníček
Browse files

template determinisation of InputDrivenPDAs

parent dc890c62
No related branches found
No related tags found
No related merge requests found
......@@ -26,10 +26,6 @@ namespace automaton {
 
namespace determinize {
 
DFA<> Determinize::determinize(const automaton::DFA<>& automaton) {
return automaton;
}
auto DeterminizeDFA = registration::AbstractRegister < Determinize, automaton::DFA < >, const automaton::DFA < > & > ( Determinize::determinize );
 
DPDA < > Determinize::determinize(const automaton::DPDA < > & automaton) {
......@@ -44,10 +40,6 @@ SinglePopDPDA < > Determinize::determinize(const automaton::SinglePopDPDA < > &
 
auto DeterminizeSinglePopDPDA = registration::AbstractRegister < Determinize, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( Determinize::determinize );
 
InputDrivenDPDA < > Determinize::determinize(const automaton::InputDrivenDPDA < > & automaton) {
return automaton;
}
auto DeterminizeInputDrivenDPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( Determinize::determinize );
 
VisiblyPushdownDPDA < > Determinize::determinize(const automaton::VisiblyPushdownDPDA < > & automaton) {
......@@ -87,11 +79,12 @@ auto DeterminizeDFTA = registration::AbstractRegister < Determinize, automaton::
auto DeterminizeMultiInitialStateNFA = registration::AbstractRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::MultiInitialStateNFA < > & > ( Determinize::determinize );
auto DeterminizeNFA = registration::AbstractRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::NFA < > & > ( Determinize::determinize );
 
auto DeterminizeInputDrivenNPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < DefaultSymbolType, DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::InputDrivenNPDA < > & > ( Determinize::determinize );
} /* namespace determinize */
 
} /* namespace automaton */
 
#include "DeterminizeIDPDAPart.cxx"
#include "DeterminizeVPAPart.cxx"
#include "DeterminizeRHDPDAPart.cxx"
#include "DeterminizeNFTAPart.cxx"
......
......@@ -22,8 +22,8 @@ namespace determinize {
*/
class Determinize {
public:
static automaton::DFA<> determinize(const automaton::DFA<>& nfa);
template < class SymbolType, class StateType >
static automaton::DFA < SymbolType, StateType > determinize ( const automaton::DFA < SymbolType, StateType > & nfa );
 
/**
* @param nfsm nondeterministic final-state machine given for determinization
......@@ -41,8 +41,13 @@ public:
static automaton::SinglePopDPDA < > determinize(const automaton::SinglePopDPDA < > & dpda);
static automaton::VisiblyPushdownDPDA < > determinize(const automaton::VisiblyPushdownDPDA < > & nondeterministic);
static automaton::VisiblyPushdownDPDA < > determinize(const automaton::VisiblyPushdownNPDA < > & nondeterministic);
static automaton::InputDrivenDPDA < > determinize(const automaton::InputDrivenDPDA < > & nfa);
static automaton::InputDrivenDPDA < > determinize(const automaton::InputDrivenNPDA < > & nfa);
template < class InputSymbolType, class PushdownSymbolType, class StateType >
static automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, StateType > determinize ( const automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, StateType > & dpda );
template < class InputSymbolType, class PushdownSymbolType, class StateType >
static automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, ext::set < StateType > > determinize ( const automaton::InputDrivenNPDA < InputSymbolType, PushdownSymbolType, StateType > & npda );
static automaton::RealTimeHeightDeterministicDPDA < > determinize(const automaton::RealTimeHeightDeterministicDPDA < > & nondeterministic);
static automaton::RealTimeHeightDeterministicDPDA < > determinize(const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic);
static automaton::DFTA < > determinize(const automaton::DFTA < > & nfta);
......@@ -51,10 +56,21 @@ public:
static automaton::OneTapeDTM<> determinize(const automaton::OneTapeDTM<>& nfta);
};
 
template < class SymbolType, class StateType >
automaton::DFA < SymbolType, StateType > Determinize::determinize ( const automaton::DFA < SymbolType, StateType > & automaton ) {
return automaton;
}
template < class InputSymbolType, class PushdownSymbolType, class StateType >
automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, StateType > Determinize::determinize ( const automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, StateType > & automaton ) {
return automaton;
}
} /* namespace determinize */
 
} /* namespace automaton */
 
#include "DeterminizeNFAPart.hxx"
#include "DeterminizeIDPDAPart.hxx"
 
#endif /* DETERMINIZE_H_ */
......@@ -15,37 +15,37 @@ namespace automaton {
 
namespace determinize {
 
automaton::InputDrivenDPDA < > Determinize::determinize ( const automaton::InputDrivenNPDA < > & nfa ) {
template < class InputSymbolType, class PushdownSymbolType, class StateType >
automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, ext::set < StateType > > Determinize::determinize ( const automaton::InputDrivenNPDA < InputSymbolType, PushdownSymbolType, StateType > & npda ) {
// 1, 4
DefaultStateType initialState ( createDFAState ( { nfa.getInitialState ( ) } ) );
automaton::InputDrivenDPDA < > res ( initialState, nfa.getInitialSymbol ( ) );
ext::set < StateType > initialState;
initialState.insert ( npda.getInitialState ( ) );
automaton::InputDrivenDPDA < InputSymbolType, PushdownSymbolType, ext::set < StateType > > res ( initialState, npda.getInitialSymbol ( ) );
 
res.setInputAlphabet ( nfa.getInputAlphabet ( ) );
res.setPushdownStoreAlphabet ( nfa.getPushdownStoreAlphabet ( ) );
res.setPushdownStoreOperations ( nfa.getPushdownStoreOperations ( ) );
res.setInputAlphabet ( npda.getInputAlphabet ( ) );
res.setPushdownStoreAlphabet ( npda.getPushdownStoreAlphabet ( ) );
res.setPushdownStoreOperations ( npda.getPushdownStoreOperations ( ) );
 
// 2
ext::deque < DefaultStateType > todo;
ext::deque < ext::set < StateType > > todo;
todo.push_back ( std::move ( initialState ) );
 
do {
// 3a, c
DefaultStateType state = std::move ( todo.front ( ) );
ext::set < StateType > state = std::move ( todo.front ( ) );
todo.pop_front ( );
 
// 3b
for ( const DefaultSymbolType & input : nfa.getInputAlphabet ( ) ) {
ext::set < DefaultStateType > targetIDPDAStates;
for ( const InputSymbolType & input : npda.getInputAlphabet ( ) ) {
ext::set < StateType > dfaState;
 
for ( DefaultStateType nfaState : recreateNFAStates ( state ) ) {
auto iter = nfa.getTransitions ( ).find ( ext::make_pair ( std::move ( nfaState ), input ) );
for ( StateType nfaState : state ) {
auto iter = npda.getTransitions ( ).find ( ext::make_pair ( std::move ( nfaState ), input ) );
 
if ( iter != nfa.getTransitions ( ).end ( ) )
targetIDPDAStates.insert ( iter->second.begin ( ), iter->second.end ( ) );
if ( iter != npda.getTransitions ( ).end ( ) )
dfaState.insert ( iter->second.begin ( ), iter->second.end ( ) );
}
 
DefaultStateType dfaState = createDFAState ( std::move ( targetIDPDAStates ) );
// 4
bool existed = !res.addState ( dfaState );
 
......@@ -57,19 +57,14 @@ automaton::InputDrivenDPDA < > Determinize::determinize ( const automaton::Input
} while ( !todo.empty ( ) );
 
// 5
const ext::set<DefaultStateType>& finalLabels = nfa.getFinalStates();
for ( const DefaultStateType & dfaState : res.getStates ( ) ) {
const ext::set < DefaultStateType > & nfaStates = recreateNFAStates ( dfaState );
if(!ext::excludes(finalLabels.begin(), finalLabels.end(), nfaStates.begin(), nfaStates.end()))
const ext::set < StateType > & finalLabels = npda.getFinalStates();
for ( const ext::set < StateType > & dfaState : res.getStates ( ) )
if ( ! ext::excludes ( finalLabels.begin ( ), finalLabels.end ( ), dfaState.begin ( ), dfaState.end ( ) ) )
res.addFinalState ( dfaState );
}
 
return res;
}
 
auto DeterminizeInputDrivenNPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenNPDA < > & > ( Determinize::determinize );
} /* namespace determinize */
 
} /* namespace automaton */
......@@ -56,7 +56,7 @@ void determinizeTest::testDeterminizeIDPDA() {
 
automaton.addFinalState(DefaultStateType(3));
 
automaton::InputDrivenDPDA < > determinized = automaton::determinize::Determinize::determinize(automaton);
automaton::InputDrivenDPDA < DefaultSymbolType, DefaultSymbolType, ext::set < DefaultStateType > > determinized = automaton::determinize::Determinize::determinize(automaton);
 
CPPUNIT_ASSERT(determinized.getStates().size() == 3);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment