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
247 if (this->createExpressions) {
248 return manager.integer(value);
249 } else {
250 return manager.boolean(false);
251 }
252}
253
255 if (this->createExpressions) {
256 return manager.boolean(value);
257 } else {
258 return manager.boolean(false);
259 }
260}
261
263 storm::expressions::OperatorType const& operatorType,
264 storm::expressions::Expression const& e2, bool& pass) const {
265 if (this->createExpressions) {
266 try {
267 switch (operatorType) {
269 return storm::expressions::minimum(e1, e2);
270 break;
272 return storm::expressions::maximum(e1, e2);
273 break;
274 default:
275 STORM_LOG_ASSERT(false, "Invalid operation.");
276 break;
277 }
278 } catch (storm::exceptions::InvalidTypeException const& e) {
279 pass = false;
280 }
281 }
282 return manager.boolean(false);
283}
284
286 storm::expressions::Expression const& e1, bool& pass) const {
287 if (this->createExpressions) {
288 try {
289 switch (operatorType) {
291 return storm::expressions::floor(e1);
292 break;
294 return storm::expressions::ceil(e1);
295 break;
296 default:
297 STORM_LOG_ASSERT(false, "Invalid operation.");
298 break;
299 }
300 } catch (storm::exceptions::InvalidTypeException const& e) {
301 pass = false;
302 }
303 }
304 return manager.boolean(false);
305}
306
308 if (this->createExpressions) {
309 try {
310 return storm::expressions::round(e1);
311 } catch (storm::exceptions::InvalidTypeException const& e) {
312 pass = false;
313 }
314 }
315 return manager.boolean(false);
316}
317
319 std::vector<storm::expressions::Expression> const& operands, bool& pass) const {
320 if (this->createExpressions) {
321 try {
322 switch (opTyp) {
324 return storm::expressions::atLeastOneOf(operands);
326 return storm::expressions::atMostOneOf(operands);
328 return storm::expressions::exactlyOneOf(operands);
329 default:
330 STORM_LOG_THROW(false, storm::exceptions::InvalidTypeException, "Operator type " << opTyp << " invalid for predicate expression.");
331 }
332 } catch (storm::exceptions::InvalidTypeException const& e) {
333 pass = false;
334 }
335 }
336 return manager.boolean(false);
337}
338
339storm::expressions::Expression ExpressionCreator::getIdentifierExpression(std::string const& identifier, bool& pass) const {
340 if (this->createExpressions) {
341 STORM_LOG_THROW(this->identifiers != nullptr, storm::exceptions::WrongFormatException,
342 "Unable to substitute identifier expressions without given mapping.");
343 storm::expressions::Expression const* expression = this->identifiers->find(identifier);
344 if (expression == nullptr) {
345 pass = false;
346 return manager.boolean(false);
347 }
348 return *expression;
349 } else {
350 return manager.boolean(false);
351 }
352}
353
354void ExpressionCreator::setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_) {
355 if (identifiers_ != nullptr) {
356 createExpressions = true;
357 identifiers = identifiers_;
358 } else {
359 createExpressions = false;
360 identifiers = nullptr;
361 }
362}
363
364void ExpressionCreator::setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping) {
366
367 createExpressions = true;
368 identifiers = new qi::symbols<char, storm::expressions::Expression>();
369 for (auto const& identifierExpressionPair : identifierMapping) {
370 identifiers->add(identifierExpressionPair.first, identifierExpressionPair.second);
371 }
372 deleteIdentifierMapping = true;
373}
374
376 createExpressions = false;
377 if (deleteIdentifierMapping) {
378 delete this->identifiers;
379 deleteIdentifierMapping = false;
380 }
381 this->identifiers = nullptr;
382}
383
384} // namespace parser
385} // 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 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 createIntegerLiteralExpression(int64_t value, 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_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)
LabParser.cpp.
Definition cli.cpp:18