From 0eecaa627927989e20e782af6eaa107b8aae01c3 Mon Sep 17 00:00:00 2001 From: Jan Vesely <janvesely@janvesely.net> Date: Fri, 13 Dec 2013 15:30:22 +0100 Subject: [PATCH] clean vpa determinization --- adeterminize.vpa/src/VPADeterminizer.cpp | 104 +++++++++++++++++------ adeterminize.vpa/src/VPADeterminizer.h | 22 +++-- 2 files changed, 91 insertions(+), 35 deletions(-) diff --git a/adeterminize.vpa/src/VPADeterminizer.cpp b/adeterminize.vpa/src/VPADeterminizer.cpp index f26ba90800..2fac2f4515 100644 --- a/adeterminize.vpa/src/VPADeterminizer.cpp +++ b/adeterminize.vpa/src/VPADeterminizer.cpp @@ -3,15 +3,17 @@ namespace determinization { const Symbol VPADeterminizer::BOTTOM_OF_STACK_SYMBOL("⊥"); - + string VPADeterminizer::buildStateName(const SComponent& s, const RComponent& r) { string name = "{"; - for (set<StatesPair>::const_iterator statePair = s.statesPairs.begin(); statePair != s.statesPairs.end(); statePair++) { - if (statePair != s.statesPairs.begin()) { + for (set<StatesPair>::const_iterator statesPair = s.statesPairs.begin(); + statesPair != s.statesPairs.end(); + statesPair++) { + if (statesPair != s.statesPairs.begin()) { name += ", "; } - name += "('" + statePair->state1.getName() + "', '" + statePair->state2.getName() + "')"; + name += "('" + statesPair->state1.getName() + "', '" + statesPair->state2.getName() + "')"; } name += "}, {"; for (set<State>::const_iterator state = r.states.begin(); state != r.states.end(); state++) { @@ -58,7 +60,9 @@ void VPADeterminizer::divideInputAlphabet() { set<Symbol> alphabet = this->nondeterministicVPA->getInputAlphabet(); set<TransitionPDA> transitions = this->nondeterministicVPA->getTransitions(); for (set<Symbol>::iterator input = alphabet.begin(); input != alphabet.end(); input++) { - for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) { + for (set<TransitionPDA>::iterator transition = transitions.begin(); + transition != transitions.end(); + transition++) { if (transition->getInput() == *input) { if (transition->getPush().size() != 0) { this->callSymbols.insert(*input); @@ -98,7 +102,9 @@ void VPADeterminizer::buildStackAlphabet() { for (int i = 0; i < possibleSSize; i++) { set<StatesPair> statesPairsSet; int mask = 1; - for (vector<StatesPair>::iterator statesPair = possibleStatesPairs.begin(); statesPair != possibleStatesPairs.end(); statesPair++) { + for (vector<StatesPair>::iterator statesPair = possibleStatesPairs.begin(); + statesPair != possibleStatesPairs.end(); + statesPair++) { if ((i & mask) != 0) { statesPairsSet.insert(*statesPair); } @@ -158,7 +164,9 @@ PDA* VPADeterminizer::determinize() { while (true) { StateData* unmarkedStateData = NULL; - for (map<string, StateData>::iterator stateIter = this->states.begin(); stateIter != this->states.end(); stateIter++) { + for (map<string, StateData>::iterator stateIter = this->states.begin(); + stateIter != this->states.end(); + stateIter++) { if (!stateIter->second.isMarked) { unmarkedStateData = &stateIter->second; unmarkedStateData->isMarked = true; @@ -170,11 +178,17 @@ PDA* VPADeterminizer::determinize() { } // Internal symbols - for (set<Symbol>::iterator internalSymbol = this->internalSymbols.begin(); internalSymbol != this->internalSymbols.end(); internalSymbol++) { + for (set<Symbol>::iterator internalSymbol = this->internalSymbols.begin(); + internalSymbol != this->internalSymbols.end(); + internalSymbol++) { SComponent s; SComponent& oldS = unmarkedStateData->s; - for (set<StatesPair>::iterator statesPair = oldS.statesPairs.begin(); statesPair != oldS.statesPairs.end(); statesPair++) { - for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) { + for (set<StatesPair>::iterator statesPair = oldS.statesPairs.begin(); + statesPair != oldS.statesPairs.end(); + statesPair++) { + for (set<TransitionPDA>::iterator transition = transitions.begin(); + transition != transitions.end(); + transition++) { if (transition->getFrom() == statesPair->state2 && transition->getInput() == *internalSymbol) { s.statesPairs.insert(StatesPair(statesPair->state1, transition->getTo())); } @@ -182,8 +196,12 @@ PDA* VPADeterminizer::determinize() { } RComponent r; RComponent& oldR = unmarkedStateData->r; - for (set<State>::iterator state = oldR.states.begin(); state != oldR.states.end(); state++) { - for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) { + for (set<State>::iterator state = oldR.states.begin(); + state != oldR.states.end(); + state++) { + for (set<TransitionPDA>::iterator transition = transitions.begin(); + transition != transitions.end(); + transition++) { if (transition->getFrom() == *state && transition->getInput() == *internalSymbol) { r.states.insert(transition->getTo()); } @@ -195,11 +213,17 @@ PDA* VPADeterminizer::determinize() { } // Call symbols - for (set<Symbol>::iterator callSymbol = this->callSymbols.begin(); callSymbol != this->callSymbols.end(); callSymbol++) { + for (set<Symbol>::iterator callSymbol = this->callSymbols.begin(); + callSymbol != this->callSymbols.end(); + callSymbol++) { RComponent r; RComponent& oldR = unmarkedStateData->r; - for (set<State>::iterator state = oldR.states.begin(); state != oldR.states.end(); state++) { - for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) { + for (set<State>::iterator state = oldR.states.begin(); + state != oldR.states.end(); + state++) { + for (set<TransitionPDA>::iterator transition = transitions.begin(); + transition != transitions.end(); + transition++) { if (transition->getFrom() == *state && transition->getInput() == *callSymbol) { r.states.insert(transition->getTo()); } @@ -214,24 +238,36 @@ PDA* VPADeterminizer::determinize() { } // Return symbols - for (set<Symbol>::iterator returnSymbol = this->returnSymbols.begin(); returnSymbol != this->returnSymbols.end(); returnSymbol++) { + for (set<Symbol>::iterator returnSymbol = this->returnSymbols.begin(); + returnSymbol != this->returnSymbols.end(); + returnSymbol++) { SComponent& oldS = unmarkedStateData->s; RComponent& oldR = unmarkedStateData->r; // Empty stack list<Symbol> bottomOfStack(1, BOTTOM_OF_STACK_SYMBOL); SComponent s; - for (set<StatesPair>::iterator statesPair = oldS.statesPairs.begin(); statesPair != oldS.statesPairs.end(); statesPair++) { - for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) { - if (transition->getFrom() == statesPair->state2 && transition->getInput() == *returnSymbol && transition->getPop() == bottomOfStack) { + for (set<StatesPair>::iterator statesPair = oldS.statesPairs.begin(); + statesPair != oldS.statesPairs.end(); + statesPair++) { + for (set<TransitionPDA>::iterator transition = transitions.begin(); + transition != transitions.end(); + transition++) { + if (transition->getFrom() == statesPair->state2 && transition->getInput() == *returnSymbol && + transition->getPop() == bottomOfStack) { s.statesPairs.insert(StatesPair(statesPair->state1, transition->getTo())); } } } RComponent r; - for (set<State>::iterator state = oldR.states.begin(); state != oldR.states.end(); state++) { - for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) { - if (transition->getFrom() == *state && transition->getInput() == *returnSymbol && transition->getPop() == bottomOfStack) { + for (set<State>::iterator state = oldR.states.begin(); + state != oldR.states.end(); + state++) { + for (set<TransitionPDA>::iterator transition = transitions.begin(); + transition != transitions.end(); + transition++) { + if (transition->getFrom() == *state && transition->getInput() == *returnSymbol && + transition->getPop() == bottomOfStack) { r.states.insert(transition->getTo()); } } @@ -245,14 +281,22 @@ PDA* VPADeterminizer::determinize() { } // Otherwise - for (set<Symbol>::iterator callSymbol = this->callSymbols.begin(); callSymbol != this->callSymbols.end(); callSymbol++) { + for (set<Symbol>::iterator callSymbol = this->callSymbols.begin(); + callSymbol != this->callSymbols.end(); + callSymbol++) { set<StatesPair> update; - for (set<StatesPair>::iterator oldSStatesPair = oldS.statesPairs.begin(); oldSStatesPair != oldS.statesPairs.end(); oldSStatesPair++) { + for (set<StatesPair>::iterator oldSStatesPair = oldS.statesPairs.begin(); + oldSStatesPair != oldS.statesPairs.end(); + oldSStatesPair++) { if (oldR.states.find(oldSStatesPair->state2) != oldR.states.end()) { const State& state1 = oldSStatesPair->state1; const State& state2 = oldSStatesPair->state2; - for (set<TransitionPDA>::iterator transitionPush = transitions.begin(); transitionPush != transitions.end(); transitionPush++) { - for (set<TransitionPDA>::iterator transitionPop = transitions.begin(); transitionPop != transitions.end(); transitionPop++) { + for (set<TransitionPDA>::iterator transitionPush = transitions.begin(); + transitionPush != transitions.end(); + transitionPush++) { + for (set<TransitionPDA>::iterator transitionPop = transitions.begin(); + transitionPop != transitions.end(); + transitionPop++) { if (transitionPush->getInput() == *callSymbol && transitionPush->getTo() == state1 && transitionPop->getInput() == *returnSymbol && transitionPop->getFrom() == state2 && transitionPush->getPush() == transitionPop->getPop()) { @@ -274,7 +318,9 @@ PDA* VPADeterminizer::determinize() { RComponent r; SComponent s; - for (set<StatesPair>::iterator updateItem = update.begin(); updateItem != update.end(); updateItem++) { + for (set<StatesPair>::iterator updateItem = update.begin(); + updateItem != update.end(); + updateItem++) { if (stackR.states.find(updateItem->state1) != stackR.states.end()) { r.states.insert(updateItem->state2); } @@ -303,7 +349,9 @@ PDA* VPADeterminizer::determinize() { } // Final states - for (map<string, StateData>::iterator stateIter = this->states.begin(); stateIter != this->states.end(); stateIter++) { + for (map<string, StateData>::iterator stateIter = this->states.begin(); + stateIter != this->states.end(); + stateIter++) { const StateData& stateData = stateIter->second; if (DeterminizationUtils::containSomeFinalStateOfAutomaton(stateData.r.states, *this->nondeterministicVPA)) { this->deterministicVPA->addFinalState(stateData.state); diff --git a/adeterminize.vpa/src/VPADeterminizer.h b/adeterminize.vpa/src/VPADeterminizer.h index 521258f741..1ddcfcbfce 100644 --- a/adeterminize.vpa/src/VPADeterminizer.h +++ b/adeterminize.vpa/src/VPADeterminizer.h @@ -26,7 +26,9 @@ protected: State state1; State state2; - StatesPair(const State& state1, const State& state2) : state1(state1), state2(state2) { } + StatesPair(const State& state1, const State& state2) + : state1(state1), + state2(state2) {} bool operator < (const StatesPair& other) const { return state1 < other.state1 || state1 == other.state1 && state2 < other.state2; @@ -44,13 +46,15 @@ protected: struct SComponent { set<StatesPair> statesPairs; SComponent() {} - SComponent(const set<StatesPair>& statesPairs) : statesPairs(statesPairs) {} + SComponent(const set<StatesPair>& statesPairs) + : statesPairs(statesPairs) {} }; struct RComponent { set<State> states; RComponent() {} - RComponent(const set<State>& states) : states(states) {} + RComponent(const set<State>& states) + : states(states) {} }; struct StateData { @@ -59,16 +63,20 @@ protected: RComponent r; bool isMarked; - StateData(const State& state, const SComponent& s, const RComponent& r) : s(s), r(r), state(state) { - this->isMarked = false; - } + StateData(const State& state, const SComponent& s, const RComponent& r) + : s(s), + r(r), + state(state), + isMarked(false) {} }; struct PartialStackData { SComponent s; RComponent r; - PartialStackData(const SComponent& s, const RComponent& r) : s(s), r(r) {} + PartialStackData(const SComponent& s, const RComponent& r) + : s(s), + r(r) {} }; PDA* nondeterministicVPA; -- GitLab