1#include "storm-config.h"
6#include <carl/core/VariablePool.h>
7#include <carl/numbers/numbers.h>
22class ModelInstantiatorTest :
public ::testing::Test {
24 void SetUp()
override {
26 GTEST_SKIP() <<
"Z3 not available.";
31TEST_F(ModelInstantiatorTest, BrpProb) {
32 carl::VariablePool::getInstance().clear();
34 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
35 std::string formulaAsString =
"P=? [F s=5 ]";
40 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
42 ASSERT_TRUE(formulas.size() == 1);
45 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc =
49 EXPECT_FALSE(dtmc->hasRewardModel());
52 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> valuation;
54 ASSERT_NE(pL, carl::Variable::NO_VARIABLE);
56 ASSERT_NE(pK, carl::Variable::NO_VARIABLE);
57 valuation.insert(std::make_pair(pL, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.8)));
58 valuation.insert(std::make_pair(pK, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.9)));
62 ASSERT_EQ(dtmc->getTransitionMatrix().getRowGroupIndices(), instantiated.getTransitionMatrix().getRowGroupIndices());
63 for (std::size_t rowGroup = 0; rowGroup < dtmc->getTransitionMatrix().getRowGroupCount(); ++rowGroup) {
64 for (std::size_t row = dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup];
65 row < dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup + 1]; ++row) {
66 auto instantiatedEntry = instantiated.getTransitionMatrix().getRow(row).begin();
67 for (
auto const& paramEntry : dtmc->getTransitionMatrix().getRow(row)) {
68 EXPECT_EQ(paramEntry.getColumn(), instantiatedEntry->getColumn());
69 double evaluatedValue = carl::toDouble(paramEntry.getValue().evaluate(valuation));
70 EXPECT_EQ(evaluatedValue, instantiatedEntry->getValue());
73 EXPECT_EQ(instantiated.getTransitionMatrix().getRow(row).end(), instantiatedEntry);
76 EXPECT_EQ(dtmc->getStateLabeling(), instantiated.getStateLabeling());
77 EXPECT_EQ(dtmc->getOptionalChoiceLabeling(), instantiated.getOptionalChoiceLabeling());
80 std::unique_ptr<storm::modelchecker::CheckResult> chkResult = modelchecker.check(*formulas[0]);
82 EXPECT_NEAR(0.2989278941, quantitativeChkResult[*instantiated.getInitialStates().begin()],
83 storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
87 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> valuation;
89 ASSERT_NE(pL, carl::Variable::NO_VARIABLE);
91 ASSERT_NE(pK, carl::Variable::NO_VARIABLE);
92 valuation.insert(std::make_pair(pL, storm::utility::one<storm::RationalFunctionCoefficient>()));
93 valuation.insert(std::make_pair(pK, storm::utility::one<storm::RationalFunctionCoefficient>()));
97 ASSERT_EQ(dtmc->getTransitionMatrix().getRowGroupIndices(), instantiated.getTransitionMatrix().getRowGroupIndices());
98 for (std::size_t rowGroup = 0; rowGroup < dtmc->getTransitionMatrix().getRowGroupCount(); ++rowGroup) {
99 for (std::size_t row = dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup];
100 row < dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup + 1]; ++row) {
101 auto instantiatedEntry = instantiated.getTransitionMatrix().getRow(row).begin();
102 for (
auto const& paramEntry : dtmc->getTransitionMatrix().getRow(row)) {
103 EXPECT_EQ(paramEntry.getColumn(), instantiatedEntry->getColumn());
104 double evaluatedValue = carl::toDouble(paramEntry.getValue().evaluate(valuation));
105 EXPECT_EQ(evaluatedValue, instantiatedEntry->getValue());
108 EXPECT_EQ(instantiated.getTransitionMatrix().getRow(row).end(), instantiatedEntry);
111 EXPECT_EQ(dtmc->getStateLabeling(), instantiated.getStateLabeling());
112 EXPECT_EQ(dtmc->getOptionalChoiceLabeling(), instantiated.getOptionalChoiceLabeling());
115 std::unique_ptr<storm::modelchecker::CheckResult> chkResult = modelchecker.check(*formulas[0]);
117 EXPECT_EQ(0.0, quantitativeChkResult[*instantiated.getInitialStates().begin()]);
121 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> valuation;
123 ASSERT_NE(pL, carl::Variable::NO_VARIABLE);
125 ASSERT_NE(pK, carl::Variable::NO_VARIABLE);
126 valuation.insert(std::make_pair(pL, storm::utility::one<storm::RationalFunctionCoefficient>()));
127 valuation.insert(std::make_pair(pK, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.9)));
131 ASSERT_EQ(dtmc->getTransitionMatrix().getRowGroupIndices(), instantiated.getTransitionMatrix().getRowGroupIndices());
132 for (std::size_t rowGroup = 0; rowGroup < dtmc->getTransitionMatrix().getRowGroupCount(); ++rowGroup) {
133 for (std::size_t row = dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup];
134 row < dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup + 1]; ++row) {
135 auto instantiatedEntry = instantiated.getTransitionMatrix().getRow(row).begin();
136 for (
auto const& paramEntry : dtmc->getTransitionMatrix().getRow(row)) {
137 EXPECT_EQ(paramEntry.getColumn(), instantiatedEntry->getColumn());
138 double evaluatedValue = carl::toDouble(paramEntry.getValue().evaluate(valuation));
139 EXPECT_EQ(evaluatedValue, instantiatedEntry->getValue());
142 EXPECT_EQ(instantiated.getTransitionMatrix().getRow(row).end(), instantiatedEntry);
145 EXPECT_EQ(dtmc->getStateLabeling(), instantiated.getStateLabeling());
146 EXPECT_EQ(dtmc->getOptionalChoiceLabeling(), instantiated.getOptionalChoiceLabeling());
149 std::unique_ptr<storm::modelchecker::CheckResult> chkResult = modelchecker.check(*formulas[0]);
151 EXPECT_NEAR(0.01588055832, quantitativeChkResult[*instantiated.getInitialStates().begin()],
152 storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
156TEST_F(ModelInstantiatorTest, Brp_Rew) {
157 carl::VariablePool::getInstance().clear();
159 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
160 std::string formulaAsString =
"R=? [F ((s=5) | (s=0&srep=3)) ]";
165 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
167 ASSERT_TRUE(formulas.size() == 1);
170 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc =
176 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> valuation;
178 ASSERT_NE(pL, carl::Variable::NO_VARIABLE);
180 ASSERT_NE(pK, carl::Variable::NO_VARIABLE);
182 ASSERT_NE(pK, carl::Variable::NO_VARIABLE);
184 ASSERT_NE(pK, carl::Variable::NO_VARIABLE);
185 valuation.insert(std::make_pair(pL, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.9)));
186 valuation.insert(std::make_pair(pK, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.3)));
187 valuation.insert(std::make_pair(TOMsg, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.3)));
188 valuation.insert(std::make_pair(TOAck, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.5)));
192 ASSERT_EQ(dtmc->getTransitionMatrix().getRowGroupIndices(), instantiated.getTransitionMatrix().getRowGroupIndices());
193 for (std::size_t rowGroup = 0; rowGroup < dtmc->getTransitionMatrix().getRowGroupCount(); ++rowGroup) {
194 for (std::size_t row = dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup];
195 row < dtmc->getTransitionMatrix().getRowGroupIndices()[rowGroup + 1]; ++row) {
196 auto instantiatedEntry = instantiated.getTransitionMatrix().getRow(row).begin();
197 for (
auto const& paramEntry : dtmc->getTransitionMatrix().getRow(row)) {
198 EXPECT_EQ(paramEntry.getColumn(), instantiatedEntry->getColumn());
199 double evaluatedValue = carl::toDouble(paramEntry.getValue().evaluate(valuation));
200 EXPECT_EQ(evaluatedValue, instantiatedEntry->getValue());
203 EXPECT_EQ(instantiated.getTransitionMatrix().getRow(row).end(), instantiatedEntry);
206 ASSERT_TRUE(instantiated.hasUniqueRewardModel());
207 EXPECT_FALSE(instantiated.getUniqueRewardModel().hasStateRewards());
208 EXPECT_FALSE(instantiated.getUniqueRewardModel().hasTransitionRewards());
209 EXPECT_TRUE(instantiated.getUniqueRewardModel().hasStateActionRewards());
210 ASSERT_TRUE(dtmc->getUniqueRewardModel().hasStateActionRewards());
211 std::size_t stateActionEntries = dtmc->getUniqueRewardModel().getStateActionRewardVector().size();
212 ASSERT_EQ(stateActionEntries, instantiated.getUniqueRewardModel().getStateActionRewardVector().size());
213 for (std::size_t i = 0;
i < stateActionEntries; ++
i) {
214 double evaluatedValue = carl::toDouble(dtmc->getUniqueRewardModel().getStateActionRewardVector()[i].evaluate(valuation));
215 EXPECT_EQ(evaluatedValue, instantiated.getUniqueRewardModel().getStateActionRewardVector()[i]);
217 EXPECT_EQ(dtmc->getStateLabeling(), instantiated.getStateLabeling());
218 EXPECT_EQ(dtmc->getOptionalChoiceLabeling(), instantiated.getOptionalChoiceLabeling());
221 std::unique_ptr<storm::modelchecker::CheckResult> chkResult = modelchecker.check(*formulas[0]);
223 EXPECT_NEAR(1.308324495, quantitativeChkResult[*instantiated.getInitialStates().begin()],
224 storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
228TEST_F(ModelInstantiatorTest, Consensus) {
229 carl::VariablePool::getInstance().clear();
231 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pmdp/coin2_2.nm";
232 std::string formulaAsString =
"Pmin=? [F \"finished\"&\"all_coins_equal_1\" ]";
237 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
239 ASSERT_TRUE(formulas.size() == 1);
242 std::shared_ptr<storm::models::sparse::Mdp<storm::RationalFunction>> mdp =
247 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> valuation;
249 ASSERT_NE(p1, carl::Variable::NO_VARIABLE);
251 ASSERT_NE(p2, carl::Variable::NO_VARIABLE);
252 valuation.insert(std::make_pair(p1, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.51)));
253 valuation.insert(std::make_pair(p2, storm::utility::convertNumber<storm::RationalFunctionCoefficient>(0.49)));
256 ASSERT_EQ(mdp->getTransitionMatrix().getRowGroupIndices(), instantiated.getTransitionMatrix().getRowGroupIndices());
257 for (std::size_t rowGroup = 0; rowGroup < mdp->getTransitionMatrix().getRowGroupCount(); ++rowGroup) {
258 for (std::size_t row = mdp->getTransitionMatrix().getRowGroupIndices()[rowGroup]; row < mdp->getTransitionMatrix().getRowGroupIndices()[rowGroup + 1];
260 auto instantiatedEntry = instantiated.getTransitionMatrix().getRow(row).begin();
261 for (
auto const& paramEntry : mdp->getTransitionMatrix().getRow(row)) {
262 EXPECT_EQ(paramEntry.getColumn(), instantiatedEntry->getColumn());
263 double evaluatedValue = carl::toDouble(paramEntry.getValue().evaluate(valuation));
264 EXPECT_EQ(evaluatedValue, instantiatedEntry->getValue());
267 EXPECT_EQ(instantiated.getTransitionMatrix().getRow(row).end(), instantiatedEntry);
270 EXPECT_EQ(mdp->getStateLabeling(), instantiated.getStateLabeling());
271 EXPECT_EQ(mdp->getOptionalChoiceLabeling(), instantiated.getOptionalChoiceLabeling());
274 std::unique_ptr<storm::modelchecker::CheckResult> chkResult = modelchecker.check(*formulas[0]);
276 EXPECT_NEAR(0.3526577219, quantitativeChkResult[*instantiated.getInitialStates().begin()],
277 storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
TEST_F(AssumptionCheckerTest, Brp_no_bisimulation)
std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > build()
Convert the program given at construction time to an abstract model.
ExplicitQuantitativeCheckResult< ValueType > & asExplicitQuantitativeCheckResult()
This class represents a discrete-time Markov chain.
This class represents a (discrete-time) Markov decision process.
void checkValidity(Program::ValidityCheckLevel lvl=Program::ValidityCheckLevel::READYFORPROCESSING) const
Checks the validity of the program.
This class allows efficient instantiation of the given parametric model.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
carl::Variable RationalFunctionVariable