|
|
@ -208,7 +208,7 @@ namespace { |
|
|
|
typedef typename TestFixture::ValueType ValueType; |
|
|
|
|
|
|
|
// TODO skip without LTL support
|
|
|
|
std::string formulasString = "Pmax=? [X X \"target\"]; Pmin=? [G F \"target\"]; Pmax=? [(G F s>2) & (F G !(s=3))];"; |
|
|
|
std::string formulasString = "Pmax=? [X X s=0]; Pmin=? [G F \"target\"]; Pmax=? [(G F s>2) & (F G !(s=3))];"; |
|
|
|
auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR "/mdp/scheduler_generation.nm", |
|
|
|
formulasString); |
|
|
|
auto mdp = std::move(modelFormulas.first); |
|
|
@ -223,9 +223,11 @@ namespace { |
|
|
|
{ |
|
|
|
auto result = checker.check(this->env(), tasks[0]); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("81/100"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler()); |
|
|
|
storm::storage::Scheduler<ValueType> const &scheduler = result->template asExplicitQuantitativeCheckResult<ValueType>().getScheduler(); |
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(scheduler.isDeterministicScheduler()); |
|
|
|
EXPECT_TRUE(!scheduler.isMemorylessScheduler()); |
|
|
|
EXPECT_TRUE(scheduler.isPartialScheduler()); |
|
|
@ -238,11 +240,12 @@ namespace { |
|
|
|
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<ValueType>> inducedChecker(*inducedMdp); |
|
|
|
auto inducedResult = inducedChecker.check(this->env(), tasks[0]); |
|
|
|
ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("9/10"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
EXPECT_NEAR(this->parseNumber("81/100"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
} |
|
|
|
{ |
|
|
|
auto result = checker.check(this->env(), tasks[1]); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1/2"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler()); |
|
|
|
storm::storage::Scheduler<ValueType> const &scheduler = result->template asExplicitQuantitativeCheckResult<ValueType>().getScheduler(); |
|
|
|
|
|
|
@ -256,14 +259,14 @@ namespace { |
|
|
|
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<ValueType>> inducedChecker( *inducedMdp); |
|
|
|
auto inducedResult = inducedChecker.check(this->env(), tasks[1]); |
|
|
|
ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1/2"),inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1/2"),inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
} |
|
|
|
{ |
|
|
|
auto result = checker.check(this->env(), tasks[2]); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1/2"), |
|
|
|
result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()], |
|
|
|
storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler()); |
|
|
|
storm::storage::Scheduler<ValueType> const &scheduler = result->template asExplicitQuantitativeCheckResult<ValueType>().getScheduler(); |
|
|
|
|
|
|
@ -279,14 +282,12 @@ namespace { |
|
|
|
auto inducedResult = inducedChecker.check(this->env(), tasks[2]); |
|
|
|
ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1/2"), |
|
|
|
inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()], |
|
|
|
inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()], |
|
|
|
storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, ltlMec) { |
|
|
|
TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, ltlNondetChoice) { |
|
|
|
typedef typename TestFixture::ValueType ValueType; |
|
|
|
// TODO skip without LTL support
|
|
|
|
// Nondeterministic choice in an accepting EC.
|
|
|
@ -305,6 +306,8 @@ namespace { |
|
|
|
{ |
|
|
|
auto result = checker.check(this->env(), tasks[0]); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("0.5"),result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()], |
|
|
|
storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler()); |
|
|
|
storm::storage::Scheduler<ValueType> const &scheduler = result->template asExplicitQuantitativeCheckResult<ValueType>().getScheduler(); |
|
|
|
|
|
|
@ -315,7 +318,7 @@ namespace { |
|
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(inducedModel->getType(), storm::models::ModelType::Mdp); |
|
|
|
auto const &inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>(); // TODO DTMC!
|
|
|
|
auto const &inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>(); |
|
|
|
EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates()); |
|
|
|
|
|
|
|
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<ValueType>> inducedChecker(*inducedMdp); |
|
|
@ -326,4 +329,70 @@ namespace { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, ltlUnsat) { |
|
|
|
typedef typename TestFixture::ValueType ValueType; |
|
|
|
// TODO skip without LTL support
|
|
|
|
// Nondeterministic choice in an accepting EC, Pmax unsatisfiable, Pmin tautology (compute 1-Pmax(!phi))
|
|
|
|
std::string formulasString = "Pmax=? [(X X !(s=0)) & (X X (s=0))]; Pmin=? [(X X !(s=0)) | (X X (s=0))];"; |
|
|
|
auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR "/mdp/scheduler_generation.nm", formulasString); |
|
|
|
|
|
|
|
auto mdp = std::move(modelFormulas.first); |
|
|
|
auto tasks = this->getTasks(modelFormulas.second); |
|
|
|
EXPECT_EQ(4ull, mdp->getNumberOfStates()); |
|
|
|
EXPECT_EQ(11ull, mdp->getNumberOfTransitions()); |
|
|
|
ASSERT_EQ(mdp->getType(), storm::models::ModelType::Mdp); |
|
|
|
EXPECT_EQ(7ull, mdp->getNumberOfChoices()); |
|
|
|
|
|
|
|
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<ValueType>> checker(*mdp); |
|
|
|
|
|
|
|
{ |
|
|
|
auto result = checker.check(this->env(), tasks[0]); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("0"),result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()], |
|
|
|
storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler()); |
|
|
|
storm::storage::Scheduler<ValueType> const &scheduler = result->template asExplicitQuantitativeCheckResult<ValueType>().getScheduler(); |
|
|
|
|
|
|
|
EXPECT_TRUE(scheduler.isDeterministicScheduler()); |
|
|
|
EXPECT_TRUE(scheduler.isMemorylessScheduler()); |
|
|
|
EXPECT_TRUE(!scheduler.isPartialScheduler()); |
|
|
|
auto inducedModel = mdp->applyScheduler(scheduler, true); |
|
|
|
|
|
|
|
ASSERT_EQ(inducedModel->getType(), storm::models::ModelType::Mdp); |
|
|
|
auto const &inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>(); |
|
|
|
EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates()); |
|
|
|
|
|
|
|
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<ValueType>> inducedChecker(*inducedMdp); |
|
|
|
auto inducedResult = inducedChecker.check(this->env(), tasks[0]); |
|
|
|
ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("0"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
} |
|
|
|
|
|
|
|
{ |
|
|
|
auto result = checker.check(this->env(), tasks[1]); |
|
|
|
ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); |
|
|
|
ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1"),result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()], |
|
|
|
storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
storm::storage::Scheduler<ValueType> const &scheduler = result->template asExplicitQuantitativeCheckResult<ValueType>().getScheduler(); |
|
|
|
|
|
|
|
EXPECT_TRUE(scheduler.isDeterministicScheduler()); |
|
|
|
EXPECT_TRUE(scheduler.isMemorylessScheduler()); |
|
|
|
EXPECT_TRUE(!scheduler.isPartialScheduler()); |
|
|
|
auto inducedModel = mdp->applyScheduler(scheduler, true); |
|
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(inducedModel->getType(), storm::models::ModelType::Mdp); |
|
|
|
auto const &inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>(); |
|
|
|
EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates()); |
|
|
|
|
|
|
|
storm::modelchecker::SparseMdpPrctlModelChecker<storm::models::sparse::Mdp<ValueType>> inducedChecker(*inducedMdp); |
|
|
|
auto inducedResult = inducedChecker.check(this->env(), tasks[1]); |
|
|
|
ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult()); |
|
|
|
EXPECT_NEAR(this->parseNumber("1"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |