diff --git a/alib2algo/src/automaton/properties/UndistinguishableStates.cpp b/alib2algo/src/automaton/properties/UndistinguishableStates.cpp index 125dc76b015d5ee6f2b3917abe722b744a9bb212..2e3e46156601f51e7ce3ad856eb09408dd12868a 100644 --- a/alib2algo/src/automaton/properties/UndistinguishableStates.cpp +++ b/alib2algo/src/automaton/properties/UndistinguishableStates.cpp @@ -10,16 +10,16 @@ namespace { -auto UndistinguishableStatesDFA = registration::AbstractRegister < automaton::properties::UndistinguishableStates, ext::set < ext::set < DefaultStateType > >, const automaton::DFA < > & > ( automaton::properties::UndistinguishableStates::undistinguishable, "fsm" ).setDocumentation ( +auto UndistinguishableStatesDFA = registration::AbstractRegister < automaton::properties::UndistinguishableStates, ext::set < ext::pair < DefaultStateType, DefaultStateType > >, const automaton::DFA < > & > ( automaton::properties::UndistinguishableStates::undistinguishable, "fsm" ).setDocumentation ( "Computes the partitions of undistinguishable states states in given DFA.\n\ \n\ @param dfa finite automaton.\n\ -@return set of blocks of undistinguishable states" ); +@return undistinguishable states relation" ); -auto UndistinguishableStatesDFTA = registration::AbstractRegister < automaton::properties::UndistinguishableStates, ext::set < ext::set < DefaultStateType > >, const automaton::DFTA < > & > ( automaton::properties::UndistinguishableStates::undistinguishable, "fta" ).setDocumentation ( +auto UndistinguishableStatesDFTA = registration::AbstractRegister < automaton::properties::UndistinguishableStates, ext::set < ext::pair < DefaultStateType, DefaultStateType > >, const automaton::DFTA < > & > ( automaton::properties::UndistinguishableStates::undistinguishable, "fta" ).setDocumentation ( "Computes the partitions of undistinguishable states states in given DFTA.\n\ \n\ @param dfta finite tree automaton.\n\ -@return set of blocks of undistinguishable states" ); +@return undistinguishable states relation" ); } /* namespace */ diff --git a/alib2algo/src/automaton/properties/UndistinguishableStates.h b/alib2algo/src/automaton/properties/UndistinguishableStates.h index ed6a7d682c65369656a429066675c9b05460b7ab..de9ee7ca070cbfcc80919cd26d9c32a6f5d8cd13 100644 --- a/alib2algo/src/automaton/properties/UndistinguishableStates.h +++ b/alib2algo/src/automaton/properties/UndistinguishableStates.h @@ -42,21 +42,6 @@ namespace properties { * @sa DistinguishableStates */ class UndistinguishableStates { - template < class StateType > - static ext::set < ext::set < StateType > > convertUndistinguishable ( const ext::set < ext::pair < StateType, StateType > > & undistinguishable, const ext::set < StateType > & states ) { - ext::set < ext::set < StateType > > res; - for ( const StateType & state : states ) { - ext::set < StateType > partition; - - for ( const StateType & other : states ) - if ( undistinguishable.count ( ext::make_pair ( state, other ) ) != 0 ) - partition.insert ( other ); - - res.insert ( partition ); - } - return res; - } - template < class StateType > static ext::set < ext::pair < StateType, StateType > > initial ( const ext::set < StateType > & states, const ext::set < StateType > & finals ) { ext::set < ext::pair < StateType, StateType > > init; @@ -84,7 +69,7 @@ public: * @return state partitioning of undistinguishable states */ template < class SymbolType, class StateType > - static ext::set < ext::set < StateType > > undistinguishable ( const automaton::DFA < SymbolType, StateType > & dfa ); + static ext::set < ext::pair < StateType, StateType > > undistinguishable ( const automaton::DFA < SymbolType, StateType > & dfa ); /** * Creates state partitioning of undistinguishable states- @@ -97,11 +82,11 @@ public: * @return state partitioning of undistinguishable states */ template < class SymbolType, class StateType > - static ext::set < ext::set < StateType > > undistinguishable ( const automaton::DFTA < SymbolType, StateType > & fta ); + static ext::set < ext::pair < StateType, StateType > > undistinguishable ( const automaton::DFTA < SymbolType, StateType > & fta ); }; template < class SymbolType, class StateType > -ext::set < ext::set < StateType > > UndistinguishableStates::undistinguishable ( const automaton::DFA < SymbolType, StateType > & dfa ) { +ext::set < ext::pair < StateType, StateType > > UndistinguishableStates::undistinguishable ( const automaton::DFA < SymbolType, StateType > & dfa ) { ext::set < ext::pair < StateType, StateType > > undistinguishable = initial ( dfa.getStates ( ), dfa.getFinalStates ( ) ); do { @@ -127,11 +112,11 @@ ext::set < ext::set < StateType > > UndistinguishableStates::undistinguishable ( } while ( true ); - return convertUndistinguishable ( undistinguishable, dfa.getStates ( ) ); + return undistinguishable; } template < class SymbolType, class StateType > -ext::set < ext::set < StateType > > UndistinguishableStates::undistinguishable ( const automaton::DFTA < SymbolType, StateType > & fta ) { +ext::set < ext::pair < StateType, StateType > > UndistinguishableStates::undistinguishable ( const automaton::DFTA < SymbolType, StateType > & fta ) { ext::set < ext::pair < StateType, StateType > > undistinguishable = initial ( fta.getStates ( ), fta.getFinalStates ( ) ); do { @@ -161,7 +146,7 @@ ext::set < ext::set < StateType > > UndistinguishableStates::undistinguishable ( } while ( true ); - return convertUndistinguishable ( undistinguishable, fta.getStates ( ) ); + return undistinguishable; } } /* namespace properties */ diff --git a/alib2integrationtest/test-src/tests/minimizeTest.cpp b/alib2integrationtest/test-src/tests/minimizeTest.cpp index 713ae766140b95123fd2efee8e190a9c9fc55377..836c97b43baf99aad0ee98d31302ac3474ae7b48 100644 --- a/alib2integrationtest/test-src/tests/minimizeTest.cpp +++ b/alib2integrationtest/test-src/tests/minimizeTest.cpp @@ -21,9 +21,10 @@ static const std::string qGenNFA ( ) { TEST_CASE ( "Minimization FA test", "[integration]" ) { static const std::string qDet ( "automaton::determinize::Determinize - | automaton::simplify::Trim -" ); - static const std::string qMinimizeHop ( qDet + " | " + "automaton::simplify::Minimize - | automaton::simplify::Normalize -" ); - static const std::string qMinimizeBrz ( qDet + " | " + "automaton::simplify::MinimizeBrzozowski - | automaton::simplify::Trim - | automaton::simplify::Normalize -" ); - static const std::string qMinimizeDis ( qDet + " | " + "automaton::simplify::MinimizeByPartitioning - <( $gen | " + qDet + " | automaton::properties::UndistinguishableStates - ) | automaton::simplify::Normalize -" ); + static const std::string qMinimizeHop ( qDet + " | " + "automaton::simplify::Minimize - | automaton::simplify::Normalize -" ); + static const std::string qMinimizeBrz ( qDet + " | " + "automaton::simplify::MinimizeBrzozowski - | automaton::simplify::Trim - | automaton::simplify::Normalize -" ); + static const std::string qMinimizeDis ( qDet + " | " + "automaton::simplify::MinimizeByPartitioning - <( $gen | " + qDet + " | automaton::properties::DistinguishableStates - | relation::RelationComplement - <( $gen | " + qDet + " | automaton::States::get - ) | relation::InducedEquivalence - ) | automaton::simplify::Normalize -" ); + static const std::string qMinimizeUnd ( qDet + " | " + "automaton::simplify::MinimizeByPartitioning - <( $gen | " + qDet + " | automaton::properties::UndistinguishableStates - | relation::InducedEquivalence - ) | automaton::simplify::Normalize -" ); SECTION ( "Files tests" ) { @@ -41,6 +42,12 @@ TEST_CASE ( "Minimization FA test", "[integration]" ) { "quit compare::AutomatonCompare <( $gen | " + qMinimizeHop + " )" + " <( $gen | " + qMinimizeDis + ")" }; TimeoutAqlTest ( 2s, qs ); + + qs = { + "execute < " + inputFile + " > $gen", + "quit compare::AutomatonCompare <( $gen | " + qMinimizeHop + " )" + " <( $gen | " + qMinimizeUnd + ")" + }; + TimeoutAqlTest ( 2s, qs ); } } @@ -59,6 +66,12 @@ TEST_CASE ( "Minimization FA test", "[integration]" ) { "quit compare::AutomatonCompare <( $gen | " + qMinimizeHop + " )" + " <( $gen | " + qMinimizeDis + ")" }; TimeoutAqlTest ( 2s, qs ); + + qs = { + qGenNFA ( ) + " > $gen", + "quit compare::AutomatonCompare <( $gen | " + qMinimizeHop + " )" + " <( $gen | " + qMinimizeUnd + ")" + }; + TimeoutAqlTest ( 2s, qs ); } } }