Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
AssumptionMaker.cpp
Go to the documentation of this file.
2
4
5namespace storm {
6namespace analysis {
7template<typename ValueType, typename ConstantType>
9 numberOfStates = matrix.getColumnCount();
10 expressionManager = std::make_shared<expressions::ExpressionManager>(expressions::ExpressionManager());
11 for (uint_fast64_t i = 0; i < this->numberOfStates; ++i) {
12 expressionManager->declareRationalVariable(std::to_string(i));
13 }
14}
15
16template<typename ValueType, typename ConstantType>
17std::map<std::shared_ptr<expressions::BinaryRelationExpression>, AssumptionStatus> AssumptionMaker<ValueType, ConstantType>::createAndCheckAssumptions(
18 uint_fast64_t val1, uint_fast64_t val2, std::shared_ptr<Order> order, storage::ParameterRegion<ValueType> region) const {
19 auto vec1 = std::vector<ConstantType>();
20 auto vec2 = std::vector<ConstantType>();
21 return createAndCheckAssumptions(val1, val2, order, region, vec1, vec2);
22}
23
24template<typename ValueType, typename ConstantType>
25std::map<std::shared_ptr<expressions::BinaryRelationExpression>, AssumptionStatus> AssumptionMaker<ValueType, ConstantType>::createAndCheckAssumptions(
26 uint_fast64_t val1, uint_fast64_t val2, std::shared_ptr<Order> order, storage::ParameterRegion<ValueType> region, std::vector<ConstantType> const minValues,
27 std::vector<ConstantType> const maxValues) const {
28 std::map<std::shared_ptr<expressions::BinaryRelationExpression>, AssumptionStatus> result;
29 STORM_LOG_INFO("Creating assumptions for " << val1 << " and " << val2);
30 STORM_LOG_ASSERT(order->compare(val1, val2) == Order::UNKNOWN, "Order should be UNKNOWN at start.");
31 auto assumption = createAndCheckAssumption(val1, val2, expressions::RelationType::Greater, order, region, minValues, maxValues);
32 if (assumption.second != AssumptionStatus::INVALID) {
33 result.insert(assumption);
34 if (assumption.second == AssumptionStatus::VALID) {
35 STORM_LOG_ASSERT(createAndCheckAssumption(val2, val1, expressions::RelationType::Greater, order, region, minValues, maxValues).second !=
37 createAndCheckAssumption(val1, val2, expressions::RelationType::Equal, order, region, minValues, maxValues).second !=
39 "Assumption " << val2 << " >= " << val1 << " should not be valid.");
40 STORM_LOG_INFO("Assumption " << assumption.first << "is valid\n");
41 return result;
42 }
43 }
44 STORM_LOG_ASSERT(order->compare(val1, val2) == Order::UNKNOWN, "Order should be UNKNOWN.");
45 assumption = createAndCheckAssumption(val2, val1, expressions::RelationType::Greater, order, region, minValues, maxValues);
46 if (assumption.second != AssumptionStatus::INVALID) {
47 if (assumption.second == AssumptionStatus::VALID) {
48 result.clear();
49 result.insert(assumption);
51 createAndCheckAssumption(val1, val2, expressions::RelationType::Equal, order, region, minValues, maxValues).second != AssumptionStatus::VALID,
52 "Assumption " << val1 << " == " << val2 << " should not be valid.");
53 STORM_LOG_INFO("Assumption " << assumption.first << "is valid\n");
54 return result;
55 }
56 result.insert(assumption);
57 }
58 STORM_LOG_ASSERT(order->compare(val1, val2) == Order::UNKNOWN, "Order should be UNKNOWN.");
59 assumption = createAndCheckAssumption(val1, val2, expressions::RelationType::Equal, order, region, minValues, maxValues);
60 if (assumption.second != AssumptionStatus::INVALID) {
61 if (assumption.second == AssumptionStatus::VALID) {
62 result.clear();
63 result.insert(assumption);
64 STORM_LOG_INFO("Assumption " << assumption.first << "is valid\n");
65 return result;
66 }
67 result.insert(assumption);
68 }
69 STORM_LOG_ASSERT(order->compare(val1, val2) == Order::UNKNOWN, "Order should be UNKNOWN.");
70 STORM_LOG_INFO("None of the assumptions is valid, number of possible assumptions: " << result.size() << '\n');
71 return result;
72}
73
74template<typename ValueType, typename ConstantType>
75void AssumptionMaker<ValueType, ConstantType>::initializeCheckingOnSamples(std::shared_ptr<logic::Formula const> formula,
76 std::shared_ptr<models::sparse::Dtmc<ValueType>> model,
77 storage::ParameterRegion<ValueType> region, uint_fast64_t numberOfSamples) {
78 assumptionChecker.initializeCheckingOnSamples(formula, model, region, numberOfSamples);
79}
80
81template<typename ValueType, typename ConstantType>
82void AssumptionMaker<ValueType, ConstantType>::setSampleValues(std::vector<std::vector<ConstantType>> const& samples) {
83 assumptionChecker.setSampleValues(samples);
84}
85
86template<typename ValueType, typename ConstantType>
87std::pair<std::shared_ptr<expressions::BinaryRelationExpression>, AssumptionStatus> AssumptionMaker<ValueType, ConstantType>::createAndCheckAssumption(
88 uint_fast64_t val1, uint_fast64_t val2, expressions::RelationType relationType, std::shared_ptr<Order> order, storage::ParameterRegion<ValueType> region,
89 std::vector<ConstantType> const minValues, std::vector<ConstantType> const maxValues) const {
90 STORM_LOG_ASSERT(val1 != val2, "Values should be different.");
91 expressions::Variable var1 = expressionManager->getVariable(std::to_string(val1));
92 expressions::Variable var2 = expressionManager->getVariable(std::to_string(val2));
93 auto assumption = std::make_shared<expressions::BinaryRelationExpression>(
94 expressions::BinaryRelationExpression(*expressionManager, expressionManager->getBooleanType(), var1.getExpression().getBaseExpressionPointer(),
95 var2.getExpression().getBaseExpressionPointer(), relationType));
96 AssumptionStatus validationResult = assumptionChecker.validateAssumption(val1, val2, assumption, order, region, minValues, maxValues);
97 return std::pair<std::shared_ptr<expressions::BinaryRelationExpression>, AssumptionStatus>(assumption, validationResult);
98}
99
100template class AssumptionMaker<RationalFunction, double>;
101template class AssumptionMaker<RationalFunction, RationalNumber>;
102} // namespace analysis
103} // namespace storm
void setSampleValues(std::vector< std::vector< ConstantType > > const &samples)
Sets the sample values to the given vector.
std::map< std::shared_ptr< expressions::BinaryRelationExpression >, AssumptionStatus > createAndCheckAssumptions(uint_fast64_t val1, uint_fast64_t val2, std::shared_ptr< Order > order, storage::ParameterRegion< ValueType > region) const
Creates assumptions, and checks them, only VALID and UNKNOWN assumptions are returned.
AssumptionMaker(storage::SparseMatrix< ValueType > matrix)
Constructs AssumptionMaker based on the matrix of the model.
void initializeCheckingOnSamples(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.
std::shared_ptr< BaseExpression const > const & getBaseExpressionPointer() const
Retrieves a pointer to the base expression underlying this expression object.
This class is responsible for managing a set of typed variables and all expressions using these varia...
storm::expressions::Expression getExpression() const
Retrieves an expression that represents the variable.
Definition Variable.cpp:34
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
A class that holds a possibly non-square matrix in the compressed row storage format.
index_type getColumnCount() const
Returns the number of columns of the matrix.
#define STORM_LOG_INFO(message)
Definition logging.h:27
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
AssumptionStatus
Constants for status of assumption.
RelationType
An enum type specifying the different relations applicable.