1#include "storm-config.h"
20 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(model->getInitialStates());
24 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(model->getInitialStates());
28 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
30 result->filter(*filter);
31 return result->asQuantitativeCheckResult<
double>().getMin();
35 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
37 result->filter(*filter);
38 return result->asQuantitativeCheckResult<
double>().getMin();
41void expectThrow(std::string
const& path, std::string
const& formulaString) {
56void checkModel(std::string
const& path, std::string
const& formulaString,
double maxmin,
double maxmax,
double minmax,
double minmin,
bool produceScheduler) {
65 taskMax.setProduceSchedulers(produceScheduler);
68 auto resultMax = checker.
check(env, taskMax);
70 taskMax.setRobustUncertainty(
false);
71 auto resultMaxNonRobust = checker.check(env, taskMax);
75 taskMin.setProduceSchedulers(produceScheduler);
77 auto resultMin = checker.check(env, taskMin);
79 taskMin.setRobustUncertainty(
false);
80 auto resultMinNonRobust = checker.check(env, taskMin);
84void makeUncertainAndCheck(std::string
const& path, std::string
const& formulaString,
double amountOfUncertainty) {
87 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
89 std::shared_ptr<storm::models::sparse::Model<double>> modelPtr = storm::api::buildSparseModel<double>(program, formulas);
93 ASSERT_TRUE(formulas[0]->isProbabilityOperatorFormula());
95 ASSERT_TRUE(formulas[0]->asProbabilityOperatorFormula().getOptimalityType() == storm::solver::OptimizationDirection::Maximize);
101 auto exresult = checker.
check(env, task);
109 auto iresultMin = checker.
check(env, task);
111 EXPECT_LE(minValue, certainValue);
112 task.setRobustUncertainty(
false);
113 auto iresultMax = checker.check(env, task);
115 EXPECT_LE(certainValue, maxValue);
118TEST(RobustMDPModelCheckingTest, Tiny01maxmin) {
119 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-01.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 0.4, 0.5, 0.5, 0.4,
false);
122TEST(RobustMDPModelCheckingTest, Tiny03maxmin) {
123 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 0.4, 0.5, 0.5, 0.4,
true);
126TEST(RobustMDPModelCheckingTest, BoundedTiny03maxmin) {
127 expectThrow(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F<=3 \"target\"]");
130TEST(RobustMDPModelCheckingTest, Tiny04maxmin) {
131 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-04.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 1, 1, 0.42857, 0.42,
false);
134TEST(RobustMDPModelCheckingTest, Tiny05maxmin) {
135 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-05.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 0.3, 0.4, 0.4, 0.3,
false);
138TEST(RobustMDPModelCheckingTest, Tiny04maxmin_rewards) {
139 expectThrow(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-04.drn",
"Rmin=? [ F \"target\"]");
142TEST(RobustMDPModelCheckingTest, AddUncertaintyCoin22max) {
144 GTEST_SKIP() <<
"Z3 not available.";
146 makeUncertainAndCheck(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm",
"Pmax=? [F \"all_coins_equal_1\"]", 0.1);
147 makeUncertainAndCheck(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm",
"Pmax=? [F \"all_coins_equal_1\"]", 0.2);
std::unique_ptr< storm::modelchecker::QualitativeCheckResult > getInitialStateFilter(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model)
void expectThrow(std::string const &path, std::string const &formulaString)
TEST(RobustMDPModelCheckingTest, Tiny01maxmin)
void checkModel(std::string const &path, std::string const &formulaString, double maxmin, double maxmax, double minmax, double minmin, bool produceScheduler)
double getQuantitativeResultAtInitialState(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model, std::unique_ptr< storm::modelchecker::CheckResult > &result)
void makeUncertainAndCheck(std::string const &path, std::string const &formulaString, double amountOfUncertainty)
SolverEnvironment & solver()
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
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 decision process.
Base class for all sparse models.
static std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > parseModel(std::string const &fil, DirectEncodingParserOptions const &options=DirectEncodingParserOptions())
Load a model in DRN format from a file and create the model.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
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)
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)