From 28cbfc9dc4809b97fa2de3b7b8d343dedcbeadb8 Mon Sep 17 00:00:00 2001 From: Jan Vesely <janvesely@janvesely.net> Date: Wed, 26 Mar 2014 12:09:46 +0100 Subject: [PATCH] add precomputing of pop and push symbols --- adeterminize/src/idpda/IdpdaDeterminizer.cpp | 27 ++++++++++++++------ adeterminize/src/idpda/IdpdaDeterminizer.h | 6 +++-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.cpp b/adeterminize/src/idpda/IdpdaDeterminizer.cpp index a5cc5a6437..69ba83f523 100644 --- a/adeterminize/src/idpda/IdpdaDeterminizer.cpp +++ b/adeterminize/src/idpda/IdpdaDeterminizer.cpp @@ -9,6 +9,21 @@ void IdpdaDeterminizer::initDeterminization() Utils::copyInputAlphabet(*this->nidpda, *this->didpda); Utils::copyStackAlphabet(*this->nidpda, *this->didpda); this->states.clear(); + this->findPopAndPushSymbols(); +} + + +void IdpdaDeterminizer::findPopAndPushSymbols() +{ + for (const auto& symbol: this->nidpda->getInputAlphabet()) { + for (const auto& transition: this->nidpda->getTransitions()) { + if (transition.getInput() == symbol) { + this->popSymbols[symbol] = transition.getPop(); + this->pushSymbols[symbol] = transition.getPush(); + break; + } + } + } } @@ -18,15 +33,12 @@ const State& IdpdaDeterminizer::getOrCreateState(const set<State>& originalState } -set<State> IdpdaDeterminizer::findToStates(const set<State>& nidpdaStates, const Symbol& input, list<Symbol>* stackPop, - list<Symbol>* stackPush) +set<State> IdpdaDeterminizer::findToStates(const set<State>& nidpdaStates, const Symbol& input) { set<State> targetStates; for (const auto& state : nidpdaStates) { for (const auto& transition : this->nidpda->getTransitions()) { if (transition.getFrom() == state && transition.getInput() == input) { - *stackPop = transition.getPop(); - *stackPush = transition.getPush(); targetStates.insert(transition.getTo()); } } @@ -68,10 +80,9 @@ Automaton* IdpdaDeterminizer::determinize() } for (const auto& input : this->nidpda->getInputAlphabet()) { - list<Symbol> stackPop; - list<Symbol> stackPush; - const set<State>& nidpdaToStates = this->findToStates(unmarkedStateData->originalStates, input, - &stackPop, &stackPush); + list<Symbol> stackPop = this->popSymbols[input]; + list<Symbol> stackPush = this->pushSymbols[input]; + const set<State>& nidpdaToStates = this->findToStates(unmarkedStateData->originalStates, input); if (nidpdaToStates.size() > 0) { const State& targetState = this->getOrCreateState(nidpdaToStates); TransitionPDA transition(unmarkedStateData->state, input, targetState, stackPop, stackPush); diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.h b/adeterminize/src/idpda/IdpdaDeterminizer.h index de7a0c1a4d..f4ac7d499b 100644 --- a/adeterminize/src/idpda/IdpdaDeterminizer.h +++ b/adeterminize/src/idpda/IdpdaDeterminizer.h @@ -29,11 +29,13 @@ class IdpdaDeterminizer : public Determinizer PDA* nidpda; PDA* didpda; map<string, StateData> states; + map<Symbol, list<Symbol>> popSymbols; + map<Symbol, list<Symbol>> pushSymbols; void initDeterminization(); + void findPopAndPushSymbols(); const State& getOrCreateState(const set<State>& originalStates); - set<State> findToStates(const set<State>& nidpdaStates, const Symbol& input, list<Symbol>* stackPop, - list<Symbol>* stackPush); + set<State> findToStates(const set<State>& nidpdaStates, const Symbol& input); public: IdpdaDeterminizer(PDA* automaton); -- GitLab