60 storm::dd::Bdd<DdType> const& psiStates,
bool qualitative, ValueType lowerBound, std::optional<ValueType>
const& upperBound) {
71 std::vector<ValueType> explicitExitRateVector = exitRateVector.
toVector(odd);
73 if (onlyInitialStatesRelevant) {
76 conversionWatch.
stop();
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();
139 env, explicitUniformizedMatrix, &explicitB, *upperBound, uniformizationRate, values, epsilon);
143 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subresult));
144 }
else if (!upperBound) {
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();
173 result = std::move(explicitUnboundedResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
175 STORM_LOG_THROW(unboundedResult->isSymbolicQuantitativeCheckResult(), storm::exceptions::InvalidStateException,
176 "Expected check result of different type.");
177 result = unboundedResult->asSymbolicQuantitativeCheckResult<DdType, ValueType>().getValueVector().toVector(odd);
181 ValueType uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
186 conversionWatch.
start();
188 conversionWatch.
stop();
193 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, result, epsilon);
195 return std::unique_ptr<CheckResult>(
197 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, result));
201 if (lowerBound != *upperBound) {
205 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0NonPsi.template toAdd<ValueType>() * exitRateVector).getMax();
206 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
210 computeUniformizedMatrix(model, rateMatrix, exitRateVector, statesWithProbabilityGreater0NonPsi, uniformizationRate);
216 model.
getManager().getConstant(uniformizationRate);
222 std::vector<ValueType> explicitB = b.
toVector(odd);
223 conversionWatch.
stop();
228 env, explicitUniformizedMatrix, &explicitB, *upperBound - lowerBound, uniformizationRate, values, epsilon);
234 psiStates.template toAdd<ValueType>(), statesWithProbabilityGreater0NonPsi, odd, subResult);
243 conversionWatch.
start();
247 conversionWatch.
stop();
250 std::vector<ValueType> newSubresult = std::move(explicitResult->asExplicitQuantitativeCheckResult<ValueType>().getValueVector());
254 uniformizationRate = 1.02 * (relevantStates.template toAdd<ValueType>() * exitRateVector).getMax();
255 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
259 if (lowerBound == *upperBound) {
261 newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
265 uniformizedMatrix =
computeUniformizedMatrix(model, rateMatrix, exitRateVector, relevantStates, uniformizationRate);
266 conversionWatch.
start();
267 explicitUniformizedMatrix = uniformizedMatrix.
toMatrix(odd, odd);
268 conversionWatch.
stop();
272 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
274 return std::unique_ptr<CheckResult>(
276 model.
getManager().template getAddZero<ValueType>(), relevantStates, odd, newSubresult));
283 conversionWatch.
start();
286 std::vector<ValueType> newSubresult = psiStates.template toAdd<ValueType>().
toVector(odd);
287 conversionWatch.
stop();
291 ValueType uniformizationRate = 1.02 * (statesWithProbabilityGreater0.template toAdd<ValueType>() * exitRateVector).getMax();
292 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
297 conversionWatch.
start();
299 conversionWatch.
stop();
303 env, explicitUniformizedMatrix,
nullptr, lowerBound, uniformizationRate, newSubresult, epsilon);
307 model.
getManager().template getAddZero<ValueType>(), statesWithProbabilityGreater0, odd, newSubresult));
387 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
390 if (timeBound == 0) {
391 return std::unique_ptr<CheckResult>(
398 ValueType uniformizationRate = 1.02 * exitRateVector.
getMax();
399 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException,
"The uniformization rate must be positive.");
404 conversionWatch.
start();
406 conversionWatch.
stop();
411 conversionWatch.
start();
413 conversionWatch.
stop();
417 conversionWatch.
start();
418 std::vector<ValueType> explicitTotalRewardVector = totalRewardVector.
toVector(odd);
419 conversionWatch.
stop();
422 ValueType maxReward = std::max(totalRewardVector.
getMax(), -totalRewardVector.
getMin());
426 return std::unique_ptr<CheckResult>(
441 if (onlyInitialStatesRelevant) {
447 std::vector<ValueType> result;
452 env, explicitUniformizedMatrix,
nullptr, timeBound, uniformizationRate, explicitTotalRewardVector, epsilon);
456 model.
getManager().template getAddZero<ValueType>(),