Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DdManager.cpp
Go to the documentation of this file.
2
4
8
11
12#include "storm-config.h"
14
15#include <cmath>
16#include <iostream>
17
18namespace storm {
19namespace dd {
20template<DdType LibraryType>
21DdManager<LibraryType>::DdManager() : internalDdManager(), metaVariableMap(), manager(new storm::expressions::ExpressionManager()) {
22 // Intentionally left empty.
23}
24
25template<DdType LibraryType>
26std::shared_ptr<DdManager<LibraryType>> DdManager<LibraryType>::asSharedPointer() {
27 return this->shared_from_this();
28}
29
30template<DdType LibraryType>
31std::shared_ptr<DdManager<LibraryType> const> DdManager<LibraryType>::asSharedPointer() const {
32 return this->shared_from_this();
33}
34
35template<DdType LibraryType>
37 return Bdd<LibraryType>(*this, internalDdManager.getBddOne());
39
40template<DdType LibraryType>
41template<typename ValueType>
43 return Add<LibraryType, ValueType>(*this, internalDdManager.template getAddOne<ValueType>());
44}
45
46template<DdType LibraryType>
48 return Bdd<LibraryType>(*this, internalDdManager.getBddZero());
49}
50
51template<DdType LibraryType>
52template<typename ValueType>
54 return Add<LibraryType, ValueType>(*this, internalDdManager.template getAddZero<ValueType>());
55}
56
57template<DdType LibraryType>
58template<typename ValueType>
60 return Add<LibraryType, ValueType>(*this, internalDdManager.template getAddUndefined<ValueType>());
61}
63template<DdType LibraryType>
64template<typename ValueType>
66 return getConstant(storm::utility::infinity<ValueType>());
67}
68
69template<DdType LibraryType>
70template<typename ValueType>
72 return Add<LibraryType, ValueType>(*this, internalDdManager.getConstant(value));
73}
74
75template<DdType LibraryType>
76Bdd<LibraryType> DdManager<LibraryType>::getEncoding(storm::expressions::Variable const& variable, int_fast64_t value, bool mostSignificantBitAtTop) const {
77 DdMetaVariable<LibraryType> const& metaVariable = this->getMetaVariable(variable);
78
79 STORM_LOG_THROW(metaVariable.canRepresent(value), storm::exceptions::InvalidArgumentException,
80 "Illegal value " << value << " for meta variable '" << variable.getName() << "'.");
81
82 // Now compute the encoding relative to the low value of the meta variable.
83 value -= metaVariable.getLow();
84
85 std::vector<Bdd<LibraryType>> const& ddVariables = metaVariable.getDdVariables();
86
87 Bdd<LibraryType> result;
88 if (mostSignificantBitAtTop) {
89 if (value & (1ull << (ddVariables.size() - 1))) {
90 result = ddVariables[0];
91 } else {
92 result = !ddVariables[0];
93 }
94
95 for (std::size_t i = 1; i < ddVariables.size(); ++i) {
96 if (value & (1ull << (ddVariables.size() - i - 1))) {
97 result &= ddVariables[i];
98 } else {
99 result &= !ddVariables[i];
100 }
102 } else {
103 if (value & 1ull) {
104 result = ddVariables[0];
105 } else {
106 result = !ddVariables[0];
107 }
108 value >>= 1;
109
110 for (std::size_t i = 1; i < ddVariables.size(); ++i) {
111 if (value & 1ull) {
112 result &= ddVariables[i];
113 } else {
114 result &= !ddVariables[i];
115 }
116 value >>= 1;
117 }
118 }
119
120 return result;
121}
122
123template<DdType LibraryType>
125 storm::dd::DdMetaVariable<LibraryType> const& metaVariable = this->getMetaVariable(variable);
126
127 if (metaVariable.hasHigh()) {
128 return Bdd<LibraryType>(*this,
129 internalDdManager.getBddEncodingLessOrEqualThan(static_cast<uint64_t>(metaVariable.getHigh() - metaVariable.getLow()),
130 metaVariable.getCube().getInternalBdd(), metaVariable.getNumberOfDdVariables()),
131 {variable});
132 } else {
133 // If there is no upper bound on this variable, the whole range is valid.
134 Bdd<LibraryType> result = this->getBddOne();
135 result.addMetaVariable(variable);
136 return result;
137 }
138}
139
140template<DdType LibraryType>
141template<typename ValueType>
143 storm::dd::DdMetaVariable<LibraryType> const& metaVariable = this->getMetaVariable(variable);
144 STORM_LOG_THROW(metaVariable.hasHigh(), storm::exceptions::InvalidOperationException, "Cannot create identity for meta variable.");
145
146 Add<LibraryType, ValueType> result = this->getAddZero<ValueType>();
147 for (int_fast64_t value = metaVariable.getLow(); value <= metaVariable.getHigh(); ++value) {
148 result += this->getEncoding(variable, value).template toAdd<ValueType>() * this->getConstant(storm::utility::convertNumber<ValueType>(value));
149 }
150 return result;
152
153template<DdType LibraryType>
154Bdd<LibraryType> DdManager<LibraryType>::getIdentity(std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& variablePairs,
155 bool restrictToFirstRange) const {
156 auto result = this->getBddOne();
157 for (auto const& pair : variablePairs) {
158 result &= this->getIdentity(pair.first, pair.second, restrictToFirstRange);
160 return result;
161}
162
163template<DdType LibraryType>
165 bool restrictToFirstRange) const {
166 auto const& firstMetaVariable = this->getMetaVariable(first);
167 auto const& secondMetaVariable = this->getMetaVariable(second);
168
169 STORM_LOG_THROW(firstMetaVariable.getNumberOfDdVariables() == secondMetaVariable.getNumberOfDdVariables(), storm::exceptions::InvalidOperationException,
170 "Mismatching sizes of meta variables.");
171
172 auto const& firstDdVariables = firstMetaVariable.getDdVariables();
173 auto const& secondDdVariables = secondMetaVariable.getDdVariables();
174
175 auto result = restrictToFirstRange ? this->getRange(first) : this->getBddOne();
176 for (auto it1 = firstDdVariables.begin(), it2 = secondDdVariables.begin(), ite1 = firstDdVariables.end(); it1 != ite1; ++it1, ++it2) {
177 result &= it1->iff(*it2);
178 }
179
180 return result;
181}
182
183#pragma GCC diagnostic push
184#pragma GCC diagnostic ignored "-Winfinite-recursion"
185template<DdType LibraryType>
187 return getCube({variable});
188}
189#pragma GCC diagnostic pop
190
191template<DdType LibraryType>
192Bdd<LibraryType> DdManager<LibraryType>::getCube(std::set<storm::expressions::Variable> const& variables) const {
193 Bdd<LibraryType> result = this->getBddOne();
194 for (auto const& variable : variables) {
195 storm::dd::DdMetaVariable<LibraryType> const& metaVariable = this->getMetaVariable(variable);
196 result &= metaVariable.getCube();
197 }
198 return result;
199}
200
201template<DdType LibraryType>
202std::vector<storm::expressions::Variable> DdManager<LibraryType>::cloneVariable(storm::expressions::Variable const& variable,
203 std::string const& newMetaVariableName,
204 boost::optional<uint64_t> const& numberOfLayers) {
205 std::vector<storm::expressions::Variable> newMetaVariables;
206 auto const& ddMetaVariable = this->getMetaVariable(variable);
207 if (ddMetaVariable.getType() == storm::dd::MetaVariableType::Bool) {
208 newMetaVariables = this->addMetaVariable(newMetaVariableName, 3);
209 } else if (ddMetaVariable.getType() == storm::dd::MetaVariableType::Int) {
210 newMetaVariables = this->addMetaVariable(newMetaVariableName, ddMetaVariable.getLow(), ddMetaVariable.getHigh(), 3);
211 } else if (ddMetaVariable.getType() == storm::dd::MetaVariableType::BitVector) {
212 newMetaVariables = this->addBitVectorMetaVariable(newMetaVariableName, ddMetaVariable.getNumberOfDdVariables(), 3);
213 }
214 return newMetaVariables;
216
217template<DdType LibraryType>
218std::pair<storm::expressions::Variable, storm::expressions::Variable> DdManager<LibraryType>::addMetaVariable(
219 std::string const& name, int_fast64_t low, int_fast64_t high,
220 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position) {
221 std::vector<storm::expressions::Variable> result = addMetaVariable(name, low, high, 2, position);
222 return std::make_pair(result[0], result[1]);
223}
225template<DdType LibraryType>
226std::vector<storm::expressions::Variable> DdManager<LibraryType>::addMetaVariable(
227 std::string const& name, int_fast64_t low, int_fast64_t high, uint64_t numberOfLayers,
228 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position) {
229 return this->addMetaVariableHelper(MetaVariableType::Int, name,
230 std::max(static_cast<uint64_t>(std::ceil(std::log2(high - low + 1))), static_cast<uint64_t>(1)), numberOfLayers,
231 position, std::make_pair(low, high));
232}
234template<DdType LibraryType>
235std::vector<storm::expressions::Variable> DdManager<LibraryType>::addBitVectorMetaVariable(
236 std::string const& variableName, uint64_t bits, uint64_t numberOfLayers,
237 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position) {
238 return this->addMetaVariableHelper(MetaVariableType::BitVector, variableName, bits, numberOfLayers, position);
239}
241template<DdType LibraryType>
242std::pair<storm::expressions::Variable, storm::expressions::Variable> DdManager<LibraryType>::addMetaVariable(
243 std::string const& name, boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position) {
244 std::vector<storm::expressions::Variable> result = this->addMetaVariableHelper(MetaVariableType::Bool, name, 1, 2, position);
245 return std::make_pair(result[0], result[1]);
246}
247
248template<DdType LibraryType>
249std::vector<storm::expressions::Variable> DdManager<LibraryType>::addMetaVariable(
250 std::string const& name, uint64_t numberOfLayers, boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position) {
251 return this->addMetaVariableHelper(MetaVariableType::Bool, name, 1, numberOfLayers, position);
252}
253
254template<DdType LibraryType>
255std::vector<storm::expressions::Variable> DdManager<LibraryType>::addMetaVariableHelper(
256 MetaVariableType const& type, std::string const& name, uint64_t numberOfDdVariables, uint64_t numberOfLayers,
257 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position,
258 boost::optional<std::pair<int_fast64_t, int_fast64_t>> const& bounds) {
259 // Check whether number of layers is legal.
260 STORM_LOG_THROW(numberOfLayers >= 1, storm::exceptions::InvalidArgumentException, "Layers must be at least 1.");
261
262 // Check that the number of DD variables is legal.
263 STORM_LOG_THROW(numberOfDdVariables >= 1, storm::exceptions::InvalidArgumentException, "Illegal number of DD variables.");
265 // Check whether the variable name is legal.
266 STORM_LOG_THROW(name != "" && name.back() != '\'', storm::exceptions::InvalidArgumentException, "Illegal name of meta variable: '" << name << "'.");
267
268 // Check whether a meta variable already exists.
269 STORM_LOG_THROW(!this->hasMetaVariable(name), storm::exceptions::InvalidArgumentException, "A meta variable '" << name << "' already exists.");
270
271 // If a specific position was requested, we compute it now.
272 boost::optional<uint_fast64_t> level;
273 if (position) {
274 storm::dd::DdMetaVariable<LibraryType> beforeVariable = this->getMetaVariable(position.get().second);
275 level = position.get().first == MetaVariablePosition::Above ? std::numeric_limits<uint_fast64_t>::max() : std::numeric_limits<uint_fast64_t>::min();
276 for (auto const& ddVariable : beforeVariable.getDdVariables()) {
277 level = position.get().first == MetaVariablePosition::Above ? std::min(level.get(), ddVariable.getLevel())
278 : std::max(level.get(), ddVariable.getLevel());
279 }
280 if (position.get().first == MetaVariablePosition::Below) {
281 ++level.get();
282 }
284
285 STORM_LOG_TRACE("Creating meta variable with " << numberOfDdVariables << " bit(s) and " << numberOfLayers << " layer(s).");
286
287 std::stringstream tmp1;
288 std::vector<storm::expressions::Variable> result;
289 for (uint64_t layer = 0; layer < numberOfLayers; ++layer) {
290 if (type == MetaVariableType::Int) {
291 result.emplace_back(manager->declareIntegerVariable(name + tmp1.str()));
292 } else if (type == MetaVariableType::Bool) {
293 result.emplace_back(manager->declareBooleanVariable(name + tmp1.str()));
294 } else if (type == MetaVariableType::BitVector) {
295 result.emplace_back(manager->declareBitVectorVariable(name + tmp1.str(), numberOfDdVariables));
296 }
297 tmp1 << "'";
299
300 std::vector<std::vector<Bdd<LibraryType>>> variables(numberOfLayers);
301 for (std::size_t i = 0; i < numberOfDdVariables; ++i) {
302 std::vector<InternalBdd<LibraryType>> ddVariables = internalDdManager.createDdVariables(numberOfLayers, level);
303 for (uint64_t layer = 0; layer < numberOfLayers; ++layer) {
304 variables[layer].emplace_back(Bdd<LibraryType>(*this, ddVariables[layer], {result[layer]}));
305 }
306
307 // If we are inserting the variable at a specific level, we need to prepare the level for the next pair
308 // of variables.
309 if (level) {
310 level.get() += numberOfLayers;
311 }
312 }
313
314 std::stringstream tmp2;
315 for (uint64_t layer = 0; layer < numberOfLayers; ++layer) {
316 if (bounds) {
317 metaVariableMap.emplace(result[layer], DdMetaVariable<LibraryType>(name + tmp2.str(), bounds.get().first, bounds.get().second, variables[layer]));
318 } else {
319 metaVariableMap.emplace(result[layer], DdMetaVariable<LibraryType>(type, name + tmp2.str(), variables[layer]));
320 }
321 tmp2 << "'";
322 }
324 return result;
325}
326
327template<DdType LibraryType>
329 auto const& variablePair = metaVariableMap.find(variable);
331 // Check whether the meta variable exists.
332 STORM_LOG_THROW(variablePair != metaVariableMap.end(), storm::exceptions::InvalidArgumentException,
333 "Unknown meta variable name '" << variable.getName() << "'.");
334
335 return variablePair->second;
336}
337
338template<DdType LibraryType>
340 std::set<std::string> result;
341 for (auto const& variablePair : metaVariableMap) {
342 result.insert(variablePair.first.getName());
343 }
344 return result;
346
347template<DdType LibraryType>
349 return this->metaVariableMap.size();
350}
351
352template<DdType LibraryType>
353bool DdManager<LibraryType>::hasMetaVariable(std::string const& metaVariableName) const {
354 return manager->hasVariable(metaVariableName);
355}
356
357template<DdType LibraryType>
359 // Check whether the meta variable exists.
360 STORM_LOG_THROW(hasMetaVariable(metaVariableName), storm::exceptions::InvalidArgumentException, "Unknown meta variable name '" << metaVariableName << "'.");
361
362 return manager->getVariable(metaVariableName);
363}
364
365template<DdType LibraryType>
367 return internalDdManager.supportsOrderedInsertion();
368}
369
370template<DdType LibraryType>
372 return *manager;
373}
374
375template<DdType LibraryType>
376storm::expressions::ExpressionManager& DdManager<LibraryType>::getExpressionManager() {
377 return *manager;
378}
379
380template<DdType LibraryType>
381std::vector<std::string> DdManager<LibraryType>::getDdVariableNames() const {
382 // First, we initialize a list DD variables and their names.
383 std::vector<std::pair<uint_fast64_t, std::string>> variablePairs;
384 for (auto const& variablePair : this->metaVariableMap) {
385 DdMetaVariable<LibraryType> const& metaVariable = variablePair.second;
386 // If the meta variable is of type bool, we don't need to suffix it with the bit number.
387 if (metaVariable.getType() == MetaVariableType::Bool) {
388 variablePairs.emplace_back(metaVariable.getDdVariables().front().getIndex(), variablePair.first.getName());
389 } else {
390 // For integer-valued meta variables, we, however, have to add the suffix.
391 for (uint_fast64_t variableIndex = 0; variableIndex < metaVariable.getNumberOfDdVariables(); ++variableIndex) {
392 variablePairs.emplace_back(metaVariable.getDdVariables()[variableIndex].getIndex(),
393 variablePair.first.getName() + '.' + std::to_string(variableIndex));
394 }
395 }
396 }
397
398 // Then, we sort this list according to the indices of the ADDs.
399 std::sort(variablePairs.begin(), variablePairs.end(),
400 [](std::pair<uint_fast64_t, std::string> const& a, std::pair<uint_fast64_t, std::string> const& b) { return a.first < b.first; });
401
402 // Now, we project the sorted vector to its second component.
403 std::vector<std::string> result;
404 for (auto const& element : variablePairs) {
405 result.push_back(element.second);
406 }
407
408 return result;
409}
410
411template<DdType LibraryType>
412std::vector<storm::expressions::Variable> DdManager<LibraryType>::getDdVariables() const {
413 // First, we initialize a list DD variables and their names.
414 std::vector<std::pair<uint_fast64_t, storm::expressions::Variable>> variablePairs;
415 for (auto const& variablePair : this->metaVariableMap) {
416 DdMetaVariable<LibraryType> const& metaVariable = variablePair.second;
417 // If the meta variable is of type bool, we don't need to suffix it with the bit number.
418 if (metaVariable.getType() == MetaVariableType::Bool) {
419 variablePairs.emplace_back(metaVariable.getDdVariables().front().getIndex(), variablePair.first);
420 } else {
421 // For integer-valued meta variables, we, however, have to add the suffix.
422 for (uint_fast64_t variableIndex = 0; variableIndex < metaVariable.getNumberOfDdVariables(); ++variableIndex) {
423 variablePairs.emplace_back(metaVariable.getDdVariables()[variableIndex].getIndex(), variablePair.first);
424 }
425 }
426 }
427
428 // Then, we sort this list according to the indices of the ADDs.
429 std::sort(variablePairs.begin(), variablePairs.end(),
430 [](std::pair<uint_fast64_t, storm::expressions::Variable> const& a, std::pair<uint_fast64_t, storm::expressions::Variable> const& b) {
431 return a.first < b.first;
432 });
433
434 // Now, we project the sorted vector to its second component.
435 std::vector<storm::expressions::Variable> result;
436 for (auto const& element : variablePairs) {
437 result.push_back(element.second);
438 }
439
440 return result;
441}
442
443template<DdType LibraryType>
445 internalDdManager.allowDynamicReordering(value);
446}
447
448template<DdType LibraryType>
450 return internalDdManager.isDynamicReorderingAllowed();
451}
452
453template<DdType LibraryType>
455 internalDdManager.triggerReordering();
456}
457
458template<DdType LibraryType>
459std::set<storm::expressions::Variable> DdManager<LibraryType>::getAllMetaVariables() const {
460 std::set<storm::expressions::Variable> result;
461 for (auto const& variable : this->metaVariableMap) {
462 result.insert(variable.first);
463 }
464 return result;
465}
466
467template<DdType LibraryType>
468std::vector<uint_fast64_t> DdManager<LibraryType>::getSortedVariableIndices() const {
469 return this->getSortedVariableIndices(this->getAllMetaVariables());
470}
471
472template<DdType LibraryType>
473std::vector<uint_fast64_t> DdManager<LibraryType>::getSortedVariableIndices(std::set<storm::expressions::Variable> const& metaVariables) const {
474 std::vector<uint_fast64_t> ddVariableIndices;
475 for (auto const& metaVariable : metaVariables) {
476 for (auto const& ddVariable : metaVariableMap.at(metaVariable).getDdVariables()) {
477 ddVariableIndices.push_back(ddVariable.getIndex());
478 }
479 }
480
481 // Next, we need to sort them, since they may be arbitrarily ordered otherwise.
482 std::sort(ddVariableIndices.begin(), ddVariableIndices.end());
483 return ddVariableIndices;
484}
485
486template<DdType LibraryType>
490
491template<DdType LibraryType>
493 return internalDdManager;
494}
495
496template<DdType LibraryType>
498 return &internalDdManager;
499}
500
501template<DdType LibraryType>
502InternalDdManager<LibraryType> const* DdManager<LibraryType>::getInternalDdManagerPointer() const {
503 return &internalDdManager;
504}
505
506template<DdType LibraryType>
508 internalDdManager.debugCheck();
509}
510
511template<DdType LibraryType>
512void DdManager<LibraryType>::execute(std::function<void()> const& f) const {
513 internalDdManager.execute(f);
514}
515
516template class DdManager<DdType::CUDD>;
517
520
521#ifdef STORM_HAVE_CARL
523#endif
524
527
528#ifdef STORM_HAVE_CARL
530#endif
531
534
535template Add<DdType::CUDD, double> DdManager<DdType::CUDD>::getConstant(double const& value) const;
536template Add<DdType::CUDD, uint_fast64_t> DdManager<DdType::CUDD>::getConstant(uint_fast64_t const& value) const;
537
538#ifdef STORM_HAVE_CARL
539template Add<DdType::CUDD, storm::RationalNumber> DdManager<DdType::CUDD>::getConstant(storm::RationalNumber const& value) const;
540#endif
541
544
545template class DdManager<DdType::Sylvan>;
546
549#ifdef STORM_HAVE_CARL
552#endif
553
556#ifdef STORM_HAVE_CARL
559#endif
560
563#ifdef STORM_HAVE_CARL
566#endif
567
570#ifdef STORM_HAVE_CARL
573#endif
574
576template Add<DdType::Sylvan, uint_fast64_t> DdManager<DdType::Sylvan>::getConstant(uint_fast64_t const& value) const;
577#ifdef STORM_HAVE_CARL
578template Add<DdType::Sylvan, storm::RationalNumber> DdManager<DdType::Sylvan>::getConstant(storm::RationalNumber const& value) const;
580#endif
581
584#ifdef STORM_HAVE_CARL
587#endif
588} // namespace dd
589} // namespace storm
Bdd< LibraryType > iff(Bdd< LibraryType > const &other) const
Performs a logical iff of the current and the given BDD.
Definition Bdd.cpp:152
void addMetaVariable(storm::expressions::Variable const &metaVariable)
Adds the given meta variable to the set of meta variables that are contained in this DD.
Definition Dd.cpp:52
storm::expressions::Variable getMetaVariable(std::string const &variableName) const
Retrieves the given meta variable by name.
Add< LibraryType, ValueType > getInfinity() const
Retrieves an ADD representing the constant infinity function.
Definition DdManager.cpp:65
bool hasMetaVariable(std::string const &variableName) const
Retrieves whether the given meta variable name is already in use.
std::shared_ptr< DdManager< LibraryType > > asSharedPointer()
Definition DdManager.cpp:26
std::vector< uint_fast64_t > getSortedVariableIndices() const
Retrieves the (sorted) list of the variable indices of the DD variables given by the meta variable se...
Add< LibraryType, ValueType > getAddZero() const
Retrieves an ADD representing the constant zero function.
Definition DdManager.cpp:53
std::set< storm::expressions::Variable > getAllMetaVariables() const
Retrieves the set of meta variables contained in the DD.
Add< LibraryType, ValueType > getAddUndefined() const
Retrieves an ADD representing an undefined value.
Definition DdManager.cpp:59
Add< LibraryType, ValueType > getAddOne() const
Retrieves an ADD representing the constant one function.
Definition DdManager.cpp:42
InternalDdManager< LibraryType > & getInternalDdManager()
Retrieves the internal DD manager.
Add< LibraryType, ValueType > getConstant(ValueType const &value) const
Retrieves an ADD representing the constant function with the given value.
Definition DdManager.cpp:71
Bdd< LibraryType > getCube(storm::expressions::Variable const &variable) const
Retrieves a BDD that is the cube of the variables representing the given meta variable.
void execute(std::function< void()> const &f) const
All code that manipulates DDs shall be called through this function.
Bdd< LibraryType > getBddOne() const
Retrieves a BDD representing the constant one function.
Definition DdManager.cpp:36
DdManager()
Creates an empty manager without any meta variables.
Definition DdManager.cpp:21
std::set< std::string > getAllMetaVariableNames() const
Retrieves the names of all meta variables that have been added to the manager.
Bdd< LibraryType > getBddZero() const
Retrieves a BDD representing the constant zero function.
Definition DdManager.cpp:47
void triggerReordering()
Triggers a reordering of the DDs managed by this manager (if supported).
Bdd< LibraryType > getEncoding(storm::expressions::Variable const &variable, int_fast64_t value, bool mostSignificantBitAtTop=true) const
Retrieves the BDD representing the function that maps all inputs which have the given meta variable e...
Definition DdManager.cpp:76
bool isDynamicReorderingAllowed() const
Retrieves whether dynamic reordering is currently allowed (if supported).
std::vector< storm::expressions::Variable > cloneVariable(storm::expressions::Variable const &variable, std::string const &newVariableName, boost::optional< uint64_t > const &numberOfLayers=boost::none)
Clones the given meta variable and optionally changes the number of layers of the variable.
Add< LibraryType, ValueType > getIdentity(storm::expressions::Variable const &variable) const
Retrieves the ADD representing the identity of the meta variable, i.e., a function that maps all lega...
bool supportsOrderedInsertion() const
Checks whether this manager supports the ordered insertion of variables, i.e.
Bdd< LibraryType > getRange(storm::expressions::Variable const &variable) const
Retrieves the BDD representing the range of the meta variable, i.e., a function that maps all legal v...
std::pair< storm::expressions::Variable, storm::expressions::Variable > addMetaVariable(std::string const &variableName, int_fast64_t low, int_fast64_t high, boost::optional< std::pair< MetaVariablePosition, storm::expressions::Variable > > const &position=boost::none)
Adds an integer meta variable with the given range with two layers (a 'normal' and a 'primed' one).
std::vector< storm::expressions::Variable > addBitVectorMetaVariable(std::string const &variableName, uint64_t bits, uint64_t numberOfLayers, boost::optional< std::pair< MetaVariablePosition, storm::expressions::Variable > > const &position=boost::none)
Creates a meta variable with the given number of layers.
void allowDynamicReordering(bool value)
Sets whether or not dynamic reordering is allowed for the DDs managed by this manager (if supported).
void debugCheck() const
Performs a debug check if available.
std::size_t getNumberOfMetaVariables() const
Retrieves the number of meta variables that are contained in this manager.
bool hasHigh() const
Retrieves whether the variable has an upper bound.
int_fast64_t getLow() const
Retrieves the lowest value of the range of the variable.
std::size_t getNumberOfDdVariables() const
Retrieves the number of DD variables for this meta variable.
bool canRepresent(int_fast64_t value) const
Retrieves whether the meta variable can represent the given value.
int_fast64_t getHigh() const
Retrieves the highest value of the range of the variable.
Bdd< LibraryType > const & getCube() const
Retrieves the cube of all variables that encode this meta variable.
This class is responsible for managing a set of typed variables and all expressions using these varia...
std::string const & getName() const
Retrieves the name of the variable.
Definition Variable.cpp:46
#define STORM_LOG_TRACE(message)
Definition logging.h:12
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.