From 5d0702f3de00065c1cd3f56b542ba08110591453 Mon Sep 17 00:00:00 2001
From: Jan Vesely <janvesely@janvesely.net>
Date: Tue, 25 Feb 2014 15:33:11 +0100
Subject: [PATCH] stop creating states with empty s or r in vpa
 determinizations

---
 adeterminize.vpa/src/VPADeterminizer.cpp   | 63 ++++++++++++----------
 adeterminize.vpa2/src/VPADeterminizer2.cpp | 63 ++++++++++++----------
 adeterminize.vpa3/src/VPADeterminizer3.cpp | 58 +++++++++++---------
 3 files changed, 103 insertions(+), 81 deletions(-)

diff --git a/adeterminize.vpa/src/VPADeterminizer.cpp b/adeterminize.vpa/src/VPADeterminizer.cpp
index 9cca7a2145..320a917752 100644
--- a/adeterminize.vpa/src/VPADeterminizer.cpp
+++ b/adeterminize.vpa/src/VPADeterminizer.cpp
@@ -60,10 +60,12 @@ PDA VPADeterminizer::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
-            const TransitionPDA transition(fromState, *internalSymbol, toState);
-            deterministicVPA.addTransition(transition);
+            if (sPrimed.statesPairs.size() > 0 && rPrimed.states.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
+                const TransitionPDA transition(fromState, *internalSymbol, toState);
+                deterministicVPA.addTransition(transition);
+            }
         }
         
         // Call symbols
@@ -82,15 +84,17 @@ PDA VPADeterminizer::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            SComponent& s = unmarkedStateData->s;
-            const SComponent& sPrimed = VPADeterminizationUtils::getSComponentWithStatesIdentity(nondeterministicVPA.getStates());
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
-            string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(s, r, *callSymbol);
-            list<Symbol> pop;
-            list<Symbol> push(1, Symbol(stackSymbolName));
-            const TransitionPDA transition(fromState, *callSymbol, toState, pop, push);
-            deterministicVPA.addTransition(transition);
+            if (rPrimed.states.size() > 0) {
+                SComponent& s = unmarkedStateData->s;
+                const SComponent& sPrimed = VPADeterminizationUtils::getSComponentWithStatesIdentity(nondeterministicVPA.getStates());
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
+                string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(s, r, *callSymbol);
+                list<Symbol> pop;
+                list<Symbol> push(1, Symbol(stackSymbolName));
+                const TransitionPDA transition(fromState, *callSymbol, toState, pop, push);
+                deterministicVPA.addTransition(transition);
+            }
         }
         
         // Return symbols
@@ -130,12 +134,14 @@ PDA VPADeterminizer::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
-            list<Symbol> pop(1, VPADeterminizationUtils::BOTTOM_OF_STACK_SYMBOL);
-            list<Symbol> push;
-            const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
-            deterministicVPA.addTransition(transition);
+            if (sPrimed.statesPairs.size() > 0 && rPrimed.states.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
+                list<Symbol> pop(1, VPADeterminizationUtils::BOTTOM_OF_STACK_SYMBOL);
+                list<Symbol> push;
+                const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
+                deterministicVPA.addTransition(transition);
+            }
             
             // Otherwise
             for (set<Symbol>::iterator callSymbol = callSymbols.begin(); callSymbol != callSymbols.end(); callSymbol++) {
@@ -198,15 +204,16 @@ PDA VPADeterminizer::determinize(PDA& nondeterministicVPA) {
                             }
                         }
                     }
-
-                    const State& fromState = unmarkedStateData->state;
-                    const State& toState = VPADeterminizationUtils::getOrCreateState(sDoublePrimed, rDoublePrimed,
-                        states, deterministicVPA);
-                    string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(sPrimed, rPrimed, *callSymbol);
-                    list<Symbol> pop(1, Symbol(stackSymbolName));
-                    list<Symbol> push;
-                    const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
-                    deterministicVPA.addTransition(transition);
+                    if (sDoublePrimed.statesPairs.size() > 0 && rDoublePrimed.states.size() > 0) {
+                        const State& fromState = unmarkedStateData->state;
+                        const State& toState = VPADeterminizationUtils::getOrCreateState(sDoublePrimed, rDoublePrimed,
+                            states, deterministicVPA);
+                        string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(sPrimed, rPrimed, *callSymbol);
+                        list<Symbol> pop(1, Symbol(stackSymbolName));
+                        list<Symbol> push;
+                        const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
+                        deterministicVPA.addTransition(transition);
+                    }
                 }
             }
         }
