22template<
typename ValueType,
typename ConstantType>
26 this->matrix = model->getTransitionMatrix();
27 this->numberOfStates = this->model->getNumberOfStates();
28 this->formula = formula;
32template<
typename ValueType,
typename ConstantType>
36 this->matrix = matrix;
37 this->model =
nullptr;
44 std::vector<uint64_t> firstStates;
47 for (
auto state : *topStates) {
48 firstStates.push_back(state);
49 subStates.
set(state,
false);
51 for (
auto state : *bottomStates) {
52 firstStates.push_back(state);
53 subStates.
set(state,
false);
62 this->bottomTopOrder = std::shared_ptr<Order>(
new Order(topStates, bottomStates, numberOfStates, std::move(decomposition), std::move(statesSorted)));
65 for (uint_fast64_t state = 0; state < numberOfStates; ++state) {
66 auto const& row = matrix.
getRow(state);
67 stateMap[state] = std::vector<uint_fast64_t>();
68 std::set<VariableType> occurringVariables;
70 for (
auto& entry : matrix.
getRow(state)) {
72 if (state != entry.getColumn() || row.getNumberOfEntries() == 1) {
73 if (!subStates[entry.getColumn()] && !bottomTopOrder->contains(state)) {
74 bottomTopOrder->add(state);
76 stateMap[state].push_back(entry.getColumn());
80 if (occurringVariables.empty()) {
81 nonParametricStates.insert(state);
84 for (
auto& var : occurringVariables) {
85 occuringStatesAtVariable[var].push_back(state);
87 occuringVariablesAtState.push_back(std::move(occurringVariables));
93template<
typename ValueType,
typename ConstantType>
95 if (bottomTopOrder ==
nullptr) {
96 assert(model !=
nullptr);
97 STORM_LOG_THROW(matrix.getRowCount() == matrix.getColumnCount(), exceptions::NotSupportedException,
98 "Creating order not supported for non-square matrix");
102 assert(formula->isProbabilityOperatorFormula());
103 if (formula->asProbabilityOperatorFormula().getSubformula().isUntilFormula()) {
104 phiStates = propositionalChecker.check(formula->asProbabilityOperatorFormula().getSubformula().asUntilFormula().getLeftSubformula())
105 ->asExplicitQualitativeCheckResult()
106 .getTruthValuesVector();
107 psiStates = propositionalChecker.check(formula->asProbabilityOperatorFormula().getSubformula().asUntilFormula().getRightSubformula())
108 ->asExplicitQualitativeCheckResult()
109 .getTruthValuesVector();
111 assert(formula->asProbabilityOperatorFormula().getSubformula().isEventuallyFormula());
113 psiStates = propositionalChecker.check(formula->asProbabilityOperatorFormula().getSubformula().asEventuallyFormula().getSubformula())
114 ->asExplicitQualitativeCheckResult()
115 .getTruthValuesVector();
118 std::pair<storage::BitVector, storage::BitVector> statesWithProbability01 =
120 storage::BitVector topStates = statesWithProbability01.second;
121 storage::BitVector bottomStates = statesWithProbability01.first;
123 STORM_LOG_THROW(topStates.begin() != topStates.end(), exceptions::NotSupportedException,
"Formula yields to no 1 states");
124 STORM_LOG_THROW(bottomStates.begin() != bottomStates.end(), exceptions::NotSupportedException,
"Formula yields to no zero states");
125 auto& matrix = this->model->getTransitionMatrix();
126 std::vector<uint64_t> firstStates;
129 for (
auto state : topStates) {
130 firstStates.push_back(state);
131 subStates.set(state,
false);
133 for (
auto state : bottomStates) {
134 firstStates.push_back(state);
135 subStates.set(state,
false);
145 bottomTopOrder = std::shared_ptr<Order>(
new Order(&topStates, &bottomStates, numberOfStates, std::move(decomposition), std::move(statesSorted)));
148 for (uint_fast64_t state = 0; state < numberOfStates; ++state) {
149 auto const& row = matrix.getRow(state);
150 stateMap[state] = std::vector<uint_fast64_t>();
151 std::set<VariableType> occurringVariables;
153 for (
auto& entry : matrix.getRow(state)) {
155 if (state != entry.getColumn() || row.getNumberOfEntries() == 1) {
159 stateMap[state].push_back(entry.getColumn());
163 if (occurringVariables.empty()) {
164 nonParametricStates.insert(state);
167 for (
auto& var : occurringVariables) {
168 occuringStatesAtVariable[var].push_back(state);
170 occuringVariablesAtState.push_back(std::move(occurringVariables));
174 if (minValuesInit && maxValuesInit) {
175 continueExtending[bottomTopOrder] =
true;
176 usePLA[bottomTopOrder] =
true;
177 minValues[bottomTopOrder] = std::move(minValuesInit.get());
178 maxValues[bottomTopOrder] = std::move(maxValuesInit.get());
180 usePLA[bottomTopOrder] =
false;
182 return bottomTopOrder;
185template<
typename ValueType,
typename ConstantType>
188 return this->extendOrder(
nullptr, region, monRes,
nullptr);
191template<
typename ValueType,
typename ConstantType>
193 std::shared_ptr<expressions::BinaryRelationExpression> assumption)
const {
194 assert(assumption !=
nullptr);
195 assert(assumption->getFirstOperand()->isVariable() && assumption->getSecondOperand()->isVariable());
199 auto const& val1 = std::stoul(var1.
getName(),
nullptr, 0);
200 auto const& val2 = std::stoul(var2.
getName(),
nullptr, 0);
208 if (n1 !=
nullptr && n2 !=
nullptr) {
209 order->mergeNodes(n1, n2);
210 }
else if (n1 !=
nullptr) {
211 order->addToNode(val2, n1);
212 }
else if (n2 !=
nullptr) {
213 order->addToNode(val1, n2);
216 order->addToNode(val2, order->getNode(val1));
220 if (n1 !=
nullptr && n2 !=
nullptr) {
221 order->addRelationNodes(n1, n2);
222 }
else if (n1 !=
nullptr) {
223 order->addBetween(val2, n1, order->getBottom());
224 }
else if (n2 !=
nullptr) {
225 order->addBetween(val1, order->getTop(), n2);
228 order->addBetween(val2, order->getNode(val1), order->getBottom());
233template<
typename ValueType,
typename ConstantType>
236 std::shared_ptr<expressions::BinaryRelationExpression> assumption) {
237 this->region = region;
238 if (order ==
nullptr) {
239 order = getBottomTopOrder();
241 auto& min = minValues[order];
242 auto& max = maxValues[order];
244 auto& statesSorted = order->getStatesSorted();
245 auto itr = statesSorted.begin();
246 while (itr != statesSorted.end()) {
248 auto& successors = stateMap[state];
250 for (uint_fast64_t i = 0; i < successors.size(); ++i) {
251 auto state1 = successors[i];
252 for (uint_fast64_t j = i + 1; j < successors.size(); ++j) {
253 auto state2 = successors[j];
254 if (min[state1] > max[state2]) {
255 if (!order->contains(state1)) {
258 if (!order->contains(state2)) {
261 order->addRelation(state1, state2,
false);
262 }
else if (min[state2] > max[state1]) {
263 if (!order->contains(state1)) {
266 if (!order->contains(state2)) {
269 order->addRelation(state2, state1,
false);
270 }
else if (min[state1] == max[state2] && max[state1] == min[state2]) {
271 if (!order->contains(state1) && !order->contains(state2)) {
273 order->addToNode(state2, order->getNode(state1));
274 }
else if (!order->contains(state1)) {
275 order->addToNode(state1, order->getNode(state2));
276 }
else if (!order->contains(state2)) {
277 order->addToNode(state2, order->getNode(state1));
279 order->merge(state1, state2);
280 assert(!order->isInvalid());
288 STORM_LOG_INFO(
"All successors of state " << state <<
" sorted based on min max values");
293 continueExtending[order] =
true;
295 if (continueExtending[order] || assumption !=
nullptr) {
296 return extendOrder(order, monRes, assumption);
298 auto& res = unknownStatesMap[order];
299 continueExtending[order] =
false;
300 return {order, res.first, res.second};
304template<
typename ValueType,
typename ConstantType>
306 std::shared_ptr<Order> order, std::shared_ptr<
MonotonicityResult<VariableType>> monRes, std::shared_ptr<expressions::BinaryRelationExpression> assumption) {
307 if (assumption !=
nullptr) {
309 handleAssumption(order, assumption);
312 auto currentStateMode = getNextState(order, numberOfStates,
false);
313 while (currentStateMode.first != numberOfStates) {
314 assert(currentStateMode.first < numberOfStates);
315 auto& currentState = currentStateMode.first;
316 auto& successors = stateMap[currentState];
317 std::pair<uint_fast64_t, uint_fast64_t> result = {numberOfStates, numberOfStates};
319 if (successors.size() == 1) {
320 assert(order->contains(successors[0]));
321 handleOneSuccessor(order, currentState, successors[0]);
322 }
else if (!successors.empty()) {
323 if (order->isOnlyBottomTopOrder()) {
324 order->add(currentState);
325 if (!order->isTrivial(currentState)) {
327 result = extendByForwardReasoning(order, currentState, successors, assumption !=
nullptr);
329 result = {numberOfStates, numberOfStates};
332 result = extendNormal(order, currentState, successors, assumption !=
nullptr);
336 if (result.first == numberOfStates) {
338 assert(result.second == numberOfStates);
339 assert(order->sortStates(&successors).size() == successors.size());
340 assert(order->contains(currentState) && order->getNode(currentState) !=
nullptr);
342 if (monRes !=
nullptr) {
343 for (
auto& param : occuringVariablesAtState[currentState]) {
344 checkParOnStateMonRes(currentState, order, param, monRes);
348 currentStateMode = getNextState(order, currentState,
true);
350 assert(result.first < numberOfStates);
351 assert(result.second < numberOfStates);
352 assert(order->compare(result.first, result.second) ==
Order::UNKNOWN);
353 assert(order->compare(result.second, result.first) ==
Order::UNKNOWN);
355 if (currentStateMode.second && extendByAssumption(order, result.first, result.second)) {
359 if (nonParametricStates.find(currentState) != nonParametricStates.end()) {
360 if (!order->contains(currentState)) {
362 order->add(currentState);
364 currentStateMode = getNextState(order, currentState,
true);
367 if (!currentStateMode.second) {
369 currentStateMode = getNextState(order, currentState,
false);
374 order->addStateSorted(currentState);
375 continueExtending[order] =
false;
376 return {order, result.first, result.second};
380 assert(order->sortStates(&successors).size() == successors.size());
383 assert(order->getDoneBuilding());
384 if (monRes !=
nullptr) {
388 return std::make_tuple(order, numberOfStates, numberOfStates);
391template<
typename ValueType,
typename ConstantType>
392std::pair<uint_fast64_t, uint_fast64_t> OrderExtender<ValueType, ConstantType>::extendNormal(std::shared_ptr<Order> order, uint_fast64_t currentState,
393 const std::vector<uint_fast64_t>& successors,
bool allowMerge) {
395 if (cyclic && !order->isTrivial(currentState) && order->contains(currentState)) {
397 return extendByForwardReasoning(order, currentState, successors, allowMerge);
399 assert(order->isTrivial(currentState) || !order->contains(currentState));
401 return extendByBackwardReasoning(order, currentState, successors, allowMerge);
405template<
typename ValueType,
typename ConstantType>
406void OrderExtender<ValueType, ConstantType>::handleOneSuccessor(std::shared_ptr<Order> order, uint_fast64_t currentState, uint_fast64_t successor) {
407 assert(order->contains(successor));
408 if (currentState != successor) {
409 if (order->contains(currentState)) {
410 order->merge(currentState, successor);
412 order->addToNode(currentState, order->getNode(successor));
417template<
typename ValueType,
typename ConstantType>
418std::pair<uint_fast64_t, uint_fast64_t> OrderExtender<ValueType, ConstantType>::extendByBackwardReasoning(std::shared_ptr<Order> order,
419 uint_fast64_t currentState,
420 std::vector<uint_fast64_t>
const& successors,
422 assert(!order->isOnlyBottomTopOrder());
423 assert(successors.size() > 1);
425 bool pla = (usePLA.find(order) != usePLA.end() && usePLA.at(order));
426 std::vector<uint_fast64_t> sortedSuccs;
428 if (pla && (continueExtending.find(order) == continueExtending.end() || continueExtending.at(order))) {
429 for (
auto& state1 : successors) {
430 if (sortedSuccs.size() == 0) {
431 sortedSuccs.push_back(state1);
434 for (
auto itr = sortedSuccs.begin(); itr != sortedSuccs.end(); ++itr) {
436 auto compareRes = order->compareFast(state1, state2);
438 compareRes = addStatesBasedOnMinMax(order, state1, state2);
442 compareRes = order->compare(state1, state2);
446 sortedSuccs.insert(itr, state1);
450 continueExtending[order] =
false;
451 return {state1, state2};
455 sortedSuccs.push_back(state1);
460 auto temp = order->sortStatesUnorderedPair(&successors);
461 if (temp.first.first != numberOfStates) {
464 sortedSuccs = std::move(temp.second);
468 if (order->compare(sortedSuccs[0], sortedSuccs[sortedSuccs.size() - 1]) ==
Order::SAME) {
469 if (!order->contains(currentState)) {
470 order->addToNode(currentState, order->getNode(sortedSuccs[0]));
472 order->merge(currentState, sortedSuccs[0]);
475 if (!order->contains(sortedSuccs[0])) {
476 assert(order->isBottomState(sortedSuccs[sortedSuccs.size() - 1]));
477 assert(sortedSuccs.size() == 2);
478 order->addAbove(sortedSuccs[0], order->getBottom());
480 if (!order->contains(sortedSuccs[sortedSuccs.size() - 1])) {
481 assert(order->isTopState(sortedSuccs[0]));
482 assert(sortedSuccs.size() == 2);
483 order->addBelow(sortedSuccs[sortedSuccs.size() - 1], order->getTop());
486 if (!order->contains(currentState)) {
487 order->addBetween(currentState, sortedSuccs[0], sortedSuccs[sortedSuccs.size() - 1]);
489 order->addRelation(sortedSuccs[0], currentState, allowMerge);
490 order->addRelation(currentState, sortedSuccs[sortedSuccs.size() - 1], allowMerge);
493 assert(order->contains(currentState) && order->compare(order->getNode(currentState), order->getBottom()) ==
Order::ABOVE &&
494 order->compare(order->getNode(currentState), order->getTop()) ==
Order::BELOW);
495 return {numberOfStates, numberOfStates};
498template<
typename ValueType,
typename ConstantType>
499std::pair<uint_fast64_t, uint_fast64_t> OrderExtender<ValueType, ConstantType>::extendByForwardReasoning(std::shared_ptr<Order> order,
500 uint_fast64_t currentState,
501 std::vector<uint_fast64_t>
const& successors,
503 assert(successors.size() > 1);
504 assert(order->contains(currentState));
507 std::vector<uint_fast64_t> statesSorted;
508 statesSorted.push_back(currentState);
509 bool pla = (usePLA.find(order) != usePLA.end() && usePLA.at(order));
511 bool oneUnknown =
false;
512 bool unknown =
false;
513 uint_fast64_t s1 = numberOfStates;
514 uint_fast64_t s2 = numberOfStates;
515 for (
auto& state : successors) {
518 for (
auto itr = statesSorted.begin(); itr != statesSorted.end(); ++itr) {
519 auto compareRes = order->compareFast(state, (*itr));
521 compareRes = addStatesBasedOnMinMax(order, state, (*itr));
524 compareRes = order->compare(state, *itr);
529 order->addStateToHandle(state);
533 statesSorted.insert(itr, state);
548 if (!(unknown && oneUnknown) && !added) {
550 statesSorted.push_back(state);
552 if (unknown && oneUnknown) {
556 if (!unknown && oneUnknown) {
557 assert(statesSorted.size() == successors.size());
561 if (s1 == numberOfStates) {
562 assert(statesSorted.size() == successors.size() + 1);
564 }
else if (s2 == numberOfStates) {
565 if (!order->contains(s1)) {
569 if (statesSorted[0] == currentState) {
570 order->addRelation(s1, statesSorted[0], allowMerge);
571 assert((order->compare(s1, statesSorted[0]) ==
Order::ABOVE) ||
572 (allowMerge && (order->compare(s1, statesSorted[statesSorted.size() - 1]) ==
Order::SAME)));
573 order->addRelation(s1, statesSorted[statesSorted.size() - 1], allowMerge);
574 assert((order->compare(s1, statesSorted[statesSorted.size() - 1]) ==
Order::ABOVE) ||
575 (allowMerge && (order->compare(s1, statesSorted[statesSorted.size() - 1]) ==
Order::SAME)));
576 order->addStateToHandle(s1);
577 }
else if (statesSorted[statesSorted.size() - 1] == currentState) {
578 order->addRelation(statesSorted[0], s1, allowMerge);
579 assert((order->compare(s1, statesSorted[0]) ==
Order::BELOW) ||
580 (allowMerge && (order->compare(s1, statesSorted[statesSorted.size() - 1]) ==
Order::SAME)));
581 order->addRelation(statesSorted[statesSorted.size() - 1], s1, allowMerge);
582 assert((order->compare(s1, statesSorted[statesSorted.size() - 1]) ==
Order::BELOW) ||
583 (allowMerge && (order->compare(s1, statesSorted[statesSorted.size() - 1]) ==
Order::SAME)));
584 order->addStateToHandle(s1);
586 bool continueSearch =
true;
587 for (
auto& entry : matrix.getRow(currentState)) {
588 if (entry.getColumn() == s1) {
589 if (entry.getValue().isConstant()) {
590 continueSearch =
false;
594 if (continueSearch) {
595 for (
auto& i : statesSorted) {
605 assert(order->contains(currentState) && order->compare(order->getNode(currentState), order->getBottom()) ==
Order::ABOVE &&
606 order->compare(order->getNode(currentState), order->getTop()) ==
Order::BELOW);
607 return {numberOfStates, numberOfStates};
610template<
typename ValueType,
typename ConstantType>
611bool OrderExtender<ValueType, ConstantType>::extendByAssumption(std::shared_ptr<Order> order, uint_fast64_t state1, uint_fast64_t state2) {
612 bool usePLANow = usePLA.find(order) != usePLA.end() && usePLA[order];
614 auto assumptions = usePLANow ? assumptionMaker->createAndCheckAssumptions(state1, state2, order, region, minValues[order], maxValues[order])
615 : assumptionMaker->createAndCheckAssumptions(state1, state2, order, region);
617 handleAssumption(order, assumptions.begin()->first);
624template<
typename ValueType,
typename ConstantType>
625Order::NodeComparison OrderExtender<ValueType, ConstantType>::addStatesBasedOnMinMax(std::shared_ptr<Order> order, uint_fast64_t state1,
626 uint_fast64_t state2)
const {
628 assert(minValues.find(order) != minValues.end());
629 std::vector<ConstantType>
const& mins = minValues.at(order);
630 std::vector<ConstantType>
const& maxs = maxValues.at(order);
631 if (mins[state1] == maxs[state1] && mins[state2] == maxs[state2] && mins[state1] == mins[state2]) {
632 if (order->contains(state1)) {
633 if (order->contains(state2)) {
634 order->merge(state1, state2);
635 assert(!order->isInvalid());
637 order->addToNode(state2, order->getNode(state1));
641 }
else if (mins[state1] > maxs[state2]) {
643 if (!order->contains(state1)) {
646 if (!order->contains(state2)) {
650 assert(order->compare(state1, state2) !=
Order::SAME);
651 order->addRelation(state1, state2);
654 }
else if (mins[state2] > maxs[state1]) {
656 if (!order->contains(state1)) {
659 if (!order->contains(state2)) {
663 assert(order->compare(state2, state1) !=
Order::SAME);
664 order->addRelation(state2, state1);
672template<
typename ValueType,
typename ConstantType>
674 if (model !=
nullptr) {
677 std::unique_ptr<modelchecker::CheckResult> checkResult;
679 boost::optional<modelchecker::CheckTask<logic::Formula, ValueType>> checkTask;
680 if (this->formula->hasQuantitativeResult()) {
685 std::make_shared<storm::logic::ProbabilityOperatorFormula>(formula->asProbabilityOperatorFormula().getSubformula().asSharedPointer(), opInfo);
688 STORM_LOG_THROW(plaModelChecker.
canHandle(model, checkTask.get()), exceptions::NotSupportedException,
"Cannot handle this formula");
689 plaModelChecker.
specify(env, model, checkTask.get(),
false,
false);
692 plaModelChecker.
check(env, region, solver::OptimizationDirection::Minimize)->template asExplicitQuantitativeCheckResult<ConstantType>();
694 plaModelChecker.
check(env, region, solver::OptimizationDirection::Maximize)->template asExplicitQuantitativeCheckResult<ConstantType>();
697 assert(minValuesInit->size() == numberOfStates);
698 assert(maxValuesInit->size() == numberOfStates);
702template<
typename ValueType,
typename ConstantType>
704 std::vector<ConstantType>& maxValues) {
705 assert(minValues.size() == numberOfStates);
706 assert(maxValues.size() == numberOfStates);
707 usePLA[order] =
true;
708 if (unknownStatesMap.find(order) != unknownStatesMap.end()) {
709 auto& unknownStates = unknownStatesMap[order];
710 if (unknownStates.first != numberOfStates) {
711 continueExtending[order] =
712 minValues[unknownStates.first] >= maxValues[unknownStates.second] || minValues[unknownStates.second] >= maxValues[unknownStates.first];
714 continueExtending[order] =
true;
717 continueExtending[order] =
true;
719 this->minValues[order] = std::move(minValues);
720 this->maxValues[order] = std::move(maxValues);
723template<
typename ValueType,
typename ConstantType>
725 assert(minValues.size() == numberOfStates);
726 auto& maxValues = this->maxValues[order];
727 usePLA[order] = this->maxValues.find(order) != this->maxValues.end();
728 if (maxValues.size() == 0) {
729 continueExtending[order] =
false;
730 }
else if (unknownStatesMap.find(order) != unknownStatesMap.end()) {
731 auto& unknownStates = unknownStatesMap[order];
732 if (unknownStates.first != numberOfStates) {
733 continueExtending[order] =
734 minValues[unknownStates.first] >= maxValues[unknownStates.second] || minValues[unknownStates.second] >= maxValues[unknownStates.first];
736 continueExtending[order] =
true;
739 continueExtending[order] =
true;
741 this->minValues[order] = std::move(minValues);
744template<
typename ValueType,
typename ConstantType>
746 assert(maxValues.size() == numberOfStates);
747 usePLA[order] = this->minValues.find(order) != this->minValues.end();
748 auto& minValues = this->minValues[order];
749 if (minValues.size() == 0) {
750 continueExtending[order] =
false;
751 }
else if (unknownStatesMap.find(order) != unknownStatesMap.end()) {
752 auto& unknownStates = unknownStatesMap[order];
753 if (unknownStates.first != numberOfStates) {
754 continueExtending[order] =
755 minValues[unknownStates.first] >= maxValues[unknownStates.second] || minValues[unknownStates.second] >= maxValues[unknownStates.first];
757 continueExtending[order] =
true;
760 continueExtending[order] =
true;
762 this->maxValues[order] = std::move(maxValues);
764template<
typename ValueType,
typename ConstantType>
766 assert(minValues.size() == numberOfStates);
767 this->minValuesInit = std::move(minValues);
770template<
typename ValueType,
typename ConstantType>
772 assert(maxValues.size() == numberOfStates);
773 this->maxValuesInit = std::move(maxValues);
776template<
typename ValueType,
typename ConstantType>
780 auto mon = monotonicityChecker.checkLocalMonotonicity(order, s, param, region);
781 monResult->updateMonotonicityResult(param, mon);
784template<
typename ValueType,
typename ConstantType>
786 assert(state1 != numberOfStates && state2 != numberOfStates);
787 unknownStatesMap[order] = {state1, state2};
790template<
typename ValueType,
typename ConstantType>
792 if (unknownStatesMap.find(order) != unknownStatesMap.end()) {
793 return unknownStatesMap.at(order);
795 return {numberOfStates, numberOfStates};
798template<
typename ValueType,
typename ConstantType>
800 assert(unknownStatesMap.find(orderCopy) == unknownStatesMap.end());
801 unknownStatesMap.insert({orderCopy, {unknownStatesMap[orderOriginal].first, unknownStatesMap[orderOriginal].second}});
804template<
typename ValueType,
typename ConstantType>
806 usePLA[orderCopy] = usePLA[orderOriginal];
807 if (usePLA[orderCopy]) {
808 minValues[orderCopy] = minValues[orderOriginal];
809 assert(maxValues.find(orderOriginal) != maxValues.end());
810 maxValues[orderCopy] = maxValues[orderOriginal];
812 continueExtending[orderCopy] = continueExtending[orderOriginal];
815template<
typename ValueType,
typename ConstantType>
817 if (done && currentState != numberOfStates) {
818 order->setDoneState(currentState);
820 if (cyclic && order->existsStateToHandle()) {
821 return order->getStateToHandle();
823 if (currentState == numberOfStates) {
824 return order->getNextStateNumber();
826 if (currentState != numberOfStates) {
827 return order->getNextStateNumber();
829 return {numberOfStates,
true};
832template<
typename ValueType,
typename ConstantType>
834 assert(unknownStatesMap.find(order) != unknownStatesMap.end());
835 assert(!order->getDoneBuilding());
837 bool yesThereIsHope = continueExtending[order];
838 return yesThereIsHope;
840template<
typename ValueType,
typename ConstantType>
842 return monotonicityChecker;
844template<
typename ValueType,
typename ConstantType>
845const std::vector<std::set<typename OrderExtender<ValueType, ConstantType>::VariableType>>&
847 return occuringVariablesAtState;
void copyMinMax(std::shared_ptr< Order > orderOriginal, std::shared_ptr< Order > orderCopy)
std::vector< std::set< VariableType > > const & getVariablesOccuringAtState()
std::pair< uint_fast64_t, uint_fast64_t > getUnknownStates(std::shared_ptr< Order > order) const
void setMaxValuesInit(std::vector< ConstantType > &minValues)
void setMinValuesInit(std::vector< ConstantType > &minValues)
std::tuple< std::shared_ptr< Order >, uint_fast64_t, uint_fast64_t > extendOrder(std::shared_ptr< Order > order, storm::storage::ParameterRegion< ValueType > region, std::shared_ptr< MonotonicityResult< VariableType > > monRes=nullptr, std::shared_ptr< expressions::BinaryRelationExpression > assumption=nullptr)
Extends the order for the given region.
MonotonicityChecker< ValueType > & getMonotoncityChecker()
void setUnknownStates(std::shared_ptr< Order > order, uint_fast64_t state1, uint_fast64_t state2)
OrderExtender(std::shared_ptr< models::sparse::Model< ValueType > > model, std::shared_ptr< logic::Formula const > formula)
Constructs a new OrderExtender.
utility::parametric::VariableType< ValueType >::type VariableType
std::tuple< std::shared_ptr< Order >, uint_fast64_t, uint_fast64_t > toOrder(storage::ParameterRegion< ValueType > region, std::shared_ptr< MonotonicityResult< VariableType > > monRes=nullptr)
Creates an order based on the given formula.
void setMaxValues(std::shared_ptr< Order > order, std::vector< ConstantType > &maxValues)
void setMinMaxValues(std::shared_ptr< Order > order, std::vector< ConstantType > &minValues, std::vector< ConstantType > &maxValues)
void checkParOnStateMonRes(uint_fast64_t s, std::shared_ptr< Order > order, typename OrderExtender< ValueType, ConstantType >::VariableType param, std::shared_ptr< MonotonicityResult< VariableType > > monResult)
void setMinValues(std::shared_ptr< Order > order, std::vector< ConstantType > &minValues)
void initializeMinMaxValues(storage::ParameterRegion< ValueType > region)
bool isHope(std::shared_ptr< Order > order)
NodeComparison
Constants for comparison of nodes/states.
std::string const & getName() const
Retrieves the name of the variable.
vector_type const & getValueVector() const
virtual void specify(Environment const &env, std::shared_ptr< storm::models::ModelBase > parametricModel, CheckTask< storm::logic::Formula, ValueType > const &checkTask, bool generateRegionSplitEstimates=false, bool allowModelSimplification=true) override
virtual bool canHandle(std::shared_ptr< storm::models::ModelBase > parametricModel, CheckTask< storm::logic::Formula, ValueType > const &checkTask) const override
std::unique_ptr< CheckResult > check(Environment const &env, storm::storage::ParameterRegion< typename SparseModelType::ValueType > const ®ion, storm::solver::OptimizationDirection const &dirForParameters, std::shared_ptr< storm::analysis::LocalMonotonicityResult< typename RegionModelChecker< typename SparseModelType::ValueType >::VariableType > > localMonotonicityResult=nullptr)
Checks the specified formula on the given region by applying parameter lifting (Parameter choices are...
Base class for all sparse models.
A bit vector that is internally represented as a vector of 64-bit values.
void set(uint_fast64_t index, bool value=true)
Sets the given truth value at the given index.
size_t size() const
Retrieves the number of bits this bit vector can store.
A class that holds a possibly non-square matrix in the compressed row storage format.
const_rows getRow(index_type row) const
Returns an object representing the given row.
index_type getColumnCount() const
Returns the number of columns of the matrix.
storm::storage::SparseMatrix< value_type > transpose(bool joinGroups=false, bool keepZeros=false) const
Transposes the matrix.
This class represents the decomposition of a graph-like structure into its strongly connected compone...
#define STORM_LOG_INFO(message)
#define STORM_LOG_THROW(cond, exception, message)
std::pair< storm::storage::BitVector, storm::storage::BitVector > performProb01(storm::models::sparse::DeterministicModel< T > const &model, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
Computes the sets of states that have probability 0 or 1, respectively, of satisfying phi until psi i...
std::vector< uint_fast64_t > getTopologicalSort(storm::storage::SparseMatrix< T > const &matrix, std::vector< uint64_t > const &firstStates)
Performs a topological sort of the states of the system according to the given transitions.
bool hasCycle(storm::storage::SparseMatrix< T > const &transitionMatrix, boost::optional< storm::storage::BitVector > const &subsystem)
Returns true if the graph represented by the given matrix has a cycle.
void gatherOccurringVariables(FunctionType const &function, std::set< typename VariableType< FunctionType >::type > &variableSet)
Add all variables that occur in the given function to the the given set.
Nodes of the Reachability Order.
StronglyConnectedComponentDecompositionOptions & forceTopologicalSort(bool value=true)
Enforces that the returned SCCs are sorted in a topological order.