Browse Source
Fixed a model building problem. Included checking of reward properties on CTMCs and wrote tests for it.
Fixed a model building problem. Included checking of reward properties on CTMCs and wrote tests for it.
Former-commit-id: a137bd20ac
tempestpy_adaptions
dehnert
10 years ago
7 changed files with 499 additions and 70 deletions
-
33examples/ctmc/embedded/embedded_debug.sm
-
8src/builder/ExplicitPrismModelBuilder.cpp
-
28src/modelchecker/csl/SparseCtmcCslModelChecker.cpp
-
213test/functional/modelchecker/GmmxxCtmcCslModelCheckerTest.cpp
-
196test/functional/modelchecker/GmmxxMdpPrctlModelCheckerTest.cpp
-
58test/functional/modelchecker/SparseCtmcCslModelCheckerTest.cpp
-
23test/functional/modelchecker/SparseDtmcEliminationModelCheckerTest.cpp
@ -1,33 +0,0 @@ |
|||||
ctmc |
|
||||
|
|
||||
// constants |
|
||||
const int MAX_COUNT; |
|
||||
const int MIN_SENSORS = 2; |
|
||||
const int MIN_ACTUATORS = 1; |
|
||||
|
|
||||
// rates |
|
||||
const double lambda_p = 1/(365*24*60*60); // 1 year |
|
||||
const double lambda_s = 1/(30*24*60*60); // 1 month |
|
||||
const double lambda_a = 1/(2*30*24*60*60); // 2 months |
|
||||
const double tau = 1/60; // 1 min |
|
||||
const double delta_f = 1/(24*60*60); // 1 day |
|
||||
const double delta_r = 1/30; // 30 secs |
|
||||
|
|
||||
// sensors |
|
||||
module sensors |
|
||||
|
|
||||
s : [0..3] init 3; // number of sensors working |
|
||||
|
|
||||
[] s>1 -> s*lambda_s : (s'=s-1); // failure of a single sensor |
|
||||
|
|
||||
endmodule |
|
||||
|
|
||||
// input processor |
|
||||
// (takes data from sensors and passes onto main processor) |
|
||||
module proci |
|
||||
|
|
||||
i : [0..2] init 2; // 2=ok, 1=transient fault, 0=failed |
|
||||
|
|
||||
[] i>0 & s>=MIN_SENSORS -> lambda_p : (i'=0); // failure of processor |
|
||||
|
|
||||
endmodule |
|
@ -0,0 +1,213 @@ |
|||||
|
#include "gtest/gtest.h"
|
||||
|
#include "storm-config.h"
|
||||
|
|
||||
|
#include "src/parser/PrismParser.h"
|
||||
|
#include "src/parser/FormulaParser.h"
|
||||
|
#include "src/logic/Formulas.h"
|
||||
|
#include "src/builder/ExplicitPrismModelBuilder.h"
|
||||
|
|
||||
|
#include "src/solver/GmmxxLinearEquationSolver.h"
|
||||
|
#include "src/modelchecker/csl/SparseCtmcCslModelChecker.h"
|
||||
|
#include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h"
|
||||
|
|
||||
|
#include "src/settings/SettingsManager.h"
|
||||
|
|
||||
|
TEST(GmmxxCtmcCslModelCheckerTest, Cluster) { |
||||
|
// Parse the model description.
|
||||
|
storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/cluster2.sm"); |
||||
|
storm::parser::FormulaParser formulaParser(program.getManager().getSharedPointer()); |
||||
|
std::shared_ptr<storm::logic::Formula> formula(nullptr); |
||||
|
|
||||
|
// Build the model.
|
||||
|
typename storm::builder::ExplicitPrismModelBuilder<double>::Options options; |
||||
|
options.buildRewards = true; |
||||
|
options.rewardModelName = "num_repairs"; |
||||
|
std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitPrismModelBuilder<double>::translateProgram(program, options); |
||||
|
ASSERT_EQ(storm::models::ModelType::Ctmc, model->getType()); |
||||
|
std::shared_ptr<storm::models::sparse::Ctmc<double>> ctmc = model->as<storm::models::sparse::Ctmc<double>>(); |
||||
|
uint_fast64_t initialState = *ctmc->getInitialStates().begin(); |
||||
|
|
||||
|
// Create model checker.
|
||||
|
storm::modelchecker::SparseCtmcCslModelChecker<double> modelchecker(*ctmc, std::unique_ptr<storm::solver::LinearEquationSolver<double>>(new storm::solver::GmmxxLinearEquationSolver<double>())); |
||||
|
|
||||
|
// Start checking properties.
|
||||
|
formula = formulaParser.parseFromString("P=? [ F<=100 !\"minimum\"]"); |
||||
|
std::unique_ptr<storm::modelchecker::CheckResult> checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult1 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(5.5461254704419085E-5, quantitativeCheckResult1[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ F[100,100] !\"minimum\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult2 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(2.3397873548343415E-6, quantitativeCheckResult2[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ \"minimum\" U<=10 \"premium\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult3 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(1, quantitativeCheckResult3[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ !\"minimum\" U[1,inf] \"minimum\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult4 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(0, quantitativeCheckResult4[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("R=? [C<=100]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult5 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(0.8602815057967503, quantitativeCheckResult5[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
} |
||||
|
|
||||
|
TEST(GmmxxCtmcCslModelCheckerTest, Embedded) { |
||||
|
// Parse the model description.
|
||||
|
storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/embedded2.sm"); |
||||
|
storm::parser::FormulaParser formulaParser(program.getManager().getSharedPointer()); |
||||
|
std::shared_ptr<storm::logic::Formula> formula(nullptr); |
||||
|
|
||||
|
// Build the model.
|
||||
|
typename storm::builder::ExplicitPrismModelBuilder<double>::Options options; |
||||
|
options.buildRewards = true; |
||||
|
options.rewardModelName = "up"; |
||||
|
std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitPrismModelBuilder<double>::translateProgram(program, options); |
||||
|
ASSERT_EQ(storm::models::ModelType::Ctmc, model->getType()); |
||||
|
std::shared_ptr<storm::models::sparse::Ctmc<double>> ctmc = model->as<storm::models::sparse::Ctmc<double>>(); |
||||
|
uint_fast64_t initialState = *ctmc->getInitialStates().begin(); |
||||
|
|
||||
|
// Create model checker.
|
||||
|
storm::modelchecker::SparseCtmcCslModelChecker<double> modelchecker(*ctmc, std::unique_ptr<storm::solver::LinearEquationSolver<double>>(new storm::solver::GmmxxLinearEquationSolver<double>())); |
||||
|
|
||||
|
// Start checking properties.
|
||||
|
formula = formulaParser.parseFromString("P=? [ F<=10000 \"down\"]"); |
||||
|
std::unique_ptr<storm::modelchecker::CheckResult> checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult1 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(0.0019216435246119591, quantitativeCheckResult1[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ !\"down\" U<=10000 \"fail_actuators\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult2 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(3.7079151806696567E-6, quantitativeCheckResult2[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ !\"down\" U<=10000 \"fail_io\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult3 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(0.001556839327673734, quantitativeCheckResult3[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ !\"down\" U<=10000 \"fail_sensors\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult4 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(4.429620626755424E-5, quantitativeCheckResult4[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("R=? [C<=10000]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult5 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(2.7719776270427521, quantitativeCheckResult5[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
} |
||||
|
|
||||
|
TEST(GmmxxCtmcCslModelCheckerTest, Polling) { |
||||
|
// Parse the model description.
|
||||
|
storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/polling2.sm"); |
||||
|
storm::parser::FormulaParser formulaParser(program.getManager().getSharedPointer()); |
||||
|
std::shared_ptr<storm::logic::Formula> formula(nullptr); |
||||
|
|
||||
|
// Build the model.
|
||||
|
std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitPrismModelBuilder<double>::translateProgram(program); |
||||
|
ASSERT_EQ(storm::models::ModelType::Ctmc, model->getType()); |
||||
|
std::shared_ptr<storm::models::sparse::Ctmc<double>> ctmc = model->as<storm::models::sparse::Ctmc<double>>(); |
||||
|
uint_fast64_t initialState = *ctmc->getInitialStates().begin(); |
||||
|
|
||||
|
// Create model checker.
|
||||
|
storm::modelchecker::SparseCtmcCslModelChecker<double> modelchecker(*ctmc, std::unique_ptr<storm::solver::LinearEquationSolver<double>>(new storm::solver::GmmxxLinearEquationSolver<double>())); |
||||
|
|
||||
|
// Start checking properties.
|
||||
|
formula = formulaParser.parseFromString("P=?[ F<=10 \"target\"]"); |
||||
|
std::unique_ptr<storm::modelchecker::CheckResult> checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult1 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(1, quantitativeCheckResult1[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
} |
||||
|
|
||||
|
TEST(GmmxxCtmcCslModelCheckerTest, Fms) { |
||||
|
// No properties to check at this point.
|
||||
|
} |
||||
|
|
||||
|
TEST(GmmxxCtmcCslModelCheckerTest, Tandem) { |
||||
|
// Parse the model description.
|
||||
|
storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/tandem5.sm"); |
||||
|
storm::parser::FormulaParser formulaParser(program.getManager().getSharedPointer()); |
||||
|
std::shared_ptr<storm::logic::Formula> formula(nullptr); |
||||
|
|
||||
|
// Build the model.
|
||||
|
typename storm::builder::ExplicitPrismModelBuilder<double>::Options options; |
||||
|
options.buildRewards = true; |
||||
|
options.rewardModelName = "customers"; |
||||
|
std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitPrismModelBuilder<double>::translateProgram(program, options); |
||||
|
ASSERT_EQ(storm::models::ModelType::Ctmc, model->getType()); |
||||
|
std::shared_ptr<storm::models::sparse::Ctmc<double>> ctmc = model->as<storm::models::sparse::Ctmc<double>>(); |
||||
|
uint_fast64_t initialState = *ctmc->getInitialStates().begin(); |
||||
|
|
||||
|
// Create model checker.
|
||||
|
storm::modelchecker::SparseCtmcCslModelChecker<double> modelchecker(*ctmc, std::unique_ptr<storm::solver::LinearEquationSolver<double>>(new storm::solver::GmmxxLinearEquationSolver<double>())); |
||||
|
|
||||
|
// Start checking properties.
|
||||
|
formula = formulaParser.parseFromString("P=? [ F<=10 \"network_full\" ]"); |
||||
|
std::unique_ptr<storm::modelchecker::CheckResult> checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult1 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(0.015446370562428037, quantitativeCheckResult1[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [ F<=10 \"first_queue_full\" ]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult2 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(0.999999837225515, quantitativeCheckResult2[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("P=? [\"second_queue_full\" U<=1 !\"second_queue_full\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult3 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(1, quantitativeCheckResult3[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("R=? [I=10]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult4 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(5.679243850315877, quantitativeCheckResult4[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("R=? [C<=10]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult5 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(55.44792186036232, quantitativeCheckResult5[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
|
||||
|
formula = formulaParser.parseFromString("R=? [F \"first_queue_full\"&\"second_queue_full\"]"); |
||||
|
checkResult = modelchecker.check(*formula); |
||||
|
|
||||
|
ASSERT_TRUE(checkResult->isExplicitQuantitativeCheckResult()); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double> quantitativeCheckResult6 = checkResult->asExplicitQuantitativeCheckResult<double>(); |
||||
|
EXPECT_NEAR(262.85103661561755, quantitativeCheckResult6[initialState], storm::settings::generalSettings().getPrecision()); |
||||
|
} |
@ -0,0 +1,196 @@ |
|||||
|
#include "gtest/gtest.h"
|
||||
|
#include "storm-config.h"
|
||||
|
|
||||
|
#include "src/logic/Formulas.h"
|
||||
|
#include "src/solver/GmmxxNondeterministicLinearEquationSolver.h"
|
||||
|
#include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h"
|
||||
|
#include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h"
|
||||
|
#include "src/settings/SettingsManager.h"
|
||||
|
#include "src/parser/AutoParser.h"
|
||||
|
|
||||
|
TEST(GmmxxMdpPrctlModelCheckerTest, Dice) { |
||||
|
std::shared_ptr<storm::models::sparse::Model<double>> abstractModel = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.tra", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.lab", "", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.trans.rew"); |
||||
|
|
||||
|
ASSERT_EQ(abstractModel->getType(), storm::models::ModelType::Mdp); |
||||
|
|
||||
|
std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = abstractModel->as<storm::models::sparse::Mdp<double>>(); |
||||
|
|
||||
|
ASSERT_EQ(mdp->getNumberOfStates(), 169ull); |
||||
|
ASSERT_EQ(mdp->getNumberOfTransitions(), 436ull); |
||||
|
|
||||
|
storm::modelchecker::SparseMdpPrctlModelChecker<double> checker(*mdp, std::shared_ptr<storm::solver::GmmxxNondeterministicLinearEquationSolver<double>>(new storm::solver::GmmxxNondeterministicLinearEquationSolver<double>())); |
||||
|
|
||||
|
auto labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("two"); |
||||
|
auto eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(labelFormula); |
||||
|
auto minProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula); |
||||
|
|
||||
|
std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(*minProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult1 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.0277777612209320068, quantitativeResult1[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
auto maxProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula); |
||||
|
|
||||
|
result = checker.check(*maxProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult2 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.0277777612209320068, quantitativeResult2[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("three"); |
||||
|
eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(labelFormula); |
||||
|
minProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula); |
||||
|
|
||||
|
result = checker.check(*minProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult3 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.0555555224418640136, quantitativeResult3[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
maxProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula); |
||||
|
|
||||
|
result = checker.check(*maxProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult4 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.0555555224418640136, quantitativeResult4[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("four"); |
||||
|
eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(labelFormula); |
||||
|
minProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula); |
||||
|
|
||||
|
result = checker.check(*minProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult5 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.083333283662796020508, quantitativeResult5[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
maxProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula); |
||||
|
|
||||
|
result = checker.check(*maxProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult6 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.083333283662796020508, quantitativeResult6[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done"); |
||||
|
auto reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(labelFormula); |
||||
|
auto minRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = checker.check(*minRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult7 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(7.333329499, quantitativeResult7[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
auto maxRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = checker.check(*maxRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult8 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(7.333329499, quantitativeResult8[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
abstractModel = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.tra", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.lab", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.state.rew", ""); |
||||
|
|
||||
|
ASSERT_EQ(abstractModel->getType(), storm::models::ModelType::Mdp); |
||||
|
|
||||
|
std::shared_ptr<storm::models::sparse::Mdp<double>> stateRewardMdp = abstractModel->as<storm::models::sparse::Mdp<double>>(); |
||||
|
|
||||
|
storm::modelchecker::SparseMdpPrctlModelChecker<double> stateRewardModelChecker(*stateRewardMdp, std::shared_ptr<storm::solver::GmmxxNondeterministicLinearEquationSolver<double>>(new storm::solver::GmmxxNondeterministicLinearEquationSolver<double>())); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done"); |
||||
|
reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(labelFormula); |
||||
|
minRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = stateRewardModelChecker.check(*minRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult9 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(7.333329499, quantitativeResult9[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
maxRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = stateRewardModelChecker.check(*maxRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult10 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(7.333329499, quantitativeResult10[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
abstractModel = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.tra", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.lab", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.state.rew", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.trans.rew"); |
||||
|
|
||||
|
ASSERT_EQ(abstractModel->getType(), storm::models::ModelType::Mdp); |
||||
|
|
||||
|
std::shared_ptr<storm::models::sparse::Mdp<double>> stateAndTransitionRewardMdp = abstractModel->as<storm::models::sparse::Mdp<double>>(); |
||||
|
|
||||
|
storm::modelchecker::SparseMdpPrctlModelChecker<double> stateAndTransitionRewardModelChecker(*stateAndTransitionRewardMdp, std::shared_ptr<storm::solver::GmmxxNondeterministicLinearEquationSolver<double>>(new storm::solver::GmmxxNondeterministicLinearEquationSolver<double>())); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done"); |
||||
|
reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(labelFormula); |
||||
|
minRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = stateAndTransitionRewardModelChecker.check(*minRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult11 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(14.666658998, quantitativeResult11[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
maxRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = stateAndTransitionRewardModelChecker.check(*maxRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult12 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(14.666658998, quantitativeResult12[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
} |
||||
|
|
||||
|
TEST(GmmxxMdpPrctlModelCheckerTest, AsynchronousLeader) { |
||||
|
std::shared_ptr<storm::models::sparse::Model<double>> abstractModel = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader4.tra", STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader4.lab", "", STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader4.trans.rew"); |
||||
|
|
||||
|
ASSERT_EQ(storm::models::ModelType::Mdp, abstractModel->getType()); |
||||
|
|
||||
|
std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = abstractModel->as<storm::models::sparse::Mdp<double>>(); |
||||
|
|
||||
|
ASSERT_EQ(3172ull, mdp->getNumberOfStates()); |
||||
|
ASSERT_EQ(7144ull, mdp->getNumberOfTransitions()); |
||||
|
|
||||
|
storm::modelchecker::SparseMdpPrctlModelChecker<double> checker(*mdp, std::shared_ptr<storm::solver::GmmxxNondeterministicLinearEquationSolver<double>>(new storm::solver::GmmxxNondeterministicLinearEquationSolver<double>())); |
||||
|
|
||||
|
auto labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("elected"); |
||||
|
auto eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(labelFormula); |
||||
|
auto minProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula); |
||||
|
|
||||
|
std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(*minProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult1 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(1, quantitativeResult1[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
auto maxProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula); |
||||
|
|
||||
|
result = checker.check(*maxProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult2 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(1, quantitativeResult2[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("elected"); |
||||
|
auto trueFormula = std::make_shared<storm::logic::BooleanLiteralFormula>(true); |
||||
|
auto boundedUntilFormula = std::make_shared<storm::logic::BoundedUntilFormula>(trueFormula, labelFormula, 25); |
||||
|
minProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, boundedUntilFormula); |
||||
|
|
||||
|
result = checker.check(*minProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult3 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.0625, quantitativeResult3[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
maxProbabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, boundedUntilFormula); |
||||
|
|
||||
|
result = checker.check(*maxProbabilityOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult4 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(0.0625, quantitativeResult4[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
labelFormula = std::make_shared<storm::logic::AtomicLabelFormula>("elected"); |
||||
|
auto reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(labelFormula); |
||||
|
auto minRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = checker.check(*minRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult5 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(4.285689611, quantitativeResult5[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
|
||||
|
auto maxRewardOperatorFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula); |
||||
|
|
||||
|
result = checker.check(*maxRewardOperatorFormula); |
||||
|
storm::modelchecker::ExplicitQuantitativeCheckResult<double>& quantitativeResult6 = result->asExplicitQuantitativeCheckResult<double>(); |
||||
|
|
||||
|
EXPECT_NEAR(4.285689611, quantitativeResult6[0], storm::settings::nativeEquationSolverSettings().getPrecision()); |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue