Skip to content
Snippets Groups Projects
Commit 57fa05dc authored by Tomáš Pecka's avatar Tomáš Pecka
Browse files

Minimize: Label groups by lexicographically smallest state label

parent 15892f06
No related branches found
No related tags found
1 merge request!13Verbose minim
...@@ -51,11 +51,14 @@ automaton::DFA Minimize::minimize(const automaton::DFA& dfa) { ...@@ -51,11 +51,14 @@ automaton::DFA Minimize::minimize(const automaton::DFA& dfa) {
std::map<automaton::State, automaton::State> toEquvivalentStates2; 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; 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++) { for(auto iter = dfa.getStates().begin(); iter != dfa.getStates().end(); iter++) {
if(dfa.getFinalStates().count(*iter) == 0) { // not a final state 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 { } 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) { ...@@ -92,7 +95,8 @@ automaton::DFA Minimize::minimize(const automaton::DFA& dfa) {
int number = 0; int number = 0;
for(auto iter = minimizedTransitionFunction1.begin(); iter != minimizedTransitionFunction1.end(); iter++) { for(auto iter = minimizedTransitionFunction1.begin(); iter != minimizedTransitionFunction1.end(); iter++) {
for(auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++) { 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++; number++;
} }
......
...@@ -40,8 +40,8 @@ void re2faTest::testThompson() { ...@@ -40,8 +40,8 @@ void re2faTest::testThompson() {
automaton::Automaton dfa1 = automaton::determinize::Determinize::determinize(nfa1); automaton::Automaton dfa1 = automaton::determinize::Determinize::determinize(nfa1);
automaton::Automaton dfa2 = automaton::determinize::Determinize::determinize(nfa2); automaton::Automaton dfa2 = automaton::determinize::Determinize::determinize(nfa2);
   
automaton::Automaton mdfa1 = automaton::simplify::Minimize::minimize(dfa1); automaton::Automaton mdfa1 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa1));
automaton::Automaton mdfa2 = automaton::simplify::Minimize::minimize(dfa2); automaton::Automaton mdfa2 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa2));
   
CPPUNIT_ASSERT( mdfa1 == mdfa2); CPPUNIT_ASSERT( mdfa1 == mdfa2);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment