1#include "storm-config.h"
22 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<double>>(model->getInitialStates());
26 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<double>>(model->getInitialStates());
30 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
32 result->filter(*filter);
33 return result->asQuantitativeCheckResult<
double>().getMin();
37 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
39 result->filter(*filter);
40 return result->asQuantitativeCheckResult<
double>().getMin();
43void expectThrow(std::string
const& path, std::string
const& formulaString,
44 std::optional<storm::UncertaintyResolutionMode> uncertaintyResolutionMode = std::nullopt) {
54 if (uncertaintyResolutionMode.has_value()) {
55 task.setUncertaintyResolutionMode(uncertaintyResolutionMode.value());
89 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
92 auto resultMax = checker.
check(env, taskMax);
96 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
98 auto resultMin = checker.check(env, taskMin);
115 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
118 auto resultMax = checker.
check(env, taskMax);
122 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
124 auto resultMin = checker.check(env, taskMin);
139 auto result = checker.
check(env, task1);
141 ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
143 for (
size_t i = 0; i < expectedResultVector[0].size(); i++) {
144 EXPECT_EQ(expectedResultVector[0].get(i), result->template asExplicitQualitativeCheckResult<double>()[i]);
149 result = checker.check(env, task2);
151 ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
153 for (
size_t i = 0; i < expectedResultVector[1].size(); i++) {
154 EXPECT_EQ(expectedResultVector[1].get(i), result->template asExplicitQualitativeCheckResult<double>()[i]);
160 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<storm::RationalNumber>>(model->getInitialStates());
164 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
166 result->filter(*filter);
167 return result->asQuantitativeCheckResult<storm::RationalNumber>().getMin();
172 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<storm::RationalNumber>>(model->getInitialStates());
176 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
178 result->filter(*filter);
179 return result->asQuantitativeCheckResult<storm::RationalNumber>().getMin();
183 std::optional<storm::UncertaintyResolutionMode> uncertaintyResolutionMode = std::nullopt) {
194 if (uncertaintyResolutionMode.has_value()) {
195 task.setUncertaintyResolutionMode(uncertaintyResolutionMode.value());
203 storm::RationalNumber max) {
212 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
215 auto resultMax = checker.
check(env, taskMax);
219 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
221 auto resultMin = checker.check(env, taskMin);
226 storm::RationalNumber max) {
239 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
242 auto resultMax = checker.
check(env, taskMax);
246 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
248 auto resultMin = checker.check(env, taskMin);
255 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
263 auto exresult = checker.
check(env, taskCertain);
273 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
274 auto iresultMin = ichecker.check(envIntervals, taskMin);
276 EXPECT_LE(minValue, certainValue);
279 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
280 auto iresultMax = ichecker.check(envIntervals, taskMax);
282 EXPECT_LE(certainValue, maxValue);
285TEST(RobustDtmcModelCheckerTest, Tiny01ReachMaxMinProbs) {
290TEST(RobustDtmcModelCheckerTest, Tiny01MaxReachProbNoUncertaintyResolutionMode) {
292 expectThrow(STORM_TEST_RESOURCES_DIR
"/idtmc/tiny-01.drn",
"P=? [ F \"target\"];",
293 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Unset));
296TEST(RobustDtmcModelCheckerTest, Tiny01MaxReachProbNoOptimizationDirectionButRobust) {
298 expectThrow(STORM_TEST_RESOURCES_DIR
"/idtmc/tiny-01.drn",
"P=? [ F \"target\"];",
299 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Robust));
302TEST(RobustDtmcModelCheckerTest, Tiny02GloballyMaxMinProbs) {
304 expectThrow(STORM_TEST_RESOURCES_DIR
"/idtmc/tiny-02.drn",
"P=? [ G \"target\"];P=? [ G \"target\"]");
307TEST(RobustDtmcModelCheckerTest, DieIntervalsMaxMin) {
309 GTEST_SKIP() <<
"Z3 not available.";
315TEST(RobustDtmcModelCheckerTest, BrpIntervalsMaxMin) {
317 GTEST_SKIP() <<
"Z3 not available.";
321 2.559615918664207e-10, 0.0008464876763422187);
324TEST(RobustDtmcModelCheckerTest, DieIntervalsMaxMinRewards) {
326 GTEST_SKIP() <<
"Z3 not available.";
332TEST(RobustDtmcModelCheckerTest, Tiny03MaxMinRewards) {
337TEST(RobustDtmcModelCheckerTest, Tiny03RewardsNoUncertaintyResolutionMode) {
339 expectThrow(STORM_TEST_RESOURCES_DIR
"/idtmc/tiny-03.drn",
"R=? [ F \"target\"]", storm::UncertaintyResolutionMode::Unset);
342TEST(RobustDtmcModelCheckerTest, Tiny04MaxMinRewards) {
345 std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity());
348TEST(RobustDtmcModelCheckerTest, CrowdsQuotientIDTMC) {
351 "P=? [ F \"observe0Greater1\"];P=? [ F \"observe0Greater1\"]", 0.1383409, 0.1383409);
354TEST(RobustDtmcModelCheckerTest, TinyO2Propositional) {
356 std::vector<storm::storage::BitVector> expectedResults;
360 expectedResults.push_back(result1);
361 result1.complement();
362 expectedResults.push_back(result1);
367TEST(RobustDtmcModelCheckerTest, Tiny05StepBounded) {
374TEST(RobustDtmcModelCheckerTest, BoundedMaxmin) {
392TEST(RobustRationalDtmcModelCheckerTest, Tiny01ReachMaxMinProbs) {
394 storm::RationalNumber(
"3/10"), storm::RationalNumber(
"1/2"));
397TEST(RobustRationalDtmcModelCheckerTest, Tiny01MaxReachProbNoUncertaintyResolutionMode) {
399 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Unset));
402TEST(RobustRationalDtmcModelCheckerTest, Tiny01MaxReachProbNoOptimizationDirectionButRobust) {
404 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Robust));
407TEST(RobustRationalDtmcModelCheckerTest, Tiny02GloballyMaxMinProbs) {
408 expectThrowRational(STORM_TEST_RESOURCES_DIR
"/idtmc/tiny-02.drn",
"P=? [ G \"target\"];P=? [ G \"target\"]");
411TEST(RobustRationalDtmcModelCheckerTest, DieIntervalsMaxMin) {
413 GTEST_SKIP() <<
"Z3 not available.";
416 storm::RationalNumber(
"4483008223/94143178827"), storm::RationalNumber(
"35864065784/94143178827"));
419TEST(RobustRationalDtmcModelCheckerTest, BrpIntervalsMaxMin) {
421 GTEST_SKIP() <<
"Z3 not available.";
424 STORM_TEST_RESOURCES_DIR
"/idtmc/brp-32-2-intervals.pm",
"P=? [ F \"error\" ];P=? [ F \"error\" ]",
426 storm::RationalNumber(
"10238464074071514998168131748974289312176706851339248682605279417683104172439385084862067764341447739354976890683145110072150529"
427 "29484271217452553595194641992099205093706027267658909966207049695357884534755950707204946503657943965652247014748702342577938440"
428 "579441829932769922685028147340905022682454110960938051"
430 "40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
431 "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
432 "000000000000000000000000000000000000000000000000000000000000000"),
433 storm::RationalNumber(
"73421101667166357614487085157865792442422423664718103404519649530149236548299533815461648662459394997073289369183682645650367121"
434 "4626220291672876565353557862092334897"
436 "86736173798840354720596224069595336914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
437 "0000000000000000000000000000000000000000"));
440TEST(RobustRationalDtmcModelCheckerTest, DieIntervalsMaxMinRewards) {
442 GTEST_SKIP() <<
"Z3 not available.";
445 storm::RationalNumber(
"15544649/4782969"), storm::RationalNumber(
"76715008330675523/16677181699666569"));
448TEST(RobustRationalDtmcModelCheckerTest, Tiny03MaxMinRewards) {
450 storm::RationalNumber(
"13/2"), storm::RationalNumber(
"17/2"));
453TEST(RobustRationalDtmcModelCheckerTest, Tiny03RewardsNoUncertaintyResolutionMode) {
454 expectThrowRational(STORM_TEST_RESOURCES_DIR
"/idtmc/tiny-03.drn",
"R=? [ F \"target\"]", storm::UncertaintyResolutionMode::Unset);
457TEST(RobustRationalDtmcModelCheckerTest, Tiny04MaxMinRewards) {
462TEST(RobustRationalDtmcModelCheckerTest, AddUncertaintyBrpMax) {
464 GTEST_SKIP() <<
"Z3 not available.";
void checkPrismModelForQuantitativeResult(std::string const &path, std::string const &formulaString, double min, double max)
TEST(RobustDtmcModelCheckerTest, Tiny01ReachMaxMinProbs)
std::unique_ptr< storm::modelchecker::QualitativeCheckResult > getInitialStateFilter(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model)
void checkModelForQualitativeResult(std::string const &path, std::string const &formulaString, std::vector< storm::storage::BitVector > expectedResultVector)
void expectThrow(std::string const &path, std::string const &formulaString, std::optional< storm::UncertaintyResolutionMode > uncertaintyResolutionMode=std::nullopt)
void checkExplicitModelForQuantitativeResult(std::string const &path, std::string const &formulaString, double min, double max)
void checkPrismModelForQuantitativeResultRational(std::string const &path, std::string const &formulaString, storm::RationalNumber min, storm::RationalNumber max)
void expectThrowPrism(std::string const &path, std::string const &formulaString)
double getQuantitativeResultAtInitialState(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model, std::unique_ptr< storm::modelchecker::CheckResult > &result)
void makeUncertainAndCheckRational(std::string const &path, std::string const &formulaString, storm::RationalNumber amountOfUncertainty)
void expectThrowRational(std::string const &path, std::string const &formulaString, std::optional< storm::UncertaintyResolutionMode > uncertaintyResolutionMode=std::nullopt)
void checkExplicitModelForQuantitativeResultRational(std::string const &path, std::string const &formulaString, storm::RationalNumber min, storm::RationalNumber max)
SolverEnvironment & solver()
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
This class represents the base class of all exception classes.
virtual std::unique_ptr< CheckResult > check(Environment const &env, CheckTask< storm::logic::Formula, SolutionType > const &checkTask)
Checks the provided formula.
This class represents a discrete-time Markov chain.
Base class for all sparse models.
A bit vector that is internally represented as a vector of 64-bit values.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
template std::shared_ptr< storm::models::sparse::Model< storm::RationalInterval > > parseDirectEncodingModel< storm::RationalInterval >(std::filesystem::path const &file, DirectEncodingParserOptions const &options)
template std::shared_ptr< storm::models::sparse::Model< storm::Interval > > parseDirectEncodingModel< storm::Interval >(std::filesystem::path const &file, DirectEncodingParserOptions const &options)
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)