From 13eca826af729b2dcccec9bcefba24a912228601 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 16 Sep 2019 17:43:54 +0200
Subject: [PATCH] simplify distinguishable states computation for DFTA

---
 .../src/automaton/properties/DistinguishableStates.h  | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/alib2algo/src/automaton/properties/DistinguishableStates.h b/alib2algo/src/automaton/properties/DistinguishableStates.h
index 3a4237e456..0de068158c 100644
--- a/alib2algo/src/automaton/properties/DistinguishableStates.h
+++ b/alib2algo/src/automaton/properties/DistinguishableStates.h
@@ -110,8 +110,9 @@ template < class SymbolType, class StateType >
 ext::set < ext::pair < StateType, StateType > > DistinguishableStates::distinguishable ( const automaton::DFTA < SymbolType, StateType > & fta ) {
 	ext::set < ext::pair < StateType, StateType > > distinguishable = initial ( fta.getStates ( ), fta.getFinalStates ( ) );
 
+	bool changed;
 	do {
-		ext::set < ext::pair < StateType, StateType > > distinguishable2 = distinguishable;
+		changed = false;
 
 		for ( const StateType & a : fta.getStates ( ) ) {
 			for ( const StateType & b : fta.getStates ( ) ) {
@@ -126,21 +127,19 @@ ext::set < ext::pair < StateType, StateType > > DistinguishableStates::distingui
 
 							const auto & transition2 = fta.getTransitions ( ).find ( std::make_pair ( transition.first.first, std::move ( copy ) ) );
 
-							if ( transition2 == fta.getTransitions ( ).end ( ) || distinguishable2.count ( ext::make_pair ( transition.second, transition2->second ) ) ) {
+							if ( transition2 == fta.getTransitions ( ).end ( ) || distinguishable.count ( ext::make_pair ( transition.second, transition2->second ) ) ) {
 								// end up in dead state - dead state is be distinguishable from every other state OR
 								// end up in distinguishable states
 								distinguishable.insert ( ext::make_pair ( a, b ) );
 								distinguishable.insert ( ext::make_pair ( b, a ) );
+								changed = true;
 							}
 						}
 					}
 				}
 			}
 		}
-		if ( distinguishable == distinguishable2 )
-			break;
-
-	} while ( true );
+	} while ( changed );
 
 	return distinguishable;
 }
-- 
GitLab