|
@ -2,6 +2,7 @@ |
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
|
|
|
|
#include "src/storage/parameters.h"
|
|
|
#include "src/storage/StronglyConnectedComponentDecomposition.h"
|
|
|
#include "src/storage/StronglyConnectedComponentDecomposition.h"
|
|
|
#include "src/utility/graph.h"
|
|
|
#include "src/utility/graph.h"
|
|
|
#include "src/utility/vector.h"
|
|
|
#include "src/utility/vector.h"
|
|
@ -26,7 +27,7 @@ namespace storm { |
|
|
|
|
|
|
|
|
// If the initial state is known to have either probability 0 or 1, we can directly return the result.
|
|
|
// If the initial state is known to have either probability 0 or 1, we can directly return the result.
|
|
|
if (!maybeStates.get(initialStateIndex)) { |
|
|
if (!maybeStates.get(initialStateIndex)) { |
|
|
return statesWithProbability0.get(initialStateIndex) ? 0 : 1; |
|
|
|
|
|
|
|
|
return statesWithProbability0.get(initialStateIndex) ? storm::utility::constantZero<ValueType>() : storm::utility::constantOne<ValueType>(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Determine the set of states that is reachable from the initial state without jumping over a target state.
|
|
|
// Determine the set of states that is reachable from the initial state without jumping over a target state.
|
|
@ -131,7 +132,7 @@ namespace storm { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Scale all entries in this row with (1 / (1 - loopProbability)).
|
|
|
// Scale all entries in this row with (1 / (1 - loopProbability)).
|
|
|
loopProbability = 1 / (1 - loopProbability); |
|
|
|
|
|
|
|
|
loopProbability = storm::utility::constantOne<ValueType>() / (storm::utility::constantOne<ValueType>() - loopProbability); |
|
|
for (auto& entry : matrix.getRow(state)) { |
|
|
for (auto& entry : matrix.getRow(state)) { |
|
|
entry.setValue(entry.getValue() * loopProbability); |
|
|
entry.setValue(entry.getValue() * loopProbability); |
|
|
} |
|
|
} |
|
@ -155,7 +156,7 @@ namespace storm { |
|
|
// Make sure we have found the probability and set it to zero.
|
|
|
// Make sure we have found the probability and set it to zero.
|
|
|
LOG_THROW(multiplyElement != predecessorForwardTransitions.end(), storm::exceptions::InvalidStateException, "No probability for successor found."); |
|
|
LOG_THROW(multiplyElement != predecessorForwardTransitions.end(), storm::exceptions::InvalidStateException, "No probability for successor found."); |
|
|
ValueType multiplyFactor = multiplyElement->getValue(); |
|
|
ValueType multiplyFactor = multiplyElement->getValue(); |
|
|
multiplyElement->setValue(0); |
|
|
|
|
|
|
|
|
multiplyElement->setValue(storm::utility::constantZero<ValueType>()); |
|
|
|
|
|
|
|
|
// At this point, we need to update the (forward) transitions of the predecessor.
|
|
|
// At this point, we need to update the (forward) transitions of the predecessor.
|
|
|
typename FlexibleSparseMatrix<ValueType>::row_type::iterator first1 = predecessorForwardTransitions.begin(); |
|
|
typename FlexibleSparseMatrix<ValueType>::row_type::iterator first1 = predecessorForwardTransitions.begin(); |
|
@ -298,7 +299,10 @@ namespace storm { |
|
|
|
|
|
|
|
|
template class FlexibleSparseMatrix<double>; |
|
|
template class FlexibleSparseMatrix<double>; |
|
|
template class SparseSccModelChecker<double>; |
|
|
template class SparseSccModelChecker<double>; |
|
|
|
|
|
|
|
|
|
|
|
#ifdef PARAMETRIC_SYSTEMS
|
|
|
|
|
|
template class FlexibleSparseMatrix<RationalFunction>; |
|
|
|
|
|
template class SparseSccModelChecker<RationalFunction>; |
|
|
|
|
|
#endif
|
|
|
} // namespace reachability
|
|
|
} // namespace reachability
|
|
|
} // namespace modelchecker
|
|
|
} // namespace modelchecker
|
|
|
} // namespace storm
|
|
|
} // namespace storm
|