71 std::vector<ValueType> explicitExitRateVector = exitRateVector.
toVector(odd);
73 if (onlyInitialStatesRelevant) {
76 conversionWatch.
stop();
79 std::vector<ValueType> result = storm::modelchecker::helper::SparseCtmcCslHelper::computeBoundedUntilProbabilities<ValueType>(
80 env, std::move(goal), explicitRateMatrix, explicitRateMatrix.
transpose(
true), phiStates.
toVector(odd), psiStates.
toVector(odd),
81 explicitExitRateVector, qualitative, lowerBound, upperBound);
85 std::move(odd), std::move(result)));
101 if (!statesWithProbabilityGreater0NonPsi.
isZero()) {
104 return std::unique_ptr<CheckResult>(
112 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
113 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
117 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
123 model.
getManager().getConstant(uniformizationRate);
132 std::vector<ValueType> explicitB = b.
toVector(odd);
133 conversionWatch.
stop();
137 std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.
getNonZeroCount(), storm::utility::zero<ValueType>());
139 env, explicitUniformizedMatrix, &explicitB, upperBound, uniformizationRate, values, epsilon);
143 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subresult));
144 }
else if (upperBound == storm::utility::infinity<ValueType>()) {
149 std::unique_ptr<CheckResult> unboundedResult =
161 conversionWatch.
start();
163 conversionWatch.
stop();
165 std::vector<ValueType> result;
166 if (unboundedResult->isHybridQuantitativeCheckResult()) {
167 conversionWatch.
start();
168 std::unique_ptr<CheckResult> explicitUnboundedResult =
169 unboundedResult->asHybridQuantitativeCheckResult<DdType, ValueType>().toExplicitQuantitativeCheckResult();
170 conversionWatch.
stop();
171 result = std::move(explicitUnboundedResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
173 STORM_LOG_THROW(unboundedResult->isSymbolicQuantitativeCheckResult(), storm::exceptions::InvalidStateException,
174 "Expected check result of different type.");
175 result = unboundedResult->asSymbolicQuantitativeCheckResult<DdType, ValueType>().getValueVector().toVector(odd);
179 ValueType uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
184 conversionWatch.
start();
186 conversionWatch.
stop();
190 result = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
191 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, result, epsilon);
193 return std::unique_ptr<CheckResult>(
195 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, result));
199 if (lowerBound != upperBound) {
203 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
204 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
208 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
214 model.
getManager().getConstant(uniformizationRate);
220 std::vector<ValueType> explicitB = b.
toVector(odd);
221 conversionWatch.
stop();
224 std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.
getNonZeroCount(), storm::utility::zero<ValueType>());
226 env, explicitUniformizedMatrix, &explicitB, upperBound - lowerBound, uniformizationRate, values, epsilon);
232 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subResult);
241 conversionWatch.
start();
245 conversionWatch.
stop();
246 std::vector<ValueType> newSubresult = std::move(explicitResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
250 uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
251 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
255 if (lowerBound == upperBound) {
257 newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
261 uniformizedMatrix =
computeUniformizedMatrix(model, rateMatrix, exitRateVector, relevantStates, uniformizationRate);
262 conversionWatch.
start();
263 explicitUniformizedMatrix = uniformizedMatrix.
toMatrix(odd, odd);
264 conversionWatch.
stop();
267 newSubresult = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
268 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
270 return std::unique_ptr<CheckResult>(
272 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, newSubresult));
279 conversionWatch.
start();
282 std::vector<ValueType> newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
283 conversionWatch.
stop();
287 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0.template toAdd<ValueType>() * exitRateVector).getMax();
288 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
293 conversionWatch.
start();
295 conversionWatch.
stop();
298 newSubresult = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
299 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
303 model.
getManager().template getAddZero<ValueType>(), statesWithProbabilityGreater0, odd, newSubresult));
383 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
386 if (timeBound == 0) {
387 return std::unique_ptr<CheckResult>(
394 ValueType uniformizationRate = 1.02 * exitRateVector.
getMax();
395 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
400 conversionWatch.
start();
402 conversionWatch.
stop();
407 conversionWatch.
start();
409 conversionWatch.
stop();
413 conversionWatch.
start();
414 std::vector<ValueType> explicitTotalRewardVector = totalRewardVector.
toVector(odd);
415 conversionWatch.
stop();
418 ValueType maxReward = std::max(totalRewardVector.
getMax(), -totalRewardVector.
getMin());
422 return std::unique_ptr<CheckResult>(
430 epsilon *= std::min(storm::utility::one<ValueType>(), maxReward);
433 epsilon /= std::max(storm::utility::one<ValueType>(), maxReward * timeBound);
437 if (onlyInitialStatesRelevant) {
443 std::vector<ValueType> result;
447 result = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType, true>(
448 env, explicitUniformizedMatrix,
nullptr, timeBound, uniformizationRate, explicitTotalRewardVector, epsilon);
452 model.
getManager().template getAddZero<ValueType>(),