Skip to content
Snippets Groups Projects
Commit eb7b5fa0 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

continue with determinize

parent 8750b06e
No related branches found
No related tags found
No related merge requests found
...@@ -16,107 +16,64 @@ namespace automaton { ...@@ -16,107 +16,64 @@ namespace automaton {
namespace determinize { namespace determinize {
   
automaton::Automaton Determinize::determinize(const automaton::Automaton& automaton) { automaton::Automaton Determinize::determinize(const automaton::Automaton& automaton) {
automaton::Automaton* out = NULL; return getInstance().dispatch(automaton.getData());
automaton.getData().Accept((void*) &out, Determinize::DETERMINIZE);
automaton::Automaton res = std::move(*out);
delete out;
return res;
} }
   
void Determinize::Visit(void*, const automaton::EpsilonNFA&) const { DFA Determinize::determinize(const automaton::DFA& automaton) {
throw exception::AlibException("Unsupported automaton type EpsilonNFA"); return automaton;
} }
   
void Determinize::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const { auto DeterminizeDFA = Determinize::RegistratorWrapper<automaton::DFA, automaton::DFA>(Determinize::getInstance(), Determinize::determinize);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->determinize(automaton));
}
void Determinize::Visit(void* data, const automaton::NFA& automaton) const {
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->determinize(automaton));
}
   
void Determinize::Visit(void* data, const automaton::DFA& automaton) const { DPDA Determinize::determinize(const automaton::DPDA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
void Determinize::Visit(void*, const automaton::ExtendedNFA& ) const { auto DeterminizeDPDA = Determinize::RegistratorWrapper<automaton::DPDA, automaton::DPDA>(Determinize::getInstance(), Determinize::determinize);
throw exception::AlibException("Unsupported automaton type ExtendedNFA");
}
void Determinize::Visit(void*, const automaton::CompactNFA& ) const {
throw exception::AlibException("Unsupported automaton type CompactNFA");
}
   
void Determinize::Visit(void* data, const automaton::DPDA& automaton) const { SinglePopDPDA Determinize::determinize(const automaton::SinglePopDPDA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
void Determinize::Visit(void* data, const automaton::SinglePopDPDA& automaton) const { auto DeterminizeSinglePopDPDA = Determinize::RegistratorWrapper<automaton::SinglePopDPDA, automaton::SinglePopDPDA>(Determinize::getInstance(), Determinize::determinize);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(automaton);
}
   
void Determinize::Visit(void* data, const automaton::InputDrivenDPDA& automaton) const { InputDrivenDPDA Determinize::determinize(const automaton::InputDrivenDPDA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
void Determinize::Visit(void* data, const automaton::InputDrivenNPDA& automaton) const { auto DeterminizeInputDrivenDPDA = Determinize::RegistratorWrapper<automaton::InputDrivenDPDA, automaton::InputDrivenDPDA>(Determinize::getInstance(), Determinize::determinize);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->determinize(automaton));
}
   
void Determinize::Visit(void* data, const automaton::VisiblyPushdownDPDA& automaton) const { VisiblyPushdownDPDA Determinize::determinize(const automaton::VisiblyPushdownDPDA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
void Determinize::Visit(void* data, const automaton::VisiblyPushdownNPDA& automaton) const { auto DeterminizeVisiblyPushdownDPDA = Determinize::RegistratorWrapper<automaton::VisiblyPushdownDPDA, automaton::VisiblyPushdownDPDA>(Determinize::getInstance(), Determinize::determinize);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->determinize(automaton));
}
   
void Determinize::Visit(void* data, const automaton::RealTimeHeightDeterministicDPDA& automaton) const { RealTimeHeightDeterministicDPDA Determinize::determinize(const automaton::RealTimeHeightDeterministicDPDA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
void Determinize::Visit(void* data, const automaton::RealTimeHeightDeterministicNPDA& automaton) const { auto DeterminizeRealTimeHeightDeterministicDPDA = Determinize::RegistratorWrapper<automaton::RealTimeHeightDeterministicDPDA, automaton::RealTimeHeightDeterministicDPDA>(Determinize::getInstance(), Determinize::determinize);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->determinize(automaton));
}
   
void Determinize::Visit(void* data, const automaton::NPDA& automaton) const { DPDA Determinize::determinize(const automaton::NPDA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data);
automaton::RealTimeHeightDeterministicNPDA rhpda = automaton::PDAToRHPDA::convert(automaton); automaton::RealTimeHeightDeterministicNPDA rhpda = automaton::PDAToRHPDA::convert(automaton);
automaton::RealTimeHeightDeterministicDPDA dpda = this->determinize(rhpda); automaton::RealTimeHeightDeterministicDPDA dpda = Determinize::determinize(rhpda);
out = new automaton::Automaton(automaton::RHPDAToPDA::convert(dpda)); return automaton::RHPDAToPDA::convert(dpda);
} }
   
void Determinize::Visit(void*, const automaton::SinglePopNPDA&) const { auto DeterminizeNPDA = Determinize::RegistratorWrapper<automaton::DPDA, automaton::NPDA>(Determinize::getInstance(), Determinize::determinize);
throw exception::AlibException("Unsupported automaton type SinglePopNPDA");
}
   
void Determinize::Visit(void* data, const automaton::OneTapeDTM& automaton) const { OneTapeDTM Determinize::determinize(const automaton::OneTapeDTM& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
void Determinize::Visit(void* data, const automaton::NFTA& automaton) const { auto DeterminizeOneTapeDTM = Determinize::RegistratorWrapper<automaton::OneTapeDTM, automaton::OneTapeDTM>(Determinize::getInstance(), Determinize::determinize);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->determinize(automaton));
}
   
void Determinize::Visit(void* data, const automaton::DFTA& automaton) const { DFTA Determinize::determinize(const automaton::DFTA& automaton) {
automaton::Automaton* & out = *((automaton::Automaton**) data); return automaton;
out = new automaton::Automaton(automaton);
} }
   
const Determinize Determinize::DETERMINIZE; auto DeterminizeDFTA = Determinize::RegistratorWrapper<automaton::DFTA, automaton::DFTA>(Determinize::getInstance(), Determinize::determinize);
   
} /* namespace determinize */ } /* namespace determinize */
   
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#ifndef DETERMINIZE_H_ #ifndef DETERMINIZE_H_
#define DETERMINIZE_H_ #define DETERMINIZE_H_
   
#include <common/multipleDispatch.hpp>
#include <set> #include <set>
   
#include <automaton/common/State.h> #include <automaton/common/State.h>
...@@ -30,33 +31,7 @@ namespace determinize { ...@@ -30,33 +31,7 @@ namespace determinize {
/** /**
* Class for running determinization algorithm on fsm. * Class for running determinization algorithm on fsm.
*/ */
class Determinize : public automaton::VisitableAutomatonBase::const_visitor_type { class Determinize : public std::SingleDispatch<automaton::Automaton, automaton::AutomatonBase> {
public:
Determinize() {}
private:
void Visit(void*, const automaton::EpsilonNFA& automaton) const;
void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
void Visit(void*, const automaton::NFA& automaton) const;
void Visit(void*, const automaton::DFA& automaton) const;
void Visit(void*, const automaton::ExtendedNFA& automaton) const;
void Visit(void*, const automaton::CompactNFA& automaton) const;
void Visit(void*, const automaton::DPDA& automaton) const;
void Visit(void*, const automaton::SinglePopDPDA& automaton) const;
void Visit(void*, const automaton::InputDrivenDPDA& automaton) const;
void Visit(void*, const automaton::InputDrivenNPDA& automaton) const;
void Visit(void*, const automaton::VisiblyPushdownDPDA& automaton) const;
void Visit(void*, const automaton::VisiblyPushdownNPDA& automaton) const;
void Visit(void*, const automaton::RealTimeHeightDeterministicDPDA& automaton) const;
void Visit(void*, const automaton::RealTimeHeightDeterministicNPDA& automaton) const;
void Visit(void*, const automaton::NPDA& automaton) const;
void Visit(void*, const automaton::SinglePopNPDA& automaton) const;
void Visit(void*, const automaton::OneTapeDTM& automaton) const;
void Visit(void*, const automaton::DFTA& automaton) const;
void Visit(void*, const automaton::NFTA& automaton) const;
static const Determinize DETERMINIZE;
public: public:
   
/** /**
...@@ -66,12 +41,26 @@ public: ...@@ -66,12 +41,26 @@ public:
*/ */
static automaton::Automaton determinize(const automaton::Automaton& nfa); static automaton::Automaton determinize(const automaton::Automaton& nfa);
   
static automaton::DFA determinize(const automaton::DFA& nfa);
static automaton::DFA determinize(const automaton::NFA& nfa); static automaton::DFA determinize(const automaton::NFA& nfa);
static automaton::DFA determinize(const automaton::MultiInitialStateNFA& nfa); static automaton::DFA determinize(const automaton::MultiInitialStateNFA& nfa);
static automaton::DPDA determinize(const automaton::DPDA& dpda);
static automaton::DPDA determinize(const automaton::NPDA& dpda);
static automaton::SinglePopDPDA determinize(const automaton::SinglePopDPDA& dpda);
static automaton::VisiblyPushdownDPDA determinize(const automaton::VisiblyPushdownDPDA& nondeterministic);
static automaton::VisiblyPushdownDPDA determinize(const automaton::VisiblyPushdownNPDA& nondeterministic); static automaton::VisiblyPushdownDPDA determinize(const automaton::VisiblyPushdownNPDA& nondeterministic);
static automaton::InputDrivenDPDA determinize(const automaton::InputDrivenDPDA& nfa);
static automaton::InputDrivenDPDA determinize(const automaton::InputDrivenNPDA& nfa); static automaton::InputDrivenDPDA determinize(const automaton::InputDrivenNPDA& nfa);
static automaton::RealTimeHeightDeterministicDPDA determinize(const automaton::RealTimeHeightDeterministicDPDA& nondeterministic);
static automaton::RealTimeHeightDeterministicDPDA determinize(const automaton::RealTimeHeightDeterministicNPDA& nondeterministic); static automaton::RealTimeHeightDeterministicDPDA determinize(const automaton::RealTimeHeightDeterministicNPDA& nondeterministic);
static automaton::DFTA determinize(const automaton::DFTA& nfta);
static automaton::DFTA determinize(const automaton::NFTA& nfta); static automaton::DFTA determinize(const automaton::NFTA& nfta);
static automaton::OneTapeDTM determinize(const automaton::OneTapeDTM& nfta);
static Determinize& getInstance() {
static Determinize res;
return res;
}
}; };
   
} /* namespace determinize */ } /* namespace determinize */
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
* Author: Jan Vesely * Author: Jan Vesely
*/ */
   
#include <common/multipleDispatch.hpp>
#include "common/NFACommon.h" #include "common/NFACommon.h"
   
#include <automaton/PDA/InputDrivenNPDA.h> #include <automaton/PDA/InputDrivenNPDA.h>
...@@ -64,6 +66,8 @@ automaton::InputDrivenDPDA Determinize::determinize(const automaton::InputDriven ...@@ -64,6 +66,8 @@ automaton::InputDrivenDPDA Determinize::determinize(const automaton::InputDriven
return res; return res;
} }
   
auto DeterminizeInputDrivenNPDA = Determinize::RegistratorWrapper<automaton::InputDrivenDPDA, automaton::InputDrivenNPDA>(Determinize::getInstance(), Determinize::determinize);
} /* namespace determinize */ } /* namespace determinize */
   
} /* namespace automaton */ } /* namespace automaton */
...@@ -63,6 +63,8 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n ...@@ -63,6 +63,8 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n
return res; return res;
} }
   
auto DeterminizeMultiInitialStateNFA = Determinize::RegistratorWrapper<automaton::DFA, automaton::MultiInitialStateNFA>(Determinize::getInstance(), Determinize::determinize);
automaton::DFA Determinize::determinize(const automaton::NFA& nfa) { automaton::DFA Determinize::determinize(const automaton::NFA& nfa) {
// 1, 4 // 1, 4
automaton::State initialState(createDFAState({nfa.getInitialState()})); automaton::State initialState(createDFAState({nfa.getInitialState()}));
...@@ -110,6 +112,8 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) { ...@@ -110,6 +112,8 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) {
return res; return res;
} }
   
auto DeterminizeNFA = Determinize::RegistratorWrapper<automaton::DFA, automaton::NFA>(Determinize::getInstance(), Determinize::determinize);
} /* namespace determinize */ } /* namespace determinize */
   
} /* namespace automaton */ } /* namespace automaton */
...@@ -94,6 +94,8 @@ DFTA Determinize::determinize(const NFTA & nfta) { ...@@ -94,6 +94,8 @@ DFTA Determinize::determinize(const NFTA & nfta) {
return res; return res;
} }
   
