Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExpressionManager.cpp
Go to the documentation of this file.
2
8
9namespace storm {
10namespace expressions {
11
12VariableIterator::VariableIterator(ExpressionManager const& manager, std::unordered_map<std::string, uint_fast64_t>::const_iterator nameIndexIterator,
13 std::unordered_map<std::string, uint_fast64_t>::const_iterator nameIndexIteratorEnd, VariableSelection const& selection)
14 : manager(manager), nameIndexIterator(nameIndexIterator), nameIndexIteratorEnd(nameIndexIteratorEnd), selection(selection) {
15 moveUntilNextSelectedElement(false);
16}
17
19 return this->nameIndexIterator == other.nameIndexIterator;
20}
21
23 return !(*this == other);
24}
25
29
31 moveUntilNextSelectedElement();
32 return *this;
33}
34
36 moveUntilNextSelectedElement();
37 return *this;
38}
39
40void VariableIterator::moveUntilNextSelectedElement(bool atLeastOneStep) {
41 if (atLeastOneStep && nameIndexIterator != nameIndexIteratorEnd) {
42 ++nameIndexIterator;
43 }
44
45 // Move the underlying iterator forward until a variable matches the selection.
46 while (nameIndexIterator != nameIndexIteratorEnd &&
47 (selection == VariableSelection::OnlyRegularVariables && (nameIndexIterator->second & ExpressionManager::auxiliaryMask) != 0) &&
48 (selection == VariableSelection::OnlyAuxiliaryVariables && (nameIndexIterator->second & ExpressionManager::auxiliaryMask) == 0)) {
49 ++nameIndexIterator;
50 }
51
52 if (nameIndexIterator != nameIndexIteratorEnd) {
53 currentElement = std::make_pair(Variable(manager.getSharedPointer(), nameIndexIterator->second), manager.getVariableType(nameIndexIterator->second));
54 }
55}
56
58 : nameToIndexMapping(),
59 indexToNameMapping(),
60 indexToTypeMapping(),
61 numberOfBooleanVariables(0),
62 numberOfIntegerVariables(0),
63 numberOfBitVectorVariables(0),
64 numberOfRationalVariables(0),
65 numberOfArrayVariables(0),
66 numberOfAuxiliaryVariables(0),
67 numberOfAuxiliaryBooleanVariables(0),
68 numberOfAuxiliaryIntegerVariables(0),
69 numberOfAuxiliaryBitVectorVariables(0),
70 numberOfAuxiliaryRationalVariables(0),
71 numberOfAuxiliaryArrayVariables(0),
72 freshVariableCounter(0) {
73 // Intentionally left empty.
74}
75
77 // Intentionally left empty.
78}
79
80std::shared_ptr<ExpressionManager> ExpressionManager::clone() const {
81 return std::shared_ptr<ExpressionManager>(new ExpressionManager(*this));
82}
83
85 return Expression(std::make_shared<BooleanLiteralExpression>(*this, value));
86}
87
88Expression ExpressionManager::integer(int_fast64_t value) const {
89 return Expression(std::make_shared<IntegerLiteralExpression>(*this, value));
90}
91
93 return Expression(std::make_shared<RationalLiteralExpression>(*this, value));
94}
95
96Expression ExpressionManager::rational(storm::RationalNumber const& value) const {
97 return Expression(std::make_shared<RationalLiteralExpression>(*this, value));
98}
99
101 return this == &other;
102}
103
105 if (!booleanType) {
106 booleanType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new BooleanType()));
107 }
108 return booleanType.get();
109}
110
112 if (!integerType) {
113 integerType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new IntegerType()));
114 }
115 return integerType.get();
116}
117
118Type const& ExpressionManager::getBitVectorType(std::size_t width) const {
119 Type type(this->getSharedPointer(), std::shared_ptr<BaseType>(new BitVectorType(width)));
120 auto typeIterator = bitvectorTypes.find(type);
121 if (typeIterator == bitvectorTypes.end()) {
122 auto iteratorBoolPair = bitvectorTypes.insert(type);
123 return *iteratorBoolPair.first;
124 }
125 return *typeIterator;
126}
127
129 if (!rationalType) {
130 rationalType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new RationalType()));
131 }
132 return rationalType.get();
133}
134
135Type const& ExpressionManager::getArrayType(Type elementType) const {
136 Type type(this->getSharedPointer(), std::shared_ptr<BaseType>(new ArrayType(elementType)));
137 return *arrayTypes.insert(type).first;
138}
139
141 if (!transcendentalNumberType) {
142 transcendentalNumberType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new TranscendentalNumberType()));
143 }
144 return transcendentalNumberType.get();
145}
146
147bool ExpressionManager::isValidVariableName(std::string const& name) {
148 return name.size() < 2 || name.at(0) != '_' || name.at(1) != '_';
149}
150
151bool ExpressionManager::variableExists(std::string const& name) const {
152 auto nameIndexPair = nameToIndexMapping.find(name);
153 return nameIndexPair != nameToIndexMapping.end();
154}
155
157 return declareFreshVariable(variable.getType(), true, "_" + variable.getName() + "_");
158}
159
160Variable ExpressionManager::declareVariable(std::string const& name, storm::expressions::Type const& variableType, bool auxiliary) {
161 STORM_LOG_THROW(!variableExists(name), storm::exceptions::InvalidArgumentException, "Variable with name '" << name << "' already exists.");
162 return declareOrGetVariable(name, variableType, auxiliary);
163}
164
165Variable ExpressionManager::declareBooleanVariable(std::string const& name, bool auxiliary) {
166 Variable var = this->declareVariable(name, this->getBooleanType(), auxiliary);
167 return var;
168}
169
170Variable ExpressionManager::declareIntegerVariable(std::string const& name, bool auxiliary) {
171 return this->declareVariable(name, this->getIntegerType(), auxiliary);
172}
173
174Variable ExpressionManager::declareBitVectorVariable(std::string const& name, std::size_t width, bool auxiliary) {
175 return this->declareVariable(name, this->getBitVectorType(width), auxiliary);
176}
177
178Variable ExpressionManager::declareRationalVariable(std::string const& name, bool auxiliary) {
179 return this->declareVariable(name, this->getRationalType(), auxiliary);
180}
181
182Variable ExpressionManager::declareArrayVariable(std::string const& name, Type const& elementType, bool auxiliary) {
183 return this->declareVariable(name, this->getArrayType(elementType), auxiliary);
184}
185
186Variable ExpressionManager::declareOrGetVariable(std::string const& name, storm::expressions::Type const& variableType, bool auxiliary) {
187 return declareOrGetVariable(name, variableType, auxiliary, true);
188}
189
190Variable ExpressionManager::declareOrGetVariable(std::string const& name, storm::expressions::Type const& variableType, bool auxiliary, bool checkName) {
191 STORM_LOG_THROW(!checkName || isValidVariableName(name), storm::exceptions::InvalidArgumentException, "Invalid variable name '" << name << "'.");
192 auto nameIndexPair = nameToIndexMapping.find(name);
193 if (nameIndexPair != nameToIndexMapping.end()) {
194 STORM_LOG_ASSERT(indexToTypeMapping.at(nameIndexPair->second) == variableType, "Tried to declareOrGet variable '"
195 << name << "' of type '" << variableType
196 << "' but there is a variable with that name and different type '"
197 << indexToTypeMapping.at(nameIndexPair->second) << "'.");
198 return Variable(this->getSharedPointer(), nameIndexPair->second);
199 } else {
200 uint64_t offset = 0;
201
202 if (variableType.isBooleanType()) {
203 offset = numberOfBooleanVariables++;
204 } else if (variableType.isIntegerType()) {
205 offset = numberOfIntegerVariables++ + numberOfBitVectorVariables;
206 } else if (variableType.isBitVectorType()) {
207 offset = numberOfBitVectorVariables++ + numberOfIntegerVariables;
208 } else if (variableType.isRationalType()) {
209 offset = numberOfRationalVariables++;
210 } else if (variableType.isArrayType()) {
211 offset = numberOfArrayVariables++;
212 } else {
213 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException,
214 "Trying to declare a variable of unsupported type: '" << variableType.getStringRepresentation() << "'.");
215 }
216
217 // Compute the index of the new variable.
218 uint64_t newIndex = offset | variableType.getMask() | (auxiliary ? auxiliaryMask : 0);
219
220 // Properly insert the variable into the data structure.
221 nameToIndexMapping[name] = newIndex;
222 indexToNameMapping[newIndex] = name;
223 indexToTypeMapping[newIndex] = variableType;
224 Variable result(this->getSharedPointer(), newIndex);
225 variableSet.insert(result);
226 return result;
227 }
228}
229
230Variable ExpressionManager::getVariable(std::string const& name) const {
231 auto nameIndexPair = nameToIndexMapping.find(name);
232 STORM_LOG_THROW(nameIndexPair != nameToIndexMapping.end(), storm::exceptions::InvalidArgumentException, "Unknown variable '" << name << "'.");
233 return Variable(this->getSharedPointer(), nameIndexPair->second);
234}
235
236std::set<Variable> const& ExpressionManager::getVariables() const {
237 return variableSet;
238}
239
241 return Expression(getVariable(name));
242}
243
244bool ExpressionManager::hasVariable(std::string const& name) const {
245 return nameToIndexMapping.find(name) != nameToIndexMapping.end();
246}
247
248Variable ExpressionManager::declareFreshVariable(storm::expressions::Type const& variableType, bool auxiliary, std::string const& prefix) {
249 std::string newName = prefix + std::to_string(freshVariableCounter++);
250 return declareOrGetVariable(newName, variableType, auxiliary, false);
251}
252
253Variable ExpressionManager::declareFreshBooleanVariable(bool auxiliary, const std::string& prefix) {
254 return declareFreshVariable(this->getBooleanType(), auxiliary, prefix);
255}
256
257Variable ExpressionManager::declareFreshIntegerVariable(bool auxiliary, const std::string& prefix) {
258 return declareFreshVariable(this->getIntegerType(), auxiliary, prefix);
259}
260
261Variable ExpressionManager::declareFreshRationalVariable(bool auxiliary, const std::string& prefix) {
262 return declareFreshVariable(this->getRationalType(), auxiliary, prefix);
263}
264
265uint_fast64_t ExpressionManager::getNumberOfVariables(storm::expressions::Type const& variableType) const {
266 if (variableType.isBooleanType()) {
267 return numberOfBooleanVariables;
268 } else if (variableType.isIntegerType()) {
269 return numberOfIntegerVariables;
270 } else if (variableType.isBitVectorType()) {
271 return numberOfBitVectorVariables;
272 } else if (variableType.isRationalType()) {
273 return numberOfRationalVariables;
274 } else if (variableType.isArrayType()) {
275 return numberOfArrayVariables;
276 }
277 return 0;
278}
279
281 return numberOfBooleanVariables + numberOfIntegerVariables + numberOfBitVectorVariables + numberOfRationalVariables + numberOfArrayVariables;
282}
283
285 return numberOfBooleanVariables;
286}
287
289 return numberOfIntegerVariables;
290}
291
293 return numberOfBitVectorVariables;
294}
295
297 return numberOfRationalVariables;
298}
299
301 return numberOfRationalVariables;
302}
303
304std::string const& ExpressionManager::getVariableName(uint_fast64_t index) const {
305 auto indexTypeNamePair = indexToNameMapping.find(index);
306 STORM_LOG_THROW(indexTypeNamePair != indexToNameMapping.end(), storm::exceptions::InvalidArgumentException, "Unknown variable index '" << index << "'.");
307 return indexTypeNamePair->second;
308}
309
310Type const& ExpressionManager::getVariableType(uint_fast64_t index) const {
311 auto indexTypePair = indexToTypeMapping.find(index);
312 STORM_LOG_ASSERT(indexTypePair != indexToTypeMapping.end(), "Unable to retrieve type of unknown variable index '" << index << "'.");
313 return indexTypePair->second;
314}
315
316uint64_t ExpressionManager::getOffset(uint64_t index) const {
317 return index & offsetMask;
318}
319
321 return ExpressionManager::const_iterator(*this, this->nameToIndexMapping.begin(), this->nameToIndexMapping.end(),
323}
324
326 return ExpressionManager::const_iterator(*this, this->nameToIndexMapping.end(), this->nameToIndexMapping.end(),
328}
329
330std::shared_ptr<ExpressionManager> ExpressionManager::getSharedPointer() {
331 return this->shared_from_this();
332}
333
334std::shared_ptr<ExpressionManager const> ExpressionManager::getSharedPointer() const {
335 return this->shared_from_this();
336}
337
338std::ostream& operator<<(std::ostream& out, ExpressionManager const& manager) {
339 out << "manager {\n";
340
341 for (auto const& variableTypePair : manager) {
342 out << "\t" << variableTypePair.second << " " << variableTypePair.first.getName() << " [offset " << variableTypePair.first.getOffset() << ", "
343 << variableTypePair.first.getIndex() << " ]\n";
344 }
345
346 out << "}\n";
347
348 return out;
349}
350
351} // namespace expressions
352} // namespace storm
This class is responsible for managing a set of typed variables and all expressions using these varia...
Variable declareFreshIntegerVariable(bool auxiliary=false, std::string const &prefix="_x")
Declares a variable with integer type whose name is guaranteed to be unique and not yet in use.
Type const & getTranscendentalNumberType() const
Retrieves the transcendental numbers type (i.e.
Type const & getBitVectorType(std::size_t width) const
Retrieves the bit vector type of the given width.
std::set< Variable > const & getVariables() const
Retrieves the set of all variables known to this manager.
Type const & getArrayType(Type elementType) const
Retrieves the array type with the given element type.
uint_fast64_t getNumberOfIntegerVariables() const
Retrieves the number of integer variables.
uint_fast64_t getNumberOfBooleanVariables() const
Retrieves the number of boolean variables.
Variable declareFreshBooleanVariable(bool auxiliary=false, std::string const &prefix="_x")
Declares a variable with Boolean type whose name is guaranteed to be unique and not yet in use.
Variable declareRationalVariable(std::string const &name, bool auxiliary=false)
Declares a new rational variable with a name that must not yet exist and its corresponding type.
uint_fast64_t getNumberOfArrayVariables() const
Retrieves the number of array variables.
Variable declareBooleanVariable(std::string const &name, bool auxiliary=false)
Declares a new boolean variable with a name that must not yet exist and its corresponding type.
Expression integer(int_fast64_t value) const
Creates an expression that characterizes the given integer literal.
Type const & getVariableType(uint_fast64_t index) const
Retrieves the type of the variable with the given index.
bool hasVariable(std::string const &name) const
Retrieves whether a variable with the given name is known to the manager.
Variable declareOrGetVariable(std::string const &name, storm::expressions::Type const &variableType, bool auxiliary=false)
Declares a variable with the given name if it does not yet exist.
std::shared_ptr< ExpressionManager > clone() const
Creates a new expression manager with the same set of variables.
Type const & getBooleanType() const
Retrieves the boolean type.
const_iterator end() const
Retrieves an iterator that points beyond the last variable managed by this manager.
uint_fast64_t getOffset(uint_fast64_t index) const
Retrieves the offset of the variable with the given index within the group of equally typed variables...
const_iterator begin() const
Retrieves an iterator to all variables managed by this manager.
Variable declareVariable(std::string const &name, storm::expressions::Type const &variableType, bool auxiliary=false)
Declares a variable with a name that must not yet exist and its corresponding type.
ExpressionManager()
Creates a new manager that is unaware of any variables.
Type const & getIntegerType() const
Retrieves the unbounded integer type.
uint_fast64_t getNumberOfVariables() const
Retrieves the number of variables.
Variable declareFreshRationalVariable(bool auxiliary=false, std::string const &prefix="_x")
Declares a variable with rational type whose name is guaranteed to be unique and not yet in use.
Variable declareVariableCopy(Variable const &variable)
Declares a variable that is a copy of the provided variable (i.e.
Variable declareIntegerVariable(std::string const &name, bool auxiliary=false)
Declares a new integer variable with a name that must not yet exist and its corresponding type.
bool operator==(ExpressionManager const &other) const
Compares the two expression managers for equality, which holds iff they are the very same object.
uint_fast64_t getNumberOfRationalVariables() const
Retrieves the number of rational variables.
uint_fast64_t getNumberOfBitVectorVariables() const
Retrieves the number of bit vector variables.
Variable declareArrayVariable(std::string const &name, Type const &elementType, bool auxiliary=false)
Declares a new array variable with the given name and the given element type.
Expression getVariableExpression(std::string const &name) const
Retrieves an expression that represents the variable with the given name.
Expression rational(double value) const
Creates an expression that characterizes the given rational literal.
Variable declareFreshVariable(storm::expressions::Type const &variableType, bool auxiliary=false, std::string const &prefix="_x")
Declares a variable with the given type whose name is guaranteed to be unique and not yet in use.
std::string const & getVariableName(uint_fast64_t index) const
Retrieves the name of the variable with the given index.
std::shared_ptr< ExpressionManager > getSharedPointer()
Retrieves a shared pointer to the expression manager.
Type const & getRationalType() const
Retrieves the rational type.
Variable declareBitVectorVariable(std::string const &name, std::size_t width, bool auxiliary=false)
Declares a new bit vector variable with a name that must not yet exist and the bounded type of the gi...
Variable getVariable(std::string const &name) const
Retrieves the expression that represents the variable with the given name.
Expression boolean(bool value) const
Creates an expression that characterizes the given boolean literal.
bool isBooleanType() const
Checks whether this type is a boolean type.
Definition Type.cpp:178
bool isIntegerType() const
Checks whether this type is an integral type.
Definition Type.cpp:182
bool isArrayType() const
Checks whether this type is an array type.
Definition Type.cpp:194
std::string getStringRepresentation() const
Retrieves a string representation of the type.
Definition Type.cpp:202
uint64_t getMask() const
Retrieves the bit mask of the type.
Definition Type.cpp:174
bool isRationalType() const
Checks whether this type is a rational type.
Definition Type.cpp:214
bool isBitVectorType() const
Checks whether this type is a bitvector type.
Definition Type.cpp:186
Type const & getType() const
Retrieves the type of the variable.
Definition Variable.cpp:50
std::string const & getName() const
Retrieves the name of the variable.
Definition Variable.cpp:46
VariableIterator(ExpressionManager const &manager, std::unordered_map< std::string, uint_fast64_t >::const_iterator nameIndexIterator, std::unordered_map< std::string, uint_fast64_t >::const_iterator nameIndexIteratorEnd, VariableSelection const &selection)
bool operator!=(VariableIterator const &other)
bool operator==(VariableIterator const &other)
std::pair< storm::expressions::Variable, storm::expressions::Type > const value_type
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
std::ostream & operator<<(std::ostream &stream, BaseExpression const &expression)
LabParser.cpp.
Definition cli.cpp:18