diff --git a/alib2algo/src/automaton/simplify/Minimize.cpp b/alib2algo/src/automaton/simplify/Minimize.cpp index 8a76dd7d2ae74e575866ce8b536ff2e05ce0daa3..3ae99c5fddb80b1b5f4b670321d48d529204f2ef 100644 --- a/alib2algo/src/automaton/simplify/Minimize.cpp +++ b/alib2algo/src/automaton/simplify/Minimize.cpp @@ -51,11 +51,14 @@ automaton::DFA Minimize::minimize(const automaton::DFA& dfa) { std::map<automaton::State, automaton::State> toEquvivalentStates2; std::map<std::pair<automaton::State, std::set<std::pair<alphabet::Symbol, automaton::State> > >, std::set<automaton::State> > minimizedTransitionFunction2; + const automaton::State *firstFinal = NULL, *firstNonfinal = NULL; for(auto iter = dfa.getStates().begin(); iter != dfa.getStates().end(); iter++) { if(dfa.getFinalStates().count(*iter) == 0) { // not a final state - toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter, automaton::State(0))); + if(!firstNonfinal) firstNonfinal = &(*iter); + toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter, *firstNonfinal)); } else { - toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter, automaton::State(1))); + if(!firstFinal) firstFinal = &(*iter); + toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter, *firstFinal)); } } @@ -92,7 +95,8 @@ automaton::DFA Minimize::minimize(const automaton::DFA& dfa) { int number = 0; for(auto iter = minimizedTransitionFunction1.begin(); iter != minimizedTransitionFunction1.end(); iter++) { for(auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++) { - toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter2, automaton::State(number))); + //toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter2, automaton::State(number))); + toEquvivalentStates2.insert(std::pair<automaton::State, automaton::State>(*iter2, *(iter->second.begin()))); } number++; } diff --git a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp index 7c643022de5d64c82663cea5f099a1d9e352582c..6adf98cc4468b5dcc2d1c0673dd712024ac7974e 100644 --- a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp +++ b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp @@ -40,8 +40,8 @@ void re2faTest::testThompson() { automaton::Automaton dfa1 = automaton::determinize::Determinize::determinize(nfa1); automaton::Automaton dfa2 = automaton::determinize::Determinize::determinize(nfa2); - automaton::Automaton mdfa1 = automaton::simplify::Minimize::minimize(dfa1); - automaton::Automaton mdfa2 = automaton::simplify::Minimize::minimize(dfa2); + automaton::Automaton mdfa1 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa1)); + automaton::Automaton mdfa2 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa2)); CPPUNIT_ASSERT( mdfa1 == mdfa2); }