Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
LinearCoefficientVisitor.cpp
Go to the documentation of this file.
2
4
7
8namespace storm {
9namespace expressions {
10LinearCoefficientVisitor::VariableCoefficients::VariableCoefficients(double constantPart) : variableToCoefficientMapping(), constantPart(constantPart) {
11 // Intentionally left empty.
12}
13
15 for (auto const& otherVariableCoefficientPair : other.variableToCoefficientMapping) {
16 this->variableToCoefficientMapping[otherVariableCoefficientPair.first] += otherVariableCoefficientPair.second;
17 }
18 constantPart += other.constantPart;
19 return *this;
20}
21
23 for (auto const& otherVariableCoefficientPair : other.variableToCoefficientMapping) {
24 this->variableToCoefficientMapping[otherVariableCoefficientPair.first] -= otherVariableCoefficientPair.second;
25 }
26 constantPart -= other.constantPart;
27 return *this;
28}
29
31 STORM_LOG_THROW(variableToCoefficientMapping.size() == 0 || other.variableToCoefficientMapping.size() == 0, storm::exceptions::InvalidArgumentException,
32 "Expression is non-linear.");
33 if (other.variableToCoefficientMapping.size() > 0) {
34 variableToCoefficientMapping = std::move(other.variableToCoefficientMapping);
35 std::swap(constantPart, other.constantPart);
36 }
37 for (auto& variableCoefficientPair : this->variableToCoefficientMapping) {
38 variableCoefficientPair.second *= other.constantPart;
39 }
40 constantPart *= other.constantPart;
41 return *this;
42}
43
45 STORM_LOG_THROW(other.variableToCoefficientMapping.size() == 0, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
46 for (auto& variableCoefficientPair : this->variableToCoefficientMapping) {
47 variableCoefficientPair.second /= other.constantPart;
48 }
49 constantPart /= other.constantPart;
50 return *this;
51}
52
54 for (auto& variableCoefficientPair : variableToCoefficientMapping) {
55 variableCoefficientPair.second = -variableCoefficientPair.second;
56 }
57 constantPart = -constantPart;
58}
59
61 variableToCoefficientMapping[variable] = coefficient;
62}
63
65 return variableToCoefficientMapping[variable];
66}
67
69 return variableToCoefficientMapping.size();
70}
71
73 return this->constantPart;
74}
75
77 for (auto const& rhsVariableCoefficientPair : rhs.variableToCoefficientMapping) {
78 this->variableToCoefficientMapping[rhsVariableCoefficientPair.first] -= rhsVariableCoefficientPair.second;
79 }
80 rhs.variableToCoefficientMapping.clear();
81 rhs.constantPart -= this->constantPart;
82}
83
84std::map<storm::expressions::Variable, double>::const_iterator LinearCoefficientVisitor::VariableCoefficients::begin() const {
85 return this->variableToCoefficientMapping.begin();
86}
87
88std::map<storm::expressions::Variable, double>::const_iterator LinearCoefficientVisitor::VariableCoefficients::end() const {
89 return this->variableToCoefficientMapping.end();
90}
91
93 return boost::any_cast<VariableCoefficients>(expression.getBaseExpression().accept(*this, boost::none));
94}
95
96boost::any LinearCoefficientVisitor::visit(IfThenElseExpression const&, boost::any const&) {
97 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
98}
99
101 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
102}
103
104boost::any LinearCoefficientVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) {
105 VariableCoefficients leftResult = boost::any_cast<VariableCoefficients>(expression.getFirstOperand()->accept(*this, data));
106 VariableCoefficients rightResult = boost::any_cast<VariableCoefficients>(expression.getSecondOperand()->accept(*this, data));
107
109 leftResult += std::move(rightResult);
111 leftResult -= std::move(rightResult);
113 leftResult *= std::move(rightResult);
115 leftResult /= std::move(rightResult);
116 } else {
117 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
118 }
119 return leftResult;
120}
121
122boost::any LinearCoefficientVisitor::visit(BinaryRelationExpression const&, boost::any const&) {
123 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
124}
125
126boost::any LinearCoefficientVisitor::visit(VariableExpression const& expression, boost::any const&) {
127 VariableCoefficients coefficients;
128 if (expression.getType().isNumericalType()) {
129 coefficients.setCoefficient(expression.getVariable(), 1);
130 } else {
131 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
132 }
133 return coefficients;
134}
135
137 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
138}
139
140boost::any LinearCoefficientVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) {
141 VariableCoefficients childResult = boost::any_cast<VariableCoefficients>(expression.getOperand()->accept(*this, data));
142
144 childResult.negate();
145 return childResult;
146 } else {
147 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
148 }
149}
150
151boost::any LinearCoefficientVisitor::visit(BooleanLiteralExpression const&, boost::any const&) {
152 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear.");
153}
154
155boost::any LinearCoefficientVisitor::visit(IntegerLiteralExpression const& expression, boost::any const&) {
156 return VariableCoefficients(static_cast<double>(expression.getValue()));
157}
158
159boost::any LinearCoefficientVisitor::visit(RationalLiteralExpression const& expression, boost::any const&) {
160 return VariableCoefficients(expression.getValueAsDouble());
161}
162} // namespace expressions
163} // namespace storm
virtual boost::any accept(ExpressionVisitor &visitor, boost::any const &data) const =0
Accepts the given visitor by calling its visit method.
Type const & getType() const
Retrieves the type of the expression.
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.
int_fast64_t getValue() const
Retrieves the value of the integer literal.
VariableCoefficients getLinearCoefficients(Expression const &expression)
Computes the (double) coefficients of all identifiers appearing in the expression if the expression w...
virtual boost::any visit(IfThenElseExpression const &expression, boost::any const &data) override
double getValueAsDouble() const
Retrieves the value of the double literal.
bool isNumericalType() const
Checks whether this type is a numerical type.
Definition Type.cpp:190
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.
Variable const & getVariable() const
Retrieves the variable associated with this expression.
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.
Definition cli.cpp:18
VariableCoefficients & operator-=(VariableCoefficients &&other)
std::map< storm::expressions::Variable, double >::const_iterator end() const
void separateVariablesFromConstantPart(VariableCoefficients &rhs)
Brings all variables of the right-hand side coefficients to the left-hand side by negating them and m...
double getCoefficient(storm::expressions::Variable const &variable)
VariableCoefficients & operator*=(VariableCoefficients &&other)
std::map< storm::expressions::Variable, double >::const_iterator begin() const
void setCoefficient(storm::expressions::Variable const &variable, double coefficient)
VariableCoefficients & operator/=(VariableCoefficients &&other)
VariableCoefficients & operator+=(VariableCoefficients &&other)