From 9dda59738846195f271e3a651f6afbd879836356 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 17 Sep 2014 09:26:32 +0200
Subject: [PATCH] idpda determinization

---
 .../determinize/idpda/IDPDADeterminizer.cpp   | 81 +++++++++++++++++++
 .../src/determinize/idpda/IDPDADeterminizer.h | 56 +++++++++++++
 .../test-src/conversions/rg2rg/rg2rgTest.cpp  | 74 ++++++++---------
 .../test-src/determinize/determinizeTest.cpp  | 65 +++++++++++++++
 .../test-src/determinize/determinizeTest.h    | 21 +++++
 alib2algo/test-src/minimize/minimizeTest.cpp  | 18 ++---
 .../test-src/normalize/normalizeTest.cpp      | 18 ++---
 alib2algo/test-src/trim/trimTest.cpp          | 56 ++++++-------
 8 files changed, 306 insertions(+), 83 deletions(-)
 create mode 100644 alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp
 create mode 100644 alib2algo/src/determinize/idpda/IDPDADeterminizer.h
 create mode 100644 alib2algo/test-src/determinize/determinizeTest.cpp
 create mode 100644 alib2algo/test-src/determinize/determinizeTest.h

diff --git a/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp b/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp
new file mode 100644
index 0000000000..e307a3388e
--- /dev/null
+++ b/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp
@@ -0,0 +1,81 @@
+/*
+ * IDPDADeterminizer.cpp
+ *
+ *  Created on: 16. 1. 2014
+ *	  Author: Jan Vesely
+ */
+
+#include "IDPDADeterminizer.h"
+#include "label/LabelSetLabel.h"
+
+#include <deque>
+#include <algorithm>
+
+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()));
+	automaton::DPDA res(initialState, nfa.getInitialSymbol());
+	res.setInputSymbols(nfa.getInputAlphabet());
+	
+	// 2
+	std::deque<automaton::State> todo;
+	todo.push_back(initialState);
+	
+	do {
+		// 3a, c
+		automaton::State state = todo.front();
+		todo.pop_front();
+
+		// 3b
+		for (const auto& input : nfa.getInputAlphabet()) {
+			std::set<automaton::State> targetIDPDAStates;
+			for(const auto& nfaState : recreateIDPDAStates(state)) {
+				auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input));
+				if(iter != nfa.getTransitions().end()) {
+					targetIDPDAStates.insert(iter->second.begin(), iter->second.end());
+				}
+			}
+			automaton::State dfaState = createDFAState(targetIDPDAStates);
+
+			// 4
+			bool existed = !res.addState(dfaState);
+
+			// 3b
+			const auto& pushdownOperation = nfa.getPushdownStoreOperations().find(input)->second;
+			res.addTransition(state, input, pushdownOperation.first, dfaState, pushdownOperation.second);
+
+			if(!existed) todo.push_back(dfaState);
+		}
+	} while(!todo.empty());
+	
+	// 5
+	for (const auto& dfaState : res.getStates()) {
+		std::set<automaton::State> nfaStates = recreateIDPDAStates(dfaState);
+		if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) {
+			res.addFinalState(dfaState);
+		}
+	}
+	
+	return res;
+}
+
+}
diff --git a/alib2algo/src/determinize/idpda/IDPDADeterminizer.h b/alib2algo/src/determinize/idpda/IDPDADeterminizer.h
new file mode 100644
index 0000000000..7d8d89cade
--- /dev/null
+++ b/alib2algo/src/determinize/idpda/IDPDADeterminizer.h
@@ -0,0 +1,56 @@
+/*
+ * IDPDADeterminizer.h
+ *
+ *  Created on: 16. 1. 2014
+ *	  Author: Jan Vesely
+ */
+
+#ifndef IDPDA_DETERMINIZER_H_
+#define IDPDA_DETERMINIZER_H_
+
+#include <set>
+
+#include "automaton/common/State.h"
+#include "automaton/PDA/InputDrivenNPDA.h"
+#include "automaton/PDA/DPDA.h"
+
+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:
+
+	/**
+	 * @param nfsm nondeterministic final-state machine given for determinization
+	 * Runs determinization algorithm on nondeterministic fsm given in constructor.
+	 */
+	static automaton::DPDA determinize(const automaton::InputDrivenNPDA& nfa);
+
+};
+
+} /* namespace determinize */
+
+#endif /* IDPDA_DETERMINIZER_H_ */
diff --git a/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp b/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp
index 24b8c9772e..00105647fd 100644
--- a/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp
+++ b/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp
@@ -20,65 +20,65 @@ void rg2rgTest::tearDown() {
 }
 
 void rg2rgTest::testConversion() {
-  grammar::RightRG rrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
+  grammar::RightRG rrGrammar(alphabet::symbolFrom(1));
 
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))));
-  rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(1));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(2));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(3));
+  rrGrammar.addTerminalSymbol(alphabet::symbolFrom("a"));
+  rrGrammar.addTerminalSymbol(alphabet::symbolFrom("b"));
   
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
+  rrGrammar.addRule(alphabet::symbolFrom(1), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(2)));
+  rrGrammar.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3)));
+  rrGrammar.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a"));
 
   rg2rg::RightToLeftRegularGrammar convertor;;
   grammar::LeftRG lrGrammar = convertor.convert(rrGrammar);
 
