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);