Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
LinearityCheckVisitor.cpp
Go to the documentation of this file.
2
4
8
9namespace storm {
10namespace expressions {
12 // Intentionally left empty.
13}
14
15bool LinearityCheckVisitor::check(Expression const& expression, bool booleanIsLinear) {
16 LinearityStatus result = boost::any_cast<LinearityStatus>(expression.getBaseExpression().accept(*this, booleanIsLinear));
17 return result == LinearityStatus::LinearWithoutVariables || result == LinearityStatus::LinearContainsVariables;
18}
19
20boost::any LinearityCheckVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) {
21 bool booleanIsLinear = boost::any_cast<bool>(data);
22
23 if (booleanIsLinear) {
24 auto conditionResult = boost::any_cast<LinearityStatus>(expression.getCondition()->accept(*this, booleanIsLinear));
25 auto thenResult = boost::any_cast<LinearityStatus>(expression.getThenExpression()->accept(*this, booleanIsLinear));
26 auto elseResult = boost::any_cast<LinearityStatus>(expression.getElseExpression()->accept(*this, booleanIsLinear));
27
28 if (conditionResult != LinearityStatus::NonLinear && thenResult != LinearityStatus::NonLinear && elseResult != LinearityStatus::NonLinear) {
29 return LinearityStatus::LinearContainsVariables;
30 } else {
31 return LinearityStatus::NonLinear;
32 }
33 } else {
34 return LinearityStatus::NonLinear;
35 }
36}
37
38boost::any LinearityCheckVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) {
39 bool booleanIsLinear = boost::any_cast<bool>(data);
40
41 if (booleanIsLinear) {
42 auto leftResult = boost::any_cast<LinearityStatus>(expression.getFirstOperand()->accept(*this, booleanIsLinear));
43 auto rightResult = boost::any_cast<LinearityStatus>(expression.getSecondOperand()->accept(*this, booleanIsLinear));
44
45 if (leftResult != LinearityStatus::NonLinear && rightResult != LinearityStatus::NonLinear) {
46 return LinearityStatus::LinearContainsVariables;
47 } else {
48 return LinearityStatus::NonLinear;
49 }
50 } else {
51 return LinearityStatus::NonLinear;
52 }
53}
54
55boost::any LinearityCheckVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) {
56 LinearityStatus leftResult = boost::any_cast<LinearityStatus>(expression.getFirstOperand()->accept(*this, data));
57 if (leftResult == LinearityStatus::NonLinear) {
58 return LinearityStatus::NonLinear;
59 }
60
61 LinearityStatus rightResult = boost::any_cast<LinearityStatus>(expression.getSecondOperand()->accept(*this, data));
62 if (rightResult == LinearityStatus::NonLinear) {
63 return LinearityStatus::NonLinear;
64 }
65
66 switch (expression.getOperatorType()) {
69 return (leftResult == LinearityStatus::LinearContainsVariables || rightResult == LinearityStatus::LinearContainsVariables
70 ? LinearityStatus::LinearContainsVariables
71 : LinearityStatus::LinearWithoutVariables);
74 if (leftResult == LinearityStatus::LinearContainsVariables && rightResult == LinearityStatus::LinearContainsVariables) {
75 return LinearityStatus::NonLinear;
76 }
77
78 return (leftResult == LinearityStatus::LinearContainsVariables || rightResult == LinearityStatus::LinearContainsVariables
79 ? LinearityStatus::LinearContainsVariables
80 : LinearityStatus::LinearWithoutVariables);
82 return LinearityStatus::NonLinear;
84 return LinearityStatus::NonLinear;
86 return LinearityStatus::NonLinear;
88 return LinearityStatus::NonLinear;
90 return LinearityStatus::NonLinear;
91 }
92 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Illegal binary numerical expression operator.");
93}
94
95boost::any LinearityCheckVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) {
96 bool booleanIsLinear = boost::any_cast<bool>(data);
97
98 if (booleanIsLinear) {
99 auto leftResult = boost::any_cast<LinearityStatus>(expression.getFirstOperand()->accept(*this, booleanIsLinear));
100 auto rightResult = boost::any_cast<LinearityStatus>(expression.getSecondOperand()->accept(*this, booleanIsLinear));
101
102 if (leftResult != LinearityStatus::NonLinear && rightResult != LinearityStatus::NonLinear) {
103 return LinearityStatus::LinearContainsVariables;
104 } else {
105 return LinearityStatus::NonLinear;
106 }
107 } else {
108 return LinearityStatus::NonLinear;
109 }
110}
111
112boost::any LinearityCheckVisitor::visit(VariableExpression const&, boost::any const&) {
113 return LinearityStatus::LinearContainsVariables;
114}
115
116boost::any LinearityCheckVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) {
117 bool booleanIsLinear = boost::any_cast<bool>(data);
118
119 if (booleanIsLinear) {
120 return boost::any_cast<LinearityStatus>(expression.getOperand()->accept(*this, booleanIsLinear));
121 } else {
122 return LinearityStatus::NonLinear;
123 }
124
125 // Boolean function applications are not allowed in linear expressions.
126 return LinearityStatus::NonLinear;
127}
128
129boost::any LinearityCheckVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) {
130 switch (expression.getOperatorType()) {
132 return expression.getOperand()->accept(*this, data);
135 return LinearityStatus::NonLinear;
136 }
137 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Illegal unary numerical expression operator.");
138}
139
140boost::any LinearityCheckVisitor::visit(BooleanLiteralExpression const&, boost::any const& data) {
141 bool booleanIsLinear = boost::any_cast<bool>(data);
142
143 if (booleanIsLinear) {
144 return LinearityStatus::LinearWithoutVariables;
145 } else {
146 return LinearityStatus::NonLinear;
147 }
148}
149
150boost::any LinearityCheckVisitor::visit(IntegerLiteralExpression const&, boost::any const&) {
151 return LinearityStatus::LinearWithoutVariables;
152}
153
154boost::any LinearityCheckVisitor::visit(RationalLiteralExpression const&, boost::any const&) {
155 return LinearityStatus::LinearWithoutVariables;
156}
157} // namespace expressions
158} // namespace storm
virtual boost::any accept(ExpressionVisitor &visitor, boost::any const &data) const =0
Accepts the given visitor by calling its visit method.
std::shared_ptr< BaseExpression const > const & getSecondOperand() const
Retrieves the second operand of the expression.
std::shared_ptr< BaseExpression const > const & getFirstOperand() const
Retrieves the first operand of the expression.
OperatorType getOperatorType() const
Retrieves the operator associated with the expression.
BaseExpression const & getBaseExpression() const
Retrieves the base expression underlying this expression object.
std::shared_ptr< BaseExpression const > getElseExpression() const
Retrieves the else expression of the if-then-else expression.
std::shared_ptr< BaseExpression const > getCondition() const
Retrieves the condition expression of the if-then-else expression.
std::shared_ptr< BaseExpression const > getThenExpression() const
Retrieves the then expression of the if-then-else expression.
LinearityCheckVisitor()
Creates a linearity check visitor.
virtual boost::any visit(IfThenElseExpression const &expression, boost::any const &data) override
bool check(Expression const &expression, bool booleanIsLinear=false)
Checks that the given expression is linear.
virtual std::shared_ptr< BaseExpression const > getOperand(uint_fast64_t operandIndex) const override
Retrieves the given operand from the expression.
OperatorType getOperatorType() const
Retrieves the operator associated with this expression.
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.
Definition cli.cpp:18