-  grammar::LeftRG lrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
+  grammar::LeftRG lrGrammarRef(alphabet::symbolFrom(4));
 
-  lrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
-  lrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))));
-  lrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))));
-  lrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  lrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  lrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(1));
+  lrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(2));
+  lrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(3));
+  lrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("a"));
+  lrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("b"));
 
-  lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))));
-  lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))));
-  lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))));
+  lrGrammarRef.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom(1), alphabet::symbolFrom("a")));
+  lrGrammarRef.addRule(alphabet::symbolFrom(2), alphabet::symbolFrom("a"));
+  lrGrammarRef.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom(2), alphabet::symbolFrom("b")));
+  lrGrammarRef.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom(3), alphabet::symbolFrom("a")));
 
   CPPUNIT_ASSERT(lrGrammarRef == lrGrammar);
 }
 
 void rg2rgTest::testConversion2() {
-  grammar::LeftRG lrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
+  grammar::LeftRG lrGrammar(alphabet::symbolFrom(4));
 
-  lrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))));
-  lrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))));
-  lrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
-  lrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  lrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  lrGrammar.addNonterminalSymbol(alphabet::symbolFrom(2));
+  lrGrammar.addNonterminalSymbol(alphabet::symbolFrom(3));
+  lrGrammar.addNonterminalSymbol(alphabet::symbolFrom(4));
+  lrGrammar.addTerminalSymbol(alphabet::symbolFrom("a"));
+  lrGrammar.addTerminalSymbol(alphabet::symbolFrom("b"));
 
-  lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))));
-  lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))));
+  lrGrammar.addRule(alphabet::symbolFrom(2), alphabet::symbolFrom("a"));
+  lrGrammar.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom(2), alphabet::symbolFrom("b")));
+  lrGrammar.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom(3), alphabet::symbolFrom("a")));
 
   rg2rg::LeftToRightRegularGrammar convertor;
   grammar::RightRG rrGrammar = convertor.convert(lrGrammar);
 
   grammar::RightRG rrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))));
 
-  rrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))));
-  rrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))));
-  rrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
-  rrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  rrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  rrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(2));
+  rrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(3));
+  rrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(4));
+  rrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("a"));
+  rrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("b"));
 
-  rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))));
-  rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))));
-  rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4))))));
+  rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(2)));
+  rrGrammarRef.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3)));
+  rrGrammarRef.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a"));
+  rrGrammarRef.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(4)));
 
   CPPUNIT_ASSERT(rrGrammarRef == rrGrammar);
 }
