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);
19 return this->nameIndexIterator == other.nameIndexIterator;
23 return !(*
this == other);
27 return currentElement;
31 moveUntilNextSelectedElement();
36 moveUntilNextSelectedElement();
40void VariableIterator::moveUntilNextSelectedElement(
bool atLeastOneStep) {
41 if (atLeastOneStep && nameIndexIterator != nameIndexIteratorEnd) {
46 while (nameIndexIterator != nameIndexIteratorEnd &&
52 if (nameIndexIterator != nameIndexIteratorEnd) {
58 : nameToIndexMapping(),
61 numberOfBooleanVariables(0),
62 numberOfIntegerVariables(0),
63 numberOfBitVectorVariables(0),
64 numberOfRationalVariables(0),
65 numberOfArrayVariables(0),
66 numberOfStringVariables(0),
67 freshVariableCounter(0) {
80 return Expression(std::make_shared<BooleanLiteralExpression>(*
this, value));
84 return Expression(std::make_shared<IntegerLiteralExpression>(*
this, value));
88 return Expression(std::make_shared<RationalLiteralExpression>(*
this, value));
92 return Expression(std::make_shared<RationalLiteralExpression>(*
this, value));
96 return this == &other;
103 return booleanType.get();
110 return integerType.get();
115 auto typeIterator = bitvectorTypes.find(type);
116 if (typeIterator == bitvectorTypes.end()) {
117 auto iteratorBoolPair = bitvectorTypes.insert(type);
118 return *iteratorBoolPair.first;
120 return *typeIterator;
127 return rationalType.get();
132 return *arrayTypes.insert(type).first;
136 if (!transcendentalNumberType) {
139 return transcendentalNumberType.get();
146 return stringType.get();
149bool ExpressionManager::isValidVariableName(std::string
const& name) {
150 return name.size() < 2 || name.at(0) !=
'_' || name.at(1) !=
'_';
153bool ExpressionManager::variableExists(std::string
const& name)
const {
154 auto nameIndexPair = nameToIndexMapping.find(name);
155 return nameIndexPair != nameToIndexMapping.end();
163 STORM_LOG_THROW(!variableExists(name), storm::exceptions::InvalidArgumentException,
"Variable with name '" << name <<
"' already exists.");
193 STORM_LOG_THROW(!checkName || isValidVariableName(name), storm::exceptions::InvalidArgumentException,
"Invalid variable name '" << name <<
"'.");
194 auto nameIndexPair = nameToIndexMapping.find(name);
195 if (nameIndexPair != nameToIndexMapping.end()) {
196 STORM_LOG_ASSERT(indexToTypeMapping.at(nameIndexPair->second) == variableType,
"Tried to declareOrGet variable '"
197 << name <<
"' of type '" << variableType
198 <<
"' but there is a variable with that name and different type '"
199 << indexToTypeMapping.at(nameIndexPair->second) <<
"'.");
205 offset = numberOfBooleanVariables++;
207 offset = numberOfIntegerVariables++ + numberOfBitVectorVariables;
209 offset = numberOfBitVectorVariables++ + numberOfIntegerVariables;
211 offset = numberOfRationalVariables++;
213 offset = numberOfArrayVariables++;
215 offset = numberOfStringVariables++;
222 uint64_t newIndex = offset | variableType.
getMask() | (auxiliary ? auxiliaryMask : 0);
225 nameToIndexMapping[name] = newIndex;
226 indexToNameMapping[newIndex] = name;
227 indexToTypeMapping[newIndex] = variableType;
229 variableSet.insert(result);
235 auto nameIndexPair = nameToIndexMapping.find(name);
236 STORM_LOG_THROW(nameIndexPair != nameToIndexMapping.end(), storm::exceptions::InvalidArgumentException,
"Unknown variable '" << name <<
"'.");
249 return nameToIndexMapping.find(name) != nameToIndexMapping.end();
253 std::string newName = prefix + std::to_string(freshVariableCounter++);
271 return numberOfBooleanVariables;
273 return numberOfIntegerVariables;
275 return numberOfBitVectorVariables;
277 return numberOfRationalVariables;
279 return numberOfArrayVariables;
281 return numberOfStringVariables;
287 return numberOfBooleanVariables + numberOfIntegerVariables + numberOfBitVectorVariables + numberOfRationalVariables + numberOfArrayVariables +
288 numberOfStringVariables;
292 return numberOfBooleanVariables;
296 return numberOfIntegerVariables;
300 return numberOfBitVectorVariables;
304 return numberOfRationalVariables;
308 return numberOfRationalVariables;
312 return numberOfStringVariables;
316 auto indexTypeNamePair = indexToNameMapping.find(index);
317 STORM_LOG_THROW(indexTypeNamePair != indexToNameMapping.end(), storm::exceptions::InvalidArgumentException,
"Unknown variable index '" << index <<
"'.");
318 return indexTypeNamePair->second;
322 auto indexTypePair = indexToTypeMapping.find(index);
323 STORM_LOG_ASSERT(indexTypePair != indexToTypeMapping.end(),
"Unable to retrieve type of unknown variable index '" << index <<
"'.");
324 return indexTypePair->second;
328 return index & offsetMask;
342 return this->shared_from_this();
346 return this->shared_from_this();
350 out <<
"manager {\n";
352 for (
auto const& variableTypePair : manager) {
353 out <<
"\t" << variableTypePair.second <<
" " << variableTypePair.first.getName() <<
" [offset " << variableTypePair.first.getOffset() <<
", "
354 << variableTypePair.first.getIndex() <<
" ]\n";
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.
uint_fast64_t getNumberOfStringVariables() const
Retrieves the number of string 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.
VariableIterator const_iterator
Expression rational(double value) const
Creates an expression that characterizes the given rational literal.
Type const & getStringType() const
Retrieves the string type.
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.
bool isStringType() const
Checks whether this type is a string type.
bool isIntegerType() const
Checks whether this type is an integral type.
bool isArrayType() const
Checks whether this type is an array type.
std::string getStringRepresentation() const
Retrieves a string representation of the type.
uint64_t getMask() const
Retrieves the bit mask of the type.
bool isRationalType() const
Checks whether this type is a rational type.
bool isBitVectorType() const
Checks whether this type is a bitvector type.
Type const & getType() const
Retrieves the type of the variable.
std::string const & getName() const
Retrieves the name of the variable.
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
VariableIterator & operator++()
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::ostream & operator<<(std::ostream &stream, BaseExpression const &expression)