79 std::vector<ValueType> explicitExitRateVector = exitRateVector.
toVector(odd);
81 if (onlyInitialStatesRelevant) {
84 conversionWatch.
stop();
87 std::vector<ValueType> result = storm::modelchecker::helper::SparseCtmcCslHelper::computeBoundedUntilProbabilities<ValueType>(
88 env, std::move(goal), explicitRateMatrix, explicitRateMatrix.
transpose(
true), phiStates.
toVector(odd), psiStates.
toVector(odd),
89 explicitExitRateVector, qualitative, lowerBound, upperBound);
93 std::move(odd), std::move(result)));
109 if (!statesWithProbabilityGreater0NonPsi.
isZero()) {
112 return std::unique_ptr<CheckResult>(
120 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
121 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
125 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
131 model.
getManager().getConstant(uniformizationRate);
140 std::vector<ValueType> explicitB = b.
toVector(odd);
141 conversionWatch.
stop();
145 std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.
getNonZeroCount(), storm::utility::zero<ValueType>());
147 env, explicitUniformizedMatrix, &explicitB, upperBound, uniformizationRate, values, epsilon);
151 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subresult));
152 }
else if (upperBound == storm::utility::infinity<ValueType>()) {
157 std::unique_ptr<CheckResult> unboundedResult =
169 conversionWatch.
start();
171 conversionWatch.
stop();
173 std::vector<ValueType> result;
174 if (unboundedResult->isHybridQuantitativeCheckResult()) {
175 conversionWatch.
start();
176 std::unique_ptr<CheckResult> explicitUnboundedResult =
177 unboundedResult->asHybridQuantitativeCheckResult<DdType, ValueType>().toExplicitQuantitativeCheckResult();
178 conversionWatch.
stop();
179 result = std::move(explicitUnboundedResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
181 STORM_LOG_THROW(unboundedResult->isSymbolicQuantitativeCheckResult(), storm::exceptions::InvalidStateException,
182 "Expected check result of different type.");
183 result = unboundedResult->asSymbolicQuantitativeCheckResult<DdType, ValueType>().getValueVector().toVector(odd);
187 ValueType uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
192 conversionWatch.
start();
194 conversionWatch.
stop();
198 result = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
199 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, result, epsilon);
201 return std::unique_ptr<CheckResult>(
203 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, result));
207 if (lowerBound != upperBound) {
211 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
212 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
216 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
222 model.
getManager().getConstant(uniformizationRate);
228 std::vector<ValueType> explicitB = b.
toVector(odd);
229 conversionWatch.
stop();
232 std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.
getNonZeroCount(), storm::utility::zero<ValueType>());
234 env, explicitUniformizedMatrix, &explicitB, upperBound - lowerBound, uniformizationRate, values, epsilon);
240 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subResult);
249 conversionWatch.
start();
253 conversionWatch.
stop();
254 std::vector<ValueType> newSubresult = std::move(explicitResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
258 uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
259 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
263 if (lowerBound == upperBound) {
265 newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
269 uniformizedMatrix =
computeUniformizedMatrix(model, rateMatrix, exitRateVector, relevantStates, uniformizationRate);
270 conversionWatch.
start();
271 explicitUniformizedMatrix = uniformizedMatrix.
toMatrix(odd, odd);
272 conversionWatch.
stop();
275 newSubresult = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
276 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
278 return std::unique_ptr<CheckResult>(
280 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, newSubresult));
287 conversionWatch.
start();
290 std::vector<ValueType> newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
291 conversionWatch.
stop();
295 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0.template toAdd<ValueType>() * exitRateVector).getMax();
296 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
301 conversionWatch.
start();
303 conversionWatch.
stop();
306 newSubresult = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
307 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
311 model.
getManager().template getAddZero<ValueType>(), statesWithProbabilityGreater0, odd, newSubresult));
406 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
409 if (timeBound == 0) {
410 return std::unique_ptr<CheckResult>(
417 ValueType uniformizationRate = 1.02 * exitRateVector.
getMax();
418 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
423 conversionWatch.
start();
425 conversionWatch.
stop();
430 conversionWatch.
start();
432 conversionWatch.
stop();
436 conversionWatch.
start();
437 std::vector<ValueType> explicitTotalRewardVector = totalRewardVector.
toVector(odd);
438 conversionWatch.
stop();
441 ValueType maxReward = std::max(totalRewardVector.
getMax(), -totalRewardVector.
getMin());
445 return std::unique_ptr<CheckResult>(
453 epsilon *= std::min(storm::utility::one<ValueType>(), maxReward);
456 epsilon /= std::max(storm::utility::one<ValueType>(), maxReward * timeBound);
460 if (onlyInitialStatesRelevant) {
466 std::vector<ValueType> result;
470 result = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType, true>(
471 env, explicitUniformizedMatrix,
nullptr, timeBound, uniformizationRate, explicitTotalRewardVector, epsilon);
475 model.
getManager().template getAddZero<ValueType>(),