3#include "storm-config.h"
19template<DdType LibraryType>
21 std::set<storm::expressions::Variable>
const& containedMetaVariables)
22 :
Dd<LibraryType>(ddManager, containedMetaVariables), internalBdd(internalBdd) {
26template<DdType LibraryType,
typename ValueType>
31 switch (comparisonType) {
36 [&value, &explicitValues](uint64_t offset) { return explicitValues[offset] < value; }),
42 [&value, &explicitValues](uint64_t offset) { return explicitValues[offset] <= value; }),
48 [&value, &explicitValues](uint64_t offset) { return explicitValues[offset] > value; }),
54 [&value, &explicitValues](uint64_t offset) { return explicitValues[offset] >= value; }),
61template<DdType LibraryType>
65 STORM_LOG_THROW(
false, storm::exceptions::InvalidOperationException,
"Cannot compare rational functions to bound.");
70template<DdType LibraryType>
71template<
typename ValueType>
78template<DdType LibraryType>
80 std::set<storm::expressions::Variable>
const& metaVariables) {
83 [&truthValues](uint64_t offset) { return truthValues[offset]; }),
87template<DdType LibraryType>
89 std::set<storm::expressions::Variable>
const& metaVariables) {
92 [targetOffset](uint64_t offset) { return offset == targetOffset; }),
96template<DdType LibraryType>
98 return internalBdd == other.internalBdd;
101template<DdType LibraryType>
103 return internalBdd != other.internalBdd;
106template<DdType LibraryType>
109 metaVariables.insert(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end());
110 return Bdd<LibraryType>(this->getDdManager(), internalBdd.ite(thenBdd.internalBdd, elseBdd.internalBdd), metaVariables);
113template<DdType LibraryType>
114template<
typename ValueType>
117 metaVariables.insert(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end());
118 return Add<LibraryType, ValueType>(this->getDdManager(), internalBdd.ite(thenAdd.internalAdd, elseAdd.internalAdd), metaVariables);
121template<DdType LibraryType>
126template<DdType LibraryType>
129 internalBdd |= other.internalBdd;
133template<DdType LibraryType>
138template<DdType LibraryType>
141 internalBdd &= other.internalBdd;
145template<DdType LibraryType>
150template<DdType LibraryType>
155template<DdType LibraryType>
160template<DdType LibraryType>
162 return Bdd<LibraryType>(this->getDdManager(), !internalBdd, this->getContainedMetaVariables());
165template<DdType LibraryType>
171template<DdType LibraryType>
177template<DdType LibraryType>
180 return Bdd<LibraryType>(this->getDdManager(), internalBdd.existsAbstractRepresentative(cube.
getInternalBdd()), this->getContainedMetaVariables());
183template<DdType LibraryType>
189template<DdType LibraryType>
193 std::set<storm::expressions::Variable> unionOfMetaVariables;
194 std::set_union(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end(), other.
getContainedMetaVariables().begin(),
196 std::set<storm::expressions::Variable> containedMetaVariables;
197 std::set_difference(unionOfMetaVariables.begin(), unionOfMetaVariables.end(), existentialVariables.begin(), existentialVariables.end(),
198 std::inserter(containedMetaVariables, containedMetaVariables.begin()));
203template<DdType LibraryType>
208template<DdType LibraryType>
213template<DdType LibraryType>
215 std::set<storm::expressions::Variable>
const& columnMetaVariables)
const {
216 std::set<storm::expressions::Variable> newMetaVariables;
218 columnMetaVariables.end(), std::inserter(newMetaVariables, newMetaVariables.begin()));
220 std::vector<InternalBdd<LibraryType>> rowVariables;
221 for (
auto const& metaVariable : rowMetaVariables) {
223 for (
auto const& ddVariable : variable.getDdVariables()) {
224 rowVariables.push_back(ddVariable.getInternalBdd());
228 std::vector<InternalBdd<LibraryType>> columnVariables;
229 for (
auto const& metaVariable : columnMetaVariables) {
230 DdMetaVariable<LibraryType>
const& variable = this->getDdManager().getMetaVariable(metaVariable);
231 for (
auto const& ddVariable : variable.getDdVariables()) {
232 columnVariables.push_back(ddVariable.getInternalBdd());
236 return Bdd<LibraryType>(this->getDdManager(), internalBdd.relationalProduct(relation.
getInternalBdd(), rowVariables, columnVariables), newMetaVariables);
239template<DdType LibraryType>
241 std::set<storm::expressions::Variable>
const& columnMetaVariables)
const {
242 std::set<storm::expressions::Variable> newMetaVariables;
244 columnMetaVariables.end(), std::inserter(newMetaVariables, newMetaVariables.begin()));
246 std::vector<InternalBdd<LibraryType>> rowVariables;
247 for (
auto const& metaVariable : rowMetaVariables) {
249 for (
auto const& ddVariable : variable.getDdVariables()) {
250 rowVariables.push_back(ddVariable.getInternalBdd());
254 std::vector<InternalBdd<LibraryType>> columnVariables;
255 for (
auto const& metaVariable : columnMetaVariables) {
257 for (
auto const& ddVariable : variable.getDdVariables()) {
258 columnVariables.push_back(ddVariable.getInternalBdd());
262 return Bdd<LibraryType>(this->getDdManager(), internalBdd.inverseRelationalProduct(relation.
getInternalBdd(), rowVariables, columnVariables),
266template<DdType LibraryType>
268 std::set<storm::expressions::Variable>
const& rowMetaVariables,
269 std::set<storm::expressions::Variable>
const& columnMetaVariables)
const {
270 std::set<storm::expressions::Variable> newMetaVariables;
272 columnMetaVariables.end(), std::inserter(newMetaVariables, newMetaVariables.begin()));
274 std::vector<InternalBdd<LibraryType>> rowVariables;
275 for (
auto const& metaVariable : rowMetaVariables) {
277 for (
auto const& ddVariable : variable.getDdVariables()) {
278 rowVariables.push_back(ddVariable.getInternalBdd());
282 std::vector<InternalBdd<LibraryType>> columnVariables;
283 for (
auto const& metaVariable : columnMetaVariables) {
285 for (
auto const& ddVariable : variable.getDdVariables()) {
286 columnVariables.push_back(ddVariable.getInternalBdd());
291 internalBdd.inverseRelationalProductWithExtendedRelation(relation.
getInternalBdd(), rowVariables, columnVariables),
295template<DdType LibraryType>
297 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>>
const& metaVariablePairs)
const {
298 std::set<storm::expressions::Variable> newContainedMetaVariables;
299 std::set<storm::expressions::Variable> deletedMetaVariables;
300 std::vector<InternalBdd<LibraryType>> from;
301 std::vector<InternalBdd<LibraryType>> to;
302 for (
auto const& metaVariablePair : metaVariablePairs) {
307 if (this->containsMetaVariable(metaVariablePair.first)) {
308 if (this->containsMetaVariable(metaVariablePair.second)) {
311 newContainedMetaVariables.insert(metaVariablePair.second);
312 deletedMetaVariables.insert(metaVariablePair.first);
315 if (!this->containsMetaVariable(metaVariablePair.second)) {
318 newContainedMetaVariables.insert(metaVariablePair.first);
319 deletedMetaVariables.insert(metaVariablePair.second);
323 for (
auto const& ddVariable : variable1.getDdVariables()) {
324 from.emplace_back(ddVariable.getInternalBdd());
326 for (
auto const& ddVariable : variable2.getDdVariables()) {
327 to.emplace_back(ddVariable.getInternalBdd());
331 std::set<storm::expressions::Variable> tmp;
332 std::set_difference(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end(), deletedMetaVariables.begin(),
333 deletedMetaVariables.end(), std::inserter(tmp, tmp.begin()));
334 std::set<storm::expressions::Variable> containedMetaVariables;
335 std::set_union(tmp.begin(), tmp.end(), newContainedMetaVariables.begin(), newContainedMetaVariables.end(),
336 std::inserter(containedMetaVariables, containedMetaVariables.begin()));
337 return Bdd<LibraryType>(this->getDdManager(), internalBdd.swapVariables(from, to), containedMetaVariables);
340template<DdType LibraryType>
342 std::vector<InternalBdd<LibraryType>> fromBdds;
343 std::vector<InternalBdd<LibraryType>> toBdds;
345 for (
auto const& metaVariable : from) {
346 STORM_LOG_THROW(this->containsMetaVariable(metaVariable), storm::exceptions::InvalidOperationException,
347 "Cannot rename variable '" << metaVariable.getName() <<
"' that is not present.");
349 for (
auto const& ddVariable : ddMetaVariable.getDdVariables()) {
350 fromBdds.push_back(ddVariable.getInternalBdd());
353 for (
auto const& metaVariable : to) {
354 STORM_LOG_THROW(!this->containsMetaVariable(metaVariable), storm::exceptions::InvalidOperationException,
355 "Cannot rename to variable '" << metaVariable.getName() <<
"' that is already present.");
357 for (
auto const& ddVariable : ddMetaVariable.getDdVariables()) {
358 toBdds.push_back(ddVariable.getInternalBdd());
362 std::set<storm::expressions::Variable> newContainedMetaVariables = to;
363 std::set_difference(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end(), from.begin(), from.end(),
364 std::inserter(newContainedMetaVariables, newContainedMetaVariables.begin()));
366 STORM_LOG_THROW(fromBdds.size() == toBdds.size(), storm::exceptions::InvalidArgumentException,
"Unable to rename mismatching meta variables.");
367 return Bdd<LibraryType>(this->getDdManager(), internalBdd.swapVariables(fromBdds, toBdds), newContainedMetaVariables);
370template<DdType LibraryType>
372 std::set<storm::expressions::Variable>
const& to)
const {
373 std::vector<InternalBdd<LibraryType>> fromBdds;
374 std::vector<InternalBdd<LibraryType>> toBdds;
376 for (
auto const& metaVariable : from) {
377 STORM_LOG_THROW(this->containsMetaVariable(metaVariable), storm::exceptions::InvalidOperationException,
378 "Cannot rename variable '" << metaVariable.getName() <<
"' that is not present.");
380 for (
auto const& ddVariable : ddMetaVariable.getDdVariables()) {
381 fromBdds.push_back(ddVariable.getInternalBdd());
384 std::sort(fromBdds.begin(), fromBdds.end(),
386 for (
auto const& metaVariable : to) {
387 STORM_LOG_THROW(!this->containsMetaVariable(metaVariable), storm::exceptions::InvalidOperationException,
388 "Cannot rename to variable '" << metaVariable.getName() <<
"' that is already present.");
390 for (
auto const& ddVariable : ddMetaVariable.getDdVariables()) {
391 toBdds.push_back(ddVariable.getInternalBdd());
394 std::sort(toBdds.begin(), toBdds.end(), [](InternalBdd<LibraryType>
const& a, InternalBdd<LibraryType>
const& b) { return a.getLevel() < b.getLevel(); });
396 std::set<storm::expressions::Variable> newContainedMetaVariables = to;
397 std::set_difference(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end(), from.begin(), from.end(),
398 std::inserter(newContainedMetaVariables, newContainedMetaVariables.begin()));
400 STORM_LOG_ASSERT(fromBdds.size() >= toBdds.size(),
"Unable to perform rename-abstract with mismatching sizes.");
402 if (fromBdds.size() == toBdds.size()) {
403 return Bdd<LibraryType>(this->getDdManager(), internalBdd.swapVariables(fromBdds, toBdds), newContainedMetaVariables);
406 for (uint64_t index = toBdds.size(); index < fromBdds.size(); ++index) {
407 cube &= fromBdds[index];
409 fromBdds.resize(toBdds.size());
411 return Bdd<LibraryType>(this->getDdManager(), internalBdd.existsAbstract(cube).swapVariables(fromBdds, toBdds), newContainedMetaVariables);
415template<DdType LibraryType>
417 std::set<storm::expressions::Variable>
const& to)
const {
418 std::vector<InternalBdd<LibraryType>> fromBdds;
419 std::vector<InternalBdd<LibraryType>> toBdds;
421 for (
auto const& metaVariable : from) {
422 STORM_LOG_THROW(this->containsMetaVariable(metaVariable), storm::exceptions::InvalidOperationException,
423 "Cannot rename variable '" << metaVariable.getName() <<
"' that is not present.");
425 for (
auto const& ddVariable : ddMetaVariable.getDdVariables()) {
426 fromBdds.push_back(ddVariable.getInternalBdd());
429 std::sort(fromBdds.begin(), fromBdds.end(),
430 [](InternalBdd<LibraryType>
const& a, InternalBdd<LibraryType>
const& b) { return a.getLevel() < b.getLevel(); });
431 for (
auto const& metaVariable : to) {
432 STORM_LOG_THROW(!this->containsMetaVariable(metaVariable), storm::exceptions::InvalidOperationException,
433 "Cannot rename to variable '" << metaVariable.getName() <<
"' that is already present.");
435 for (
auto const& ddVariable : ddMetaVariable.getDdVariables()) {
436 toBdds.push_back(ddVariable.getInternalBdd());
439 std::sort(toBdds.begin(), toBdds.end(), [](InternalBdd<LibraryType>
const& a, InternalBdd<LibraryType>
const& b) { return a.getLevel() < b.getLevel(); });
441 std::set<storm::expressions::Variable> newContainedMetaVariables = to;
442 std::set_difference(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end(), from.begin(), from.end(),
443 std::inserter(newContainedMetaVariables, newContainedMetaVariables.begin()));
445 STORM_LOG_ASSERT(toBdds.size() >= fromBdds.size(),
"Unable to perform rename-concretize with mismatching sizes.");
447 if (fromBdds.size() == toBdds.size()) {
448 return Bdd<LibraryType>(this->getDdManager(), internalBdd.swapVariables(fromBdds, toBdds), newContainedMetaVariables);
450 InternalBdd<LibraryType> negatedCube = this->getDdManager().getBddOne().getInternalBdd();
451 for (uint64_t index = fromBdds.size(); index < toBdds.size(); ++index) {
452 negatedCube &= !toBdds[index];
454 toBdds.resize(fromBdds.size());
456 return Bdd<LibraryType>(this->getDdManager(), (internalBdd && negatedCube).swapVariables(fromBdds, toBdds), newContainedMetaVariables);
460template<DdType LibraryType>
461template<
typename ValueType>
463 return Add<LibraryType, ValueType>(this->getDdManager(), internalBdd.template toAdd<ValueType>(), this->getContainedMetaVariables());
466template<DdType LibraryType>
468 std::set<storm::expressions::Variable> remainingMetaVariables;
469 std::set_difference(this->getContainedMetaVariables().begin(), this->getContainedMetaVariables().end(), variables.begin(), variables.end(),
470 std::inserter(remainingMetaVariables, remainingMetaVariables.begin()));
472 std::vector<uint_fast64_t> ddGroupVariableIndices;
473 for (
auto const& variable : variables) {
475 for (
auto const& ddVariable : metaVariable.getDdVariables()) {
476 ddGroupVariableIndices.push_back(ddVariable.getIndex());
479 std::ranges::sort(ddGroupVariableIndices);
481 std::vector<InternalBdd<LibraryType>> internalBddGroups = this->internalBdd.splitIntoGroups(ddGroupVariableIndices);
482 std::vector<Bdd<LibraryType>> groups;
483 for (
auto const& internalBdd : internalBddGroups) {
484 groups.emplace_back(
Bdd<LibraryType>(this->getDdManager(), internalBdd, remainingMetaVariables));
490template<DdType LibraryType>
492 return internalBdd.toVector(rowOdd, this->getSortedVariableIndices());
495template<DdType LibraryType>
498 return internalBdd.toExpression(manager);
501template<DdType LibraryType>
503 return Bdd<LibraryType>(this->getDdManager(), internalBdd.getSupport(), this->getContainedMetaVariables());
506template<DdType LibraryType>
508 std::size_t numberOfDdVariables = 0;
509 for (
auto const& metaVariable : this->getContainedMetaVariables()) {
510 numberOfDdVariables += this->getDdManager().getMetaVariable(metaVariable).getNumberOfDdVariables();
512 return internalBdd.getNonZeroCount(numberOfDdVariables);
515template<DdType LibraryType>
517 return internalBdd.getLeafCount();
520template<DdType LibraryType>
522 return internalBdd.getNodeCount();
525template<DdType LibraryType>
527 return internalBdd.getIndex();
530template<DdType LibraryType>
532 return internalBdd.getLevel();
535template<DdType LibraryType>
537 return internalBdd.isOne();
540template<DdType LibraryType>
542 return internalBdd.isZero();
545template<DdType LibraryType>
547 internalBdd.exportToDot(filename, this->getDdManager().getDdVariableNames(), showVariablesIfPossible);
550template<DdType LibraryType>
552 internalBdd.exportToText(filename);
555template<DdType LibraryType>
558 for (
auto const& metaVariable : metaVariables) {
559 cube &= manager.getMetaVariable(metaVariable).getCube();
564template<DdType LibraryType>
566 return internalBdd.createOdd(this->getSortedVariableIndices());
569template<DdType LibraryType>
574template<DdType LibraryType>
575template<
typename ValueType>
577 std::vector<ValueType> result(this->getNonZeroCount());
578 internalBdd.filterExplicitVector(odd, this->getSortedVariableIndices(), values, result);
582template<DdType LibraryType>
585 internalBdd.filterExplicitVector(odd, this->getSortedVariableIndices(), values, result);
592 storm::dd::Odd const& odd, std::set<storm::expressions::Variable>
const& metaVariables,
611 storm::dd::Odd const& odd, std::set<storm::expressions::Variable>
const& metaVariables,
615 std::vector<storm::RationalNumber>
const& explicitValues,
storm::dd::Odd const& odd,
616 std::set<storm::expressions::Variable>
const& metaVariables,
619 std::vector<storm::RationalFunction>
const& explicitValues,
storm::dd::Odd const& odd,
620 std::set<storm::expressions::Variable>
const& metaVariables,
634 std::vector<storm::RationalFunction>
const& values)
const;
Bdd< LibraryType > renameVariablesAbstract(std::set< storm::expressions::Variable > const &from, std::set< storm::expressions::Variable > const &to) const
Renames the given meta variables in the BDD.
virtual uint_fast64_t getLevel() const override
Retrieves the level of the topmost variable in the DD.
static Bdd< LibraryType > fromVector(DdManager< LibraryType > const &ddManager, storm::storage::BitVector const &truthValues, storm::dd::Odd const &odd, std::set< storm::expressions::Variable > const &metaVariables)
Constructs a BDD representation of all encodings whose value is true in the given list of truth value...
Bdd< LibraryType > existsAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Existentially abstracts from the given meta variables.
Bdd< LibraryType > inverseRelationalProduct(Bdd< LibraryType > const &relation, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables) const
Computes the inverse relational product of the current BDD and the given BDD representing a relation.
bool isZero() const
Retrieves whether this DD represents the constant zero function.
virtual uint_fast64_t getNonZeroCount() const override
Retrieves the number of encodings that are mapped to a non-zero value.
bool operator!=(Bdd< LibraryType > const &other) const
Retrieves whether the two BDDs represent different functions.
virtual uint_fast64_t getIndex() const override
Retrieves the index of the topmost variable in the DD.
Bdd< LibraryType > & operator&=(Bdd< LibraryType > const &other)
Performs a logical and of the current and the given BDD and assigns it to the current BDD.
std::pair< std::vector< storm::expressions::Expression >, std::unordered_map< uint_fast64_t, storm::expressions::Variable > > toExpression(storm::expressions::ExpressionManager &manager) const
Translates the function the BDD is representing to a set of expressions that characterize the functio...
Bdd< LibraryType > andExists(Bdd< LibraryType > const &other, std::set< storm::expressions::Variable > const &existentialVariables) const
Computes the logical and of the current and the given BDD and existentially abstracts from the given ...
static Bdd< LibraryType > getEncoding(DdManager< LibraryType > const &ddManager, uint64_t targetOffset, storm::dd::Odd const &odd, std::set< storm::expressions::Variable > const &metaVariables)
Constructs the BDD representation of the encoding with the given offset.
virtual uint_fast64_t getNodeCount() const override
Retrieves the number of nodes necessary to represent the DD.
Bdd< LibraryType > swapVariables(std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &metaVariablePairs) const
Swaps the given pairs of meta variables in the BDD.
Bdd< LibraryType > & complement()
Logically complements the current BDD.
Odd createOdd() const
Creates an ODD based on the current BDD.
Bdd< LibraryType > operator&&(Bdd< LibraryType > const &other) const
Performs a logical and of the current and the given BDD.
storm::storage::BitVector toVector(storm::dd::Odd const &rowOdd) const
Converts the BDD to a bit vector.
Bdd< LibraryType > existsAbstractRepresentative(std::set< storm::expressions::Variable > const &metaVariables) const
Similar to existsAbstract, but does not abstract from the variables but rather picks a valuation of e...
static Bdd< LibraryType > getCube(DdManager< LibraryType > const &manager, std::set< storm::expressions::Variable > const &metaVariables)
Retrieves the cube of all given meta variables.
Bdd< LibraryType > universalAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Universally abstracts from the given meta variables.
virtual Bdd< LibraryType > getSupport() const override
Retrieves the support of the current DD.
Bdd< LibraryType > constrain(Bdd< LibraryType > const &constraint) const
Computes the constraint of the current BDD with the given constraint.
Bdd< LibraryType > & operator|=(Bdd< LibraryType > const &other)
Performs a logical or of the current and the given BDD and assigns it to the current BDD.
std::vector< Bdd< LibraryType > > split(std::set< storm::expressions::Variable > const &variables) const
Splits the BDD along the given variables (must be at the top).
Bdd< LibraryType > ite(Bdd< LibraryType > const &thenBdd, Bdd< LibraryType > const &elseBdd) const
Performs an if-then-else with the given operands, i.e.
Bdd< LibraryType > operator!() const
Logically inverts the current BDD.
Add< LibraryType, ValueType > toAdd() const
Converts a BDD to an equivalent ADD.
Bdd< LibraryType > iff(Bdd< LibraryType > const &other) const
Performs a logical iff of the current and the given BDD.
virtual void exportToDot(std::string const &filename, bool showVariablesIfPossible=true) const override
Exports the DD to the given file in the dot format.
Bdd< LibraryType > renameVariables(std::set< storm::expressions::Variable > const &from, std::set< storm::expressions::Variable > const &to) const
Renames the given meta variables in the BDD.
Bdd< LibraryType > inverseRelationalProductWithExtendedRelation(Bdd< LibraryType > const &relation, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables) const
Computes the inverse relational product of the current BDD and the given BDD representing a relation ...
bool isOne() const
Retrieves whether this DD represents the constant one function.
Bdd< LibraryType > exclusiveOr(Bdd< LibraryType > const &other) const
Performs a logical exclusive-or of the current and the given BDD.
Bdd< LibraryType > relationalProduct(Bdd< LibraryType > const &relation, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables) const
Computes the relational product of the current BDD and the given BDD representing a relation.
virtual void exportToText(std::string const &filename) const override
Exports the DD to the given file in the dot format.
Bdd< LibraryType > restrict(Bdd< LibraryType > const &constraint) const
Computes the restriction of the current BDD with the given constraint.
Bdd< LibraryType > implies(Bdd< LibraryType > const &other) const
Performs a logical implication of the current and the given BDD.
Bdd< LibraryType > renameVariablesConcretize(std::set< storm::expressions::Variable > const &from, std::set< storm::expressions::Variable > const &to) const
Renames the given meta variables in the BDD.
InternalBdd< LibraryType > const & getInternalBdd() const
Retrieves the internal BDD.
std::vector< ValueType > filterExplicitVector(Odd const &odd, std::vector< ValueType > const &values) const
Filters the given explicit vector using the symbolic representation of which values to select.
bool operator==(Bdd< LibraryType > const &other) const
Retrieves whether the two BDDs represent the same function.
Bdd< LibraryType > operator||(Bdd< LibraryType > const &other) const
Performs a logical or of the current and the given BDD.
virtual uint_fast64_t getLeafCount() const override
Retrieves the number of leaves of the DD.
static std::set< storm::expressions::Variable > joinMetaVariables(storm::dd::Dd< LibraryType > const &first, storm::dd::Dd< LibraryType > const &second)
Retrieves the set of meta variables contained in both DDs.
std::set< storm::expressions::Variable > const & getContainedMetaVariables() const
Retrieves the set of all meta variables contained in the DD.
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...
InternalDdManager< LibraryType > & getInternalDdManager()
Retrieves the internal DD manager.
This class is responsible for managing a set of typed variables and all expressions using these varia...
A bit vector that is internally represented as a vector of 64-bit values.
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
static Bdd< LibraryType > fromVector(DdManager< LibraryType > const &, std::vector< storm::RationalFunction > const &, storm::dd::Odd const &, std::set< storm::expressions::Variable > const &, storm::logic::ComparisonType, storm::RationalFunction)
static Bdd< LibraryType > fromVector(DdManager< LibraryType > const &ddManager, std::vector< ValueType > const &explicitValues, storm::dd::Odd const &odd, std::set< storm::expressions::Variable > const &metaVariables, storm::logic::ComparisonType comparisonType, ValueType value)