|
|
@ -49,37 +49,40 @@ namespace storm { |
|
|
|
uint_fast64_t currentState = currentStateTargetStatePair.first; |
|
|
|
uint_fast64_t targetState = currentStateTargetStatePair.second; |
|
|
|
|
|
|
|
size_t analysisInformationSizeBefore = analysisInformation[currentState].size(); |
|
|
|
|
|
|
|
// Iterate over the successor states for all choices and compute new analysis information. |
|
|
|
storm::storage::VectorSet<uint_fast64_t> intersection(analysisInformation[currentState]); |
|
|
|
for (uint_fast64_t currentChoice = nondeterministicChoiceIndices[currentState]; currentChoice < nondeterministicChoiceIndices[currentState + 1]; ++currentChoice) { |
|
|
|
storm::storage::VectorSet<uint_fast64_t> tmpIntersection; |
|
|
|
storm::storage::VectorSet<uint_fast64_t> tmpUnion; |
|
|
|
bool choiceTargetsTargetState = false; |
|
|
|
|
|
|
|
for (typename storm::storage::SparseMatrix<T>::ConstIndexIterator successorIt = transitionMatrix.constColumnIteratorBegin(currentChoice), successorIte = transitionMatrix.constColumnIteratorEnd(currentChoice); successorIt != successorIte; ++successorIt) { |
|
|
|
// If we can reach the target state with this choice, we need to intersect the current |
|
|
|
// analysis information with the union of the new analysis information of the target state |
|
|
|
// and the choice labels. |
|
|
|
if (*successorIt == targetState) { |
|
|
|
choiceTargetsTargetState = true; |
|
|
|
std::set_union(analysisInformation[targetState].begin(), analysisInformation[targetState].end(), choiceLabeling[currentChoice].begin(), choiceLabeling[currentChoice].end(), std::inserter(tmpUnion, tmpUnion.end())); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// If we can reach the target state with this choice, we need to intersect the current |
|
|
|
// analysis information with the union of the new analysis information of the target state |
|
|
|
// and the choice labels. |
|
|
|
if (choiceTargetsTargetState) { |
|
|
|
std::set_intersection(intersection.begin(), intersection.end(), tmpUnion.begin(), tmpUnion.end(), std::inserter(tmpIntersection, tmpIntersection.end())); |
|
|
|
std::swap(intersection, tmpIntersection); |
|
|
|
std::set_intersection(analysisInformation[currentState].begin(), analysisInformation[currentState].end(), analysisInformation[targetState].begin(), analysisInformation[targetState].end(), std::inserter(tmpIntersection, tmpIntersection.end())); |
|
|
|
std::set_intersection(analysisInformation[currentState].begin(), analysisInformation[currentState].end(), choiceLabeling[currentChoice].begin(), choiceLabeling[currentChoice].end(), std::inserter(tmpIntersection, tmpIntersection.end())); |
|
|
|
analysisInformation[currentState] = std::move(tmpIntersection); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// If the analysis information changed, we need to update it and put all the predecessors of this |
|
|
|
// state in the worklist. |
|
|
|
if (analysisInformation[currentState].size() != intersection.size()) { |
|
|
|
analysisInformation[currentState] = std::move(intersection); |
|
|
|
|
|
|
|
if (analysisInformation[currentState].size() != analysisInformationSizeBefore) { |
|
|
|
for (typename storm::storage::SparseMatrix<T>::ConstIndexIterator predecessorIt = backwardTransitions.constColumnIteratorBegin(currentState), predecessorIte = backwardTransitions.constColumnIteratorEnd(currentState); predecessorIt != predecessorIte; ++predecessorIt) { |
|
|
|
// Only put the predecessor in the worklist if it's not already a target state. |
|
|
|
if (!psiStates.get(*predecessorIt)) { |
|
|
|
worklist.push(std::make_pair(*predecessorIt, currentState)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
worklist.pop(); |
|
|
|
} |
|
|
|