From 940a3ade0cdeda071132932e6dd1e85c536a6e93 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 24 Mar 2017 09:08:25 +0100
Subject: [PATCH] make automaton determinize use set

---
 .../src/automaton/determinize/Determinize.cpp |   6 +-
 .../src/automaton/determinize/Determinize.h   |  11 +-
 .../determinize/DeterminizeNFAPart.cxx        | 127 ------------------
 .../determinize/DeterminizeNFAPart.hxx        | 118 ++++++++++++++++
 .../automaton/simplify/MinimizeBrzozowski.cpp |   4 +-
 .../automaton/simplify/MinimizeBrzozowski.h   |   8 +-
 .../stringology/exact/ExactFactorAutomaton.h  |   1 +
 .../automaton/determinize/determinizeTest.cpp |   2 +-
 .../simplify/FSMSingleInitialStateTest.cpp    |   4 +-
 .../simplify/minimizeBrzozowskiTest.cpp       |   4 +-
 alib2algo/test-src/playTest.cpp               |   2 +-
 .../test-src/regexp/toAutomaton/re2faTest.cpp |   4 +-
 .../src/stringology/exact/SuffixAutomaton.cpp |   8 +-
 .../src/stringology/exact/SuffixAutomaton.h   |   2 +-
 14 files changed, 152 insertions(+), 149 deletions(-)
 delete mode 100644 alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx
 create mode 100644 alib2algo/src/automaton/determinize/DeterminizeNFAPart.hxx

diff --git a/alib2algo/src/automaton/determinize/Determinize.cpp b/alib2algo/src/automaton/determinize/Determinize.cpp
index 8bb13e5482..cf64deb03e 100644
--- a/alib2algo/src/automaton/determinize/Determinize.cpp
+++ b/alib2algo/src/automaton/determinize/Determinize.cpp
@@ -87,11 +87,15 @@ DFTA < > Determinize::determinize(const automaton::DFTA < > & automaton) {
 
 auto DeterminizeDFTA = Determinize::RegistratorWrapper<automaton::DFTA < >, automaton::DFTA < > >(Determinize::determinize);
 
+
+
+auto DeterminizeMultiInitialStateNFA = Determinize::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( Determinize::determinize );
+auto DeterminizeNFA = Determinize::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > >, automaton::NFA < > > ( Determinize::determinize );
+
 } /* namespace determinize */
 
 } /* namespace automaton */
 
-#include "DeterminizeNFAPart.cxx"
 #include "DeterminizeIDPDAPart.cxx"
 #include "DeterminizeVPAPart.cxx"
 #include "DeterminizeRHDPDAPart.cxx"
diff --git a/alib2algo/src/automaton/determinize/Determinize.h b/alib2algo/src/automaton/determinize/Determinize.h
index 9d7b245e5c..2ab923d633 100644
--- a/alib2algo/src/automaton/determinize/Determinize.h
+++ b/alib2algo/src/automaton/determinize/Determinize.h
@@ -32,8 +32,13 @@ public:
 	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::MultiInitialStateNFA < > & nfa);
+
+	template < class SymbolType, class StateType >
+	static automaton::DFA < SymbolType, std::set < StateType > > determinize(const automaton::NFA < SymbolType, StateType > & nfa);
+
+	template < class SymbolType, class StateType >
+	static automaton::DFA < SymbolType, std::set < StateType > > determinize(const automaton::MultiInitialStateNFA < SymbolType, StateType > & 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);
@@ -53,4 +58,6 @@ public:
 
 } /* namespace automaton */
 
+#include "DeterminizeNFAPart.hxx"
+
 #endif /* DETERMINIZE_H_ */
diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx
deleted file mode 100644
index 38915d863f..0000000000
--- a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * NFADeterminizer.cpp
- *
- *  Created on: 16. 1. 2014
- *	  Author: Jan Vesely
- */
-
-#include "common/NFACommon.h"
-
-#include <automaton/FSM/NFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <deque>
-#include <algorithm>
-
-namespace automaton {
-
-namespace determinize {
-
-automaton::DFA<> Determinize::determinize ( const automaton::MultiInitialStateNFA < > & nfa ) {
-	 // 1, 4
-	DefaultStateType initialState ( createDFAState ( nfa.getInitialStates ( ) ) );
-	automaton::DFA < > res ( initialState );
-
-	res.setInputAlphabet ( nfa.getInputAlphabet ( ) );
-
-	 // 2
-	std::deque < DefaultStateType > todo;
-	todo.push_back ( std::move ( initialState ) );
-
-	do {
-		 // 3a, c
-		DefaultStateType state = std::move ( todo.front ( ) );
-		todo.pop_front ( );
-
-		 // 3b
-		for ( const DefaultSymbolType & input : nfa.getInputAlphabet ( ) ) {
-			std::set < DefaultStateType > targetNFAStates;
-
-			for ( DefaultStateType nfaState : recreateNFAStates ( state ) ) {
-				auto iter = nfa.getTransitions ( ).find ( std::make_pair ( std::move ( nfaState ), input ) );
-
-				if ( iter != nfa.getTransitions ( ).end ( ) )
-					targetNFAStates.insert ( iter->second.begin ( ), iter->second.end ( ) );
-			}
-
-			DefaultStateType dfaState = createDFAState ( std::move ( targetNFAStates ) );
-
-			 // 4
-			bool existed = !res.addState ( dfaState );
-
-			if ( !existed ) todo.push_back ( dfaState );
-
-			 // 3b
-			res.addTransition ( state, input, std::move ( dfaState ) );
-		}
-	} while ( !todo.empty ( ) );
-
-	 // 5
-	const std::set<DefaultStateType>& finalLabels = nfa.getFinalStates();
-	for ( const DefaultStateType & dfaState : res.getStates ( ) ) {
-		const std::set < DefaultStateType > & nfaStates = recreateNFAStates ( dfaState );
-
-		if(!std::excludes(finalLabels.begin(), finalLabels.end(), nfaStates.begin(), nfaStates.end()))
-			res.addFinalState ( dfaState );
-	}
-
-	return res;
-}
-
-auto DeterminizeMultiInitialStateNFA = Determinize::RegistratorWrapper < automaton::DFA<>, automaton::MultiInitialStateNFA < > > ( Determinize::determinize );
-
-automaton::DFA<> Determinize::determinize ( const automaton::NFA < > & nfa ) {
-	 // 1, 4
-	DefaultStateType initialState ( createDFAState ( { nfa.getInitialState ( ) } ) );
-	automaton::DFA < > res ( initialState );
-
-	res.setInputAlphabet ( nfa.getInputAlphabet ( ) );
-
-	 // 2
-	std::deque < DefaultStateType > todo;
-	todo.push_back ( std::move ( initialState ) );
-
-	do {
-		 // 3a, c
-		DefaultStateType state = std::move ( todo.front ( ) );
-		todo.pop_front ( );
-
-		 // 3b
-		for ( const DefaultSymbolType & input : nfa.getInputAlphabet ( ) ) {
-			std::set < DefaultStateType > targetNFAStates;
-
-			for ( DefaultStateType nfaState : recreateNFAStates ( state ) ) {
-				auto iter = nfa.getTransitions ( ).find ( std::make_pair ( std::move ( nfaState ), input ) );
-
-				if ( iter != nfa.getTransitions ( ).end ( ) )
-					targetNFAStates.insert ( iter->second.begin ( ), iter->second.end ( ) );
-			}
-
-			DefaultStateType dfaState = createDFAState ( std::move ( targetNFAStates ) );
-
-			 // 4
-			bool existed = !res.addState ( dfaState );
-
-			if ( !existed ) todo.push_back ( dfaState );
-
-			 // 3b
-			res.addTransition ( state, input, std::move ( dfaState ) );
-		}
-	} while ( !todo.empty ( ) );
-
-	 // 5
-	const std::set<DefaultStateType>& finalLabels = nfa.getFinalStates();
-	for ( const DefaultStateType & dfaState : res.getStates ( ) ) {
-		const std::set < DefaultStateType > & nfaStates = recreateNFAStates ( dfaState );
-
-		if(!std::excludes(finalLabels.begin(), finalLabels.end(), nfaStates.begin(), nfaStates.end()))
-			res.addFinalState ( dfaState );
-	}
-
-	return res;
-}
-
-auto DeterminizeNFA = Determinize::RegistratorWrapper < automaton::DFA<>, automaton::NFA < > > ( Determinize::determinize );
-
-} /* namespace determinize */
-
-} /* namespace automaton */
diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.hxx b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.hxx
new file mode 100644
index 0000000000..3947a860d5
--- /dev/null
+++ b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.hxx
@@ -0,0 +1,118 @@
+/*
+ * NFADeterminizer.cpp
+ *
+ *  Created on: 16. 1. 2014
+ *	  Author: Jan Vesely
+ */
+
+#include "common/NFACommon.h"
+
+#include <automaton/FSM/NFA.h>
+#include <automaton/FSM/MultiInitialStateNFA.h>
+#include <deque>
+#include <algorithm>
+
+#include <container/ObjectsSet.h>
+
+namespace automaton {
+
+namespace determinize {
+
+template < class SymbolType, class StateType >
+automaton::DFA < SymbolType, std::set < StateType > > Determinize::determinize ( const automaton::MultiInitialStateNFA < SymbolType, StateType > & nfa ) {
+	 // 1, 4
+	std::set < StateType > initialState = nfa.getInitialStates ( );
+	automaton::DFA < SymbolType, std::set < StateType > > res ( initialState );
+
+	res.setInputAlphabet ( nfa.getInputAlphabet ( ) );
+
+	 // 2
+	std::deque < std::set < StateType > > todo;
+	todo.push_back ( std::move ( initialState ) );
+
+	do {
+		 // 3a, c
+		std::set < StateType > state = std::move ( todo.front ( ) );
+		todo.pop_front ( );
+
+		 // 3b
+		for ( const SymbolType & input : nfa.getInputAlphabet ( ) ) {
+			std::set < StateType > dfaState;
+
+			for ( StateType nfaState : state ) {
+				auto iter = nfa.getTransitions ( ).find ( std::make_pair ( std::move ( nfaState ), input ) );
+
+				if ( iter != nfa.getTransitions ( ).end ( ) )
+					dfaState.insert ( iter->second.begin ( ), iter->second.end ( ) );
+			}
+
+			 // 4
+			bool existed = !res.addState ( dfaState );
+
+			if ( !existed ) todo.push_back ( dfaState );
+
+			 // 3b
+			res.addTransition ( state, input, std::move ( dfaState ) );
+		}
+	} while ( !todo.empty ( ) );
+
+	 // 5
+	const std::set < StateType > & finalLabels = nfa.getFinalStates();
+	for ( const std::set < StateType > & dfaState : res.getStates ( ) )
+		if ( ! std::excludes ( finalLabels.begin ( ), finalLabels.end ( ), dfaState.begin ( ), dfaState.end ( ) ) )
+			res.addFinalState ( dfaState );
+
+	return res;
+}
+
+template < class SymbolType, class StateType >
+automaton::DFA < SymbolType, std::set < StateType > > Determinize::determinize ( const automaton::NFA < SymbolType, StateType > & nfa ) {
+	 // 1, 4
+	std::set < StateType > initialState;
+	initialState.insert ( nfa.getInitialState ( ) );
+	automaton::DFA < SymbolType, std::set < StateType > > res ( initialState );
+
+	res.setInputAlphabet ( nfa.getInputAlphabet ( ) );
+
+	 // 2
+	std::deque < std::set < StateType > > todo;
+	todo.push_back ( std::move ( initialState ) );
+
+	do {
+		 // 3a, c
+		std::set < StateType > state = std::move ( todo.front ( ) );
+		todo.pop_front ( );
+
+		 // 3b
+		for ( const SymbolType & input : nfa.getInputAlphabet ( ) ) {
+			std::set < StateType > dfaState;
+
+			for ( StateType nfaState : state ) {
+				auto iter = nfa.getTransitions ( ).find ( std::make_pair ( std::move ( nfaState ), input ) );
+
+				if ( iter != nfa.getTransitions ( ).end ( ) )
+					dfaState.insert ( iter->second.begin ( ), iter->second.end ( ) );
+			}
+
+			 // 4
+			bool existed = !res.addState ( dfaState );
+
+			if ( !existed ) todo.push_back ( dfaState );
+
+			 // 3b
+			res.addTransition ( state, input, std::move ( dfaState ) );
+		}
+	} while ( !todo.empty ( ) );
+
+	 // 5
+	const std::set < StateType > & finalLabels = nfa.getFinalStates();
+	for ( const std::set < StateType > & dfaState : res.getStates ( ) )
+		if ( ! std::excludes ( finalLabels.begin ( ), finalLabels.end ( ), dfaState.begin ( ), dfaState.end ( ) ) )
+			res.addFinalState ( dfaState );
+
+	return res;
+}
+
+} /* namespace determinize */
+
+} /* namespace automaton */
diff --git a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
index b6cd150bd0..7cac064e2c 100644
--- a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
+++ b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
@@ -17,8 +17,8 @@ automaton::Automaton MinimizeBrzozowski::minimize(const automaton::Automaton& au
 	return res;
 }
 
