@ -43,9 +43,9 @@ namespace storm {
std : : vector < uint_fast64_t > remainingSteps ;
if ( useStepBound ) {
stepStack . reserve ( numberOfStates ) ;
stepStack . insert ( stepStack . begin ( ) , target States. getNumberOfSetBits ( ) , maximalSteps ) ;
stepStack . insert ( stepStack . begin ( ) , initial States. getNumberOfSetBits ( ) , maximalSteps ) ;
remainingSteps . resize ( numberOfStates ) ;
for ( auto state : target States) {
for ( auto state : initial States) {
remainingSteps [ state ] = maximalSteps ;
}
}
@ -59,12 +59,16 @@ namespace storm {
if ( useStepBound ) {
currentStepBound = stepStack . back ( ) ;
stepStack . pop_back ( ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
for ( auto const & successor : transitionMatrix . getRowGroup ( currentState ) ) {
// Only explore the state if the transition was actually there and the successor has not yet
// been visited.
if ( successor . getValue ( ) ! = storm : : utility : : zero < T > ( ) & & ! reachableStates . get ( successor . getColumn ( ) ) & & ( ! useStepBound | | remainingSteps [ successor . getColumn ( ) ] < currentStepBound - 1 ) ) {
if ( ! storm : : utility : : isZero ( successor . getValue ( ) ) & & ! reachableStates . get ( successor . getColumn ( ) ) | | ( useStepBound & & remainingSteps [ successor . getColumn ( ) ] < currentStepBound - 1 ) ) {
// If the successor is one of the target states, we need to include it, but must not explore
// it further.
if ( targetStates . get ( successor . getColumn ( ) ) ) {
@ -72,12 +76,9 @@ namespace storm {
} else if ( constraintStates . get ( successor . getColumn ( ) ) ) {
// However, if the state is in the constrained set of states, we potentially need to follow it.
if ( useStepBound ) {
// As there is at least one more step to go, we need to push the state and the new number of steps.
remainingSteps [ successor . getColumn ( ) ] = currentStepBound - 1 ;
stepStack . push_back ( currentStepBound - 1 ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
reachableStates . set ( successor . getColumn ( ) ) ;
stack . push_back ( successor . getColumn ( ) ) ;
@ -168,20 +169,21 @@ namespace storm {
if ( useStepBound ) {
currentStepBound = stepStack . back ( ) ;
stepStack . pop_back ( ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
for ( typename storm : : storage : : SparseMatrix < T > : : const_iterator entryIt = backwardTransitions . begin ( currentState ) , entryIte = backwardTransitions . end ( currentState ) ; entryIt ! = entryIte ; + + entryIt ) {
if ( phiStates [ entryIt - > getColumn ( ) ] & & ( ! statesWithProbabilityGreater0 . get ( entryIt - > getColumn ( ) ) & & ( ! useStepBound | | remainingSteps [ entryIt - > getColumn ( ) ] < currentStepBound ) ) ) {
if ( phiStates [ entryIt - > getColumn ( ) ] & & ( ! statesWithProbabilityGreater0 . get ( entryIt - > getColumn ( ) ) | | ( useStepBound & & remainingSteps [ entryIt - > getColumn ( ) ] < currentStepBound - 1 ) ) ) {
statesWithProbabilityGreater0 . set ( entryIt - > getColumn ( ) , true ) ;
// If we don't have a bound on the number of steps to take, just add the state to the stack.
if ( useStepBound ) {
// If there is at least one more step to go, we need to push the state and the new number of steps.
// As there is at least one more step to go, we need to push the state and the new number of steps.
remainingSteps [ entryIt - > getColumn ( ) ] = currentStepBound - 1 ;
stepStack . push_back ( currentStepBound - 1 ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
stack . push_back ( entryIt - > getColumn ( ) ) ;
}
@ -458,19 +460,18 @@ namespace storm {
if ( useStepBound ) {
currentStepBound = stepStack . back ( ) ;
stepStack . pop_back ( ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
for ( typename storm : : storage : : SparseMatrix < T > : : const_iterator entryIt = backwardTransitions . begin ( currentState ) , entryIte = backwardTransitions . end ( currentState ) ; entryIt ! = entryIte ; + + entryIt ) {
if ( phiStates . get ( entryIt - > getColumn ( ) ) & & ( ! statesWithProbabilityGreater0 . get ( entryIt - > getColumn ( ) ) & & ( ! useStepBound | | remainingSteps [ entryIt - > getColumn ( ) ] < currentStepBound ) ) ) {
if ( phiStates . get ( entryIt - > getColumn ( ) ) & & ( ! statesWithProbabilityGreater0 . get ( entryIt - > getColumn ( ) ) | | ( useStepBound & & remainingSteps [ entryIt - > getColumn ( ) ] < currentStepBound - 1 ) ) ) {
// If we don't have a bound on the number of steps to take, just add the state to the stack.
if ( useStepBound ) {
// If there is at least one more step to go, we need to push the state and the new number of steps.
remainingSteps [ entryIt - > getColumn ( ) ] = currentStepBound - 1 ;
stepStack . push_back ( currentStepBound - 1 ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
statesWithProbabilityGreater0 . set ( entryIt - > getColumn ( ) , true ) ;
stack . push_back ( entryIt - > getColumn ( ) ) ;
@ -602,41 +603,49 @@ namespace storm {
if ( useStepBound ) {
currentStepBound = stepStack . back ( ) ;
stepStack . pop_back ( ) ;
if ( currentStepBound = = 0 ) {
continue ;
}
}
for ( typename storm : : storage : : SparseMatrix < T > : : const_iterator predecessorEntryIt = backwardTransitions . begin ( currentState ) , predecessorEntryIte = backwardTransitions . end ( currentState ) ; predecessorEntryIt ! = predecessorEntryIte ; + + predecessorEntryIt ) {
if ( phiStates . get ( predecessorEntryIt - > getColumn ( ) ) & & ( ! statesWithProbabilityGreater0 . get ( predecessorEntryIt - > getColumn ( ) ) & & ( ! useStepBound | | remainingSteps [ predecessorEntryIt - > getColumn ( ) ] < currentStepBound ) ) ) {
// Check whether the predecessor has at least one successor in the current state set for every
// nondeterministic choice.
bool addToStatesWithProbabilityGreater0 = true ;
for ( uint_fast64_t row = nondeterministicChoiceIndices [ predecessorEntryIt - > getColumn ( ) ] ; row < nondeterministicChoiceIndices [ predecessorEntryIt - > getColumn ( ) + 1 ] ; + + row ) {
bool hasAtLeastOneSuccessorWithProbabilityGreater0 = false ;
for ( typename storm : : storage : : SparseMatrix < T > : : const_iterator successorEntryIt = transitionMatrix . begin ( row ) , successorEntryIte = transitionMatrix . end ( row ) ; successorEntryIt ! = successorEntryIte ; + + successorEntryIt ) {
if ( statesWithProbabilityGreater0 . get ( successorEntryIt - > getColumn ( ) ) ) {
hasAtLeastOneSuccessorWithProbabilityGreater0 = true ;
if ( phiStates . get ( predecessorEntryIt - > getColumn ( ) ) ) {
if ( ! statesWithProbabilityGreater0 . get ( predecessorEntryIt - > getColumn ( ) ) ) {
// Check whether the predecessor has at least one successor in the current state set for every
// nondeterministic choice.
bool addToStatesWithProbabilityGreater0 = true ;
for ( uint_fast64_t row = nondeterministicChoiceIndices [ predecessorEntryIt - > getColumn ( ) ] ; row < nondeterministicChoiceIndices [ predecessorEntryIt - > getColumn ( ) + 1 ] ; + + row ) {
bool hasAtLeastOneSuccessorWithProbabilityGreater0 = false ;
for ( typename storm : : storage : : SparseMatrix < T > : : const_iterator successorEntryIt = transitionMatrix . begin ( row ) , successorEntryIte = transitionMatrix . end ( row ) ; successorEntryIt ! = successorEntryIte ; + + successorEntryIt ) {
if ( statesWithProbabilityGreater0 . get ( successorEntryIt - > getColumn ( ) ) ) {
hasAtLeastOneSuccessorWithProbabilityGreater0 = true ;
break ;
}
}
if ( ! hasAtLeastOneSuccessorWithProbabilityGreater0 ) {
addToStatesWithProbabilityGreater0 = false ;
break ;
}
}
if ( ! hasAtLeastOneSuccessorWithProbabilityGreater0 ) {
addToStatesWithProbabilityGreater0 = false ;
break ;
}
}
// If we need to add the state, then actually add it and perform further search from the state.
if ( addToStatesWithProbabilityGreater0 ) {
// If we don't have a bound on the number of steps to take, just add the state to the stack.
if ( useStepBound ) {
// If there is at least one more step to go, we need to push the state and the new number of steps.
remainingSteps [ predecessorEntryIt - > getColumn ( ) ] = currentStepBound - 1 ;
stepStack . push_back ( currentStepBound - 1 ) ;
if ( currentStepBound = = 0 ) {
continue ;
// If we need to add the state, then actually add it and perform further search from the state.
if ( addToStatesWithProbabilityGreater0 ) {
// If we don't have a bound on the number of steps to take, just add the state to the stack.
if ( useStepBound ) {
// If there is at least one more step to go, we need to push the state and the new number of steps.
remainingSteps [ predecessorEntryIt - > getColumn ( ) ] = currentStepBound - 1 ;
stepStack . push_back ( currentStepBound - 1 ) ;
}
statesWithProbabilityGreater0 . set ( predecessorEntryIt - > getColumn ( ) , true ) ;
stack . push_back ( predecessorEntryIt - > getColumn ( ) ) ;
}
statesWithProbabilityGreater0 . set ( predecessorEntryIt - > getColumn ( ) , true ) ;
} else if ( useStepBound & & remainingSteps [ predecessorEntryIt - > getColumn ( ) ] < currentStepBound - 1 ) {
// We have found a shorter path to the predecessor. Hence, we need to explore it again
remainingSteps [ predecessorEntryIt - > getColumn ( ) ] = currentStepBound - 1 ;
stepStack . push_back ( currentStepBound - 1 ) ;
stack . push_back ( predecessorEntryIt - > getColumn ( ) ) ;
}
}