1#include "storm-config.h"
25class RationalGmmxxEnvironment {
28 typedef storm::RationalNumber ConstantType;
35class DoubleGmmxxEnvironment {
38 typedef double ConstantType;
45class RationalEigenEnvironment {
48 typedef storm::RationalNumber ConstantType;
55class DoubleEigenEnvironment {
58 typedef double ConstantType;
65template<
typename TestType>
66class SparseDerivativeInstantiationModelCheckerTest :
public ::testing::Test {
68 typedef typename TestType::ValueType
ValueType;
69 typedef typename TestType::ConstantType ConstantType;
70 template<
typename ValueType>
72 template<
typename ValueType>
74 template<
typename ValueType>
75 using Instantiation = std::map<VariableType<storm::RationalFunction>, CoefficientType<storm::RationalFunction>>;
76 template<
typename ValueType>
77 using ResultMap = std::map<VariableType<storm::RationalFunction>, ConstantType>;
78 SparseDerivativeInstantiationModelCheckerTest() : _environment(TestType::createEnvironment()) {}
82 virtual void SetUp() {
84 GTEST_SKIP() <<
"Z3 not available.";
86 carl::VariablePool::getInstance().clear();
88 virtual void TearDown() {
89 carl::VariablePool::getInstance().clear();
92 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas,
storm::RationalFunction reachabilityFunction);
98typedef ::testing::Types<
100 RationalGmmxxEnvironment, DoubleGmmxxEnvironment,
102 RationalEigenEnvironment, DoubleEigenEnvironment>
108template<
typename TestType>
110 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas,
112 auto formulaWithoutBound = std::make_shared<storm::logic::ProbabilityOperatorFormula>(
119 for (
auto const& parameter : parameters) {
120 derivatives[parameter] = reachabilityFunction.derivative(parameter);
124 std::vector<Instantiation<storm::RationalFunction>> testInstantiations;
125 Instantiation<storm::RationalFunction> emptyInstantiation;
126 testInstantiations.push_back(emptyInstantiation);
127 for (
auto const& param : parameters) {
128 std::vector<Instantiation<storm::RationalFunction>> newInstantiations;
129 for (
auto point : testInstantiations) {
130 for (
typename TestType::ConstantType x = storm::utility::convertNumber<ConstantType>(1e-6); x <= 1;
131 x += (1 - storm::utility::convertNumber<ConstantType>(1e-6)) / 10) {
132 std::map<VariableType<storm::RationalFunction>, CoefficientType<storm::RationalFunction>> newMap(point);
133 newMap[param] = storm::utility::convertNumber<CoefficientType<storm::RationalFunction>>(x);
134 newInstantiations.push_back(newMap);
137 testInstantiations = newInstantiations;
142 std::map<Instantiation<storm::RationalFunction>, ResultMap<storm::RationalFunction>> testCases;
143 for (
auto const& instantiation : testInstantiations) {
144 ResultMap<storm::RationalFunction> resultMap;
145 for (
auto const& entry : instantiation) {
146 auto parameter = entry.first;
147 auto derivativeWrtParameter = derivatives[parameter];
148 resultMap[parameter] = storm::utility::parametric::evaluate<typename TestType::ConstantType>(derivativeWrtParameter, instantiation);
150 testCases[instantiation] = resultMap;
154 derivativeModelChecker.specifyFormula(env(), checkTask);
156 for (
auto const& testCase : testCases) {
157 Instantiation<ValueType> instantiation = testCase.first;
158 for (
auto const& position : instantiation) {
159 auto parameter = position.first;
160 auto parameterValue = position.second;
161 auto expectedResult = testCase.second.at(parameter);
163 auto derivative = derivativeModelChecker.check(env(), instantiation, parameter);
164 ASSERT_NEAR(storm::utility::convertNumber<double>(derivative->getValueVector()[0]), storm::utility::convertNumber<double>(expectedResult), 1e-6)
171TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Simple) {
172 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/gradient1.pm";
173 std::string formulaAsString =
"Pmax=? [F s=2]";
174 std::string constantsAsString =
"";
179 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
181 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
185 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
186 model = simplifier.getSimplifiedModel();
190 carl::Variable varP = carl::VariablePool::getInstance().findVariableWithName(
"p");
191 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
195 this->
testModel(dtmc, formulas, reachabilityFunction);
199TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Simple2) {
200 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/gradient2.pm";
201 std::string formulaAsString =
"Pmax=? [F s=2]";
202 std::string constantsAsString =
"";
207 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
209 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
213 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
214 model = simplifier.getSimplifiedModel();
218 carl::Variable varP = carl::VariablePool::getInstance().findVariableWithName(
"p");
219 carl::Variable varQ = carl::VariablePool::getInstance().findVariableWithName(
"q");
220 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
225 this->
testModel(dtmc, formulas, reachabilityFunction);
229TYPED_TEST(SparseDerivativeInstantiationModelCheckerTest, Brp162) {
230 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
231 std::string formulaAsString =
"Pmax=? [F s=4 & i=N ]";
232 std::string constantsAsString =
"";
237 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
239 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
243 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
244 model = simplifier.getSimplifiedModel();
247 carl::Variable pLVar = carl::VariablePool::getInstance().findVariableWithName(
"pL");
248 carl::Variable pKVar = carl::VariablePool::getInstance().findVariableWithName(
"pK");
249 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
254 auto firstTerm = pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK * pK;
255 auto secondTerm = pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL * pL;
256 auto thirdTermUnpowed = pK * pK * pL * pL + (-3) * pK * pL + 3;
257 auto thirdTerm = thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed *
258 thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed * thirdTermUnpowed *
259 thirdTermUnpowed * thirdTermUnpowed;
262 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)
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)
typename utility::parametric::VariableType< FunctionType >::type VariableType
typename utility::parametric::CoefficientType< FunctionType >::type CoefficientType
SFTBDDChecker::ValueType ValueType
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
carl::RationalFunction< Polynomial, true > RationalFunction
carl::MultivariatePolynomial< RationalFunctionCoefficient > RawPolynomial
::testing::Types< Cudd, Sylvan > TestingTypes