-auto MinimizeBrzozowskiDFA = MinimizeBrzozowski::RegistratorWrapper<automaton::DFA < >, automaton::DFA < > >(MinimizeBrzozowski::minimize);
-auto MinimizeBrzozowskiNFA = MinimizeBrzozowski::RegistratorWrapper<automaton::DFA < >, automaton::NFA < > >(MinimizeBrzozowski::minimize);
+auto MinimizeBrzozowskiDFA = MinimizeBrzozowski::RegistratorWrapper<automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > >, automaton::DFA < > >(MinimizeBrzozowski::minimize);
+auto MinimizeBrzozowskiNFA = MinimizeBrzozowski::RegistratorWrapper<automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > >, automaton::NFA < > >(MinimizeBrzozowski::minimize);
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.h b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.h
index ae46ffb013..7c60ec0852 100644
--- a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.h
+++ b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.h
@@ -29,18 +29,18 @@ public:
 	static automaton::Automaton minimize(const automaton::Automaton& dfa);
 
 	template < class SymbolType, class StateType >
-	static automaton::DFA < SymbolType, StateType > minimize(const automaton::DFA < SymbolType, StateType > & dfa);
+	static automaton::DFA < SymbolType, std::set < std::set < StateType > > > minimize(const automaton::DFA < SymbolType, StateType > & dfa);
 	template < class SymbolType, class StateType >
