Storm 1.11.1.1
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 freshVariableCounter(0) {
67 // Intentionally left empty.
68}
69
71 // Intentionally left empty.
72}
73
74std::shared_ptr<ExpressionManager> ExpressionManager::clone() const {
75 return std::shared_ptr<ExpressionManager>(new ExpressionManager(*this));
76}
77
79 return Expression(std::make_shared<BooleanLiteralExpression>(*this, value));
80}
81
82Expression ExpressionManager::integer(int_fast64_t value) const {
83 return Expression(std::make_shared<IntegerLiteralExpression>(*this, value));
84}
85
87 return Expression(std::make_shared<RationalLiteralExpression>(*this, value));
88}
89
90Expression ExpressionManager::rational(storm::RationalNumber const& value) const {
91 return Expression(std::make_shared<RationalLiteralExpression>(*this, value));
92}
93
95 return this == &other;
96}
97
99 if (!booleanType) {
100 booleanType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new BooleanType()));
101 }
102 return booleanType.get();
103}
104
106 if (!integerType) {
107 integerType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new IntegerType()));
108 }
109 return integerType.get();
110}
111
112Type const& ExpressionManager::getBitVectorType(std::size_t width) const {
113 Type type(this->getSharedPointer(), std::shared_ptr<BaseType>(new BitVectorType(width)));
114 auto typeIterator = bitvectorTypes.find(type);
115 if (typeIterator == bitvectorTypes.end()) {
116 auto iteratorBoolPair = bitvectorTypes.insert(type);
117 return *iteratorBoolPair.first;
118 }
119 return *typeIterator;
120}
121
123 if (!rationalType) {
124 rationalType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new RationalType()));
125 }
126 return rationalType.get();
127}
128
129Type const& ExpressionManager::getArrayType(Type elementType) const {
130 Type type(this->getSharedPointer(), std::shared_ptr<BaseType>(new ArrayType(elementType)));
131 return *arrayTypes.insert(type).first;
132}
133
135 if (!transcendentalNumberType) {
136 transcendentalNumberType = Type(this->getSharedPointer(), std::shared_ptr<BaseType>(new TranscendentalNumberType()));
137 }
138 return transcendentalNumberType.get();
139}
140
141bool ExpressionManager::isValidVariableName(std::string const& name) {
142 return name.size() < 2 || name.at(0) != '_' || name.at(1) != '_';
143}
144
145bool ExpressionManager::variableExists(std::string const& name) const {
146 auto nameIndexPair = nameToIndexMapping.find(name);
147 return nameIndexPair != nameToIndexMapping.end();
148}
149
151 return declareFreshVariable(variable.getType(), true, "_" + variable.getName() + "_");
152}
153
154Variable ExpressionManager::declareVariable(std::string const& name, storm::expressions::Type const& variableType, bool auxiliary) {
155 STORM_LOG_THROW(!variableExists(name), storm::exceptions::InvalidArgumentException, "Variable with name '" << name << "' already exists.");
156 return declareOrGetVariable(name, variableType, auxiliary);
157}
158
159Variable ExpressionManager::declareBooleanVariable(std::string const& name, bool auxiliary) {
160 Variable var = this->declareVariable(name, this->getBooleanType(), auxiliary);
161 return var;
162}
163
164Variable ExpressionManager::declareIntegerVariable(std::string const& name, bool auxiliary) {
165 return this->declareVariable(name, this->getIntegerType(), auxiliary);
166}
167
168Variable ExpressionManager::declareBitVectorVariable(std::string const& name, std::size_t width, bool auxiliary) {
169 return this->declareVariable(name, this->getBitVectorType(width), auxiliary);
170}
171
172Variable ExpressionManager::declareRationalVariable(std::string const& name, bool auxiliary) {
173 return this->declareVariable(name, this->getRationalType(), auxiliary);
174}
175
176Variable ExpressionManager::declareArrayVariable(std::string const& name, Type const& elementType, bool auxiliary) {
177 return this->declareVariable(name, this->getArrayType(elementType), auxiliary);
178}
179
180Variable ExpressionManager::declareOrGetVariable(std::string const& name, storm::expressions::Type const& variableType, bool auxiliary) {
181 return declareOrGetVariable(name, variableType, auxiliary, true);
182}
183
184Variable ExpressionManager::declareOrGetVariable(std::string const& name, storm::expressions::Type const& variableType, bool auxiliary, bool checkName) {
185 STORM_LOG_THROW(!checkName || isValidVariableName(name), storm::exceptions::InvalidArgumentException, "Invalid variable name '" << name << "'.");
186 auto nameIndexPair = nameToIndexMapping.find(name);
187 if (nameIndexPair != nameToIndexMapping.end()) {
188 STORM_LOG_ASSERT(indexToTypeMapping.at(nameIndexPair->second) == variableType, "Tried to declareOrGet variable '"
189 << name << "' of type '" << variableType
190 << "' but there is a variable with that name and different type '"
191 << indexToTypeMapping.at(nameIndexPair->second) << "'.");
192 return Variable(this->getSharedPointer(), nameIndexPair->second);
193 } else {
194 uint64_t offset = 0;
195
196 if (variableType.isBooleanType()) {
197 offset = numberOfBooleanVariables++;
198 } else if (variableType.isIntegerType()) {
199 offset = numberOfIntegerVariables++ + numberOfBitVectorVariables;
200 } else if (variableType.isBitVectorType()) {
201 offset = numberOfBitVectorVariables++ + numberOfIntegerVariables;
202 } else if (variableType.isRationalType()) {
203 offset = numberOfRationalVariables++;
204 } else if (variableType.isArrayType()) {
205 offset = numberOfArrayVariables++;
206 } else {
207 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException,
208 "Trying to declare a variable of unsupported type: '" << variableType.getStringRepresentation() << "'.");
209 }
210
211 // Compute the index of the new variable.
212 uint64_t newIndex = offset | variableType.getMask() | (auxiliary ? auxiliaryMask : 0);
213
214 // Properly insert the variable into the data structure.
215 nameToIndexMapping[name] = newIndex;
216 indexToNameMapping[newIndex] = name;
217 indexToTypeMapping[newIndex] = variableType;
218 Variable result(this->getSharedPointer(), newIndex);
219 variableSet.insert(result);
220 return result;
221 }
222}
223
224Variable ExpressionManager::getVariable(std::string const& name) const {
225 auto nameIndexPair = nameToIndexMapping.find(name);
226 STORM_LOG_THROW(nameIndexPair != nameToIndexMapping.end(), storm::exceptions::InvalidArgumentException, "Unknown variable '" << name << "'.");
227 return Variable(this->getSharedPointer(), nameIndexPair->second);
228}
229
230std::set<Variable> const& ExpressionManager::getVariables() const {
231 return variableSet;
232}
233
235 return Expression(getVariable(name));
236}
237
238bool ExpressionManager::hasVariable(std::string const& name) const {
239 return nameToIndexMapping.find(name) != nameToIndexMapping.end();
240}
241
242Variable ExpressionManager::declareFreshVariable(storm::expressions::Type const& variableType, bool auxiliary, std::string const& prefix) {
243 std::string newName = prefix + std::to_string(freshVariableCounter++);
244 return declareOrGetVariable(newName, variableType, auxiliary, false);
245}
246
247Variable ExpressionManager::declareFreshBooleanVariable(bool auxiliary, const std::string& prefix) {
248 return declareFreshVariable(this->getBooleanType(), auxiliary, prefix);
249}
250
251Variable ExpressionManager::declareFreshIntegerVariable(bool auxiliary, const std::string& prefix) {
252 return declareFreshVariable(this->getIntegerType(), auxiliary, prefix);
253}
254
255Variable ExpressionManager::declareFreshRationalVariable(bool auxiliary, const std::string& prefix) {
256 return declareFreshVariable(this->getRationalType(), auxiliary, prefix);
257}
258
259uint_fast64_t ExpressionManager::getNumberOfVariables(storm::expressions::Type const& variableType) const {
260 if (variableType.isBooleanType()) {
261 return numberOfBooleanVariables;
262 } else if (variableType.isIntegerType()) {
263 return numberOfIntegerVariables;
264 } else if (variableType.isBitVectorType()) {
265 return numberOfBitVectorVariables;
266 } else if (variableType.isRationalType()) {
267 return numberOfRationalVariables;
268 } else if (variableType.isArrayType()) {
269 return numberOfArrayVariables;
270 }
271 return 0;
272}
273
275 return numberOfBooleanVariables + numberOfIntegerVariables + numberOfBitVectorVariables + numberOfRationalVariables + numberOfArrayVariables;
276}
277
279 return numberOfBooleanVariables;
280}
281
283 return numberOfIntegerVariables;
284}
285
287 return numberOfBitVectorVariables;
288}
289
291 return numberOfRationalVariables;
292}
293
295 return numberOfRationalVariables;
296}
297
298std::string const& ExpressionManager::getVariableName(uint_fast64_t index) const {
299 auto indexTypeNamePair = indexToNameMapping.find(index);
300 STORM_LOG_THROW(indexTypeNamePair != indexToNameMapping.end(), storm::exceptions::InvalidArgumentException, "Unknown variable index '" << index << "'.");
301 return indexTypeNamePair->second;
302}
303
304Type const& ExpressionManager::getVariableType(uint_fast64_t index) const {
305 auto indexTypePair = indexToTypeMapping.find(index);
306 STORM_LOG_ASSERT(indexTypePair != indexToTypeMapping.end(), "Unable to retrieve type of unknown variable index '" << index << "'.");
307 return indexTypePair->second;
308}
309
310uint64_t ExpressionManager::getOffset(uint64_t index) const {
311 return index & offsetMask;
312}
313
315 return ExpressionManager::const_iterator(*this, this->nameToIndexMapping.begin(), this->nameToIndexMapping.end(),
317}
318
320 return ExpressionManager::const_iterator(*this, this->nameToIndexMapping.end(), this->nameToIndexMapping.end(),
322}
323
324std::shared_ptr<ExpressionManager> ExpressionManager::getSharedPointer() {
325 return this->shared_from_this();
326}
327
328std::shared_ptr<ExpressionManager const> ExpressionManager::getSharedPointer() const {
329 return this->shared_from_this();
330}
331
332std::ostream& operator<<(std::ostream& out, ExpressionManager const& manager) {
333 out << "manager {\n";
334
335 for (auto const& variableTypePair : manager) {
336 out << "\t" << variableTypePair.second << " " << variableTypePair.first.getName() << " [offset " << variableTypePair.first.getOffset() << ", "
337 << variableTypePair.first.getIndex() << " ]\n";
338 }
339
340 out << "}\n";
341
342 return out;
343}
344
345} // namespace expressions
346} // 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
bool operator==(VariableIterator const &other) const
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) const
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