10namespace expressions {
16 LinearityStatus result = boost::any_cast<LinearityStatus>(expression.
getBaseExpression().
accept(*
this, booleanIsLinear));
17 return result == LinearityStatus::LinearWithoutVariables || result == LinearityStatus::LinearContainsVariables;
21 bool booleanIsLinear = boost::any_cast<bool>(data);
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));
28 if (conditionResult != LinearityStatus::NonLinear && thenResult != LinearityStatus::NonLinear && elseResult != LinearityStatus::NonLinear) {
29 return LinearityStatus::LinearContainsVariables;
31 return LinearityStatus::NonLinear;
34 return LinearityStatus::NonLinear;
39 bool booleanIsLinear = boost::any_cast<bool>(data);
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));
45 if (leftResult != LinearityStatus::NonLinear && rightResult != LinearityStatus::NonLinear) {
46 return LinearityStatus::LinearContainsVariables;
48 return LinearityStatus::NonLinear;
51 return LinearityStatus::NonLinear;
56 LinearityStatus leftResult = boost::any_cast<LinearityStatus>(expression.
getFirstOperand()->accept(*
this, data));
57 if (leftResult == LinearityStatus::NonLinear) {
58 return LinearityStatus::NonLinear;
61 LinearityStatus rightResult = boost::any_cast<LinearityStatus>(expression.
getSecondOperand()->accept(*
this, data));
62 if (rightResult == LinearityStatus::NonLinear) {
63 return LinearityStatus::NonLinear;
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;
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;
92 STORM_LOG_THROW(
false, storm::exceptions::InvalidOperationException,
"Illegal binary numerical expression operator.");
96 bool booleanIsLinear = boost::any_cast<bool>(data);
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));
102 if (leftResult != LinearityStatus::NonLinear && rightResult != LinearityStatus::NonLinear) {
103 return LinearityStatus::LinearContainsVariables;
105 return LinearityStatus::NonLinear;
108 return LinearityStatus::NonLinear;
113 return LinearityStatus::LinearContainsVariables;
117 bool booleanIsLinear = boost::any_cast<bool>(data);
119 if (booleanIsLinear) {
120 return boost::any_cast<LinearityStatus>(expression.
getOperand()->accept(*
this, booleanIsLinear));
122 return LinearityStatus::NonLinear;
126 return LinearityStatus::NonLinear;
132 return expression.
getOperand()->accept(*
this, data);
135 return LinearityStatus::NonLinear;
137 STORM_LOG_THROW(
false, storm::exceptions::InvalidOperationException,
"Illegal unary numerical expression operator.");
141 bool booleanIsLinear = boost::any_cast<bool>(data);
143 if (booleanIsLinear) {
144 return LinearityStatus::LinearWithoutVariables;
146 return LinearityStatus::NonLinear;
151 return LinearityStatus::LinearWithoutVariables;
155 return LinearityStatus::LinearWithoutVariables;
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)