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