Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExpressionCreator.cpp
Go to the documentation of this file.
1#include "ExpressionCreator.h"
2
9
12
13namespace storm {
14namespace parser {
15
17 // Intenetionally left empty.
18}
19
21 if (deleteIdentifierMapping) {
22 delete this->identifiers;
23 }
24}
25
27 storm::expressions::Expression const& e3, bool& pass) const {
28 if (this->createExpressions) {
29 try {
30 return storm::expressions::ite(e1, e2, e3);
31 } catch (storm::exceptions::InvalidTypeException const& e) {
32 pass = false;
33 }
34 }
35 return manager.boolean(false);
36}
37
39 storm::expressions::OperatorType const& operatorType,
40 storm::expressions::Expression const& e2, bool& pass) const {
41 if (this->createExpressions) {
42 try {
43 switch (operatorType) {
45 return e1 || e2;
46 break;
48 return storm::expressions::implies(e1, e2);
49 break;
50 default:
51 STORM_LOG_ASSERT(false, "Invalid operation.");
52 break;
53 }
54 } catch (storm::exceptions::InvalidTypeException const& e) {
55 pass = false;
56 }
57 }
58 return manager.boolean(false);
59}
60
62 storm::expressions::OperatorType const& operatorType,
63 storm::expressions::Expression const& e2, bool& pass) const {
64 if (this->createExpressions) {
66 try {
67 switch (operatorType) {
69 result = e1 && e2;
70 break;
71 default:
72 STORM_LOG_ASSERT(false, "Invalid operation.");
73 break;
74 }
75 } catch (storm::exceptions::InvalidTypeException const& e) {
76 pass = false;
77 }
78 return result;
79 }
80 return manager.boolean(false);
81}
82
84 storm::expressions::OperatorType const& operatorType,
85 storm::expressions::Expression const& e2, bool& pass) const {
86 if (this->createExpressions) {
87 try {
88 switch (operatorType) {
90 return e1 >= e2;
91 break;
93 return e1 > e2;
94 break;
96 return e1 <= e2;
97 break;
99 return e1 < e2;
100 break;
101 default:
102 STORM_LOG_ASSERT(false, "Invalid operation.");
103 break;
104 }
105 } catch (storm::exceptions::InvalidTypeException const& e) {
106 pass = false;
107 }
108 }
109 return manager.boolean(false);
110}
111
113 storm::expressions::OperatorType const& operatorType,
114 storm::expressions::Expression const& e2, bool& pass) const {
115 if (this->createExpressions) {
116 try {
117 switch (operatorType) {
119 return e1.hasBooleanType() && e2.hasBooleanType() ? storm::expressions::iff(e1, e2) : e1 == e2;
120 break;
122 return e1 != e2;
123 break;
124 default:
125 STORM_LOG_ASSERT(false, "Invalid operation.");
126 break;
127 }
128 } catch (storm::exceptions::InvalidTypeException const& e) {
129 pass = false;
130 }
131 }
132 return manager.boolean(false);
133}
134
136 storm::expressions::OperatorType const& operatorType,
137 storm::expressions::Expression const& e2, bool& pass) const {
138 if (this->createExpressions) {
139 try {
140 switch (operatorType) {
142 return e1 + e2;
143 break;
145 return e1 - e2;
146 break;
147 default:
148 STORM_LOG_ASSERT(false, "Invalid operation.");
149 break;
150 }
151 } catch (storm::exceptions::InvalidTypeException const& e) {
152 pass = false;
153 }
154 }
155 return manager.boolean(false);
156}
157
159 storm::expressions::OperatorType const& operatorType,
160 storm::expressions::Expression const& e2, bool& pass) const {
161 if (this->createExpressions) {
162 try {
163 switch (operatorType) {
165 return e1 * e2;
166 break;
168 return e1 / e2;
169 break;
170 default:
171 STORM_LOG_ASSERT(false, "Invalid operation.");
172 break;
173 }
174 } catch (storm::exceptions::InvalidTypeException const& e) {
175 pass = false;
176 }
177 }
178 return manager.boolean(false);
179}
180
182 storm::expressions::OperatorType const& operatorType,
183 storm::expressions::Expression const& e2, bool& pass) const {
184 if (this->createExpressions) {
185 try {
186 switch (operatorType) {
188 return storm::expressions::pow(e1, e2, true);
189 break;
191 return e1 % e2;
192 break;
194 return storm::expressions::logarithm(e1, e2);
195 break;
196 default:
197 STORM_LOG_ASSERT(false, "Invalid operation.");
198 break;
199 }
200 } catch (storm::exceptions::InvalidTypeException const& e) {
201 pass = false;
202 }
203 }
204 return manager.boolean(false);
205}
206
207storm::expressions::Expression ExpressionCreator::createUnaryExpression(std::vector<storm::expressions::OperatorType> const& operatorTypes,
208 storm::expressions::Expression const& e1, bool& pass) const {
209 if (this->createExpressions) {
210 try {
212 for (auto const& op : operatorTypes) {
213 switch (op) {
215 result = !result;
216 break;
218 result = -result;
219 break;
220 default:
221 STORM_LOG_ASSERT(false, "Invalid operation.");
222 break;
223 }
224 }
225 return result;
226 } catch (storm::exceptions::InvalidTypeException const& e) {
227 pass = false;
228 }
229 }
230 return manager.boolean(false);
231}
232
233storm::expressions::Expression ExpressionCreator::createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const {
234 // If we are not supposed to accept double expressions, we reject it by setting pass to false.
235 if (!this->acceptDoubleLiterals) {
236 pass = false;
237 }
238
239 if (this->createExpressions) {
240 return manager.rational(value);
241 } else {
242 return manager.boolean(false);
243 }
244}
245
246storm::expressions::Expression ExpressionCreator::createIntegerLiteralExpression(storm::RationalNumber const& value, bool&, bool& overflow) const {
247 STORM_LOG_ASSERT(storm::utility::isInteger(value), "Expected integer value.");
248 auto const min = storm::utility::convertNumber<storm::RationalNumber>(std::numeric_limits<int64_t>::min());
249 auto const max = storm::utility::convertNumber<storm::RationalNumber>(std::numeric_limits<int64_t>::max());
250 overflow = value < min || value > max;
251 if (overflow) {
252 STORM_LOG_ERROR("Overflow when parsing integer literal '"
253 << value << "' as a 64 bit integer. Consider appending '.0' to the number to parse it as an (arbitrary precision) float.");
254 // parsing failure is triggered by the calling parser
255 return manager.boolean(false);
256 } else if (this->createExpressions) {
257 return manager.integer(storm::utility::convertNumber<int64_t>(value));
258 } else {
259 return manager.boolean(false);
260 }
261}
262
264 if (this->createExpressions) {
265 return manager.boolean(value);
266 } else {
267 return manager.boolean(false);
268 }
269}
270
272 storm::expressions::OperatorType const& operatorType,
273 storm::expressions::Expression const& e2, bool& pass) const {
274 if (this->createExpressions) {
275 try {
276 switch (operatorType) {
278 return storm::expressions::minimum(e1, e2);
279 break;
281 return storm::expressions::maximum(e1, e2);
282 break;
283 default:
284 STORM_LOG_ASSERT(false, "Invalid operation.");
285 break;
286 }
287 } catch (storm::exceptions::InvalidTypeException const& e) {
288 pass = false;
289 }
290 }
291 return manager.boolean(false);
292}
293
295 storm::expressions::Expression const& e1, bool& pass) const {
296 if (this->createExpressions) {
297 try {
298 switch (operatorType) {
300 return storm::expressions::floor(e1);
301 break;
303 return storm::expressions::ceil(e1);
304 break;
305 default:
306 STORM_LOG_ASSERT(false, "Invalid operation.");
307 break;
308 }
309 } catch (storm::exceptions::InvalidTypeException const& e) {
310 pass = false;
311 }
312 }
313 return manager.boolean(false);
314}
315
317 if (this->createExpressions) {
318 try {
319 return storm::expressions::round(e1);
320 } catch (storm::exceptions::InvalidTypeException const& e) {
321 pass = false;
322 }
323 }
324 return manager.boolean(false);
325}
326
328 std::vector<storm::expressions::Expression> const& operands, bool& pass) const {
329 if (this->createExpressions) {
330 try {
331 switch (opTyp) {
333 return storm::expressions::atLeastOneOf(operands);
335 return storm::expressions::atMostOneOf(operands);
337 return storm::expressions::exactlyOneOf(operands);
338 default:
339 STORM_LOG_THROW(false, storm::exceptions::InvalidTypeException, "Operator type " << opTyp << " invalid for predicate expression.");
340 }
341 } catch (storm::exceptions::InvalidTypeException const& e) {
342 pass = false;
343 }
344 }
345 return manager.boolean(false);
346}
347
348storm::expressions::Expression ExpressionCreator::getIdentifierExpression(std::string const& identifier, bool& pass) const {
349 if (this->createExpressions) {
350 STORM_LOG_THROW(this->identifiers != nullptr, storm::exceptions::WrongFormatException,
351 "Unable to substitute identifier expressions without given mapping.");
352 storm::expressions::Expression const* expression = this->identifiers->find(identifier);
353 if (expression == nullptr) {
354 pass = false;
355 return manager.boolean(false);
356 }
357 return *expression;
358 } else {
359 return manager.boolean(false);
360 }
361}
362
363void ExpressionCreator::setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_) {
364 if (identifiers_ != nullptr) {
365 createExpressions = true;
366 identifiers = identifiers_;
367 } else {
368 createExpressions = false;
369 identifiers = nullptr;
370 }
371}
372
373void ExpressionCreator::setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping) {
375
376 createExpressions = true;
377 identifiers = new qi::symbols<char, storm::expressions::Expression>();
378 for (auto const& identifierExpressionPair : identifierMapping) {
379 identifiers->add(identifierExpressionPair.first, identifierExpressionPair.second);
380 }
381 deleteIdentifierMapping = true;
382}
383
385 createExpressions = false;
386 if (deleteIdentifierMapping) {
387 delete this->identifiers;
388 deleteIdentifierMapping = false;
389 }
390 this->identifiers = nullptr;
391}
392
393} // namespace parser
394} // 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:31
#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)
Definition constants.cpp:76
LabParser.cpp.
Definition cli.cpp:18