diff --git a/alib2algo/test-src/determinize/determinizeTest.cpp b/alib2algo/test-src/determinize/determinizeTest.cpp
new file mode 100644
index 0000000000..0e7891b6ef
--- /dev/null
+++ b/alib2algo/test-src/determinize/determinizeTest.cpp
@@ -0,0 +1,65 @@
+#include <list>
+#include "determinizeTest.h"
+
+#include "label/StringLabel.h"
+#include "label/CharacterLabel.h"
+#include "label/IntegerLabel.h"
+#include "label/Label.h"
+#include "alphabet/LabeledSymbol.h"
+
+#include "determinize/nfa/NFADeterminizer.h"
+#include "determinize/idpda/IDPDADeterminizer.h"
+
+#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
+
+CPPUNIT_TEST_SUITE_REGISTRATION( determinizeTest );
+
+void determinizeTest::setUp() {
+}
+
+void determinizeTest::tearDown() {
+}
+
+void determinizeTest::testDeterminizeNFA() {
+  automaton::NFA automaton;
+
+  automaton.addState(automaton::State(1));
+  automaton.addState(automaton::State(2));
+  automaton.addState(automaton::State(3));
+  automaton.addInputSymbol(alphabet::symbolFrom("a"));
+  automaton.addInputSymbol(alphabet::symbolFrom("b"));
+  
+  automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2));
+  automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1));
+
+  automaton.addInitialState(automaton::State(1));
+  automaton.addFinalState(automaton::State(3));
+  
+  automaton::DFA determinized = determinize::NFADeterminizer::determinize(automaton);
+
+  CPPUNIT_ASSERT(determinized.getStates().size() == 3);
+
+}
+
+void determinizeTest::testDeterminizeIDPDA() {
+  automaton::InputDrivenNPDA automaton(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::CharacterLabel('S')))));
+
+  automaton.addInputSymbol(alphabet::symbolFrom("a"));
+  automaton.addInputSymbol(alphabet::symbolFrom("b"));
+  
+  automaton.setPushdownStoreOperation(alphabet::symbolFrom("a"), std::vector<alphabet::Symbol>{}, std::vector<alphabet::Symbol> {});
+  automaton.setPushdownStoreOperation(alphabet::symbolFrom("b"), std::vector<alphabet::Symbol>{}, std::vector<alphabet::Symbol> {});
+
+  automaton.addState(automaton::State(1));
+  automaton.addState(automaton::State(2));
+  automaton.addState(automaton::State(3));
+  automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2));
+  automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1));
+
+  automaton.addInitialState(automaton::State(1));
+  automaton.addFinalState(automaton::State(3));
+  
+  automaton::DPDA determinized = determinize::IDPDADeterminizer::determinize(automaton);
+
+  CPPUNIT_ASSERT(determinized.getStates().size() == 3);
+}
diff --git a/alib2algo/test-src/determinize/determinizeTest.h b/alib2algo/test-src/determinize/determinizeTest.h
new file mode 100644
index 0000000000..0d2d93e80b
--- /dev/null
+++ b/alib2algo/test-src/determinize/determinizeTest.h
@@ -0,0 +1,21 @@
+#ifndef DETERMINIZE_TEST_H_
+#define DETERMINIZE_TEST_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+class determinizeTest : public CppUnit::TestFixture
+{
+  CPPUNIT_TEST_SUITE( determinizeTest );
+  CPPUNIT_TEST( testDeterminizeNFA );
+  CPPUNIT_TEST( testDeterminizeIDPDA );
+  CPPUNIT_TEST_SUITE_END();
+
+public:
+  void setUp();
+  void tearDown();
+
+  void testDeterminizeNFA();
+  void testDeterminizeIDPDA();
+};
+
+#endif  // DETERMINIZE_TEST_H_
diff --git a/alib2algo/test-src/minimize/minimizeTest.cpp b/alib2algo/test-src/minimize/minimizeTest.cpp
index 4c07b83590..7c7624514d 100644
--- a/alib2algo/test-src/minimize/minimizeTest.cpp
+++ b/alib2algo/test-src/minimize/minimizeTest.cpp
@@ -19,18 +19,18 @@ void minimizeTest::tearDown() {
 }
 
 void minimizeTest::testMinimize() {
-  automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(1))));
+  automaton::DFA automaton(automaton::State(1));
 
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(1))));
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(2))));
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(3))));
-  automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  automaton.addState(automaton::State(1));
+  automaton.addState(automaton::State(2));
+  automaton.addState(automaton::State(3));
+  automaton.addInputSymbol(alphabet::symbolFrom("a"));
+  automaton.addInputSymbol(alphabet::symbolFrom("b"));
   
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(2))));
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(2))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1))));
+  automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2));
+  automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1));
 
