38 boost::optional<std::vector<ConstantType>>
const& valueVector) {
39 std::vector<ConstantType> reachabilityProbabilities;
40 if (!valueVector.is_initialized()) {
43 std::unique_ptr<storm::modelchecker::CheckResult> result = instantiationModelChecker.
check(env, valuation);
44 reachabilityProbabilities = result->asExplicitQuantitativeCheckResult<ConstantType>().getValueVector();
46 STORM_LOG_ASSERT(valueVector->size() == model.getNumberOfStates(),
"Size of reachability probability vector must be equal to the size of the model.");
47 reachabilityProbabilities = *valueVector;
52 std::vector<ConstantType> interestingReachabilityProbabilities;
53 for (uint64_t i = 0; i < reachabilityProbabilities.size(); i++) {
55 interestingReachabilityProbabilities.push_back(reachabilityProbabilities[i]);
60 instantiationWatch.start();
65 for (
auto& functionResult : this->functionsUnderived) {
68 for (
auto& functionResult : this->functionsDerived.at(parameter)) {
72 auto deltaConstrainedMatrixInstantiated = deltaConstrainedMatricesInstantiated->at(parameter);
75 for (
auto& entryValuePair : this->matrixMappingUnderived) {
76 entryValuePair.first->setValue(*(entryValuePair.second));
78 for (
auto& entryValuePair : this->matrixMappingsDerived.at(parameter)) {
79 entryValuePair.first->setValue(*(entryValuePair.second));
82 std::vector<ConstantType> instantiatedDerivedOutputVec(derivedOutputVecs->at(parameter).size());
83 for (uint_fast64_t i = 0; i < derivedOutputVecs->at(parameter).size(); i++) {
84 instantiatedDerivedOutputVec[i] = utility::convertNumber<ConstantType>(derivedOutputVecs->at(parameter)[i].evaluate(valuation));
87 instantiationWatch.stop();
89 approximationWatch.start();
91 std::vector<ConstantType> resultVec(interestingReachabilityProbabilities.size());
92 deltaConstrainedMatrixInstantiated.multiplyWithVector(interestingReachabilityProbabilities, resultVec);
93 for (uint_fast64_t i = 0; i < instantiatedDerivedOutputVec.size(); ++i) {
94 resultVec[i] += instantiatedDerivedOutputVec[i];
99 auto solver = factory.
create(env);
104 solver->setMatrix(constrainedMatrixInstantiated);
105 std::vector<ConstantType> finalResult(resultVec.size());
106 solver->solveEquations(env, finalResult, resultVec);
108 approximationWatch.stop();
110 return std::make_unique<modelchecker::ExplicitQuantitativeCheckResult<ConstantType>>(finalResult);
116 this->currentFormula = checkTask.
getFormula().asSharedPointer();
117 this->currentCheckTask = std::make_unique<storm::modelchecker::CheckTask<storm::logic::Formula, FunctionType>>(
118 checkTask.
substituteFormula(*currentFormula).template convertValueType<FunctionType>());
120 if (checkTask.
getFormula().isRewardOperatorFormula()) {
122 this->parameters.insert(rewardParameter);
126 if (checkTask.
getFormula().isRewardOperatorFormula()) {
127 model.reduceToStateBasedRewards();
133 generalSetupWatch.start();
144 if (this->currentFormula->isRewardOperatorFormula()) {
146 this->currentFormula->asRewardOperatorFormula().getSubformula().asEventuallyFormula().getSubformula());
147 target = propositionalChecker.
check(subformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
149 if (this->currentFormula->asProbabilityOperatorFormula().getSubformula().isUntilFormula()) {
151 this->currentFormula->asProbabilityOperatorFormula().getSubformula().asUntilFormula().getRightSubformula());
153 this->currentFormula->asProbabilityOperatorFormula().getSubformula().asUntilFormula().getLeftSubformula());
154 target = propositionalChecker.
check(rightSubformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
155 avoid = propositionalChecker.
check(leftSubformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
159 this->currentFormula->asProbabilityOperatorFormula().getSubformula().asEventuallyFormula().getSubformula());
160 target = propositionalChecker.
check(subformula)->asExplicitQualitativeCheckResult().getTruthValuesVector();
163 initialStateModel = model.getStates(
"init").getNextSetIndex(0);
165 if (!checkTask.
getFormula().isRewardOperatorFormula()) {
174 next &= atSomePointTarget;
184 next &= targetProbOne;
187 auto transitionMatrix = model.getTransitionMatrix();
188 std::map<uint_fast64_t, uint_fast64_t> stateNumToEquationSystemRow;
189 uint_fast64_t newRow = 0;
190 for (uint_fast64_t row = 0; row < transitionMatrix.getRowCount(); ++row) {
193 stateNumToEquationSystemRow[row] = newRow;
196 initialStateEqSystem = stateNumToEquationSystemRow[initialStateModel];
199 this->constrainedMatrixEquationSystem = constrainedMatrix;
200 if (convertToEquationSystem) {
207 const ConstantType dummyValue = storm::utility::one<ConstantType>();
208 for (uint_fast64_t row = 0; row < constrainedMatrixEquationSystem.getRowCount(); ++row) {
209 for (
auto const& entry : constrainedMatrixEquationSystem.getRow(row)) {
210 instantiatedSystemBuilder.
addNextValue(row, entry.getColumn(), dummyValue);
213 constrainedMatrixInstantiated = instantiatedSystemBuilder.
build();
214 initializeInstantiatedMatrix(constrainedMatrixEquationSystem, constrainedMatrixInstantiated, matrixMappingUnderived, functionsUnderived);
218 this->derivedOutputVecs = std::make_unique<std::map<VariableType<FunctionType>, std::vector<FunctionType>>>();
225 for (
auto const& var : this->parameters) {
230 for (uint_fast64_t row = 0; row < constrainedMatrix.
getRowCount(); ++row) {
233 auto variables = rationalFunction.gatherVariables();
234 for (
auto const& var : variables) {
235 matrixBuilders.at(var).addNextValue(row, entry.getColumn(), rationalFunction.derivative(var));
236 instantiatedMatrixBuilders.at(var).addNextValue(row, entry.getColumn(), dummyValue);
241 for (
auto const& var : this->parameters) {
242 auto builtMatrix = matrixBuilders[var].build();
243 auto builtMatrixInstantiated = instantiatedMatrixBuilders[var].build();
244 initializeInstantiatedMatrix(builtMatrix, builtMatrixInstantiated, matrixMappingsDerived[var], functionsDerived[var]);
245 deltaConstrainedMatrices->emplace(var, std::move(builtMatrix));
246 deltaConstrainedMatricesInstantiated->emplace(var, std::move(builtMatrixInstantiated));
249 for (
auto const& var : this->parameters) {
250 (*derivedOutputVecs)[var] = std::vector<FunctionType>(constrainedMatrix.
getRowCount());
259 for (uint_fast64_t state = 0; state < transitionMatrix.getRowCount(); ++state) {
260 if (!stateNumToEquationSystemRow.count(state))
262 uint_fast64_t row = stateNumToEquationSystemRow[state];
265 FunctionType rationalFunction;
266 if (!checkTask.
getFormula().isRewardOperatorFormula()) {
267 FunctionType vectorValue = utility::zero<FunctionType>();
268 for (
auto const& entry : transitionMatrix.getRow(state)) {
269 if (target.
get(entry.getColumn())) {
270 vectorValue += entry.getValue();
273 rationalFunction = vectorValue;
275 std::vector<FunctionType> stateRewards;
277 stateRewards = model.getRewardModel(checkTask.
getRewardModel()).getStateRewardVector();
279 stateRewards = model.getRewardModel(
"").getStateRewardVector();
282 rationalFunction = stateRewards[state];
284 for (
auto const& var : rationalFunction.gatherVariables()) {
285 (*derivedOutputVecs)[var][row] = rationalFunction.derivative(var);
289 generalSetupWatch.stop();