diff --git a/alib2algo/src/automaton/properties/BackwardBisimulation.h b/alib2algo/src/automaton/properties/BackwardBisimulation.h index a19650651d116a26d70d6363cb3a4dc15dc81896..9215c55e07ca2d334dff730a56c2f3a769ae04af 100644 --- a/alib2algo/src/automaton/properties/BackwardBisimulation.h +++ b/alib2algo/src/automaton/properties/BackwardBisimulation.h @@ -118,14 +118,14 @@ ext::set < ext::pair < StateType, StateType > > BackwardBisimulation::backwardBi if ( ! backwardBisimulation.contains ( ext::make_pair ( p, q ) ) ) continue; - for ( const std::pair < const ext::pair < SymbolType, StateType >, StateType > & pTransition : fta.getTransitionsToState ( p ) ) { + for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & pTransition : fta.getTransitionsToState ( p ) ) { bool exists = false; - for ( const std::pair < const ext::pair < SymbolType, StateType >, StateType > & qTransition : fta.getTransitionsToState ( q ) ) { - if ( qTransition.first.first != pTransition.first.first ) + for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & qTransition : fta.getTransitionsToState ( q ) ) { + if ( qTransition.first.second != pTransition.first.second ) continue; - if ( backwardBisimulation.contains ( ext::make_pair ( pTransition.first.second, qTransition.first.second) ) ) { + if ( backwardBisimulation.contains ( ext::make_pair ( pTransition.first.first, qTransition.first.first ) ) ) { exists = true; break; } diff --git a/alib2algo/src/automaton/properties/ForwardBisimulation.h b/alib2algo/src/automaton/properties/ForwardBisimulation.h index ccde55cef627ed4e160f0ad7e4250de78fc71685..963b37081d690080c96f2ad7383246071a17d517 100644 --- a/alib2algo/src/automaton/properties/ForwardBisimulation.h +++ b/alib2algo/src/automaton/properties/ForwardBisimulation.h @@ -119,11 +119,17 @@ ext::set < ext::pair < StateType, StateType > > ForwardBisimulation::forwardBisi if ( ! forwardBisimulation.contains ( ext::make_pair ( p, q ) ) ) continue; - for ( const std::pair < const ext::pair < SymbolType, StateType >, StateType > & transition : fta.getTransitions ( ) ) { - if ( transition.first.second == p ) { - const auto & transition2 = fta.getTransitions ( ).find ( std::make_pair ( transition.first.first, q ) ); + for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & pTransition : fta.getTransitions ( ) ) { + if ( pTransition.first.first == p ) { + bool exists = false; + for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & qTransition : fta.getTransitions ( ).equal_range ( std::make_pair ( q, pTransition.first.second ) ) ) { + if ( forwardBisimulation.contains ( ext::make_pair ( pTransition.second, qTransition.second ) ) ) { + exists = true; + break; + } + } - if ( transition2 == fta.getTransitions ( ).end ( ) || ! forwardBisimulation.contains ( ext::make_pair ( transition.second, transition2->second ) ) ) { + if ( ! exists ) { forwardBisimulation.erase ( ext::make_pair ( p, q ) ); forwardBisimulation.erase ( ext::make_pair ( q, p ) ); changed = true; @@ -155,15 +161,21 @@ ext::set < ext::pair < StateType, StateType > > ForwardBisimulation::forwardBisi if ( ! forwardBisimulation.contains ( ext::make_pair ( p, q ) ) ) continue; - for ( const std::pair < const ext::pair < common::ranked_symbol < SymbolType >, ext::vector < StateType > >, StateType > & transition : fta.getTransitions ( ) ) { - for ( size_t i = 0; i < transition.first.second.size ( ); ++ i ) { - if ( transition.first.second [ i ] == p ) { - ext::vector < StateType > copy = transition.first.second; + for ( const std::pair < const ext::pair < common::ranked_symbol < SymbolType >, ext::vector < StateType > >, StateType > & pTransition : fta.getTransitions ( ) ) { + for ( size_t i = 0; i < pTransition.first.second.size ( ); ++ i ) { + if ( pTransition.first.second [ i ] == p ) { + ext::vector < StateType > copy = pTransition.first.second; copy [ i ] = q; - const auto & transition2 = fta.getTransitions ( ).find ( std::make_pair ( transition.first.first, std::move ( copy ) ) ); + bool exists = false; + for ( const std::pair < const ext::pair < common::ranked_symbol < SymbolType >, ext::vector < StateType > >, StateType > & qTransition : fta.getTransitions ( ).equal_range ( std::make_pair ( pTransition.first.first, std::move ( copy ) ) ) ) { + if ( forwardBisimulation.contains ( ext::make_pair ( pTransition.second, qTransition.second ) ) ) { + exists = true; + break; + } + } - if ( transition2 == fta.getTransitions ( ).end ( ) || ! forwardBisimulation.contains ( ext::make_pair ( transition.second, transition2->second ) ) ) { + if ( ! exists ) { forwardBisimulation.erase ( ext::make_pair ( p, q ) ); forwardBisimulation.erase ( ext::make_pair ( q, p ) ); changed = true;