1#include "storm-config.h"
16class RationalGmmxxEnvironment {
19 typedef storm::RationalNumber ConstantType;
20 static storm::Environment createEnvironment() {
21 storm::Environment env;
26class DoubleGmmxxEnvironment {
29 typedef double ConstantType;
30 static storm::Environment createEnvironment() {
31 storm::Environment env;
36class RationalEigenEnvironment {
39 typedef storm::RationalNumber ConstantType;
40 static storm::Environment createEnvironment() {
41 storm::Environment env;
46class DoubleEigenEnvironment {
49 typedef double ConstantType;
50 static storm::Environment createEnvironment() {
51 storm::Environment env;
56template<
typename TestType>
57class SparseDerivativeInstantiationModelCheckerTest :
public ::testing::Test {
59 typedef typename TestType::ValueType ValueType;
60 typedef typename TestType::ConstantType ConstantType;
61 template<
typename ValueType>
63 template<
typename ValueType>
65 template<
typename ValueType>
66 using Instantiation = std::map<VariableType<storm::RationalFunction>, CoefficientType<storm::RationalFunction>>;
67 template<
typename ValueType>
68 using ResultMap = std::map<VariableType<storm::RationalFunction>, ConstantType>;
69 SparseDerivativeInstantiationModelCheckerTest() : _environment(TestType::createEnvironment()) {}
70 storm::Environment
const& env()
const {
73 virtual void SetUp() {
75 GTEST_SKIP() <<
"Z3 not available.";
77 carl::VariablePool::getInstance().clear();
79 virtual void TearDown() {
80 carl::VariablePool::getInstance().clear();
82 void testModel(std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc,
83 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas,
storm::RationalFunction reachabilityFunction);
86 storm::Environment _environment;
89typedef ::testing::Types<
91 RationalGmmxxEnvironment, DoubleGmmxxEnvironment,
93 RationalEigenEnvironment, DoubleEigenEnvironment>
99template<
typename TestType>
101 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas,
103 auto formulaWithoutBound = std::make_shared<storm::logic::ProbabilityOperatorFormula>(
110 for (
auto const& parameter : parameters) {
111 derivatives[parameter] = reachabilityFunction.derivative(parameter);
115 std::vector<Instantiation<storm::RationalFunction>> testInstantiations;
116 Instantiation<storm::RationalFunction> emptyInstantiation;
117 testInstantiations.push_back(emptyInstantiation);
118 for (
auto const& param : parameters) {
119 std::vector<Instantiation<storm::RationalFunction>> newInstantiations;
120 for (
auto point : testInstantiations) {
123 std::map<VariableType<storm::RationalFunction>, CoefficientType<storm::RationalFunction>> newMap(point);
125 newInstantiations.push_back(newMap);
128 testInstantiations = newInstantiations;
133 std::map<Instantiation<storm::RationalFunction>, ResultMap<storm::RationalFunction>> testCases;
134 for (
auto const& instantiation : testInstantiations) {
135 ResultMap<storm::RationalFunction> resultMap;
136 for (
auto const& entry : instantiation) {
137 auto parameter = entry.first;
138 auto derivativeWrtParameter = derivatives[parameter];
141 testCases[instantiation] = resultMap;
145 derivativeModelChecker.specifyFormula(env(), checkTask);
147 for (
auto const& testCase : testCases) {
148 Instantiation<ValueType> instantiation = testCase.first;
149 for (
auto const& position : instantiation) {
150 auto parameter = position.first;
151 auto parameterValue = position.second;
152 auto expectedResult = testCase.second.at(parameter);
154 auto derivative = derivativeModelChecker.check(env(), instantiation, parameter);
162TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Simple) {
163 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/gradient1.pm";
164 std::string formulaAsString =
"Pmax=? [F s=2]";
165 std::string constantsAsString =
"";
170 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
172 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
176 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
177 model = simplifier.getSimplifiedModel();
181 carl::Variable varP = carl::VariablePool::getInstance().findVariableWithName(
"p");
182 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
186 this->
testModel(dtmc, formulas, reachabilityFunction);
190TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Simple2) {
191 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/gradient2.pm";
192 std::string formulaAsString =
"Pmax=? [F s=2]";
193 std::string constantsAsString =
"";
198 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
200 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
204 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
205 model = simplifier.getSimplifiedModel();
209 carl::Variable varP = carl::VariablePool::getInstance().findVariableWithName(
"p");
210 carl::Variable varQ = carl::VariablePool::getInstance().findVariableWithName(
"q");
211 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
216 this->
testModel(dtmc, formulas, reachabilityFunction);
220TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Brp162) {
221 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
222 std::string formulaAsString =
"Pmax=? [F s=4 & i=N ]";
223 std::string constantsAsString =
"";
228 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
230 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
234 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
235 model = simplifier.getSimplifiedModel();
238 carl::Variable pLVar = carl::VariablePool::getInstance().findVariableWithName(
"pL");
239 carl::Variable pKVar = carl::VariablePool::getInstance().findVariableWithName(
"pK");
240 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
245 auto firstTerm = pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK;
246 auto secondTerm = pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL;
247 auto thirdTermUnpowed = pK * pK * pL * pL + (-3) * pK * pL + 3;
248 auto thirdTerm = thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed *
249 thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed *
250 thirdTermUnpowed * thirdTermUnpowed;
253 this->
testModel(dtmc, formulas, reachabilityFunction);
void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString)
TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Simple)
TYPED_TEST_SUITE(SparseDerivativeInstantiationModelCheckerTest, TestingTypes,)
SolverEnvironment & solver()
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
std::shared_ptr< ModelType > as()
Casts the model into the model type given by the template parameter.
This class represents a discrete-time Markov chain.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options)
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)
SFTBDDChecker::ValueType ValueType
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
double evaluate(storm::RationalFunction const &function, Valuation< storm::RationalFunction > const &valuation)
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
TargetType convertNumber(SourceType const &number)
carl::FactorizedPolynomial< RawPolynomial > Polynomial
carl::RationalFunction< Polynomial, true > RationalFunction
carl::MultivariatePolynomial< RationalFunctionCoefficient > RawPolynomial
::testing::Types< Cudd, Sylvan > TestingTypes