37 boost::optional<std::vector<ConstantType>>
const& valueVector) {
38 std::vector<ConstantType> reachabilityProbabilities;
39 if (!valueVector.is_initialized()) {
42 std::unique_ptr<storm::modelchecker::CheckResult> result = instantiationModelChecker.
check(env, valuation);
43 reachabilityProbabilities = result->asExplicitQuantitativeCheckResult<ConstantType>().getValueVector();
45 STORM_LOG_ASSERT(valueVector->size() == model.getNumberOfStates(),
"Size of reachability probability vector must be equal to the size of the model.");
46 reachabilityProbabilities = *valueVector;
51 std::vector<ConstantType> interestingReachabilityProbabilities;
52 for (uint64_t i = 0; i < reachabilityProbabilities.size(); i++) {
54 interestingReachabilityProbabilities.push_back(reachabilityProbabilities[i]);
59 instantiationWatch.start();
64 for (
auto& functionResult : this->functionsUnderived) {
65 functionResult.second = storm::utility::parametric::evaluate<ConstantType>(functionResult.first, valuation);
67 for (
auto& functionResult : this->functionsDerived.at(parameter)) {
68 functionResult.second = storm::utility::parametric::evaluate<ConstantType>(functionResult.first, valuation);
71 auto deltaConstrainedMatrixInstantiated = deltaConstrainedMatricesInstantiated->at(parameter);
74 for (
auto& entryValuePair : this->matrixMappingUnderived) {
75 entryValuePair.first->setValue(*(entryValuePair.second));
77 for (
auto& entryValuePair : this->matrixMappingsDerived.at(parameter)) {
78 entryValuePair.first->setValue(*(entryValuePair.second));
81 std::vector<ConstantType> instantiatedDerivedOutputVec(derivedOutputVecs->at(parameter).size());
82 for (uint_fast64_t i = 0; i < derivedOutputVecs->at(parameter).size(); i++) {
83 instantiatedDerivedOutputVec[i] = storm::utility::parametric::evaluate<ConstantType>(derivedOutputVecs->at(parameter)[i], valuation);
86 instantiationWatch.stop();
88 approximationWatch.start();
90 std::vector<ConstantType> resultVec(interestingReachabilityProbabilities.size());
91 deltaConstrainedMatrixInstantiated.multiplyWithVector(interestingReachabilityProbabilities, resultVec);
92 for (uint_fast64_t i = 0; i < instantiatedDerivedOutputVec.size(); ++i) {
93 resultVec[i] += instantiatedDerivedOutputVec[i];
98 auto solver = factory.
create(env);
103 solver->setMatrix(constrainedMatrixInstantiated);
104 std::vector<ConstantType> finalResult(resultVec.size());
105 solver->solveEquations(env, finalResult, resultVec);
107 approximationWatch.stop();
109 return std::make_unique<modelchecker::ExplicitQuantitativeCheckResult<ConstantType>>(finalResult);
115 this->currentFormula = checkTask.
getFormula().asSharedPointer();
116 this->currentCheckTask = std::make_unique<storm::modelchecker::CheckTask<storm::logic::Formula, FunctionType>>(
117 checkTask.
substituteFormula(*currentFormula).template convertValueType<FunctionType>());
119 if (checkTask.
getFormula().isRewardOperatorFormula()) {
121 this->parameters.insert(rewardParameter);
125 if (checkTask.
getFormula().isRewardOperatorFormula()) {
126 model.reduceToStateBasedRewards();
132 generalSetupWatch.start();
143 if (this->currentFormula->isRewardOperatorFormula()) {
145 this->currentFormula->asRewardOperatorFormula().getSubformula().asEventuallyFormula().getSubformula());
146 target = propositionalChecker.
check(subformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
148 if (this->currentFormula->asProbabilityOperatorFormula().getSubformula().isUntilFormula()) {
150 this->currentFormula->asProbabilityOperatorFormula().getSubformula().asUntilFormula().getRightSubformula());
152 this->currentFormula->asProbabilityOperatorFormula().getSubformula().asUntilFormula().getLeftSubformula());
153 target = propositionalChecker.
check(rightSubformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
154 avoid = propositionalChecker.
check(leftSubformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
158 this->currentFormula->asProbabilityOperatorFormula().getSubformula().asEventuallyFormula().getSubformula());
159 target = propositionalChecker.
check(subformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
162 initialStateModel = model.getStates(
"init").getNextSetIndex(0);
164 if (!checkTask.
getFormula().isRewardOperatorFormula()) {
173 next &= atSomePointTarget;
183 next &= targetProbOne;
186 auto transitionMatrix = model.getTransitionMatrix();
187 std::map<uint_fast64_t, uint_fast64_t> stateNumToEquationSystemRow;
188 uint_fast64_t newRow = 0;
189 for (uint_fast64_t row = 0; row < transitionMatrix.getRowCount(); ++row) {
192 stateNumToEquationSystemRow[row] = newRow;
195 initialStateEqSystem = stateNumToEquationSystemRow[initialStateModel];
198 this->constrainedMatrixEquationSystem = constrainedMatrix;
199 if (convertToEquationSystem) {
206 const ConstantType dummyValue = storm::utility::one<ConstantType>();
207 for (uint_fast64_t row = 0; row < constrainedMatrixEquationSystem.getRowCount(); ++row) {
208 for (
auto const& entry : constrainedMatrixEquationSystem.getRow(row)) {
209 instantiatedSystemBuilder.
addNextValue(row, entry.getColumn(), dummyValue);
212 constrainedMatrixInstantiated = instantiatedSystemBuilder.
build();
213 initializeInstantiatedMatrix(constrainedMatrixEquationSystem, constrainedMatrixInstantiated, matrixMappingUnderived, functionsUnderived);
217 this->derivedOutputVecs = std::make_unique<std::map<VariableType<FunctionType>, std::vector<FunctionType>>>();
224 for (
auto const& var : this->parameters) {
229 for (uint_fast64_t row = 0; row < constrainedMatrix.
getRowCount(); ++row) {
232 auto variables = rationalFunction.gatherVariables();
233 for (
auto const& var : variables) {
234 matrixBuilders.at(var).addNextValue(row, entry.getColumn(), rationalFunction.derivative(var));
235 instantiatedMatrixBuilders.at(var).addNextValue(row, entry.getColumn(), dummyValue);
240 for (
auto const& var : this->parameters) {
241 auto builtMatrix = matrixBuilders[var].build();
242 auto builtMatrixInstantiated = instantiatedMatrixBuilders[var].build();
243 initializeInstantiatedMatrix(builtMatrix, builtMatrixInstantiated, matrixMappingsDerived[var], functionsDerived[var]);
244 deltaConstrainedMatrices->emplace(var, std::move(builtMatrix));
245 deltaConstrainedMatricesInstantiated->emplace(var, std::move(builtMatrixInstantiated));
248 for (
auto const& var : this->parameters) {
249 (*derivedOutputVecs)[var] = std::vector<FunctionType>(constrainedMatrix.
getRowCount());
258 for (uint_fast64_t state = 0; state < transitionMatrix.getRowCount(); ++state) {
259 if (!stateNumToEquationSystemRow.count(state))
261 uint_fast64_t row = stateNumToEquationSystemRow[state];
264 FunctionType rationalFunction;
265 if (!checkTask.
getFormula().isRewardOperatorFormula()) {
266 FunctionType vectorValue = utility::zero<FunctionType>();
267 for (
auto const& entry : transitionMatrix.getRow(state)) {
268 if (target.
get(entry.getColumn())) {
269 vectorValue += entry.getValue();
272 rationalFunction = vectorValue;
274 std::vector<FunctionType> stateRewards;
276 stateRewards = model.getRewardModel(checkTask.
getRewardModel()).getStateRewardVector();
278 stateRewards = model.getRewardModel(
"").getStateRewardVector();
281 rationalFunction = stateRewards[state];
283 for (
auto const& var : rationalFunction.gatherVariables()) {
284 (*derivedOutputVecs)[var][row] = rationalFunction.derivative(var);
288 generalSetupWatch.stop();