From b1a61660a8f9e94bdc09c2932d3f9bb01caa0bd8 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 30 Sep 2014 23:12:07 +0200 Subject: [PATCH] simplify NFA IDPDA determinisation --- .../src/determinize/common/NFACommon.cpp | 32 ++++++++++++++++ alib2algo/src/determinize/common/NFACommon.h | 37 +++++++++++++++++++ .../determinize/idpda/IDPDADeterminizer.cpp | 22 ++--------- .../src/determinize/idpda/IDPDADeterminizer.h | 21 ----------- .../src/determinize/nfa/NFADeterminizer.cpp | 18 +-------- .../src/determinize/nfa/NFADeterminizer.h | 21 ----------- 6 files changed, 73 insertions(+), 78 deletions(-) create mode 100644 alib2algo/src/determinize/common/NFACommon.cpp create mode 100644 alib2algo/src/determinize/common/NFACommon.h diff --git a/alib2algo/src/determinize/common/NFACommon.cpp b/alib2algo/src/determinize/common/NFACommon.cpp new file mode 100644 index 0000000000..7a99e58325 --- /dev/null +++ b/alib2algo/src/determinize/common/NFACommon.cpp @@ -0,0 +1,32 @@ +/* + * NFACommon.cpp + * + * Created on: 16. 1. 2014 + * Author: Jan Vesely + */ + +#include "NFACommon.h" +#include "label/LabelSetLabel.h" + +#include <deque> +#include <algorithm> + +namespace determinize { + +automaton::State createDFAState(const std::set<automaton::State>& nfaStates) { + std::set<label::Label> labelSet; + for(const automaton::State& state : nfaStates) { + labelSet.insert(state.getName()); + } + return automaton::State(label::Label(label::LabelSetLabel(labelSet))); +} + +std::set<automaton::State> recreateNFAStates(const automaton::State& dfaState) { + std::set<automaton::State> states; + for (const auto& label : static_cast<const label::LabelSetLabel&>(dfaState.getName().getData()).getData()) { + states.insert(automaton::State(label)); + } + return states; +} + +} diff --git a/alib2algo/src/determinize/common/NFACommon.h b/alib2algo/src/determinize/common/NFACommon.h new file mode 100644 index 0000000000..d68e98f979 --- /dev/null +++ b/alib2algo/src/determinize/common/NFACommon.h @@ -0,0 +1,37 @@ +/* + * NFACommon.h + * + * Created on: 16. 1. 2014 + * Author: Jan Vesely + */ + +#ifndef NFA_COMMON_H_ +#define NFA_COMMON_H_ + +#include <automaton/common/State.h> +#include <set> + +namespace determinize { + +/** + * Returns existing state from the resulting automaton, if there is one, or creates new one and adds it into + * the resulting deterministic automaton. + * + * @param originalStates set of states from nondeterministic fsm which represents state of deterministic fsm + * @return state of deterministic fsm + */ +automaton::State createDFAState(const std::set<automaton::State>& nfaStates); + +/** + * Finds states from nondeterministic fsm to which at least one state from given set of states have transition + * with given input. + * + * @param fromStates set of states from nondeterministic fsm + * @param input symbol from input alphabet + * @return set of states from nondeterministic fsm + */ +std::set<automaton::State> recreateNFAStates(const automaton::State& dfaState); + +} /* namespace determinize */ + +#endif /* NFA_COMMON_H_ */ diff --git a/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp b/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp index cda3ab5841..36cd28c302 100644 --- a/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp +++ b/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp @@ -6,7 +6,7 @@ */ #include "IDPDADeterminizer.h" -#include "label/LabelSetLabel.h" +#include "../common/NFACommon.h" #include <deque> #include <algorithm> @@ -14,22 +14,6 @@ namespace determinize { -automaton::State IDPDADeterminizer::createDFAState(const std::set<automaton::State>& nfaStates) { - std::set<label::Label> labelSet; - for(const automaton::State& state : nfaStates) { - labelSet.insert(state.getName()); - } - return automaton::State(label::Label(label::LabelSetLabel(labelSet))); -} - -std::set<automaton::State> IDPDADeterminizer::recreateIDPDAStates(const automaton::State& dfaState) { - std::set<automaton::State> states; - for (const auto& label : static_cast<const label::LabelSetLabel&>(dfaState.getName().getData()).getData()) { - states.insert(automaton::State(label)); - } - return states; -} - automaton::DPDA IDPDADeterminizer::determinize(const automaton::InputDrivenNPDA& nfa) { // 1, 4 automaton::State initialState(createDFAState(nfa.getInitialStates())); @@ -49,7 +33,7 @@ automaton::DPDA IDPDADeterminizer::determinize(const automaton::InputDrivenNPDA& // 3b for (const auto& input : nfa.getInputAlphabet()) { std::set<automaton::State> targetIDPDAStates; - for(const auto& nfaState : recreateIDPDAStates(state)) { + for(const auto& nfaState : recreateNFAStates(state)) { auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input)); if(iter != nfa.getTransitions().end()) { targetIDPDAStates.insert(iter->second.begin(), iter->second.end()); @@ -70,7 +54,7 @@ automaton::DPDA IDPDADeterminizer::determinize(const automaton::InputDrivenNPDA& // 5 for (const auto& dfaState : res.getStates()) { - std::set<automaton::State> nfaStates = recreateIDPDAStates(dfaState); + std::set<automaton::State> nfaStates = recreateNFAStates(dfaState); if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) { res.addFinalState(dfaState); } diff --git a/alib2algo/src/determinize/idpda/IDPDADeterminizer.h b/alib2algo/src/determinize/idpda/IDPDADeterminizer.h index 7d8d89cade..4009c23dd2 100644 --- a/alib2algo/src/determinize/idpda/IDPDADeterminizer.h +++ b/alib2algo/src/determinize/idpda/IDPDADeterminizer.h @@ -20,27 +20,6 @@ namespace determinize { * Class for running determinization algorithm on fsm. */ class IDPDADeterminizer { - -private: - - /** - * Returns existing state from the resulting automaton, if there is one, or creates new one and adds it into - * the resulting deterministic automaton. - * - * @param originalStates set of states from nondeterministic fsm which represents state of deterministic fsm - * @return state of deterministic fsm - */ - static automaton::State createDFAState(const std::set<automaton::State>& nfaStates); - - /** - * Finds states from nondeterministic fsm to which at least one state from given set of states have transition - * with given input. - * - * @param fromStates set of states from nondeterministic fsm - * @param input symbol from input alphabet - * @return set of states from nondeterministic fsm - */ - static std::set<automaton::State> recreateIDPDAStates(const automaton::State& dfaState); public: /** diff --git a/alib2algo/src/determinize/nfa/NFADeterminizer.cpp b/alib2algo/src/determinize/nfa/NFADeterminizer.cpp index d46299f563..c19dab33d1 100644 --- a/alib2algo/src/determinize/nfa/NFADeterminizer.cpp +++ b/alib2algo/src/determinize/nfa/NFADeterminizer.cpp @@ -6,7 +6,7 @@ */ #include "NFADeterminizer.h" -#include "label/LabelSetLabel.h" +#include "../common/NFACommon.h" #include <deque> #include <algorithm> @@ -21,22 +21,6 @@ automaton::Automaton NFADeterminizer::determinize(const automaton::Automaton& au return res; } -automaton::State NFADeterminizer::createDFAState(const std::set<automaton::State>& nfaStates) { - std::set<label::Label> labelSet; - for(const automaton::State& state : nfaStates) { - labelSet.insert(state.getName()); - } - return automaton::State(label::Label(label::LabelSetLabel(labelSet))); -} - -std::set<automaton::State> NFADeterminizer::recreateNFAStates(const automaton::State& dfaState) { - std::set<automaton::State> states; - for (const auto& label : static_cast<const label::LabelSetLabel&>(dfaState.getName().getData()).getData()) { - states.insert(automaton::State(label)); - } - return states; -} - automaton::DFA NFADeterminizer::determinize(const automaton::NFA& nfa) { // 1, 4 automaton::State initialState(createDFAState(nfa.getInitialStates())); diff --git a/alib2algo/src/determinize/nfa/NFADeterminizer.h b/alib2algo/src/determinize/nfa/NFADeterminizer.h index 45d5def47c..196f90fb4d 100644 --- a/alib2algo/src/determinize/nfa/NFADeterminizer.h +++ b/alib2algo/src/determinize/nfa/NFADeterminizer.h @@ -23,28 +23,7 @@ namespace determinize { * Class for running determinization algorithm on fsm. */ class NFADeterminizer : public automaton::VisitableAutomatonBase::const_visitor_type { - private: - - /** - * Returns existing state from the resulting automaton, if there is one, or creates new one and adds it into - * the resulting deterministic automaton. - * - * @param originalStates set of states from nondeterministic fsm which represents state of deterministic fsm - * @return state of deterministic fsm - */ - static automaton::State createDFAState(const std::set<automaton::State>& nfaStates); - - /** - * Finds states from nondeterministic fsm to which at least one state from given set of states have transition - * with given input. - * - * @param fromStates set of states from nondeterministic fsm - * @param input symbol from input alphabet - * @return set of states from nondeterministic fsm - */ - static std::set<automaton::State> recreateNFAStates(const automaton::State& dfaState); - void Visit(void*, const automaton::UnknownAutomaton& automaton) const; void Visit(void*, const automaton::EpsilonNFA& automaton) const; void Visit(void*, const automaton::NFA& automaton) const; -- GitLab