16template<
typename ValueType,
typename ConstantType>
18 this->matrix = matrix;
22template<
typename ValueType,
typename ConstantType>
28 auto matrix = model->getTransitionMatrix();
31 for (uint_fast64_t i = 0; i < numberOfSamples; ++i) {
33 for (
auto var : variables) {
38 valuation.insert(val);
42 std::unique_ptr<modelchecker::CheckResult> checkResult;
43 if (formula->isProbabilityOperatorFormula() && formula->asProbabilityOperatorFormula().getSubformula().isUntilFormula()) {
47 }
else if (formula->isProbabilityOperatorFormula() && formula->asProbabilityOperatorFormula().getSubformula().isEventuallyFormula()) {
54 auto const& quantitativeResult = checkResult->asExplicitQuantitativeCheckResult<ConstantType>();
55 std::vector<ConstantType> values = quantitativeResult.getFiniteValueVector();
56 samples.push_back(values);
61template<
typename ValueType,
typename ConstantType>
63 this->samples = samples;
67template<
typename ValueType,
typename ConstantType>
73template<
typename ValueType,
typename ConstantType>
76 std::vector<ConstantType>
const minValues,
77 std::vector<ConstantType>
const maxValues)
const {
81 result = checkOnSamples(assumption);
85 if (minValues.size() != 0 && maxValues.size() == minValues.size()) {
86 auto const val1 = assumption.
state1;
87 auto const val2 = assumption.
state2;
89 if (minValues[val1] > maxValues[val2]) {
91 }
else if (minValues[val1] == maxValues[val2] && minValues[val1] == maxValues[val1] && minValues[val2] == maxValues[val2]) {
93 }
else if (minValues[val2] > maxValues[val1]) {
97 if (minValues[val1] == maxValues[val2] && minValues[val1] == maxValues[val1] && minValues[val2] == maxValues[val2]) {
99 }
else if (minValues[val1] > maxValues[val2]) {
101 }
else if (minValues[val2] > maxValues[val1]) {
109 result = validateAssumptionSMTSolver(assumption, order, region, minValues, maxValues);
114template<
typename ValueType,
typename ConstantType>
117 for (
auto const& values : samples) {
119 : values[assumption.
state1] == values[assumption.
state2];
128template<
typename ValueType,
typename ConstantType>
129AssumptionStatus AssumptionChecker<ValueType, ConstantType>::validateAssumptionSMTSolver(
Assumption const& assumption, std::shared_ptr<Order> order,
130 storage::ParameterRegion<ValueType> region,
131 std::vector<ConstantType>
const minValues,
132 std::vector<ConstantType>
const maxValues)
const {
133 std::shared_ptr<expressions::ExpressionManager>
manager(
new expressions::ExpressionManager());
135 uint_fast64_t val1 = assumption.state1;
136 uint_fast64_t val2 = assumption.state2;
137 auto row1 = matrix.getRow(val1);
138 auto row2 = matrix.getRow(val2);
140 bool orderKnown =
true;
143 bool addVar1 =
false;
144 bool addVar2 =
false;
147 auto exprOrderSucc =
manager->boolean(
true);
148 std::set<expressions::Variable> stateVariables;
149 std::set<expressions::Variable> topVariables;
150 std::set<expressions::Variable> bottomVariables;
151 for (
auto itr1 = row1.begin(); orderKnown && itr1 != row1.end(); ++itr1) {
152 addVar2 |= itr1->getColumn() == val2;
153 auto varname1 =
"s" + std::to_string(itr1->getColumn());
154 if (!
manager->hasVariable(varname1)) {
155 if (order->isTopState(itr1->getColumn())) {
156 topVariables.insert(
manager->declareRationalVariable(varname1));
157 }
else if (order->isBottomState(itr1->getColumn())) {
158 bottomVariables.insert(
manager->declareRationalVariable(varname1));
160 stateVariables.insert(
manager->declareRationalVariable(varname1));
164 for (
auto itr2 = row2.begin(); orderKnown && itr2 != row2.end(); ++itr2) {
165 addVar1 |= itr2->getColumn() == val1;
166 if (itr1->getColumn() != itr2->getColumn()) {
167 auto varname2 =
"s" + std::to_string(itr2->getColumn());
168 if (!
manager->hasVariable(varname2)) {
169 if (order->isTopState(itr2->getColumn())) {
170 topVariables.insert(
manager->declareRationalVariable(varname2));
171 }
else if (order->isBottomState(itr2->getColumn())) {
172 bottomVariables.insert(
manager->declareRationalVariable(varname2));
174 stateVariables.insert(
manager->declareRationalVariable(varname2));
177 auto comp = order->compare(itr1->getColumn(), itr2->getColumn());
180 if (minValues[itr2->getColumn()] > maxValues[itr1->getColumn()]) {
181 if (!order->contains(itr1->getColumn())) {
182 order->add(itr1->getColumn());
183 order->addStateToHandle(itr1->getColumn());
185 if (!order->contains(itr2->getColumn())) {
186 order->add(itr2->getColumn());
187 order->addStateToHandle(itr2->getColumn());
189 order->addRelation(itr2->getColumn(), itr1->getColumn());
191 }
else if (minValues[itr1->getColumn()] > maxValues[itr2->getColumn()]) {
192 if (!order->contains(itr1->getColumn())) {
193 order->add(itr1->getColumn());
194 order->addStateToHandle(itr1->getColumn());
196 if (!order->contains(itr2->getColumn())) {
197 order->add(itr2->getColumn());
198 order->addStateToHandle(itr2->getColumn());
200 order->addRelation(itr1->getColumn(), itr2->getColumn());
205 exprOrderSucc = exprOrderSucc && !(
manager->getVariable(varname1) <=
manager->getVariable(varname2));
207 exprOrderSucc = exprOrderSucc && !(
manager->getVariable(varname1) >=
manager->getVariable(varname2));
209 exprOrderSucc = exprOrderSucc && (
manager->getVariable(varname1) >=
manager->getVariable(varname2)) &&
210 (
manager->getVariable(varname1) <=
manager->getVariable(varname2));
219 solver::Z3SmtSolver s(*manager);
220 auto valueTypeToExpression = expressions::RationalFunctionToExpression<ValueType>(manager);
221 expressions::Expression expr1 =
manager->rational(0);
222 for (
auto itr1 = row1.begin(); itr1 != row1.end(); ++itr1) {
223 expr1 = expr1 + (valueTypeToExpression.toExpression(itr1->getValue()) *
manager->getVariable(
"s" + std::to_string(itr1->getColumn())));
226 expressions::Expression expr2 =
manager->rational(0);
227 for (
auto itr2 = row2.begin(); itr2 != row2.end(); ++itr2) {
228 expr2 = expr2 + (valueTypeToExpression.toExpression(itr2->getValue()) *
manager->getVariable(
"s" + std::to_string(itr2->getColumn())));
234 expressions::Expression exprToCheck;
236 exprToCheck = expr1 <= expr2;
238 exprToCheck = expr1 != expr2;
241 auto variables =
manager->getVariables();
243 expressions::Expression exprBounds =
manager->boolean(
true);
245 exprBounds = exprBounds && (
manager->getVariable(
"s" + std::to_string(val1)) == expr1);
248 exprBounds = exprBounds && (
manager->getVariable(
"s" + std::to_string(val2)) == expr2);
250 for (
auto var : variables) {
251 if (find(stateVariables.begin(), stateVariables.end(), var) != stateVariables.end()) {
253 if (minValues.size() > 0 && maxValues.size() == minValues.size()) {
254 std::string test = var.getName();
255 auto val = std::stoi(test.substr(1, test.size() - 1));
256 exprBounds = exprBounds &&
manager->rational(minValues[val]) <= var && var <=
manager->rational(maxValues[val]);
258 exprBounds = exprBounds &&
manager->rational(0) <= var && var <=
manager->rational(1);
260 }
else if (find(topVariables.begin(), topVariables.end(), var) != topVariables.end()) {
262 exprBounds = exprBounds && var ==
manager->rational(1);
263 }
else if (find(bottomVariables.begin(), bottomVariables.end(), var) != bottomVariables.end()) {
265 exprBounds = exprBounds && var ==
manager->rational(0);
270 exprBounds = exprBounds &&
manager->rational(lb) < var && var <
manager->rational(ub);
274 s.add(exprOrderSucc);
285 auto smtRes = s.check();
296template<
typename ValueType,
typename ConstantType>
299 std::vector<ConstantType> vals;
AssumptionChecker(storage::SparseMatrix< ValueType > matrix)
Constructs an AssumptionChecker.
void initializeCheckingOnSamples(Environment const &env, std::shared_ptr< logic::Formula const > formula, std::shared_ptr< models::sparse::Dtmc< ValueType > > model, storage::ParameterRegion< ValueType > region, uint_fast64_t numberOfSamples)
Initializes the given number of sample points for a given model, formula and region.
AssumptionStatus validateAssumption(Assumption const &assumption, std::shared_ptr< Order > order, storage::ParameterRegion< ValueType > region, std::vector< ConstantType > const minValues, std::vector< ConstantType > const maxValue) const
Tries to validate an assumption based on the order and underlying transition matrix.
void setSampleValues(std::vector< std::vector< ConstantType > > samples)
Sets the sample values to the given vector and useSamples to true.
virtual std::unique_ptr< CheckResult > computeReachabilityProbabilities(Environment const &env, CheckTask< storm::logic::EventuallyFormula, SolutionType > const &checkTask)
virtual std::unique_ptr< CheckResult > computeUntilProbabilities(Environment const &env, CheckTask< storm::logic::UntilFormula, SolutionType > const &checkTask) override
This class represents a discrete-time Markov chain.
This class represents a (discrete-time) Markov decision process.
CoefficientType const & getLowerBoundary(VariableType const &variable) const
CoefficientType const & getUpperBoundary(VariableType const &variable) const
A class that holds a possibly non-square matrix in the compressed row storage format.
This class allows efficient instantiation of the given parametric model.
#define STORM_LOG_THROW_UNCONDITIONALLY(exception, message)
#define STORM_LOG_ASSERT(cond, message)
AssumptionStatus
Constants for status of assumption.
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
SettingsManager const & manager()
Retrieves the settings manager.
std::map< typename VariableType< FunctionType >::type, typename CoefficientType< FunctionType >::type > Valuation
TargetType convertNumber(SourceType const &number)
A candidate relation between two states of a reachability order: either state1 > state2 (Greater) or ...
AssumptionRelation relation