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(uint64_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.