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

Changes to reflect singleInitialStateFSM data +fix

parent 583a0954
No related branches found
No related tags found
No related merge requests found
......@@ -10,6 +10,7 @@
 
#include <automaton/FSM/NFA.h>
#include <automaton/FSM/EpsilonNFA.h>
#include <automaton/FSM/MultiInitialStateNFA.h>
#include <automaton/FSM/DFA.h>
#include <automaton/FSM/ExtendedNFA.h>
#include <automaton/FSM/CompactNFA.h>
......@@ -67,6 +68,39 @@ void DotConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) {
}
}
 
//Mark initial states
out << "node [shape = plaintext, label=\"start\"]; 0; \n";
out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
transitions(a, states, out);
out << "}";
}
void DotConverter::convert(const automaton::MultiInitialStateNFA& a, std::ostream& out) {
label::LabelToStringComposer composer;
out << "digraph automaton {\n";
out << "rankdir=LR;\n";
int cnt = 1;
//Map states to indices
std::map<automaton::State, int> states;
for (const automaton::State& state : a.getStates()) {
states.insert(std::make_pair(state, cnt++));
}
//Print final states
for (const automaton::State& state : a.getFinalStates()) {
out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n";
}
//Print nonfinal states
for (const auto& state : states) {
if (!a.getFinalStates().count(state.first)) {
out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n";
}
}
//Mark initial states
out << "node [shape = plaintext, label=\"start\"]; 0; \n";
for (const automaton::State& state : a.getInitialStates()) {
......@@ -104,9 +138,7 @@ void DotConverter::convert(const automaton::NFA& a, std::ostream& out) {
 
//Mark initial states
out << "node [shape = plaintext, label=\"start\"]; 0; \n";
for (const automaton::State& state : a.getInitialStates()) {
out << "0 -> " << states.find(state)->second << ";\n";
}
out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
 
transitions(a, states, out);
out << "}";
......@@ -172,9 +204,7 @@ void DotConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out) {
 
//Mark initial states
out << "node [shape = plaintext, label=\"start\"]; 0; \n";
for (const automaton::State& state : a.getInitialStates()) {
out << "0 -> " << states.find(state)->second << ";\n";
}
out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
 
transitions(a, states, out);
out << "}";
......@@ -207,9 +237,7 @@ void DotConverter::convert(const automaton::CompactNFA& a, std::ostream& out) {
 
//Mark initial states
out << "node [shape = plaintext, label=\"start\"]; 0; \n";
for (const automaton::State& state : a.getInitialStates()) {
out << "0 -> " << states.find(state)->second << ";\n";
}
out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
 
transitions(a, states, out);
out << "}";
......@@ -587,6 +615,33 @@ void DotConverter::transitions(const automaton::EpsilonNFA& fsm, const std::map<
}
}
 
void DotConverter::transitions(const automaton::MultiInitialStateNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) {
std::map<std::pair<int, int>, std::string> transitions;
//put transitions from automaton to "transitions"
for (const auto& transition : fsm.getTransitions()) {
alphabet::SymbolToStringComposer composer;
std::string symbol = composer.compose(transition.first.second);
for(const automaton::State& to : transition.second) {
std::pair<int, int> key(states.find(transition.first.first)->second, states.find(to)->second);
std::map<std::pair<int, int>, std::string>::iterator mapit = transitions.find(key);
if (mapit == transitions.end()) {
transitions.insert(std::make_pair(key, symbol));
} else {
mapit->second += ", " + symbol;
}
}
}
//print the map
for (const std::pair<std::pair<int, int>, std::string>& transition : transitions) {
out << transition.first.first << " -> " << transition.first.second;
out << "[label=\"" << transition.second << "\"]\n";
}
}
void DotConverter::transitions(const automaton::NFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) {
std::map<std::pair<int, int>, std::string> transitions;
 
......@@ -1428,6 +1483,10 @@ void DotConverter::Visit(void* data, const automaton::EpsilonNFA& automaton) con
DotConverter::convert(automaton, *((std::ostream*) data));
}
 
void DotConverter::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const {
DotConverter::convert(automaton, *((std::ostream*) data));
}
void DotConverter::Visit(void* data, const automaton::NFA& automaton) const {
DotConverter::convert(automaton, *((std::ostream*) data));
}
......
......@@ -17,6 +17,7 @@
 
class DotConverter : public automaton::VisitableAutomatonBase::const_visitor_type {
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;
......@@ -33,6 +34,7 @@ class DotConverter : public automaton::VisitableAutomatonBase::const_visitor_typ
void Visit(void*, const automaton::OneTapeDTM& automaton) const;
 
static void transitions(const automaton::EpsilonNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
static void transitions(const automaton::MultiInitialStateNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
static void transitions(const automaton::NFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
static void transitions(const automaton::DFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
static void transitions(const automaton::ExtendedNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
......@@ -53,6 +55,7 @@ public:
static void convert(const automaton::Automaton& a, std::ostream& out);
 
static void convert(const automaton::EpsilonNFA& a, std::ostream& out);
static void convert(const automaton::MultiInitialStateNFA& a, std::ostream& out);
static void convert(const automaton::NFA& a, std::ostream& out);
static void convert(const automaton::DFA& a, std::ostream& out);
static void convert(const automaton::ExtendedNFA& a, std::ostream& out);
......
......@@ -8,6 +8,7 @@
#include "GasTexConverter.h"
 
#include <automaton/FSM/NFA.h>
#include <automaton/FSM/MultiInitialStateNFA.h>
#include <automaton/FSM/EpsilonNFA.h>
#include <automaton/FSM/DFA.h>
#include <automaton/FSM/ExtendedNFA.h>
......@@ -40,6 +41,45 @@ void GasTexConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out)
out << "\\begin{center}\n";
out << "\\begin{picture}(,)(,)\n";
 
for (auto& state : a.getStates()) {
bool initial = false;
bool final = false;
if(a.getInitialState() == state){
initial = true;
}
if(a.getFinalStates().count(state)){
final = true;
}
if(initial || final) {
out << "\\node[Nmarks=";
if(initial){
out << "i";
}
if(final){
out << "r";
}
out<<"](";
} else {
out <<"\\node(";
}
out << state.getName();
out << ")(,){";
out << state.getName();
out << "}\n";
}
transitions(a, out);
out << "\\end{center}\n";
out << "\\end{picture}\n";
}
void GasTexConverter::convert(const automaton::MultiInitialStateNFA& a, std::ostream& out) {
out << "\\begin{center}\n";
out << "\\begin{picture}(,)(,)\n";
for (auto& state : a.getStates()) {
bool initial = false;
bool final = false;
......@@ -83,7 +123,7 @@ void GasTexConverter::convert(const automaton::NFA& a, std::ostream& out) {
bool initial = false;
bool final = false;
 
if(a.getInitialStates().count(state)){
if(a.getInitialState() == state){
initial = true;
}
if(a.getFinalStates().count(state)){
......@@ -161,7 +201,7 @@ void GasTexConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out
bool initial = false;
bool final = false;
 
if(a.getInitialStates().count(state)){
if(a.getInitialState() == state){
initial = true;
}
if(a.getFinalStates().count(state)){
......@@ -200,7 +240,7 @@ void GasTexConverter::convert(const automaton::CompactNFA& a, std::ostream& out)
bool initial = false;
bool final = false;
 
if(a.getInitialStates().count(state)){
if(a.getInitialState() == state){
initial = true;
}
if(a.getFinalStates().count(state)){
......@@ -686,6 +726,25 @@ void GasTexConverter::transitions(const automaton::EpsilonNFA& fsm, std::ostream
printTransitionMap(transitionMap, out);
}
 
void GasTexConverter::transitions(const automaton::MultiInitialStateNFA& fsm, std::ostream& out) {
std::map<std::pair<std::string, std::string>, std::string> transitionMap;
for (const auto& transition : fsm.getTransitions()) {
for(const auto& to : transition.second) {
std::pair<std::string, std::string> key(transition.first.first.getName(), to.getName());
std::string symbol = (std::string) transition.first.second;
auto mapIterator = transitionMap.find(key);
if (mapIterator == transitionMap.end()) {
transitionMap.insert(make_pair(key, symbol));
} else {
mapIterator->second += ", " + symbol;
}
}
}
printTransitionMap(transitionMap, out);
}
void GasTexConverter::transitions(const automaton::NFA& fsm, std::ostream& out) {
std::map<std::pair<std::string, std::string>, std::string> transitionMap;
for (const auto& transition : fsm.getTransitions()) {
......@@ -1264,6 +1323,10 @@ void GasTexConverter::Visit(void* data, const automaton::EpsilonNFA& automaton)
GasTexConverter::convert(automaton, *((std::ostream*) data));
}
 
void GasTexConverter::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const {
GasTexConverter::convert(automaton, *((std::ostream*) data));
}
void GasTexConverter::Visit(void* data, const automaton::NFA& automaton) const {
GasTexConverter::convert(automaton, *((std::ostream*) data));
}
......
......@@ -17,6 +17,7 @@
 
class GasTexConverter : public automaton::VisitableAutomatonBase::const_visitor_type {
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;
......@@ -36,6 +37,7 @@ class GasTexConverter : public automaton::VisitableAutomatonBase::const_visitor_
static std::string getStackSymbols(const std::vector<alphabet::Symbol>& stackSymbols);
 
static void transitions(const automaton::EpsilonNFA& fsm, std::ostream& out);
static void transitions(const automaton::MultiInitialStateNFA& fsm, std::ostream& out);
static void transitions(const automaton::NFA& fsm, std::ostream& out);
static void transitions(const automaton::DFA& fsm, std::ostream& out);
static void transitions(const automaton::ExtendedNFA& fsm, std::ostream& out);
......@@ -56,6 +58,7 @@ public:
static void convert(const automaton::Automaton& a, std::ostream& out);
 
static void convert(const automaton::EpsilonNFA& a, std::ostream& out);
static void convert(const automaton::MultiInitialStateNFA& a, std::ostream& out);
static void convert(const automaton::NFA& a, std::ostream& out);
static void convert(const automaton::DFA& a, std::ostream& out);
static void convert(const automaton::ExtendedNFA& a, std::ostream& out);
......
......@@ -21,6 +21,7 @@
 
#include "automaton/FSM/DFA.h"
#include "automaton/FSM/NFA.h"
#include "automaton/FSM/MultiInitialStateNFA.h"
#include "automaton/FSM/EpsilonNFA.h"
#include "automaton/FSM/ExtendedNFA.h"
#include "automaton/FSM/CompactNFA.h"
......@@ -38,7 +39,7 @@ bool AutomatonDiff::testDiff(const automaton::DFA& a, const automaton::DFA& b) {
a.getTransitions() == b.getTransitions() ;
}
 
bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) {
bool AutomatonDiff::testDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) {
return a.getFinalStates() == b.getFinalStates() &&
a.getInitialStates() == b.getInitialStates() &&
// a.getInputAlphabet() == b.getInputAlphabet() &&
......@@ -46,9 +47,17 @@ bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) {
a.getTransitions() == b.getTransitions() ;
}
 
bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) {
return a.getFinalStates() == b.getFinalStates() &&
a.getInitialState() == b.getInitialState() &&
// a.getInputAlphabet() == b.getInputAlphabet() &&
a.getStates() == b.getStates() &&
a.getTransitions() == b.getTransitions() ;
}
bool AutomatonDiff::testDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) {
return a.getFinalStates() == b.getFinalStates() &&
a.getInitialStates() == b.getInitialStates() &&
a.getInitialState() == b.getInitialState() &&
// a.getInputAlphabet() == b.getInputAlphabet() &&
a.getStates() == b.getStates() &&
a.getTransitions() == b.getTransitions() ;
......@@ -56,7 +65,7 @@ bool AutomatonDiff::testDiff(const automaton::EpsilonNFA& a, const automaton::Ep
 
bool AutomatonDiff::testDiff(const automaton::ExtendedNFA& a, const automaton::ExtendedNFA& b) {
return a.getFinalStates() == b.getFinalStates() &&
a.getInitialStates() == b.getInitialStates() &&
a.getInitialState() == b.getInitialState() &&
// a.getInputAlphabet() == b.getInputAlphabet() &&
a.getStates() == b.getStates() &&
a.getTransitions() == b.getTransitions() ;
......@@ -64,7 +73,7 @@ bool AutomatonDiff::testDiff(const automaton::ExtendedNFA& a, const automaton::E
 
bool AutomatonDiff::testDiff(const automaton::CompactNFA& a, const automaton::CompactNFA& b) {
return a.getFinalStates() == b.getFinalStates() &&
a.getInitialStates() == b.getInitialStates() &&
a.getInitialState() == b.getInitialState() &&
// a.getInputAlphabet() == b.getInputAlphabet() &&
a.getStates() == b.getStates() &&
a.getTransitions() == b.getTransitions() ;
......@@ -184,7 +193,7 @@ void AutomatonDiff::printDiff(const automaton::DFA& a, const automaton::DFA& b)
}
}
 
void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) {
void AutomatonDiff::printDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) {
std::cout << "AutomataDiffer" << std::endl;
 
if(a.getFinalStates() != b.getFinalStates()){
......@@ -218,6 +227,42 @@ void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b)
}
}
 
void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) {
std::cout << "AutomataDiffer" << std::endl;
if(a.getFinalStates() != b.getFinalStates()){
std::cout << "FinalStates" << std::endl;
AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
}
if(a.getInitialState() != b.getInitialState()) {
std::cout << "Initial state" << std::endl;
std::cout << "< " << a.getInitialState() << std::endl;
std::cout << "---" << std::endl;
std::cout << "> " << b.getInitialState() << std::endl;
}
if(a.getInputAlphabet() != b.getInputAlphabet()) {
std::cout << "InputAlphabet" << std::endl;
AutomatonDiff::setDiff(a.getInputAlphabet(), b.getInputAlphabet());
}
if(a.getStates() != b.getStates()) {
std::cout << "States" << std::endl;
AutomatonDiff::setDiff(a.getStates(), b.getStates());
}
if(a.getTransitions() != b.getTransitions()) {
std::cout << "Transitions" << std::endl;
AutomatonDiff::mapDiff(a.getTransitions(), b.getTransitions());
}
}
void AutomatonDiff::printDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) {
std::cout << "AutomataDiffer" << std::endl;
 
......@@ -227,10 +272,12 @@ void AutomatonDiff::printDiff(const automaton::EpsilonNFA& a, const automaton::E
AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
}
 
if(a.getInitialStates() != b.getInitialStates()) {
std::cout << "InitialStates" << std::endl;
if(a.getInitialState() != b.getInitialState()) {
std::cout << "Initial state" << std::endl;
 
AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates());
std::cout << "< " << a.getInitialState() << std::endl;
std::cout << "---" << std::endl;
std::cout << "> " << b.getInitialState() << std::endl;
}
 
if(a.getInputAlphabet() != b.getInputAlphabet()) {
......@@ -261,10 +308,12 @@ void AutomatonDiff::printDiff(const automaton::ExtendedNFA& a, const automaton::
AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
}
 
if(a.getInitialStates() != b.getInitialStates()) {
std::cout << "InitialStates" << std::endl;
if(a.getInitialState() != b.getInitialState()) {
std::cout << "Initial state" << std::endl;
 
AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates());
std::cout << "< " << a.getInitialState() << std::endl;
std::cout << "---" << std::endl;
std::cout << "> " << b.getInitialState() << std::endl;
}
 
if(a.getInputAlphabet() != b.getInputAlphabet()) {
......@@ -295,10 +344,12 @@ void AutomatonDiff::printDiff(const automaton::CompactNFA& a, const automaton::C
AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
}
 
if(a.getInitialStates() != b.getInitialStates()) {
std::cout << "InitialStates" << std::endl;
if(a.getInitialState() != b.getInitialState()) {
std::cout << "Initial state" << std::endl;
 
AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates());
std::cout << "< " << a.getInitialState() << std::endl;
std::cout << "---" << std::endl;
std::cout << "> " << b.getInitialState() << std::endl;
}
 
if(a.getInputAlphabet() != b.getInputAlphabet()) {
......@@ -480,6 +531,15 @@ int AutomatonDiff::diff(const automaton::NFA& a, const automaton::NFA& b) {
}
}
 
int AutomatonDiff::diff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) {
if(!AutomatonDiff::testDiff(a, b)) {
AutomatonDiff::printDiff(a, b);
return 1;
} else {
return 0;
}
}
int AutomatonDiff::diff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) {
if(!AutomatonDiff::testDiff(a, b)) {
AutomatonDiff::printDiff(a, b);
......@@ -561,6 +621,10 @@ int AutomatonDiff::diff(const automaton::Automaton& a, const automaton::Automato
if(res == 0) return 0;
if(res == 1) return 1;
 
res = dynamicDiff<automaton::MultiInitialStateNFA>(a, b);
if(res == 0) return 0;
if(res == 1) return 1;
res = dynamicDiff<automaton::EpsilonNFA>(a, b);
if(res == 0) return 0;
if(res == 1) return 1;
......
......@@ -23,6 +23,9 @@ class AutomatonDiff {
static bool testDiff(const automaton::NFA& a, const automaton::NFA& b);
static void printDiff(const automaton::NFA& a, const automaton::NFA& b);
 
static bool testDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b);
static void printDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b);
static bool testDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b);
static void printDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b);
 
......@@ -47,6 +50,7 @@ class AutomatonDiff {
public:
static int diff(const automaton::DFA& a, const automaton::DFA& b);
static int diff(const automaton::NFA& a, const automaton::NFA& b);
static int diff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b);
static int diff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b);
static int diff(const automaton::ExtendedNFA& a, const automaton::ExtendedNFA& b);
static int diff(const automaton::CompactNFA& a, const automaton::CompactNFA& b);
......
......@@ -87,7 +87,7 @@ automaton::NFA RGtoFA::convert(const grammar::RightRG& grammar)
// step 1, 4
const automaton::State AState = automaton::createUniqueState(automaton::State("A"), states);
states.insert(AState);
automaton::NFA automaton(AState);
automaton::NFA automaton(stateMap.find(grammar.getInitialSymbol())->second);
automaton.setStates(states);
 
automaton.setInputSymbols(grammar.getTerminalAlphabet());
......
......@@ -51,14 +51,14 @@ void AutomataStat::stat(const automaton::NFA& automaton, const Settings& setting
 
switch(settings.initialStates) {
case PrintOptions::PRINT:
alib::DataFactory::toStdout(automaton.getInitialStates());
alib::DataFactory::toStdout(automaton.getInitialState());
break;
case PrintOptions::QUANTITY:
std::cout << automaton.getInitialStates().size() << std::endl;
std::cout << 1 << std::endl;
break;
case PrintOptions::BOTH:
std::cout << automaton.getInitialStates().size() << std::endl;
alib::DataFactory::toStdout(automaton.getInitialStates());
std::cout << 1 << std::endl;
alib::DataFactory::toStdout(automaton.getInitialState());
break;
case PrintOptions::NOOP:
break;
......@@ -176,6 +176,10 @@ void AutomataStat::Visit(void*, const automaton::EpsilonNFA&) const {
throw exception::AlibException("Unsupported automaton type EpsilonNFA");
}
 
void AutomataStat::Visit(void*, const automaton::MultiInitialStateNFA&) const {
throw exception::AlibException("Unsupported automaton type EpsilonNFA");
}
void AutomataStat::Visit(void* data, const automaton::NFA& automaton) const {
const Settings& in = *((const Settings*) data);
this->stat(automaton, in);
......
......@@ -26,6 +26,7 @@ public:
 
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;
......
......@@ -12,9 +12,9 @@
<LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol>
<LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol>
</inputAlphabet>
<initialStates>
<initialState>
<PrimitiveLabel><String>0</String></PrimitiveLabel>
</initialStates>
</initialState>
<finalStates>
<PrimitiveLabel><String>1</String></PrimitiveLabel>
<PrimitiveLabel><String>3</String></PrimitiveLabel>
......
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