18template<
typename ValueType, 
typename ConstantType>
 
   20    this->matrix = matrix;
 
 
   24template<
typename ValueType, 
typename ConstantType>
 
   30    auto matrix = model->getTransitionMatrix();
 
   33    for (uint_fast64_t i = 0; i < numberOfSamples; ++i) {
 
   35        for (
auto var : variables) {
 
   39            auto val = std::pair<VariableType, CoefficientType>(var, (lb + utility::convertNumber<CoefficientType>(i / (numberOfSamples - 1)) * (ub - lb)));
 
   40            valuation.insert(val);
 
   44        std::unique_ptr<modelchecker::CheckResult> checkResult;
 
   45        if (formula->isProbabilityOperatorFormula() && formula->asProbabilityOperatorFormula().getSubformula().isUntilFormula()) {
 
   49        } 
else if (formula->isProbabilityOperatorFormula() && formula->asProbabilityOperatorFormula().getSubformula().isEventuallyFormula()) {
 
   51                (*formula).asProbabilityOperatorFormula().getSubformula().asEventuallyFormula());
 
   54            STORM_LOG_THROW(
false, exceptions::NotSupportedException, 
"Expecting until or eventually formula");
 
   56        auto quantitativeResult = checkResult->asExplicitQuantitativeCheckResult<ConstantType>();
 
   57        std::vector<ConstantType> values = quantitativeResult.getValueVector();
 
   58        samples.push_back(values);
 
 
   63template<
typename ValueType, 
typename ConstantType>
 
   65    this->samples = samples;
 
 
   69template<
typename ValueType, 
typename ConstantType>
 
   72    STORM_LOG_THROW(
false, exceptions::NotSupportedException, 
"Assumption checking for mdps not yet implemented");
 
 
   75template<
typename ValueType, 
typename ConstantType>
 
   77                                                                                std::shared_ptr<expressions::BinaryRelationExpression> assumption,
 
   79                                                                                std::vector<ConstantType> 
const minValues,
 
   80                                                                                std::vector<ConstantType> 
const maxValues)
 const {
 
   82    assert(val1 == std::stoull(assumption->getFirstOperand()->asVariableExpression().getVariableName()));
 
   83    assert(val2 == std::stoull(assumption->getSecondOperand()->asVariableExpression().getVariableName()));
 
   86        result = checkOnSamples(assumption);
 
   90    if (minValues.size() != 0) {
 
   92            if (minValues[val1] > maxValues[val2]) {
 
   94            } 
else if (minValues[val1] == maxValues[val2] && minValues[val1] == maxValues[val1] && minValues[val2] == maxValues[val2]) {
 
   96            } 
else if (minValues[val2] > maxValues[val1]) {
 
  100            if (minValues[val1] == maxValues[val2] && minValues[val1] == maxValues[val1] && minValues[val2] == maxValues[val2]) {
 
  102            } 
else if (minValues[val1] > maxValues[val2]) {
 
  104            } 
else if (minValues[val2] > maxValues[val1]) {
 
  112        std::set<expressions::Variable> vars = std::set<expressions::Variable>({});
 
  113        assumption->gatherVariables(vars);
 
  117            exceptions::NotSupportedException, 
"Only Greater Or Equal assumptions supported");
 
  118        result = validateAssumptionSMTSolver(val1, val2, assumption, order, region, minValues, maxValues);
 
 
  123template<
typename ValueType, 
typename ConstantType>
 
  126    std::set<expressions::Variable> vars = std::set<expressions::Variable>({});
 
  127    assumption->gatherVariables(vars);
 
  128    for (
auto values : samples) {
 
  130        for (
auto var : vars) {
 
  131            auto index = std::stoi(var.getName());
 
  132            valuation.setRationalValue(var, utility::convertNumber<double>(values[index]));
 
  135        assert(assumption->hasBooleanType());
 
  136        if (!assumption->evaluateAsBool(&valuation)) {
 
  144template<
typename ValueType, 
typename ConstantType>
 
  145AssumptionStatus AssumptionChecker<ValueType, ConstantType>::validateAssumptionSMTSolver(
 
  146    uint_fast64_t val1, uint_fast64_t val2, std::shared_ptr<expressions::BinaryRelationExpression> assumption, std::shared_ptr<Order> order,
 
  147    storage::ParameterRegion<ValueType> region, std::vector<ConstantType> 
const minValues, std::vector<ConstantType> 
const maxValues)
 const {
 
  148    std::shared_ptr<utility::solver::SmtSolverFactory> smtSolverFactory = std::make_shared<utility::solver::MathsatSmtSolverFactory>();
 
  149    std::shared_ptr<expressions::ExpressionManager> 
manager(
new expressions::ExpressionManager());
 
  151    auto var1 = assumption->getFirstOperand()->asVariableExpression().getVariableName();
 
  152    auto var2 = assumption->getSecondOperand()->asVariableExpression().getVariableName();
 
  153    auto row1 = matrix.getRow(val1);
 
  154    auto row2 = matrix.getRow(val2);
 
  156    bool orderKnown = 
true;
 
  159    bool addVar1 = 
false;
 
  160    bool addVar2 = 
false;
 
  163    auto exprOrderSucc = 
manager->boolean(
true);
 
  164    std::set<expressions::Variable> stateVariables;
 
  165    std::set<expressions::Variable> topVariables;
 
  166    std::set<expressions::Variable> bottomVariables;
 
  167    for (
auto itr1 = row1.begin(); orderKnown && itr1 != row1.end(); ++itr1) {
 
  168        addVar2 |= std::to_string(itr1->getColumn()) == var2;
 
  169        auto varname1 = 
"s" + std::to_string(itr1->getColumn());
 
  170        if (!
manager->hasVariable(varname1)) {
 
  171            if (order->isTopState(itr1->getColumn())) {
 
  172                topVariables.insert(
manager->declareRationalVariable(varname1));
 
  173            } 
else if (order->isBottomState(itr1->getColumn())) {
 
  174                bottomVariables.insert(
manager->declareRationalVariable(varname1));
 
  176                stateVariables.insert(
manager->declareRationalVariable(varname1));
 
  180        for (
auto itr2 = row2.begin(); orderKnown && itr2 != row2.end(); ++itr2) {
 
  181            addVar1 |= std::to_string(itr2->getColumn()) == var1;
 
  182            if (itr1->getColumn() != itr2->getColumn()) {
 
  183                auto varname2 = 
"s" + std::to_string(itr2->getColumn());
 
  184                if (!
manager->hasVariable(varname2)) {
 
  185                    if (order->isTopState(itr2->getColumn())) {
 
  186                        topVariables.insert(
manager->declareRationalVariable(varname2));
 
  187                    } 
else if (order->isBottomState(itr2->getColumn())) {
 
  188                        bottomVariables.insert(
manager->declareRationalVariable(varname2));
 
  190                        stateVariables.insert(
manager->declareRationalVariable(varname2));
 
  193                auto comp = order->compare(itr1->getColumn(), itr2->getColumn());
 
  196                    if (minValues[itr2->getColumn()] > maxValues[itr1->getColumn()]) {
 
  197                        if (!order->contains(itr1->getColumn())) {
 
  198                            order->add(itr1->getColumn());
 
  199                            order->addStateToHandle(itr1->getColumn());
 
  201                        if (!order->contains(itr2->getColumn())) {
 
  202                            order->add(itr2->getColumn());
 
  203                            order->addStateToHandle(itr2->getColumn());
 
  205                        order->addRelation(itr2->getColumn(), itr1->getColumn());
 
  207                    } 
else if (minValues[itr1->getColumn()] > maxValues[itr2->getColumn()]) {
 
  208                        if (!order->contains(itr1->getColumn())) {
 
  209                            order->add(itr1->getColumn());
 
  210                            order->addStateToHandle(itr1->getColumn());
 
  212                        if (!order->contains(itr2->getColumn())) {
 
  213                            order->add(itr2->getColumn());
 
  214                            order->addStateToHandle(itr2->getColumn());
 
  216                        order->addRelation(itr1->getColumn(), itr2->getColumn());
 
  221                    exprOrderSucc = exprOrderSucc && !(
manager->getVariable(varname1) <= 
manager->getVariable(varname2));
 
  223                    exprOrderSucc = exprOrderSucc && !(
manager->getVariable(varname1) >= 
manager->getVariable(varname2));
 
  225                    exprOrderSucc = exprOrderSucc && (
manager->getVariable(varname1) >= 
manager->getVariable(varname2)) &&
 
  226                                    (
manager->getVariable(varname1) <= 
manager->getVariable(varname2));
 
  235        solver::Z3SmtSolver s(*manager);
 
  236        auto valueTypeToExpression = expressions::RationalFunctionToExpression<ValueType>(manager);
 
  237        expressions::Expression expr1 = 
manager->rational(0);
 
  238        for (
auto itr1 = row1.begin(); itr1 != row1.end(); ++itr1) {
 
  239            expr1 = expr1 + (valueTypeToExpression.toExpression(itr1->getValue()) * 
manager->getVariable(
"s" + std::to_string(itr1->getColumn())));
 
  242        expressions::Expression expr2 = 
manager->rational(0);
 
  243        for (
auto itr2 = row2.begin(); itr2 != row2.end(); ++itr2) {
 
  244            expr2 = expr2 + (valueTypeToExpression.toExpression(itr2->getValue()) * 
manager->getVariable(
"s" + std::to_string(itr2->getColumn())));
 
  250        expressions::Expression exprToCheck;
 
  252            exprToCheck = expr1 <= expr2;
 
  255            exprToCheck = expr1 != expr2;
 
  258        auto variables = 
manager->getVariables();
 
  260        expressions::Expression exprBounds = 
manager->boolean(
true);
 
  262            exprBounds = exprBounds && (
manager->getVariable(
"s" + var1) == expr1);
 
  265            exprBounds = exprBounds && (
manager->getVariable(
"s" + var2) == expr2);
 
  267        for (
auto var : variables) {
 
  268            if (find(stateVariables.begin(), stateVariables.end(), var) != stateVariables.end()) {
 
  270                if (minValues.size() > 0) {
 
  271                    std::string test = var.getName();
 
  272                    auto val = std::stoi(test.substr(1, test.size() - 1));
 
  273                    exprBounds = exprBounds && 
manager->rational(minValues[val]) <= var && var <= 
manager->rational(maxValues[val]);
 
  275                    exprBounds = exprBounds && 
manager->rational(0) <= var && var <= 
manager->rational(1);
 
  277            } 
else if (find(topVariables.begin(), topVariables.end(), var) != topVariables.end()) {
 
  279                exprBounds = exprBounds && var == 
manager->rational(1);
 
  280            } 
else if (find(bottomVariables.begin(), bottomVariables.end(), var) != bottomVariables.end()) {
 
  282                exprBounds = exprBounds && var == 
manager->rational(0);
 
  285                auto lb = utility::convertNumber<RationalNumber>(region.getLowerBoundary(var.getName()));
 
  286                auto ub = utility::convertNumber<RationalNumber>(region.getUpperBoundary(var.getName()));
 
  287                exprBounds = exprBounds && 
manager->rational(lb) < var && var < 
manager->rational(ub);
 
  291        s.add(exprOrderSucc);
 
  303        auto smtRes = s.check();
 
  314template<
typename ValueType, 
typename ConstantType>
 
  316                                                                                std::shared_ptr<Order> order,
 
  318    auto var1 = std::stoi(assumption->getFirstOperand()->asVariableExpression().getVariableName());
 
  319    auto var2 = std::stoi(assumption->getSecondOperand()->asVariableExpression().getVariableName());
 
  320    std::vector<ConstantType> vals;
 
  321    return validateAssumption(var1, var2, assumption, order, region, vals, vals);