@ -665,8 +665,9 @@ namespace storm {
}
}
template < typename ValueType >
template < typename ValueType >
std : : vector < ValueType > SparseMdpPrctlHelper < ValueType > : : computeGloballyProbabilities ( Environment const & env , storm : : solver : : SolveGoal < ValueType > & & goal , storm : : storage : : SparseMatrix < ValueType > const & transitionMatrix , storm : : storage : : SparseMatrix < ValueType > const & backwardTransitions , storm : : storage : : BitVector const & psiStates , bool qualitative , bool useMecBasedTechnique ) {
MDPSparseModelCheckingHelperReturnType < ValueType > SparseMdpPrctlHelper < ValueType > : : computeGloballyProbabilities ( Environment const & env , storm : : solver : : SolveGoal < ValueType > & & goal , storm : : storage : : SparseMatrix < ValueType > const & transitionMatrix , storm : : storage : : SparseMatrix < ValueType > const & backwardTransitions , storm : : storage : : BitVector const & psiStates , bool qualitative , bool produceScheduler , bool useMecBasedTechnique ) {
if ( useMecBasedTechnique ) {
if ( useMecBasedTechnique ) {
// TODO: does this really work for minimizing objectives?
storm : : storage : : MaximalEndComponentDecomposition < ValueType > mecDecomposition ( transitionMatrix , backwardTransitions , psiStates ) ;
storm : : storage : : MaximalEndComponentDecomposition < ValueType > mecDecomposition ( transitionMatrix , backwardTransitions , psiStates ) ;
storm : : storage : : BitVector statesInPsiMecs ( transitionMatrix . getRowGroupCount ( ) ) ;
storm : : storage : : BitVector statesInPsiMecs ( transitionMatrix . getRowGroupCount ( ) ) ;
for ( auto const & mec : mecDecomposition ) {
for ( auto const & mec : mecDecomposition ) {
@ -675,14 +676,14 @@ namespace storm {
}
}
}
}
return std : : move ( computeUntilProbabilities ( env , std : : move ( goal ) , transitionMatrix , backwardTransitions , psiStates , statesInPsiMecs , qualitative , false ) . values ) ;
return computeUntilProbabilities ( env , std : : move ( goal ) , transitionMatrix , backwardTransitions , psiStates , statesInPsiMecs , qualitative , produceScheduler ) ;
} else {
} else {
goal . oneMinus ( ) ;
goal . oneMinus ( ) ;
std : : vector < ValueType > result = computeUntilProbabilities ( env , std : : move ( goal ) , transitionMatrix , backwardTransitions , storm : : storage : : BitVector ( transitionMatrix . getRowGroupCount ( ) , true ) , ~ psiStates , qualitative , false ) . values ;
for ( auto & element : result ) {
auto result = computeUntilProbabilities ( env , std : : move ( goal ) , transitionMatrix , backwardTransitions , storm : : storage : : BitVector ( transitionMatrix . getRowGroupCount ( ) , true ) , ~ psiStates , qualitative , produceScheduler ) ;
for ( auto & element : result . values ) {
element = storm : : utility : : one < ValueType > ( ) - element ;
element = storm : : utility : : one < ValueType > ( ) - element ;
}
}
return std : : move ( result ) ; // move() required by, e.g., clang 3.8
return result ;
}
}
}
}