-	static automaton::DFA < SymbolType, StateType > minimize(const automaton::NFA < SymbolType, StateType > & nfa);
+	static automaton::DFA < SymbolType, std::set < std::set < StateType > > > minimize(const automaton::NFA < SymbolType, StateType > & nfa);
 };
 
 template < class SymbolType, class StateType >
-automaton::DFA < SymbolType, StateType > MinimizeBrzozowski::minimize(const automaton::DFA < SymbolType, StateType > & dfa) {
+automaton::DFA < SymbolType, std::set < std::set < StateType > > > MinimizeBrzozowski::minimize(const automaton::DFA < SymbolType, StateType > & dfa) {
 	return automaton::determinize::Determinize::determinize(automaton::transform::Reverse::convert(automaton::determinize::Determinize::determinize(automaton::transform::Reverse::convert(dfa))));
 }
 
 template < class SymbolType, class StateType >
-automaton::DFA < SymbolType, StateType > MinimizeBrzozowski::minimize(const automaton::NFA < SymbolType, StateType > & nfa) {
+automaton::DFA < SymbolType, std::set < std::set < StateType > > > MinimizeBrzozowski::minimize(const automaton::NFA < SymbolType, StateType > & nfa) {
 	return automaton::determinize::Determinize::determinize(automaton::transform::Reverse::convert(automaton::determinize::Determinize::determinize(automaton::transform::Reverse::convert(nfa))));
 }
 
diff --git a/alib2algo/src/stringology/exact/ExactFactorAutomaton.h b/alib2algo/src/stringology/exact/ExactFactorAutomaton.h
index 26e844902b..db5c71caef 100644
--- a/alib2algo/src/stringology/exact/ExactFactorAutomaton.h
+++ b/alib2algo/src/stringology/exact/ExactFactorAutomaton.h
@@ -13,6 +13,7 @@
 #include <string/LinearString.h>
 #include <string/String.h>
 #include <core/multipleDispatch.hpp>
+#include <primitive/Unsigned.h>
 
 namespace stringology {
 
diff --git a/alib2algo/test-src/automaton/determinize/determinizeTest.cpp b/alib2algo/test-src/automaton/determinize/determinizeTest.cpp
index 67d3a88216..30ab06d2ad 100644
--- a/alib2algo/test-src/automaton/determinize/determinizeTest.cpp
+++ b/alib2algo/test-src/automaton/determinize/determinizeTest.cpp
@@ -33,7 +33,7 @@ void determinizeTest::testDeterminizeNFA() {
 
   automaton.addFinalState(DefaultStateType(3));
 
-  automaton::DFA<> determinized = automaton::determinize::Determinize::determinize(automaton);
+  automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > determinized = automaton::determinize::Determinize::determinize(automaton);
 
   CPPUNIT_ASSERT(determinized.getStates().size() == 3);
 
diff --git a/alib2algo/test-src/automaton/simplify/FSMSingleInitialStateTest.cpp b/alib2algo/test-src/automaton/simplify/FSMSingleInitialStateTest.cpp
index 9c0eef59d7..71684f7fbe 100644
--- a/alib2algo/test-src/automaton/simplify/FSMSingleInitialStateTest.cpp
+++ b/alib2algo/test-src/automaton/simplify/FSMSingleInitialStateTest.cpp
@@ -47,8 +47,8 @@ void FSMSingleInitialStateTest::testSingleInitialState() {
 	automaton3.addTransition(q1, b, q2);
 	automaton3.addTransition(q2, a, q3);
 
-	automaton::DFA<> dfa2 = automaton::simplify::Minimize::minimize(automaton::determinize::Determinize::determinize(automaton2));
-	automaton::DFA<> dfa3 = automaton::simplify::Minimize::minimize(automaton::determinize::Determinize::determinize(automaton3));
+	automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > dfa2 = automaton::simplify::Minimize::minimize(automaton::determinize::Determinize::determinize(automaton2));
+	automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > dfa3 = automaton::simplify::Minimize::minimize(automaton::determinize::Determinize::determinize(automaton3));
 
 	CPPUNIT_ASSERT(automaton::simplify::Normalize::normalize(dfa2) == automaton::simplify::Normalize::normalize(dfa3));
 }
diff --git a/alib2algo/test-src/automaton/simplify/minimizeBrzozowskiTest.cpp b/alib2algo/test-src/automaton/simplify/minimizeBrzozowskiTest.cpp
index d0ed481f4f..8f55a90264 100644
--- a/alib2algo/test-src/automaton/simplify/minimizeBrzozowskiTest.cpp
+++ b/alib2algo/test-src/automaton/simplify/minimizeBrzozowskiTest.cpp
@@ -29,8 +29,8 @@ void minimizeBrzozowskiTest::testMinimizeBrzozowski() {
 
   automaton.addFinalState(DefaultStateType(3));
   
-  automaton::DFA<> minimizedHopcroft = automaton::simplify::Minimize::minimize(automaton);
-  automaton::DFA<> minimizedBrzozowski = automaton::simplify::MinimizeBrzozowski::minimize(automaton);
+  automaton::DFA < > minimizedHopcroft = automaton::simplify::Minimize::minimize(automaton);
+  automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > > minimizedBrzozowski = automaton::simplify::MinimizeBrzozowski::minimize(automaton);
 
   CPPUNIT_ASSERT(minimizedHopcroft.getStates().size() == 3);
   CPPUNIT_ASSERT(automaton::simplify::Normalize::normalize(automaton::simplify::Trim::trim(minimizedHopcroft)) == automaton::simplify::Normalize::normalize(automaton::simplify::Trim::trim(minimizedBrzozowski)));
diff --git a/alib2algo/test-src/playTest.cpp b/alib2algo/test-src/playTest.cpp
index 0b2395adec..91f4d02ec3 100644
--- a/alib2algo/test-src/playTest.cpp
+++ b/alib2algo/test-src/playTest.cpp
@@ -39,7 +39,7 @@ automaton::DFA < DefaultSymbolType, unsigned > playTest::mDFA(const automaton::N
 {
     automaton::NFA < >  nfa = automaton::simplify::EpsilonRemoverIncoming::remove(automaton);
     nfa = automaton::simplify::Trim::trim(nfa);
-    automaton::DFA<> dfa = automaton::determinize::Determinize::determinize(nfa);
+    automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > dfa = automaton::determinize::Determinize::determinize(nfa);
     dfa = automaton::simplify::Trim::trim(dfa);
     dfa = automaton::simplify::Minimize::minimize(dfa);
     automaton::DFA < DefaultSymbolType, unsigned > dfa2 = automaton::simplify::Normalize::normalize(dfa);
diff --git a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
index 2b74ed4a24..64e7d566cd 100644
--- a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
+++ b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
@@ -59,8 +59,8 @@ void re2faTest::testGlushkov() {
 
 	automaton::NFA < > nfa2 = regexp::convert::ToAutomatonGlushkov::convert(regexp2);
 
-	automaton::DFA<> dfa1 = automaton::determinize::Determinize::determinize(nfa1);
-	automaton::DFA<> dfa2 = automaton::determinize::Determinize::determinize(nfa2);
+	automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > dfa1 = automaton::determinize::Determinize::determinize(nfa1);
+	automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > dfa2 = automaton::determinize::Determinize::determinize(nfa2);
 
 	automaton::DFA< DefaultSymbolType, unsigned > mdfa1 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa1));
 	automaton::DFA< DefaultSymbolType, unsigned > mdfa2 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa2));
diff --git a/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.cpp b/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.cpp
index 654615dba1..0a8201048e 100644
--- a/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.cpp
+++ b/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.cpp
@@ -17,7 +17,7 @@ automaton::Automaton SuffixAutomaton::naiveConstruct ( const string::String & pa
     return dispatch ( pattern.getData ( ) );
 }
 
-automaton::DFA<> SuffixAutomaton::naiveConstruct ( const string::LinearString < > & pattern ) {
+automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > SuffixAutomaton::naiveConstruct ( const string::LinearString < > & pattern ) {
     automaton::EpsilonNFA < > nfaSuffixAutomaton ( DefaultStateType ( 0 ) );
 
     nfaSuffixAutomaton.setInputAlphabet ( pattern.getAlphabet ( ) );
@@ -33,17 +33,17 @@ automaton::DFA<> SuffixAutomaton::naiveConstruct ( const string::LinearString <
 
     nfaSuffixAutomaton.addFinalState ( DefaultStateType ( i ) );
 
-    automaton::DFA<> minimalSuffixAutomaton = automaton::simplify::Minimize::minimize ( automaton::determinize::Determinize::determinize ( automaton::simplify::EpsilonRemoverIncoming::remove ( nfaSuffixAutomaton ) ) );
+    automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > minimalSuffixAutomaton = automaton::simplify::Minimize::minimize ( automaton::determinize::Determinize::determinize ( automaton::simplify::EpsilonRemoverIncoming::remove ( nfaSuffixAutomaton ) ) );
 
     // FIXME Trim? and is this even supposed to be here?
-    DefaultStateType failState = label::FailStateLabel::instance < DefaultStateType > ( );
+/*    DefaultStateType failState = label::FailStateLabel::instance < DefaultStateType > ( );
 
     auto transitionsToFailState = minimalSuffixAutomaton.getTransitionsToState ( failState );
 
     for ( const auto & transition : transitionsToFailState )
         minimalSuffixAutomaton.removeTransition ( transition.first.first, transition.first.second, transition.second );
 
-    minimalSuffixAutomaton.removeState ( failState );
+    minimalSuffixAutomaton.removeState ( failState );*/ // No it not supposed to be here
 
     return minimalSuffixAutomaton;
 }
diff --git a/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.h b/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.h
index d60001f99c..a6a9c196c6 100644
--- a/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.h
+++ b/alib2algo_experimental/src/stringology/exact/SuffixAutomaton.h
@@ -27,7 +27,7 @@ public:
      */
     static automaton::Automaton naiveConstruct ( const string::String & pattern );
 
-    static automaton::DFA<> naiveConstruct ( const string::LinearString < > & pattern );
+    static automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > > naiveConstruct ( const string::LinearString < > & pattern );
 
      /**
      * Linear time on-line construction of minimal suffix automaton for given pattern.
-- 
GitLab