Skip to content
Snippets Groups Projects
Commit ead8e491 authored by Jan Vesely's avatar Jan Vesely
Browse files

add idpda determinization

parent 0f232545
No related branches found
No related tags found
No related merge requests found
#include "IDPDADeterminizer.h"
namespace automaton {
set<State> IDPDADeterminizer::findToStates(const set<State>& nidpdaStates, const Symbol& input, list<Symbol>* stackPop, list<Symbol>* stackPush) {
const set<TransitionPDA>& nidpdaTransitions = this->nondeterministicIDPDA->getTransitions();
set<State> targetStates;
for (set<State>::iterator state = nidpdaStates.begin(); state != nidpdaStates.end(); state++) {
for (set<TransitionPDA>::iterator transition = nidpdaTransitions.begin();
transition != nidpdaTransitions.end();
transition++) {
if (transition->getFrom() == *state && transition->getInput() == input) {
*stackPop = transition->getPop();
*stackPush = transition->getPush();
targetStates.insert(transition->getTo());
}
}
}
return targetStates;
}
IDPDADeterminizer::IDPDADeterminizer(PDA* automaton) {
this->nondeterministicIDPDA = automaton;
}
PDA* IDPDADeterminizer::determinize() {
this->deterministicIDPDA = new PDA();
DeterminizationUtils::copyInputAlphabet(*this->nondeterministicIDPDA, *this->deterministicIDPDA);
DeterminizationUtils::copyStackAlphabet(*this->nondeterministicIDPDA, *this->deterministicIDPDA);
map<string, DeterminizationUtils::StateData> states;
const set<State>& nidpdaInitialStates = this->nondeterministicIDPDA->getInitialStates();
const State& initialState = DeterminizationUtils::getOrCreateState(nidpdaInitialStates, states, *this->deterministicIDPDA);
while (true) {
bool allStatesMarked = true;
for (map<string, DeterminizationUtils::StateData>::iterator stateIter = states.begin();
stateIter != states.end();
stateIter++) {
allStatesMarked &= stateIter->second.isMarked;
}
if (allStatesMarked) {
break;
}
DeterminizationUtils::StateData* unmarkedStateData;
for (map<string, DeterminizationUtils::StateData>::iterator stateIter = states.begin();
stateIter != states.end();
stateIter++) {
DeterminizationUtils::StateData& stateData = stateIter->second;
if (!stateData.isMarked) {
unmarkedStateData = &stateData;
break;
}
}
const set<Symbol>& nidpdaInputAlphabet = this->nondeterministicIDPDA->getInputAlphabet();
for (set<Symbol>::iterator input = nidpdaInputAlphabet.begin(); input != nidpdaInputAlphabet.end(); input++) {
list<Symbol> stackPop;
list<Symbol> stackPush;
const set<State>& nidpdaToStates = this->findToStates(unmarkedStateData->originalStates, *input, &stackPop, &stackPush);
if (nidpdaToStates.size() > 0) {
const State& targetState = DeterminizationUtils::getOrCreateState(nidpdaToStates, states, *this->deterministicIDPDA);
TransitionPDA transition(unmarkedStateData->state, *input, targetState, stackPop, stackPush);
this->deterministicIDPDA->addTransition(transition);
}
}
unmarkedStateData->isMarked = true;
}
this->deterministicIDPDA->addInitialState(initialState);
for (map<string, DeterminizationUtils::StateData>::iterator stateIter = states.begin();
stateIter != states.end();
stateIter++) {
const DeterminizationUtils::StateData& stateData = stateIter->second;
if (DeterminizationUtils::containSomeFinalStateOfAutomaton(stateData.originalStates, *this->nondeterministicIDPDA)) {
this->deterministicIDPDA->addFinalState(stateData.state);
}
}
return this->deterministicIDPDA;
}
} /* namespace automaton */
#ifndef IDPDADETERMINIZER_H_
#define IDPDADETERMINIZER_H_
#include <string>
#include <set>
#include <map>
#include <list>
#include "automaton/State.h"
#include "automaton/DeterminizationUtils.h"
#include "automaton/PDA/PDA.h"
#include "automaton/PDA/TransitionPDA.h"
using namespace std;
namespace automaton {
class IDPDADeterminizer {
protected:
PDA* nondeterministicIDPDA;
PDA* deterministicIDPDA;
set<State> findToStates(const set<State>& nidpdaStates, const Symbol& input, list<Symbol>* stackPop, list<Symbol>* stackPush);
public:
IDPDADeterminizer(PDA* automaton);
PDA* determinize();
};
} /* namespace automaton */
#endif /* IDPDADETERMINIZER_H_ */
\ No newline at end of file
#include <iostream>
#include <set>
#include "automaton/UnknownAutomaton.h"
#include "AutomatonFactory.h"
#include "AlibException.h"
#include "IDPDADeterminizer.h"
using namespace std;
using namespace automaton;
using namespace alib;
int main(int argc, char** argv) {
UnknownAutomaton automaton;
try {
string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>()));
automaton = AutomatonFactory::fromString(input);
Automaton* knownAutomaton = AutomatonFactory::buildAutomaton(&automaton);
// TODO check that automaton is FSM
IDPDADeterminizer determinizer((PDA*) knownAutomaton);
PDA* deterministicIDPDA = determinizer.determinize();
deterministicIDPDA->toXML(cout);
delete knownAutomaton;
delete deterministicIDPDA;
} catch (AlibException& e) {
cout << e.what() << endl;
return 0;
}
}
\ No newline at end of file
<automaton>
<states>
<state>S</state>
<state>A</state>
<state>B</state>
<state>C</state>
</states>
<inputAlphabet>
<symbol>0</symbol>
<symbol>1</symbol>
</inputAlphabet>
<stackAlphabet>
<symbol>a</symbol>
</stackAlphabet>
<transitions>
<transition>
<from>S</from>
<input>0</input>
<to>S</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>S</from>
<input>0</input>
<to>A</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>S</from>
<input>1</input>
<to>S</to>
<pop></pop>
<push></push>
</transition>
<transition>
<from>A</from>
<input>1</input>
<to>B</to>
<pop></pop>
<push></push>
</transition>
<transition>
<from>B</from>
<input>0</input>
<to>C</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
</transitions>
<initialStates>
<state>S</state>
</initialStates>
<startSymbols></startSymbols>
<finalStates>
<state>C</state>
</finalStates>
</automaton>
<automaton>
<states>
<state>S</state>
<state>A</state>
<state>B</state>
<state>C</state>
</states>
<inputAlphabet>
<symbol>0</symbol>
<symbol>1</symbol>
</inputAlphabet>
<stackAlphabet>
<symbol>a</symbol>
</stackAlphabet>
<transitions>
<transition>
<from>S</from>
<input>0</input>
<to>A</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>S</from>
<input>0</input>
<to>B</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>S</from>
<input>1</input>
<to>C</to>
<pop>
<symbol>a</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>A</from>
<input>0</input>
<to>C</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>A</from>
<input>1</input>
<to>A</to>
<pop>
<symbol>a</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>B</from>
<input>0</input>
<to>C</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>B</from>
<input>1</input>
<to>B</to>
<pop>
<symbol>a</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>B</from>
<input>1</input>
<to>A</to>
<pop>
<symbol>a</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>C</from>
<input>0</input>
<to>S</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>C</from>
<input>0</input>
<to>A</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
</transitions>
<initialStates>
<state>S</state>
</initialStates>
<startSymbols>
<symbol>a</symbol>
<symbol>a</symbol>
<symbol>a</symbol>
</startSymbols>
<finalStates>
<state>B</state>
<state>C</state>
</finalStates>
</automaton>
<automaton>
<states>
<state>S</state>
<state>A</state>
<state>B</state>
<state>C</state>
</states>
<inputAlphabet>
<symbol>0</symbol>
<symbol>1</symbol>
</inputAlphabet>
<stackAlphabet>
<symbol>a</symbol>
<symbol>b</symbol>
</stackAlphabet>
<transitions>
<transition>
<from>S</from>
<input>0</input>
<to>S</to>
<pop></pop>
<push>
<symbol>b</symbol>
</push>
</transition>
<transition>
<from>S</from>
<input>0</input>
<to>A</to>
<pop></pop>
<push>
<symbol>b</symbol>
</push>
</transition>
<transition>
<from>S</from>
<input>1</input>
<to>B</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>A</from>
<input>1</input>
<to>A</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>A</from>
<input>1</input>
<to>C</to>
<pop></pop>
<push>
<symbol>a</symbol>
</push>
</transition>
<transition>
<from>B</from>
<input>1</input>
<to>S</to>
</transition>
<transition>
<from>C</from>
<input>0</input>
<to>B</to>
<pop></pop>
<push>
<symbol>b</symbol>
</push>
</transition>
</transitions>
<initialStates>
<state>S</state>
</initialStates>
<startSymbols>
<symbol>a</symbol>
<symbol>b</symbol>
<symbol>a</symbol>
</startSymbols>
<finalStates>
<state>B</state>
<state>C</state>
</finalStates>
</automaton>
<automaton>
<states>
<state>A</state>
<state>B</state>
<state>C</state>
<state>D</state>
<state>E</state>
<state>F</state>
</states>
<inputAlphabet>
<symbol>a</symbol>
<symbol>b</symbol>
</inputAlphabet>
<stackAlphabet>
<symbol>1</symbol>
</stackAlphabet>
<transitions>
<transition>
<from>A</from>
<input>a</input>
<to>A</to>
<pop></pop>
<push>
<symbol>1</symbol>
</push>
</transition>
<transition>
<from>A</from>
<input>a</input>
<to>B</to>
<pop></pop>
<push>
<symbol>1</symbol>
</push>
</transition>
<transition>
<from>A</from>
<input>b</input>
<to>A</to>
<pop>
<symbol>1</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>A</from>
<input>b</input>
<to>E</to>
<pop>
<symbol>1</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>B</from>
<input>a</input>
<to>C</to>
<pop></pop>
<push>
<symbol>1</symbol>
</push>
</transition>
<transition>
<from>C</from>
<input>a</input>
<to>D</to>
<pop></pop>
<push>
<symbol>1</symbol>
</push>
</transition>
<transition>
<from>C</from>
<input>b</input>
<to>D</to>
<pop>
<symbol>1</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>D</from>
<input>a</input>
<to>D</to>
<pop></pop>
<push>
<symbol>1</symbol>
</push>
</transition>
<transition>
<from>D</from>
<input>b</input>
<to>D</to>
<pop>
<symbol>1</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>E</from>
<input>a</input>
<to>F</to>
<pop></pop>
<push>
<symbol>1</symbol>
</push>
</transition>
<transition>
<from>E</from>
<input>b</input>
<to>D</to>
<pop>
<symbol>1</symbol>
</pop>
<push></push>
</transition>
<transition>
<from>F</from>
<input>b</input>
<to>D</to>
<pop>
<symbol>1</symbol>
</pop>
<push></push>
</transition>
</transitions>
<initialStates>
<state>A</state>
</initialStates>
<startSymbols></startSymbols>
<finalStates>
<state>D</state>
<state>E</state>
</finalStates>
</automaton>
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