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