80 std::vector<ValueType> explicitExitRateVector = exitRateVector.
toVector(odd);
82 if (onlyInitialStatesRelevant) {
85 conversionWatch.
stop();
88 std::vector<ValueType> result = storm::modelchecker::helper::SparseCtmcCslHelper::computeBoundedUntilProbabilities<ValueType>(
89 env, std::move(goal), explicitRateMatrix, explicitRateMatrix.
transpose(
true), phiStates.
toVector(odd), psiStates.
toVector(odd),
90 explicitExitRateVector, qualitative, lowerBound, upperBound);
94 std::move(odd), std::move(result)));
110 if (!statesWithProbabilityGreater0NonPsi.
isZero()) {
113 return std::unique_ptr<CheckResult>(
121 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
122 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
126 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
132 model.
getManager().getConstant(uniformizationRate);
141 std::vector<ValueType> explicitB = b.
toVector(odd);
142 conversionWatch.
stop();
146 std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.
getNonZeroCount(), storm::utility::zero<ValueType>());
148 env, explicitUniformizedMatrix, &explicitB, upperBound, uniformizationRate, values, epsilon);
152 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subresult));
153 }
else if (upperBound == storm::utility::infinity<ValueType>()) {
158 std::unique_ptr<CheckResult> unboundedResult =
170 conversionWatch.
start();
172 conversionWatch.
stop();
174 std::vector<ValueType> result;
175 if (unboundedResult->isHybridQuantitativeCheckResult()) {
176 conversionWatch.
start();
177 std::unique_ptr<CheckResult> explicitUnboundedResult =
178 unboundedResult->asHybridQuantitativeCheckResult<DdType, ValueType>().toExplicitQuantitativeCheckResult();
179 conversionWatch.
stop();
180 result = std::move(explicitUnboundedResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
182 STORM_LOG_THROW(unboundedResult->isSymbolicQuantitativeCheckResult(), storm::exceptions::InvalidStateException,
183 "Expected check result of different type.");
184 result = unboundedResult->asSymbolicQuantitativeCheckResult<DdType, ValueType>().getValueVector().toVector(odd);
188 ValueType uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
193 conversionWatch.
start();
195 conversionWatch.
stop();
199 result = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
200 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, result, epsilon);
202 return std::unique_ptr<CheckResult>(
204 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, result));
208 if (lowerBound != upperBound) {
212 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
213 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
217 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
223 model.
getManager().getConstant(uniformizationRate);
229 std::vector<ValueType> explicitB = b.
toVector(odd);
230 conversionWatch.
stop();
233 std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.
getNonZeroCount(), storm::utility::zero<ValueType>());
235 env, explicitUniformizedMatrix, &explicitB, upperBound - lowerBound, uniformizationRate, values, epsilon);
241 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subResult);
250 conversionWatch.
start();
254 conversionWatch.
stop();
255 std::vector<ValueType> newSubresult = std::move(explicitResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
259 uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
260 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
264 if (lowerBound == upperBound) {
266 newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
270 uniformizedMatrix =
computeUniformizedMatrix(model, rateMatrix, exitRateVector, relevantStates, uniformizationRate);
271 conversionWatch.
start();
272 explicitUniformizedMatrix = uniformizedMatrix.
toMatrix(odd, odd);
273 conversionWatch.
stop();
276 newSubresult = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
277 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
279 return std::unique_ptr<CheckResult>(
281 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, newSubresult));
288 conversionWatch.
start();
291 std::vector<ValueType> newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
292 conversionWatch.
stop();
296 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0.template toAdd<ValueType>() * exitRateVector).getMax();
297 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
302 conversionWatch.
start();
304 conversionWatch.
stop();
307 newSubresult = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType>(
308 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
312 model.
getManager().template getAddZero<ValueType>(), statesWithProbabilityGreater0, odd, newSubresult));
392 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
395 if (timeBound == 0) {
396 return std::unique_ptr<CheckResult>(
403 ValueType uniformizationRate = 1.02 * exitRateVector.
getMax();
404 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
409 conversionWatch.
start();
411 conversionWatch.
stop();
416 conversionWatch.
start();
418 conversionWatch.
stop();
422 conversionWatch.
start();
423 std::vector<ValueType> explicitTotalRewardVector = totalRewardVector.
toVector(odd);
424 conversionWatch.
stop();
427 ValueType maxReward = std::max(totalRewardVector.
getMax(), -totalRewardVector.
getMin());
431 return std::unique_ptr<CheckResult>(
439 epsilon *= std::min(storm::utility::one<ValueType>(), maxReward);
442 epsilon /= std::max(storm::utility::one<ValueType>(), maxReward * timeBound);
446 if (onlyInitialStatesRelevant) {
452 std::vector<ValueType> result;
456 result = storm::modelchecker::helper::SparseCtmcCslHelper::computeTransientProbabilities<ValueType, true>(
457 env, explicitUniformizedMatrix,
nullptr, timeBound, uniformizationRate, explicitTotalRewardVector, epsilon);
461 model.
getManager().template getAddZero<ValueType>(),