Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExpressionCreator.cpp
Go to the documentation of this file.
1#include "ExpressionCreator.h"
2
11
12namespace storm {
13namespace parser {
14
16 // Intentionally left empty.
17}
18
20 if (deleteIdentifierMapping) {
21 delete this->identifiers;
22 }
23}
24
26 storm::expressions::Expression const& e3, bool& pass) const {
27 if (this->createExpressions) {
28 // Check types instead of relying on the (logging) exception thrown by ite(), since a mismatch here is an
29 // expected outcome during speculative parsing (e.g. resolving formulas declared in dependency order).
30 bool typesOk = e1.hasBooleanType() && (e2.getType() == e3.getType() || (e2.getType().isNumericalType() && e3.getType().isNumericalType()));
31 if (typesOk) {
32 return storm::expressions::ite(e1, e2, e3);
33 }
34 pass = false;
35 }
36 return manager.boolean(false);
37}
38
40 storm::expressions::OperatorType const& operatorType,
41 storm::expressions::Expression const& e2, bool& pass) const {
42 if (this->createExpressions) {
43 if (e1.hasBooleanType() && e2.hasBooleanType()) {
44 switch (operatorType) {
46 return e1 || e2;
48 return storm::expressions::implies(e1, e2);
49 default:
50 STORM_LOG_ASSERT(false, "Invalid operation.");
51 break;
52 }
53 } else {
54 pass = false;
55 }
56 }
57 return manager.boolean(false);
58}
59
61 storm::expressions::OperatorType const& operatorType,
62 storm::expressions::Expression const& e2, bool& pass) const {
63 if (this->createExpressions) {
64 if (e1.hasBooleanType() && e2.hasBooleanType()) {
65 switch (operatorType) {
67 return e1 && e2;
68 default:
69 STORM_LOG_ASSERT(false, "Invalid operation.");
70 break;
71 }
72 } else {
73 pass = false;
74 }
75 }
76 return manager.boolean(false);
77}
78
80 storm::expressions::OperatorType const& operatorType,
81 storm::expressions::Expression const& e2, bool& pass) const {
82 if (this->createExpressions) {
83 try {
84 switch (operatorType) {
86 return e1 >= e2;
88 return e1 > e2;
90 return e1 <= e2;
92 return e1 < e2;
93 default:
94 STORM_LOG_ASSERT(false, "Invalid operation.");
95 break;
96 }
97 } catch (storm::exceptions::InvalidTypeException const&) {
98 pass = false;
99 }
100 }
101 return manager.boolean(false);
102}
103
105 storm::expressions::OperatorType const& operatorType,
106 storm::expressions::Expression const& e2, bool& pass) const {
107 if (this->createExpressions) {
108 try {
109 switch (operatorType) {
111 return e1.hasBooleanType() && e2.hasBooleanType() ? storm::expressions::iff(e1, e2) : e1 == e2;
113 return e1 != e2;
114 default:
115 STORM_LOG_ASSERT(false, "Invalid operation.");
116 break;
117 }
118 } catch (storm::exceptions::InvalidTypeException const&) {
119 pass = false;
120 }
121 }
122 return manager.boolean(false);
123}
124
126 storm::expressions::OperatorType const& operatorType,
127 storm::expressions::Expression const& e2, bool& pass) const {
128 if (this->createExpressions) {
129 try {
130 switch (operatorType) {
132 return e1 + e2;
134 return e1 - e2;
135 default:
136 STORM_LOG_ASSERT(false, "Invalid operation.");
137 break;
138 }
139 } catch (storm::exceptions::InvalidTypeException const&) {
140 pass = false;
141 }
142 }
143 return manager.boolean(false);
144}
145
147 storm::expressions::OperatorType const& operatorType,
148 storm::expressions::Expression const& e2, bool& pass) const {
149 if (this->createExpressions) {
150 try {
151 switch (operatorType) {
153 return e1 * e2;
155 return e1 / e2;
156 default:
157 STORM_LOG_ASSERT(false, "Invalid operation.");
158 break;
159 }
160 } catch (storm::exceptions::InvalidTypeException const&) {
161 pass = false;
162 }
163 }
164 return manager.boolean(false);
165}
166
168 storm::expressions::OperatorType const& operatorType,
169 storm::expressions::Expression const& e2, bool& pass) const {
170 if (this->createExpressions) {
171 try {
172 switch (operatorType) {
174 return storm::expressions::pow(e1, e2, true);
176 return e1 % e2;
178 return storm::expressions::logarithm(e1, e2);
179 default:
180 STORM_LOG_ASSERT(false, "Invalid operation.");
181 break;
182 }
183 } catch (storm::exceptions::InvalidTypeException const&) {
184 pass = false;
185 }
186 }
187 return manager.boolean(false);
188}
189
190storm::expressions::Expression ExpressionCreator::createUnaryExpression(std::vector<storm::expressions::OperatorType> const& operatorTypes,
191 storm::expressions::Expression const& e1, bool& pass) const {
192 if (this->createExpressions) {
193 try {
195 for (auto const& op : operatorTypes) {
196 switch (op) {
198 result = !result;
199 break;
201 result = -result;
202 break;
203 default:
204 STORM_LOG_ASSERT(false, "Invalid operation.");
205 break;
206 }
207 }
208 return result;
209 } catch (storm::exceptions::InvalidTypeException const&) {
210 pass = false;
211 }
212 }
213 return manager.boolean(false);
214}
215
216storm::expressions::Expression ExpressionCreator::createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const {
217 // If we are not supposed to accept double expressions, we reject it by setting pass to false.
218 if (!this->acceptDoubleLiterals) {
219 pass = false;
220 }
221
222 if (this->createExpressions) {
223 return manager.rational(value);
224 } else {
225 return manager.boolean(false);
226 }
227}
228
229storm::expressions::Expression ExpressionCreator::createIntegerLiteralExpression(storm::RationalNumber const& value, bool&, bool& overflow) const {
230 STORM_LOG_ASSERT(storm::utility::isInteger(value), "Expected integer value.");
231 auto const min = storm::utility::convertNumber<storm::RationalNumber>(std::numeric_limits<int64_t>::min());
232 auto const max = storm::utility::convertNumber<storm::RationalNumber>(std::numeric_limits<int64_t>::max());
233 overflow = value < min || value > max;
234 if (overflow) {
235 STORM_LOG_ERROR("Overflow when parsing integer literal '"
236 << value << "' as a 64 bit integer. Consider appending '.0' to the number to parse it as an (arbitrary precision) float.");
237 // parsing failure is triggered by the calling parser
238 return manager.boolean(false);
239 } else if (this->createExpressions) {
240 return manager.integer(storm::utility::convertNumber<int64_t>(value));
241 } else {
242 return manager.boolean(false);
243 }
244}
245
247 if (this->createExpressions) {
248 return manager.boolean(value);
249 } else {
250 return manager.boolean(false);
251 }
252}
253
255 storm::expressions::OperatorType const& operatorType,
256 storm::expressions::Expression const& e2, bool& pass) const {
257 if (this->createExpressions) {
258 try {
259 switch (operatorType) {
261 return storm::expressions::minimum(e1, e2);
263 return storm::expressions::maximum(e1, e2);
264 default:
265 STORM_LOG_ASSERT(false, "Invalid operation.");
266 break;
267 }
268 } catch (storm::exceptions::InvalidTypeException const&) {
269 pass = false;
270 }
271 }
272 return manager.boolean(false);
273}
274
276 storm::expressions::Expression const& e1, bool& pass) const {
277 if (this->createExpressions) {
278 try {
279 switch (operatorType) {
281 return storm::expressions::floor(e1);
283 return storm::expressions::ceil(e1);
284 default:
285 STORM_LOG_ASSERT(false, "Invalid operation.");
286 break;
287 }
288 } catch (storm::exceptions::InvalidTypeException const&) {
289 pass = false;
290 }
291 }
292 return manager.boolean(false);
293}
294
296 if (this->createExpressions) {
297 try {
298 return storm::expressions::round(e1);
299 } catch (storm::exceptions::InvalidTypeException const&) {
300 pass = false;
301 }
302 }
303 return manager.boolean(false);
304}
305
307 std::vector<storm::expressions::Expression> const& operands, bool& pass) const {
308 if (this->createExpressions) {
309 try {
310 switch (opTyp) {
312 return storm::expressions::atLeastOneOf(operands);
314 return storm::expressions::atMostOneOf(operands);
316 return storm::expressions::exactlyOneOf(operands);
317 default:
318 STORM_LOG_THROW(false, storm::exceptions::InvalidTypeException, "Operator type " << opTyp << " invalid for predicate expression.");
319 }
320 } catch (storm::exceptions::InvalidTypeException const&) {
321 pass = false;
322 }
323 }
324 return manager.boolean(false);
325}
326
327storm::expressions::Expression ExpressionCreator::getIdentifierExpression(std::string const& identifier, bool& pass) const {
328 if (this->createExpressions) {
329 STORM_LOG_THROW(this->identifiers != nullptr, storm::exceptions::WrongFormatException,
330 "Unable to substitute identifier expressions without given mapping.");
331 storm::expressions::Expression const* expression = this->identifiers->find(identifier);
332 if (expression == nullptr) {
333 pass = false;
334 return manager.boolean(false);
335 }
336 return *expression;
337 } else {
338 return manager.boolean(false);
339 }
340}
341
342void ExpressionCreator::setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_) {
343 if (identifiers_ != nullptr) {
344 createExpressions = true;
345 identifiers = identifiers_;
346 } else {
347 createExpressions = false;
348 identifiers = nullptr;
349 }
350}
351
352void ExpressionCreator::setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping) {
354
355 createExpressions = true;
356 identifiers = new qi::symbols<char, storm::expressions::Expression>();
357 for (auto const& identifierExpressionPair : identifierMapping) {
358 identifiers->add(identifierExpressionPair.first, identifierExpressionPair.second);
359 }
360 deleteIdentifierMapping = true;
361}
362
364 createExpressions = false;
365 if (deleteIdentifierMapping) {
366 delete this->identifiers;
367 deleteIdentifierMapping = false;
368 }
369 this->identifiers = nullptr;
370}
371
372} // namespace parser
373} // namespace storm
bool hasBooleanType() const
Retrieves whether the expression has a boolean return type.
Type const & getType() const
Retrieves the type of the expression.
This class is responsible for managing a set of typed variables and all expressions using these varia...
bool isNumericalType() const
Checks whether this type is a numerical type.
Definition Type.cpp:206
storm::expressions::Expression createIntegerLiteralExpression(storm::RationalNumber const &value, bool &pass, bool &overflow) const
storm::expressions::Expression getIdentifierExpression(std::string const &identifier, bool &pass) const
storm::expressions::Expression createRationalLiteralExpression(storm::RationalNumber const &value, bool &pass) const
storm::expressions::Expression createPredicateExpression(storm::expressions::OperatorType const &opTyp, std::vector< storm::expressions::Expression > const &operands, bool &pass) const
storm::expressions::Expression createIteExpression(storm::expressions::Expression const &e1, storm::expressions::Expression const &e2, storm::expressions::Expression const &e3, bool &pass) const
ExpressionCreator(storm::expressions::ExpressionManager const &manager)
void setIdentifierMapping(qi::symbols< char, storm::expressions::Expression > const *identifiers_)
Sets an identifier mapping that is used to determine valid variables in the expression.
storm::expressions::Expression createMultExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createPlusExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createEqualsExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createFloorCeilExpression(storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e1, bool &pass) const
void unsetIdentifierMapping()
Unsets a previously set identifier mapping.
storm::expressions::Expression createOrExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createRelationalExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createRoundExpression(storm::expressions::Expression const &e1, bool &pass) const
storm::expressions::Expression createBooleanLiteralExpression(bool value, bool &pass) const
storm::expressions::Expression createUnaryExpression(std::vector< storm::expressions::OperatorType > const &operatorType, storm::expressions::Expression const &e1, bool &pass) const
storm::expressions::Expression createPowerModuloLogarithmExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createAndExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
storm::expressions::Expression createMinimumMaximumExpression(storm::expressions::Expression const &e1, storm::expressions::OperatorType const &operatorType, storm::expressions::Expression const &e2, bool &pass) const
#define STORM_LOG_ERROR(message)
Definition logging.h:29
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:28
Expression maximum(Expression const &first, Expression const &second)
Expression atLeastOneOf(std::vector< Expression > const &expressions)
Expression round(Expression const &first)
Expression ceil(Expression const &first)
Expression ite(Expression const &condition, Expression const &thenExpression, Expression const &elseExpression)
Expression iff(Expression const &first, Expression const &second)
Expression exactlyOneOf(std::vector< Expression > const &expressions)
Expression atMostOneOf(std::vector< Expression > const &expressions)
Expression pow(Expression const &base, Expression const &exponent, bool allowIntegerType)
The type of the resulting expression is.
Expression minimum(Expression const &first, Expression const &second)
Expression floor(Expression const &first)
Expression logarithm(Expression const &first, Expression const &second)
Expression implies(Expression const &first, Expression const &second)
Contains all file parsers and helper classes.
bool isInteger(ValueType const &number)
TargetType convertNumber(SourceType const &number)