26void testModelB(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
29 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
31 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
41 auto simpleDtmc = binaryDtmcTransformer.transform(*dtmc,
true);
51 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> testInstantiations;
52 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> emptyInstantiation;
53 testInstantiations.push_back(emptyInstantiation);
54 for (
auto const& param : parameters) {
55 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> newInstantiations;
56 for (
auto point : testInstantiations) {
57 for (storm::RationalNumber x = storm::utility::convertNumber<storm::RationalNumber>(1e-6); x <= 1;
58 x += (1 - storm::utility::convertNumber<storm::RationalNumber>(1e-6)) / 10) {
59 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> newMap(point);
60 newMap[param] = storm::utility::convertNumber<storm::RationalFunctionCoefficient>(x);
61 newInstantiations.push_back(newMap);
64 testInstantiations = newInstantiations;
68 for (
auto const& instantiation : testInstantiations) {
69 auto result = modelChecker.
check(env, instantiation)->asExplicitQuantitativeCheckResult<
double>()[initialStateModel];
70 auto resultSimple = modelCheckerSimple.
check(env, instantiation)->asExplicitQuantitativeCheckResult<
double>()[initialStateModel];
72 <<
"Results " << result <<
" and " << resultSimple <<
" are not the same but should be.";
75 auto region = storm::api::createRegion<storm::RationalFunction>(
"0.4", *dtmc);
79 auto resultPLA = pla->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
83 auto resultPLASimple = plaSimple->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
85 ASSERT_TRUE(resultPLA == resultPLASimple) <<
"Different PLA result with simplified DTMC";
88 for (uint64_t state = 0; state < simpleDtmc->getTransitionMatrix().getRowCount(); ++state) {
89 auto row = simpleDtmc->getTransitionMatrix().getRow(state);
91 std::set<storm::RationalFunctionVariable> variables;
93 for (
auto const& entry : row) {
94 for (
auto const& variable : entry.getValue().gatherVariables()) {
95 variables.emplace(variable);
99 if (variables.size() != 0) {
100 ASSERT_TRUE(variables.size() == 1);
101 auto parameter = *variables.begin();
106 auto oneMinusParameterRational =
storm::RationalFunction(carl::makePolynomial<storm::Polynomial>(oneMinusParameter));
109 uint64_t seenOneMinusP = 0;
111 for (
auto const& entry : row) {
113 if (entry.getValue() == parameterRational) {
115 }
else if (entry.getValue() == oneMinusParameterRational) {
118 ASSERT_TRUE(
false) <<
"Value " << entry.getValue() <<
" is not simple";
123 ASSERT_TRUE(seenP == 1 && seenOneMinusP == 1) <<
"State " << state <<
" not simple";