@ -27,25 +27,19 @@ namespace storm {
} ;
/*
* Identifies end components and substitutes them by a single state .
* Substitutes the given end components by a single state .
*
* Only states in the given subsystem are kept . Transitions leading to a state outside of the subsystem will be
* removed ( but the corresponding row is kept , possibly yielding empty rows ) .
* The ECs are then identified on the subsystem .
*
* Only ECs for which possibleECRows is true for all choices are considered .
* Furthermore , the rows that contain a transition leading outside of the subsystem are not considered for an EC .
* Only states in the given subsystem are kept . Transitions leading to a state outside of the subsystem will be
* removed ( but the corresponding row is kept , possibly yielding empty rows ) .
* The given ECs all have to lie within the provided subsystem .
*
* For each such EC ( that is not contained in another EC ) , we add a new state and redirect all incoming and outgoing
* transitions of the EC to ( and from ) this state .
* If addSinkRowStates is true for at least one state of an eliminated EC , a row is added to the new state ( representing the choice to stay at the EC forever ) .
* If addSelfLoopAtSinkStates is true , such rows get a selfloop ( with value 1 ) . Otherwise , the row remains empty .
*/
static EndComponentEliminatorReturnType transform ( storm : : storage : : SparseMatrix < ValueType > const & originalMatrix , storm : : storage : : BitVector const & subsystemStates , storm : : storage : : BitVector const & possibleECRows , storm : : storage : : BitVector const & addSinkRowStates , bool addSelfLoopAtSinkStates = false ) {
STORM_LOG_DEBUG ( " Invoked EndComponentEliminator on matrix with " < < originalMatrix . getRowGroupCount ( ) < < " row groups and " < < subsystemStates . getNumberOfSetBits ( ) < < " subsystem states. " ) ;
storm : : storage : : MaximalEndComponentDecomposition < ValueType > ecs = computeECs ( originalMatrix , possibleECRows , subsystemStates ) ;
static EndComponentEliminatorReturnType transform ( storm : : storage : : SparseMatrix < ValueType > const & originalMatrix , storm : : storage : : MaximalEndComponentDecomposition < ValueType > ecs , storm : : storage : : BitVector const & subsystemStates , storm : : storage : : BitVector const & addSinkRowStates , bool addSelfLoopAtSinkStates = false ) {
/ / further shrink the set of kept states by removing all states that are part of an EC
storm : : storage : : BitVector keptStates = subsystemStates ;
for ( auto const & ec : ecs ) {
@ -93,8 +87,30 @@ namespace storm {
return result ;
}
private :
/*
* Identifies end components and substitutes them by a single state .
*
* Only states in the given subsystem are kept . Transitions leading to a state outside of the subsystem will be
* removed ( but the corresponding row is kept , possibly yielding empty rows ) .
* The ECs are then identified on the subsystem .
*
* Only ECs for which possibleECRows is true for all choices are considered .
* Furthermore , the rows that contain a transition leading outside of the subsystem are not considered for an EC .
*
* For each such EC ( that is not contained in another EC ) , we add a new state and redirect all incoming and outgoing
* transitions of the EC to ( and from ) this state .
* If addSinkRowStates is true for at least one state of an eliminated EC , a row is added to the new state ( representing the choice to stay at the EC forever ) .
* If addSelfLoopAtSinkStates is true , such rows get a selfloop ( with value 1 ) . Otherwise , the row remains empty .
*/
static EndComponentEliminatorReturnType transform ( storm : : storage : : SparseMatrix < ValueType > const & originalMatrix , storm : : storage : : BitVector const & subsystemStates , storm : : storage : : BitVector const & possibleECRows , storm : : storage : : BitVector const & addSinkRowStates , bool addSelfLoopAtSinkStates = false ) {
STORM_LOG_DEBUG ( " Invoked EndComponentEliminator on matrix with " < < originalMatrix . getRowGroupCount ( ) < < " row groups and " < < subsystemStates . getNumberOfSetBits ( ) < < " subsystem states. " ) ;
/ / storm : : storage : : MaximalEndComponentDecomposition < ValueType > ecs = computeECs ( originalMatrix , possibleECRows , subsystemStates ) ;
storm : : storage : : MaximalEndComponentDecomposition < ValueType > ecs ( originalMatrix , originalMatrix . transpose ( true ) , subsystemStates , possibleECRows ) ;
return transform ( originalMatrix , ecs , subsystemStates , addSinkRowStates , addSelfLoopAtSinkStates ) ;
}
private :
static storm : : storage : : MaximalEndComponentDecomposition < ValueType > computeECs ( storm : : storage : : SparseMatrix < ValueType > const & originalMatrix , storm : : storage : : BitVector const & possibleECRows , storm : : storage : : BitVector const & subsystemStates ) {
/ / Get an auxiliary matrix to identify the correct end components w . r . t . the possible EC rows and the subsystem .
/ / This is done by redirecting choices that can never be part of an EC to a sink state .