-  automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(3))));
+  automaton.addFinalState(automaton::State(3));
   
   automaton::DFA minimized = minimize::MinimizeDFA::minimize(automaton);
 
diff --git a/alib2algo/test-src/normalize/normalizeTest.cpp b/alib2algo/test-src/normalize/normalizeTest.cpp
index 741f8bcaf3..3d0282cd4c 100644
--- a/alib2algo/test-src/normalize/normalizeTest.cpp
+++ b/alib2algo/test-src/normalize/normalizeTest.cpp
@@ -19,18 +19,18 @@ void normalizeTest::tearDown() {
 }
 
 void normalizeTest::testNormalize() {
-  automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(0))));
+  automaton::DFA automaton(automaton::State(0));
 
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(0))));
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(1))));
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(2))));
-  automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  automaton.addState(automaton::State(0));
+  automaton.addState(automaton::State(1));
+  automaton.addState(automaton::State(2));
+  automaton.addInputSymbol(alphabet::symbolFrom("a"));
+  automaton.addInputSymbol(alphabet::symbolFrom("b"));
   
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(0))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(1))));
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(2))));
+  automaton.addTransition(automaton::State(0), alphabet::symbolFrom("a"), automaton::State(1));
+  automaton.addTransition(automaton::State(1), alphabet::symbolFrom("b"), automaton::State(2));
 
-  automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(2))));
+  automaton.addFinalState(automaton::State(2));
   
   automaton::DFA normalized = normalize::NormalizeDFA::normalize(automaton);
 
diff --git a/alib2algo/test-src/trim/trimTest.cpp b/alib2algo/test-src/trim/trimTest.cpp
index e416d5ea5c..dc256e5427 100644
--- a/alib2algo/test-src/trim/trimTest.cpp
+++ b/alib2algo/test-src/trim/trimTest.cpp
@@ -23,19 +23,19 @@ void trimTest::tearDown() {
 }
 
 void trimTest::testTrimAutomaton() {
-  automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(1))));
+  automaton::DFA automaton(automaton::State(1));
 
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(1))));
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(2))));
-  automaton.addState(automaton::State(label::Label(label::IntegerLabel(3))));
-  automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  automaton.addState(automaton::State(1));
+  automaton.addState(automaton::State(2));
+  automaton.addState(automaton::State(3));
+  automaton.addInputSymbol(alphabet::symbolFrom("a"));
+  automaton.addInputSymbol(alphabet::symbolFrom("b"));
   
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(2))));
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(2))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1))));
-  automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(3))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1))));
+  automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2));
+  automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1));
+  automaton.addTransition(automaton::State(3), alphabet::symbolFrom("b"), automaton::State(1));
 
-  automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(1))));
+  automaton.addFinalState(automaton::State(1));
   
   automaton::DFA trimed = trim::TrimFSM::trim(automaton);
 
@@ -43,25 +43,25 @@ void trimTest::testTrimAutomaton() {
 }
 
 void trimTest::testTrimGrammar() {
-  grammar::RightRG rrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
-
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))));
-  rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6)))));
-  rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
+  grammar::RightRG rrGrammar(alphabet::symbolFrom(1));
+
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(1));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(2));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(3));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(4));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(5));
+  rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(6));
+  rrGrammar.addTerminalSymbol(alphabet::symbolFrom("a"));
+  rrGrammar.addTerminalSymbol(alphabet::symbolFrom("b"));
   
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5))))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))));
-  rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6))))));
+  rrGrammar.addRule(alphabet::symbolFrom(1), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(2)));
+  rrGrammar.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3)));
+  rrGrammar.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a"));
+
+  rrGrammar.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(5)));
+  rrGrammar.addRule(alphabet::symbolFrom(5), alphabet::symbolFrom("a"));
+  rrGrammar.addRule(alphabet::symbolFrom(5), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(2)));
+  rrGrammar.addRule(alphabet::symbolFrom(6), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(6)));
 
   grammar::RightRG trimed = trim::TrimCFG::trim(rrGrammar);
 
-- 
GitLab