auto DeterminizeNFTA = Determinize::RegistratorWrapper<automaton::DFTA, automaton::NFTA>(Determinize::getInstance(), Determinize::determinize);
} /* namespace determinize */ } /* namespace determinize */
   
} /* namespace automaton */ } /* namespace automaton */
...@@ -246,6 +246,8 @@ automaton::RealTimeHeightDeterministicDPDA Determinize::determinize(const automa ...@@ -246,6 +246,8 @@ automaton::RealTimeHeightDeterministicDPDA Determinize::determinize(const automa
return d; return d;
} }
   
auto DeterminizeRealTimeHeightDeterministicNPDA = Determinize::RegistratorWrapper<automaton::RealTimeHeightDeterministicDPDA, automaton::RealTimeHeightDeterministicNPDA>(Determinize::getInstance(), Determinize::determinize);
} /* namespace determinize */ } /* namespace determinize */
   
} /* namespace automaton */ } /* namespace automaton */
...@@ -204,6 +204,8 @@ automaton::VisiblyPushdownDPDA Determinize::determinize(const automaton::Visibly ...@@ -204,6 +204,8 @@ automaton::VisiblyPushdownDPDA Determinize::determinize(const automaton::Visibly
return d; return d;
} }
   
auto DeterminizeVisiblyPushdownNPDA = Determinize::RegistratorWrapper<automaton::VisiblyPushdownDPDA, automaton::VisiblyPushdownNPDA>(Determinize::getInstance(), Determinize::determinize);
} /* namespace determinize */ } /* namespace determinize */
   
} /* namespace automaton */ } /* namespace 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