|
|
@ -7,38 +7,6 @@ |
|
|
|
#include "src/modelchecker/prctl/TopologicalValueIterationMdpPrctlModelChecker.h"
|
|
|
|
#include "src/parser/AutoParser.h"
|
|
|
|
|
|
|
|
TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, SmallLinEqSystem) { |
|
|
|
storm::storage::SparseMatrixBuilder<double> matrixBuilder(4, 4); |
|
|
|
ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 0.1)); |
|
|
|
ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 0.9)); |
|
|
|
ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 1.0)); |
|
|
|
ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 3, 1.0)); |
|
|
|
ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 0.8)); |
|
|
|
ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 3, 0.2)); |
|
|
|
|
|
|
|
storm::storage::SparseMatrix<double> matrix; |
|
|
|
ASSERT_NO_THROW(matrix = matrixBuilder.build()); |
|
|
|
|
|
|
|
ASSERT_EQ(4, matrix.getRowCount()); |
|
|
|
ASSERT_EQ(4, matrix.getColumnCount()); |
|
|
|
ASSERT_EQ(6, matrix.getEntryCount()); |
|
|
|
|
|
|
|
// Solve the Linear Equation System
|
|
|
|
storm::solver::TopologicalValueIterationNondeterministicLinearEquationSolver<double> topoSolver; |
|
|
|
|
|
|
|
std::vector<double> x(4); |
|
|
|
std::vector<double> b = { 1, 2, 3, 4 }; |
|
|
|
std::vector<uint_fast64_t> choices = { 0, 1, 2, 3, 4 }; |
|
|
|
|
|
|
|
ASSERT_NO_THROW(topoSolver.solveEquationSystem(true, matrix, x, b, choices)); |
|
|
|
|
|
|
|
storm::settings::Settings* s = storm::settings::Settings::getInstance(); |
|
|
|
ASSERT_LT(std::abs(x.at(0) - 2.9), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(x.at(1) - 2), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(x.at(2) - 3), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(x.at(3) - 3.2), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
storm::settings::Settings* s = storm::settings::Settings::getInstance(); |
|
|
|
storm::parser::AutoParser<double> parser(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"); |
|
|
@ -48,12 +16,11 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
std::shared_ptr<storm::models::Mdp<double>> mdp = parser.getModel<storm::models::Mdp<double>>(); |
|
|
|
|
|
|
|
// ASSERT_EQ(mdp->getNumberOfStates(), 11ull);
|
|
|
|
// ASSERT_EQ(mdp->getNumberOfTransitions(), 18ull);
|
|
|
|
ASSERT_EQ(mdp->getNumberOfStates(), 169ull); |
|
|
|
ASSERT_EQ(mdp->getNumberOfTransitions(), 436ull); |
|
|
|
|
|
|
|
storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> mc(*mdp); |
|
|
|
|
|
|
|
// storm::property::prctl::Ap<double>* apFormula = new storm::property::prctl::Ap<double>("end");
|
|
|
|
storm::property::prctl::Ap<double>* apFormula = new storm::property::prctl::Ap<double>("two"); |
|
|
|
storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula); |
|
|
|
storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |
|
|
@ -63,7 +30,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
ASSERT_LT(std::abs(result[0] - 0.0277777612209320068), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
|
|
|
|
delete probFormula; |
|
|
|
/*
|
|
|
|
|
|
|
|
apFormula = new storm::property::prctl::Ap<double>("two"); |
|
|
|
eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula); |
|
|
|
probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |
|
|
@ -120,7 +87,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
result = mc.checkNoBoundOperator(*rewardFormula); |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 7.333329499), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(result[0] - 7.33332904), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula; |
|
|
|
|
|
|
|
apFormula = new storm::property::prctl::Ap<double>("done"); |
|
|
@ -129,7 +96,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
result = mc.checkNoBoundOperator(*rewardFormula);; |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 7.333329499), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(result[0] - 7.33333151), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula; |
|
|
|
|
|
|
|
storm::parser::AutoParser<double> stateRewardParser(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", ""); |
|
|
@ -138,7 +105,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
std::shared_ptr<storm::models::Mdp<double>> stateRewardMdp = stateRewardParser.getModel<storm::models::Mdp<double>>(); |
|
|
|
|
|
|
|
storm::modelchecker::prctl::SparseMdpPrctlModelChecker<double> stateRewardModelChecker(*stateRewardMdp, std::shared_ptr<storm::solver::NativeNondeterministicLinearEquationSolver<double>>(new storm::solver::NativeNondeterministicLinearEquationSolver<double>())); |
|
|
|
storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> stateRewardModelChecker(*stateRewardMdp); |
|
|
|
|
|
|
|
apFormula = new storm::property::prctl::Ap<double>("done"); |
|
|
|
reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula); |
|
|
@ -146,7 +113,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
result = stateRewardModelChecker.checkNoBoundOperator(*rewardFormula); |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 7.333329499), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(result[0] - 7.33332904), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula; |
|
|
|
|
|
|
|
apFormula = new storm::property::prctl::Ap<double>("done"); |
|
|
@ -155,7 +122,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
result = stateRewardModelChecker.checkNoBoundOperator(*rewardFormula); |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 7.333329499), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(result[0] - 7.33333151), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula; |
|
|
|
|
|
|
|
storm::parser::AutoParser<double> stateAndTransitionRewardParser(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"); |
|
|
@ -164,7 +131,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
std::shared_ptr<storm::models::Mdp<double>> stateAndTransitionRewardMdp = stateAndTransitionRewardParser.getModel<storm::models::Mdp<double>>(); |
|
|
|
|
|
|
|
storm::modelchecker::prctl::SparseMdpPrctlModelChecker<double> stateAndTransitionRewardModelChecker(*stateAndTransitionRewardMdp, std::shared_ptr<storm::solver::NativeNondeterministicLinearEquationSolver<double>>(new storm::solver::NativeNondeterministicLinearEquationSolver<double>())); |
|
|
|
storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> stateAndTransitionRewardModelChecker(*stateAndTransitionRewardMdp); |
|
|
|
|
|
|
|
apFormula = new storm::property::prctl::Ap<double>("done"); |
|
|
|
reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula); |
|
|
@ -172,7 +139,7 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
result = stateAndTransitionRewardModelChecker.checkNoBoundOperator(*rewardFormula); |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 14.666658998), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
ASSERT_LT(std::abs(result[0] - 14.6666581), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula; |
|
|
|
|
|
|
|
apFormula = new storm::property::prctl::Ap<double>("done"); |
|
|
@ -181,12 +148,12 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) { |
|
|
|
|
|
|
|
result = stateAndTransitionRewardModelChecker.checkNoBoundOperator(*rewardFormula); |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 14.666658998), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula;*/ |
|
|
|
ASSERT_LT(std::abs(result[0] - 14.666663), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula; |
|
|
|
} |
|
|
|
|
|
|
|
TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, AsynchronousLeader) { |
|
|
|
/*storm::settings::Settings* s = storm::settings::Settings::getInstance();
|
|
|
|
storm::settings::Settings* s = storm::settings::Settings::getInstance(); |
|
|
|
storm::parser::AutoParser<double> parser(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(parser.getType(), storm::models::MDP); |
|
|
@ -254,5 +221,5 @@ TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, AsynchronousLeader) { |
|
|
|
result = mc.checkNoBoundOperator(*rewardFormula);; |
|
|
|
|
|
|
|
ASSERT_LT(std::abs(result[0] - 4.285689611), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble()); |
|
|
|
delete rewardFormula;*/ |
|
|
|
delete rewardFormula; |
|
|
|
} |