|
|
@ -310,8 +310,46 @@ namespace storm { |
|
|
|
} |
|
|
|
|
|
|
|
template <typename T> |
|
|
|
storm::storage::PartialScheduler computeSchedulerProbGreater0E(storm::storage::BitVector const& probGreater0EStates, storm::storage::SparseMatrix<T> const& transitionMatrix) { |
|
|
|
return computeSchedulerWithOneSuccessorInStates(probGreater0EStates, transitionMatrix); |
|
|
|
storm::storage::PartialScheduler computeSchedulerProbGreater0E(storm::storage::SparseMatrix<T> const& transitionMatrix, storm::storage::SparseMatrix<T> const& backwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, boost::optional<storm::storage::BitVector> const& rowFilter) { |
|
|
|
//Perform backwards DFS from psiStates and find a valid choice for each visited state.
|
|
|
|
|
|
|
|
storm::storage::PartialScheduler result; |
|
|
|
std::vector<uint_fast64_t> stack; |
|
|
|
storm::storage::BitVector currentStates(psiStates); //the states that are either psiStates or for which we have found a valid choice.
|
|
|
|
stack.insert(stack.end(), currentStates.begin(), currentStates.end()); |
|
|
|
uint_fast64_t currentState = 0; |
|
|
|
|
|
|
|
while (!stack.empty()) { |
|
|
|
currentState = stack.back(); |
|
|
|
stack.pop_back(); |
|
|
|
|
|
|
|
for (typename storm::storage::SparseMatrix<T>::const_iterator predecessorEntryIt = backwardTransitions.begin(currentState), predecessorEntryIte = backwardTransitions.end(currentState); predecessorEntryIt != predecessorEntryIte; ++predecessorEntryIt) { |
|
|
|
uint_fast64_t const& predecessor = predecessorEntryIt->getColumn(); |
|
|
|
if (phiStates.get(predecessor) && !currentStates.get(predecessor)) { |
|
|
|
//The predecessor is a probGreater0E state that has not been considered yet. Let's find the right choice that leads to a state in currentStates.
|
|
|
|
bool foundValidChoice = false; |
|
|
|
for (uint_fast64_t row = transitionMatrix.getRowGroupIndices()[predecessor]; row < transitionMatrix.getRowGroupIndices()[predecessor + 1]; ++row) { |
|
|
|
if(rowFilter && !rowFilter->get(row)){ |
|
|
|
continue; |
|
|
|
} |
|
|
|
for (typename storm::storage::SparseMatrix<T>::const_iterator successorEntryIt = transitionMatrix.begin(row), successorEntryIte = transitionMatrix.end(row); successorEntryIt != successorEntryIte; ++successorEntryIt) { |
|
|
|
if(currentStates.get(successorEntryIt->getColumn())){ |
|
|
|
foundValidChoice = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if(foundValidChoice){ |
|
|
|
result.setChoice(predecessor, row - transitionMatrix.getRowGroupIndices()[predecessor]); |
|
|
|
currentStates.set(predecessor, true); |
|
|
|
stack.push_back(predecessor); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
STORM_LOG_INFO_COND(foundValidChoice, "Could not find a valid choice for ProbGreater0E state " << predecessor << "."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
template <typename T> |
|
|
@ -972,7 +1010,7 @@ namespace storm { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template storm::storage::PartialScheduler computeSchedulerProbGreater0E(storm::storage::BitVector const& probGreater0EStates, storm::storage::SparseMatrix<double> const& transitionMatrix); |
|
|
|
template storm::storage::PartialScheduler computeSchedulerProbGreater0E(storm::storage::SparseMatrix<double> const& transitionMatrix, storm::storage::SparseMatrix<double> const& backwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, boost::optional<storm::storage::BitVector> const& rowFilter); |
|
|
|
|
|
|
|
template storm::storage::PartialScheduler computeSchedulerProb0E(storm::storage::BitVector const& prob0EStates, storm::storage::SparseMatrix<double> const& transitionMatrix); |
|
|
|
|
|
|
|