@ -122,6 +122,62 @@ namespace storm {
return this - > transitionMatrix . end ( nondeterministicChoiceIndices [ state + 1 ] - 1 ) ;
}
/*!
* Retrieves the backward transition relation of the model , i . e . a set of transitions
* between states that correspond to the reversed transition relation of this model .
* Note : This overwrites the getBackwardsTransitions of the AbstractModel , since the simple
* transposition of the state matrix does not yield correct results for non - deterministic models .
*
* @ return A sparse matrix that represents the backward transitions of this model .
*/
storm : : storage : : SparseMatrix < T > getBackwardTransitions ( ) const {
uint_fast64_t numberOfStates = this - > getNumberOfStates ( ) ;
uint_fast64_t numberOfTransitions = this - > getNumberOfTransitions ( ) ;
std : : vector < uint_fast64_t > rowIndications ( numberOfStates + 1 ) ;
std : : vector < uint_fast64_t > columnIndications ( numberOfTransitions ) ;
std : : vector < T > values ( numberOfTransitions , T ( ) ) ;
/ / First , we need to count how many backward transitions each state has .
for ( uint_fast64_t i = 0 ; i < numberOfStates ; + + i ) {
typename storm : : storage : : SparseMatrix < T > : : Rows rows = this - > getRows ( i ) ;
for ( auto const & transition : rows ) {
if ( transition . value ( ) > 0 ) {
+ + rowIndications [ transition . column ( ) + 1 ] ;
}
}
}
/ / Now compute the accumulated offsets .
for ( uint_fast64_t i = 1 ; i < numberOfStates + 1 ; + + i ) {
rowIndications [ i ] = rowIndications [ i - 1 ] + rowIndications [ i ] ;
}
/ / Create an array that stores the next index for each state . Initially
/ / this corresponds to the previously computed accumulated offsets .
std : : vector < uint_fast64_t > nextIndices = rowIndications ;
/ / Now we are ready to actually fill in the list of predecessors for
/ / every state . Again , we start by considering all but the last row .
for ( uint_fast64_t i = 0 ; i < numberOfStates ; + + i ) {
typename storm : : storage : : SparseMatrix < T > : : Rows rows = this - > getRows ( i ) ;
for ( auto & transition : rows ) {
if ( transition . value ( ) > 0 ) {
values [ nextIndices [ transition . column ( ) ] ] = transition . value ( ) ;
columnIndications [ nextIndices [ transition . column ( ) ] + + ] = i ;
}
}
}
storm : : storage : : SparseMatrix < T > backwardTransitionMatrix ( numberOfStates , numberOfStates ,
numberOfTransitions ,
std : : move ( rowIndications ) ,
std : : move ( columnIndications ) ,
std : : move ( values ) ) ;
return backwardTransitionMatrix ;
}
/*!
* Calculates a hash over all values contained in this Model .
* @ return size_t A Hash Value