Storm 1.13.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 try {
29 return storm::expressions::ite(e1, e2, e3);
30 } catch (storm::exceptions::InvalidTypeException const&) {
31 pass = false;
32 }
33 }
34 return manager.boolean(false);
35}
36
38 storm::expressions::OperatorType const& operatorType,
39 storm::expressions::Expression const& e2, bool& pass) const {
40 if (this->createExpressions) {
41 try {
42 switch (operatorType) {
44 return e1 || e2;
45 break;
47 return storm::expressions::implies(e1, e2);
48 break;
49 default:
50 STORM_LOG_ASSERT(false, "Invalid operation.");
51 break;
52 }
53 } catch (storm::exceptions::InvalidTypeException const&) {
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) {
65 try {
66 switch (operatorType) {
68 result = e1 && e2;
69 break;
70 default:
71 STORM_LOG_ASSERT(false, "Invalid operation.");
72 break;
73 }
74 } catch (storm::exceptions::InvalidTypeException const&) {
75 pass = false;
76 }
77 return result;
78 }
79 return manager.boolean(false);
80}
81
83 storm::expressions::OperatorType const& operatorType,
84 storm::expressions::Expression const& e2, bool& pass) const {
85 if (this->createExpressions) {
86 try {
87 switch (operatorType) {
89 return e1 >= e2;
90 break;
92 return e1 > e2;
93 break;
95 return e1 <= e2;
96 break;
98 return e1 < e2;
99 break;
100 default:
101 STORM_LOG_ASSERT(false, "Invalid operation.");
102 break;
103 }
104 } catch (storm::exceptions::InvalidTypeException const&) {
105 pass = false;
106 }
107 }
108 return manager.boolean(false);
109}
110
112 storm::expressions::OperatorType const& operatorType,
113 storm::expressions::Expression const& e2, bool& pass) const {
114 if (this->createExpressions) {
115 try {
116 switch (operatorType) {
118 return e1.hasBooleanType() && e2.hasBooleanType() ? storm::expressions::iff(e1, e2) : e1 == e2;
119 break;
121 return e1 != e2;
122 break;
123 default:
124 STORM_LOG_ASSERT(false, "Invalid operation.");
125 break;
126 }
127 } catch (storm::exceptions::InvalidTypeException const&) {
128 pass = false;
129 }
130 }
131 return manager.boolean(false);
132}
133
135 storm::expressions::OperatorType const& operatorType,
136 storm::expressions::Expression const& e2, bool& pass) const {
137 if (this->createExpressions) {
138 try {
139 switch (operatorType) {
141 return e1 + e2;
142 break;
144 return e1 - e2;
145 break;
146 default:
147 STORM_LOG_ASSERT(false, "Invalid operation.");
148 break;
149 }
150 } catch (storm::exceptions::InvalidTypeException const&) {
151 pass = false;
152 }
153 }
154 return manager.boolean(false);
155}
156
158 storm::expressions::OperatorType const& operatorType,
159 storm::expressions::Expression const& e2, bool& pass) const {
160 if (this->createExpressions) {
161 try {
162 switch (operatorType) {
164 return e1 * e2;
165 break;
167 return e1 / e2;
168 break;
169 default:
170 STORM_LOG_ASSERT(false, "Invalid operation.");
171 break;
172 }
173 } catch (storm::exceptions::InvalidTypeException const&) {
174 pass = false;
175 }
176 }
177 return manager.boolean(false);
178}
179
181 storm::expressions::OperatorType const& operatorType,
182 storm::expressions::Expression const& e2, bool& pass) const {
183 if (this->createExpressions) {
184 try {
185 switch (operatorType) {
187 return storm::expressions::pow(e1, e2, true);
188 break;
190 return e1 % e2;
191 break;
193 return storm::expressions::logarithm(e1, e2);
194 break;
195 default:
196 STORM_LOG_ASSERT(false, "Invalid operation.");
197 break;
198 }
199 } catch (storm::exceptions::InvalidTypeException const&) {
200 pass = false;
201 }
202 }
203 return manager.boolean(false);
204}
205
206storm::expressions::Expression ExpressionCreator::createUnaryExpression(std::vector<storm::expressions::OperatorType> const& operatorTypes,
207 storm::expressions::Expression const& e1, bool& pass) const {
208 if (this->createExpressions) {
209 try {
211 for (auto const& op : operatorTypes) {
212 switch (op) {
214 result = !result;
215 break;
217 result = -result;
218 break;
219 default:
220 STORM_LOG_ASSERT(false, "Invalid operation.");
221 break;
222 }
223 }
224 return result;
225 } catch (storm::exceptions::InvalidTypeException const&) {
226 pass = false;
227 }
228 }
229 return manager.boolean(false);
230}
231
232storm::expressions::Expression ExpressionCreator::createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const {
233 // If we are not supposed to accept double expressions, we reject it by setting pass to false.
234 if (!this->acceptDoubleLiterals) {
235 pass = false;
236 }
237
238 if (this->createExpressions) {
239 return manager.rational(value);
240 } else {
241 return manager.boolean(false);
242 }
243}
244
245storm::expressions::Expression ExpressionCreator::createIntegerLiteralExpression(storm::RationalNumber const& value, bool&, bool& overflow) const {
246 STORM_LOG_ASSERT(storm::utility::isInteger(value), "Expected integer value.");
247 auto const min = storm::utility::convertNumber<storm::RationalNumber>(std::numeric_limits<int64_t>::min());
248 auto const max = storm::utility::convertNumber<storm::RationalNumber>(std::numeric_limits<int64_t>::max());
249 overflow = value < min || value > max;
250 if (overflow) {
251 STORM_LOG_ERROR("Overflow when parsing integer literal '"
252 << value << "' as a 64 bit integer. Consider appending '.0' to the number to parse it as an (arbitrary precision) float.");
253 // parsing failure is triggered by the calling parser
254 return manager.boolean(false);
255 } else if (this->createExpressions) {
256 return manager.integer(storm::utility::convertNumber<int64_t>(value));
257 } else {
258 return manager.boolean(false);
259 }
260}
261
263 if (this->createExpressions) {
264 return manager.boolean(value);
265 } else {
266 return manager.boolean(false);
267 }
268}
269
271 storm::expressions::OperatorType const& operatorType,
272 storm::expressions::Expression const& e2, bool& pass) const {
273 if (this->createExpressions) {
274 try {
275 switch (operatorType) {
277 return storm::expressions::minimum(e1, e2);
278 break;
280 return storm::expressions::maximum(e1, e2);
281 break;
282 default:
283 STORM_LOG_ASSERT(false, "Invalid operation.");
284 break;
285 }
286 } catch (storm::exceptions::InvalidTypeException const&) {
287 pass = false;
288 }
289 }
290 return manager.boolean(false);
291}
292
294 storm::expressions::Expression const& e1, bool& pass) const {
295 if (this->createExpressions) {
296 try {
297 switch (operatorType) {
299 return storm::expressions::floor(e1);
300 break;
302 return storm::expressions::ceil(e1);
303 break;
304 default:
305 STORM_LOG_ASSERT(false, "Invalid operation.");
306 break;
307 }
308 } catch (storm::exceptions::InvalidTypeException const&) {
309 pass = false;
310 }
311 }
312 return manager.boolean(false);
313}
314
316 if (this->createExpressions) {
317 try {
318 return storm::expressions::round(e1);
319 } catch (storm::exceptions::InvalidTypeException const&) {
320 pass = false;
321 }
322 }
323 return manager.boolean(false);
324}
325
327 std::vector<storm::expressions::Expression> const& operands, bool& pass) const {
328 if (this->createExpressions) {
329 try {
330 switch (opTyp) {
332 return storm::expressions::atLeastOneOf(operands);
334 return storm::expressions::atMostOneOf(operands);
336 return storm::expressions::exactlyOneOf(operands);
337 default:
338 STORM_LOG_THROW(false, storm::exceptions::InvalidTypeException, "Operator type " << opTyp << " invalid for predicate expression.");
339 }
340 } catch (storm::exceptions::InvalidTypeException const&) {
341 pass = false;
342 }
343 }
344 return manager.boolean(false);
345}
346
347storm::expressions::Expression ExpressionCreator::getIdentifierExpression(std::string const& identifier, bool& pass) const {
348 if (this->createExpressions) {
349 STORM_LOG_THROW(this->identifiers != nullptr, storm::exceptions::WrongFormatException,
350 "Unable to substitute identifier expressions without given mapping.");
351 storm::expressions::Expression const* expression = this->identifiers->find(identifier);
352 if (expression == nullptr) {
353 pass = false;
354 return manager.boolean(false);
355 }
356 return *expression;
357 } else {
358 return manager.boolean(false);
359 }
360}
361
362void ExpressionCreator::setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_) {
363 if (identifiers_ != nullptr) {
364 createExpressions = true;
365 identifiers = identifiers_;
366 } else {
367 createExpressions = false;
368 identifiers = nullptr;
369 }
370}
371
372void ExpressionCreator::setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping) {
374
375 createExpressions = true;
376 identifiers = new qi::symbols<char, storm::expressions::Expression>();
377 for (auto const& identifierExpressionPair : identifierMapping) {
378 identifiers->add(identifierExpressionPair.first, identifierExpressionPair.second);
379 }
380 deleteIdentifierMapping = true;
381}
382
384 createExpressions = false;
385 if (deleteIdentifierMapping) {
386 delete this->identifiers;
387 deleteIdentifierMapping = false;
388 }
389 this->identifiers = nullptr;
390}
391
392} // namespace parser
393} // namespace storm
bool hasBooleanType() const
Retrieves whether the expression has a boolean return type.
This class is responsible for managing a set of typed variables and all expressions using these varia...
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:26
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
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)