Storm 1.11.1.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 // Intenetionally 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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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& e) {
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...
Expression integer(int_fast64_t value) const
Creates an expression that characterizes the given integer literal.
Expression rational(double value) const
Creates an expression that characterizes the given rational literal.
Expression boolean(bool value) const
Creates an expression that characterizes the given boolean literal.
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 minimum(Expression const &first, Expression const &second)
Expression floor(Expression const &first)
Expression pow(Expression const &base, Expression const &exponent, bool allowIntegerType)
The type of the resulting expression is.
Expression logarithm(Expression const &first, Expression const &second)
Expression implies(Expression const &first, Expression const &second)
bool isInteger(ValueType const &number)