You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

67 lines
3.4 KiB

#include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h"
#include "gtest/gtest.h"
#include "storm-config.h"
#include "storm-parsers/parser/PrismParser.h"
#include "storm-parsers/parser/FormulaParser.h"
#include "storm/storage/expressions/ExpressionManager.h"
#include "storm/logic/Formulas.h"
#include "storm/permissivesched/PermissiveSchedulers.h"
#include "storm/builder/ExplicitModelBuilder.h"
#include "storm/solver/MinMaxLinearEquationSolver.h"
#include "storm/environment/Environment.h"
#include "storm/models/sparse/StandardRewardModel.h"
#include "storm/modelchecker/prctl/SparseMdpPrctlModelChecker.h"
#ifdef STORM_HAVE_GUROBI
TEST(MilpPermissiveSchedulerTest, DieSelection) {
storm::Environment env;
storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/die_c1.nm");
storm::parser::FormulaParser formulaParser(program.getManager().getSharedPointer());
std::string formulaString = "";
formulaString += "P>=0.10 [ F \"one\"];\n";
formulaString += "P>=0.17 [ F \"one\"];\n";
formulaString += "P<=0.10 [ F \"one\"];\n";
formulaString += "P<=0.17 [ F \"one\"];\n";
auto formulas = formulaParser.parseFromString(formulaString);
auto const& formula02 = formulas[0].getRawFormula()->asProbabilityOperatorFormula();
ASSERT_TRUE(storm::logic::isLowerBound(formula02.getComparisonType()));
auto const& formula001 = formulas[1].getRawFormula()->asProbabilityOperatorFormula();
auto const& formula02b = formulas[2].getRawFormula()->asProbabilityOperatorFormula();
auto const& formula001b = formulas[3].getRawFormula()->asProbabilityOperatorFormula();
// Customize and perform model-building.
storm::generator::NextStateGeneratorOptions options;
options.setBuildAllLabels().setBuildChoiceLabels(true);
std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
boost::optional<storm::ps::SubMDPPermissiveScheduler<>> perms = storm::ps::computePermissiveSchedulerViaMILP<>(*mdp, formula02);
EXPECT_NE(perms, boost::none);
boost::optional<storm::ps::SubMDPPermissiveScheduler<>> perms2 = storm::ps::computePermissiveSchedulerViaMILP<>(*mdp, formula001);
EXPECT_EQ(perms2, boost::none);
boost::optional<storm::ps::SubMDPPermissiveScheduler<>> perms3 = storm::ps::computePermissiveSchedulerViaMILP<>(*mdp, formula02b);
EXPECT_EQ(perms3, boost::none);
boost::optional<storm::ps::SubMDPPermissiveScheduler<>> perms4 = storm::ps::computePermissiveSchedulerViaMILP<>(*mdp, formula001b);
EXPECT_NE(perms4, boost::none);
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<double>> checker0(*mdp);
std::unique_ptr<storm::modelchecker::CheckResult> result0 = checker0.check(env, formula02);
storm::modelchecker::ExplicitQualitativeCheckResult& qualitativeResult0 = result0->asExplicitQualitativeCheckResult();
ASSERT_FALSE(qualitativeResult0[0]);
auto submdp = perms->apply();
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<double>> checker1(submdp);
std::unique_ptr<storm::modelchecker::CheckResult> result1 = checker1.check(env, formula02);
storm::modelchecker::ExplicitQualitativeCheckResult& qualitativeResult1 = result1->asExplicitQualitativeCheckResult();
EXPECT_TRUE(qualitativeResult1[0]);
}
#endif