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