1#include "storm-config.h"
24template<
typename TransitionValueType,
typename RewardValueType>
25std::shared_ptr<storm::models::sparse::Dtmc<TransitionValueType, storm::models::sparse::StandardRewardModel<RewardValueType>>> buildDtmcWithTransitionRewards(
26 RewardValueType
const& firstReward, RewardValueType
const& secondReward) {
33 rewardBuilder.addNextValue(0, 2, firstReward);
34 rewardBuilder.addNextValue(1, 2, secondReward);
37 labeling.addLabel(
"init");
38 labeling.addLabelToState(
"init", 0);
40 transitionBuilder.build(), std::move(labeling));
41 std::optional<storm::storage::SparseMatrix<RewardValueType>> transitionRewards(rewardBuilder.build());
42 components.rewardModels.emplace(
"rew",
44 return std::make_shared<storm::models::sparse::Dtmc<TransitionValueType, storm::models::sparse::StandardRewardModel<RewardValueType>>>(
45 std::move(components));
48template<
typename TransitionValueType,
typename RewardValueType>
51 RewardValueType
const& firstReward, RewardValueType
const& secondReward) {
52 ASSERT_EQ(5ull, transformed.model->getNumberOfStates());
53 EXPECT_EQ((std::vector<uint64_t>{0, 1, 4}), transformed.originalToNewStateIndices);
55 auto const& transitionMatrix = transformed.model->getTransitionMatrix();
56 auto checkTransition = [&transitionMatrix](uint64_t row, uint64_t column) {
57 auto const rowEntries = transitionMatrix.getRow(row);
58 ASSERT_EQ(1ull, rowEntries.getNumberOfEntries());
59 auto const& entry = *rowEntries.begin();
60 EXPECT_EQ(column, entry.getColumn());
63 checkTransition(0, 2);
64 checkTransition(1, 3);
65 checkTransition(2, 4);
66 checkTransition(3, 4);
67 checkTransition(4, 4);
69 auto const& rewardModel = transformed.model->getRewardModel(
"rew");
70 ASSERT_TRUE(rewardModel.hasStateActionRewards());
71 ASSERT_FALSE(rewardModel.hasTransitionRewards());
72 auto const& actionRewards = rewardModel.getStateActionRewardVector();
73 ASSERT_EQ(5ull, actionRewards.size());
74 EXPECT_EQ(firstReward, actionRewards[2]);
75 EXPECT_EQ(secondReward, actionRewards[3]);
81 return result->asExplicitQuantitativeCheckResult<
double>()[*model->getInitialStates().begin()];
84TEST(TransitionToActionRewardTransformerTest, DtmcDie) {
86 STORM_TEST_RESOURCES_DIR
"/rew/die.coin_flips.trans.rew");
90 EXPECT_EQ(25ull, transformed.model->getNumberOfStates());
91 EXPECT_EQ(32ull, transformed.model->getNumberOfTransitions());
92 EXPECT_EQ((std::vector<uint64_t>{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24}), transformed.originalToNewStateIndices);
93 EXPECT_TRUE(transformed.model->getRewardModel(
"").hasStateActionRewards());
94 EXPECT_FALSE(transformed.model->getRewardModel(
"").hasTransitionRewards());
96 EXPECT_NEAR(11.0 / 3.0, computeInitialReward(transformed.model,
"R=? [F \"done\"]"), 1e-6);
99TEST(TransitionToActionRewardTransformerTest, CtmcDie) {
101 STORM_TEST_RESOURCES_DIR
"/tra/die.tra", STORM_TEST_RESOURCES_DIR
"/lab/die.lab",
"", STORM_TEST_RESOURCES_DIR
"/rew/die.coin_flips.trans.rew"));
106 EXPECT_EQ(25ull, transformed.model->getNumberOfStates());
107 EXPECT_EQ(32ull, transformed.model->getNumberOfTransitions());
108 EXPECT_TRUE(transformed.model->getRewardModel(
"").hasStateActionRewards());
109 EXPECT_FALSE(transformed.model->getRewardModel(
"").hasTransitionRewards());
111 EXPECT_NEAR(11.0 / 3.0, computeInitialReward(transformed.model,
"R=? [F \"done\"]"), 1e-6);
114TEST(TransitionToActionRewardTransformerTest, MdpTwoDice) {
116 STORM_TEST_RESOURCES_DIR
"/rew/two_dice.flip.trans.rew");
121 EXPECT_EQ(337ull, transformed.model->getNumberOfStates());
122 EXPECT_EQ(604ull, transformed.model->getNumberOfTransitions());
123 ASSERT_EQ(169ull, transformed.originalToNewStateIndices.size());
124 for (uint64_t state = 0; state < transformed.originalToNewStateIndices.size(); ++state) {
125 EXPECT_EQ(2 * state, transformed.originalToNewStateIndices[state]);
127 EXPECT_TRUE(transformed.model->getRewardModel(
"").hasStateActionRewards());
128 EXPECT_FALSE(transformed.model->getRewardModel(
"").hasTransitionRewards());
130 EXPECT_NEAR(22.0 / 3.0, computeInitialReward(transformed.model,
"Rmin=? [F \"done\"]"), 1e-6);
133TEST(TransitionToActionRewardTransformerTest, MarkovAutomatonGeneral) {
135 STORM_TEST_RESOURCES_DIR
"/tra/ma_general.tra", STORM_TEST_RESOURCES_DIR
"/lab/ma_general.lab", STORM_TEST_RESOURCES_DIR
"/rew/ma_general.state.rew"));
136 auto transitionRewards = model->getTransitionMatrix();
137 for (
auto& entry : transitionRewards) {
140 auto const stateRewards = model->getRewardModel(
"").getOptionalStateRewardVector();
146 EXPECT_EQ(12ull, transformed.model->getNumberOfStates());
147 EXPECT_EQ(18ull, transformed.model->getNumberOfTransitions());
148 EXPECT_EQ((std::vector<uint64_t>{1, 3, 5, 7, 9, 11}), transformed.originalToNewStateIndices);
149 EXPECT_TRUE(transformed.model->getRewardModel(
"").hasStateActionRewards());
150 EXPECT_FALSE(transformed.model->getRewardModel(
"").hasTransitionRewards());
153 EXPECT_EQ(2ull, transformedMa->getMarkovianStates().getNumberOfSetBits());
154 EXPECT_TRUE(transformedMa->isMarkovianState(1));
155 EXPECT_EQ(2.0, transformedMa->getExitRate(1));
156 EXPECT_TRUE(transformedMa->isMarkovianState(5));
157 EXPECT_EQ(15.0, transformedMa->getExitRate(5));
158 for (uint64_t state = 0; state < transformedMa->getNumberOfStates(); state += 2) {
159 EXPECT_TRUE(transformedMa->isProbabilisticState(state));
163TEST(TransitionToActionRewardTransformerTest, OverlappingIntervalRewardsAreNotMerged) {
166 auto const model = buildDtmcWithTransitionRewards<storm::Interval>(firstReward, secondReward);
170 checkTransformedDtmc(transformed, firstReward, secondReward);
173TEST(TransitionToActionRewardTransformerTest, OverlappingRationalIntervalRewardsAreNotMerged) {
176 auto const model = buildDtmcWithTransitionRewards<storm::RationalInterval>(firstReward, secondReward);
180 checkTransformedDtmc(transformed, firstReward, secondReward);
183TEST(TransitionToActionRewardTransformerTest, DoubleOverlappingIntervalRewardsAreNotMerged) {
186 auto const model = buildDtmcWithTransitionRewards<double>(firstReward, secondReward);
188 auto const transformed =
191 checkTransformedDtmc(transformed, firstReward, secondReward);
194TEST(TransitionToActionRewardTransformerTest, RationalOverlappingRationalIntervalRewardsAreNotMerged) {
197 auto const model = buildDtmcWithTransitionRewards<storm::RationalNumber>(firstReward, secondReward);
199 auto const transformed =
203 checkTransformedDtmc(transformed, firstReward, secondReward);
TEST(RegionConstraintCheckerTest, AffineConstraintHoldsThroughout)
This class represents a Markov automaton.
Base class for all sparse models.
This class manages the labeling of the state space with a number of (atomic) labels.
static std::shared_ptr< storm::models::sparse::Model< ValueType, storm::models::sparse::StandardRewardModel< RewardValueType > > > parseModel(std::string const &transitionsFilename, std::string const &labelingFilename, std::string const &stateRewardFilename="", std::string const &transitionRewardFilename="", std::string const &choiceLabelingFilename="", ExplicitModelParserOptions const &options=ExplicitModelParserOptions())
Checks the given files and parses the model within these files.
static storm::models::sparse::Ctmc< ValueType, storm::models::sparse::StandardRewardModel< RewardValueType > > parseCtmc(std::string const &transitionsFilename, std::string const &labelingFilename, std::string const &stateRewardFilename="", std::string const &transitionRewardFilename="", std::string const &choiceLabelingFilename="", ExplicitModelParserOptions const &options=ExplicitModelParserOptions())
Parse a Ctmc.
static storm::models::sparse::MarkovAutomaton< ValueType, storm::models::sparse::StandardRewardModel< RewardValueType > > parseMarkovAutomaton(std::string const &transitionsFilename, std::string const &labelingFilename, std::string const &stateRewardFilename="", std::string const &transitionRewardFilename="", std::string const &choiceLabelingFilename="", ExplicitModelParserOptions const &options=ExplicitModelParserOptions())
Parses the given Markov automaton and returns an object representing the automaton.
A class that can be used to build a sparse matrix by adding value by value.
storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > createTask(std::shared_ptr< const storm::logic::Formula > const &formula, bool onlyInitialStatesRelevant=false)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
std::unique_ptr< storm::modelchecker::CheckResult > verifyWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task, bool preferEliminationChecker=false)
carl::Interval< storm::RationalNumber > RationalInterval
carl::Interval< double > Interval
Interval type.