diff --git a/adeterminize.vpa2/src/VPADeterminizer2.cpp b/adeterminize.vpa2/src/VPADeterminizer2.cpp
index a6df6c9b2a..03c8e8e346 100644
--- a/adeterminize.vpa2/src/VPADeterminizer2.cpp
+++ b/adeterminize.vpa2/src/VPADeterminizer2.cpp
@@ -61,10 +61,12 @@ PDA VPADeterminizer2::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
-            const TransitionPDA transition(fromState, *internalSymbol, toState);
-            deterministicVPA.addTransition(transition);
+            if (sPrimed.statesPairs.size() > 0 && rPrimed.states.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
+                const TransitionPDA transition(fromState, *internalSymbol, toState);
+                deterministicVPA.addTransition(transition);
+            }
         }
         
         // Call symbols
@@ -83,15 +85,17 @@ PDA VPADeterminizer2::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            SComponent& s = unmarkedStateData->s;
-            const SComponent& sPrimed = VPADeterminizationUtils::getSComponentWithStatesIdentity(rPrimed.states);
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
-            string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(s, r, *callSymbol);
-            list<Symbol> pop;
-            list<Symbol> push(1, Symbol(stackSymbolName));
-            const TransitionPDA transition(fromState, *callSymbol, toState, pop, push);
-            deterministicVPA.addTransition(transition);
+            if (rPrimed.states.size() > 0) {
+                SComponent& s = unmarkedStateData->s;
+                const SComponent& sPrimed = VPADeterminizationUtils::getSComponentWithStatesIdentity(rPrimed.states);
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
+                string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(s, r, *callSymbol);
+                list<Symbol> pop;
+                list<Symbol> push(1, Symbol(stackSymbolName));
+                const TransitionPDA transition(fromState, *callSymbol, toState, pop, push);
+                deterministicVPA.addTransition(transition);
+            }
         }
         
         // Return symbols
@@ -131,12 +135,14 @@ PDA VPADeterminizer2::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
-            list<Symbol> pop(1, VPADeterminizationUtils::BOTTOM_OF_STACK_SYMBOL);
-            list<Symbol> push;
-            const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
-            deterministicVPA.addTransition(transition);
+            if (sPrimed.statesPairs.size() > 0 && rPrimed.states.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizationUtils::getOrCreateState(sPrimed, rPrimed, states, deterministicVPA);
+                list<Symbol> pop(1, VPADeterminizationUtils::BOTTOM_OF_STACK_SYMBOL);
+                list<Symbol> push;
+                const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
+                deterministicVPA.addTransition(transition);
+            }
             
             // Otherwise
             for (set<Symbol>::iterator callSymbol = callSymbols.begin(); callSymbol != callSymbols.end(); callSymbol++) {
@@ -197,15 +203,16 @@ PDA VPADeterminizer2::determinize(PDA& nondeterministicVPA) {
                             }
                         }
                     }
-
-                    const State& fromState = unmarkedStateData->state;
-                    const State& toState = VPADeterminizationUtils::getOrCreateState(sDoublePrimed, rDoublePrimed,
-                        states, deterministicVPA);
-                    string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(sPrimed, rPrimed, *callSymbol);
-                    list<Symbol> pop(1, Symbol(stackSymbolName));
-                    list<Symbol> push;
-                    const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
-                    deterministicVPA.addTransition(transition);
+                    if (sDoublePrimed.statesPairs.size() > 0 && rDoublePrimed.states.size() > 0) {
+                        const State& fromState = unmarkedStateData->state;
+                        const State& toState = VPADeterminizationUtils::getOrCreateState(sDoublePrimed, rDoublePrimed,
+                            states, deterministicVPA);
+                        string stackSymbolName = VPADeterminizationUtils::buildStackSymbolName(sPrimed, rPrimed, *callSymbol);
+                        list<Symbol> pop(1, Symbol(stackSymbolName));
+                        list<Symbol> push;
+                        const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
+                        deterministicVPA.addTransition(transition);
+                    }
                 }
             }
         }
diff --git a/adeterminize.vpa3/src/VPADeterminizer3.cpp b/adeterminize.vpa3/src/VPADeterminizer3.cpp
index a4e0016072..f6d00268df 100644
--- a/adeterminize.vpa3/src/VPADeterminizer3.cpp
+++ b/adeterminize.vpa3/src/VPADeterminizer3.cpp
@@ -132,10 +132,12 @@ PDA VPADeterminizer3::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizer3::getOrCreateState(sPrimed, states, deterministicVPA);
-            const TransitionPDA transition(fromState, *internalSymbol, toState);
-            deterministicVPA.addTransition(transition);
+            if (sPrimed.statesPairs.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizer3::getOrCreateState(sPrimed, states, deterministicVPA);
+                const TransitionPDA transition(fromState, *internalSymbol, toState);
+                deterministicVPA.addTransition(transition);
+            }
         }
         
         // Call symbols
@@ -157,14 +159,16 @@ PDA VPADeterminizer3::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const SComponent& sPrimed = VPADeterminizationUtils::getSComponentWithStatesIdentity(rPrimed.states);
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizer3::getOrCreateState(sPrimed, states, deterministicVPA);
-            string stackSymbolName = VPADeterminizer3::buildStackSymbolName(s, *callSymbol);
-            list<Symbol> pop;
-            list<Symbol> push(1, Symbol(stackSymbolName));
-            const TransitionPDA transition(fromState, *callSymbol, toState, pop, push);
-            deterministicVPA.addTransition(transition);
+            if (rPrimed.states.size() > 0) {
+                const SComponent& sPrimed = VPADeterminizationUtils::getSComponentWithStatesIdentity(rPrimed.states);
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizer3::getOrCreateState(sPrimed, states, deterministicVPA);
+                string stackSymbolName = VPADeterminizer3::buildStackSymbolName(s, *callSymbol);
+                list<Symbol> pop;
+                list<Symbol> push(1, Symbol(stackSymbolName));
+                const TransitionPDA transition(fromState, *callSymbol, toState, pop, push);
+                deterministicVPA.addTransition(transition);
+            }
         }
         
         // Return symbols
@@ -191,12 +195,14 @@ PDA VPADeterminizer3::determinize(PDA& nondeterministicVPA) {
                     }
                 }
             }
-            const State& fromState = unmarkedStateData->state;
-            const State& toState = VPADeterminizer3::getOrCreateState(sPrimed, states, deterministicVPA);
-            list<Symbol> pop(1, VPADeterminizationUtils::BOTTOM_OF_STACK_SYMBOL);
-            list<Symbol> push;
-            const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
-            deterministicVPA.addTransition(transition);
+            if (sPrimed.statesPairs.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = VPADeterminizer3::getOrCreateState(sPrimed, states, deterministicVPA);
+                list<Symbol> pop(1, VPADeterminizationUtils::BOTTOM_OF_STACK_SYMBOL);
+                list<Symbol> push;
+                const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
+                deterministicVPA.addTransition(transition);
+            }
             
             // Otherwise
             for (set<Symbol>::iterator callSymbol = callSymbols.begin(); callSymbol != callSymbols.end(); callSymbol++) {
@@ -245,13 +251,15 @@ PDA VPADeterminizer3::determinize(PDA& nondeterministicVPA) {
                             }
                         }
                     }
-                    const State& fromState = unmarkedStateData->state;
-                    const State& toState = VPADeterminizer3::getOrCreateState(sDoublePrimed, states, deterministicVPA);
-                    string stackSymbolName = VPADeterminizer3::buildStackSymbolName(sPrimed, *callSymbol);
-                    list<Symbol> pop(1, Symbol(stackSymbolName));
-                    list<Symbol> push;
-                    const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
-                    deterministicVPA.addTransition(transition);
+                    if (sDoublePrimed.statesPairs.size() > 0) {
+                        const State& fromState = unmarkedStateData->state;
+                        const State& toState = VPADeterminizer3::getOrCreateState(sDoublePrimed, states, deterministicVPA);
+                        string stackSymbolName = VPADeterminizer3::buildStackSymbolName(sPrimed, *callSymbol);
+                        list<Symbol> pop(1, Symbol(stackSymbolName));
+                        list<Symbol> push;
+                        const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push);
+                        deterministicVPA.addTransition(transition);
+                    }
                 }
             }
         }
-- 
GitLab