1#include "storm-config.h"
24template<
typename TestType>
25class Dd :
public ::testing::Test {
36 manager->execute([&]() {
38 ASSERT_NO_THROW(zero = manager->template getAddZero<double>());
40 EXPECT_EQ(0ul, zero.getNonZeroCount());
41 EXPECT_EQ(1ul, zero.getLeafCount());
42 EXPECT_EQ(1ul, zero.getNodeCount());
43 EXPECT_EQ(0, zero.getMin());
44 EXPECT_EQ(0, zero.getMax());
47 ASSERT_NO_THROW(one = manager->template getAddOne<double>());
49 EXPECT_EQ(0ul, one.getNonZeroCount());
50 EXPECT_EQ(1ul, one.getLeafCount());
51 EXPECT_EQ(1ul, one.getNodeCount());
52 EXPECT_EQ(1, one.getMin());
53 EXPECT_EQ(1, one.getMax());
56 ASSERT_NO_THROW(two = manager->template getConstant<double>(2));
61 EXPECT_EQ(2, two.
getMin());
62 EXPECT_EQ(2, two.
getMax());
69 manager->execute([&]() {
71 ASSERT_NO_THROW(zero = manager->getBddZero());
73 EXPECT_EQ(0ul, zero.getNonZeroCount());
74 EXPECT_EQ(1ul, zero.getLeafCount());
75 EXPECT_EQ(1ul, zero.getNodeCount());
78 ASSERT_NO_THROW(one = manager->getBddOne());
80 EXPECT_EQ(0ul, one.getNonZeroCount());
81 EXPECT_EQ(1ul, one.getLeafCount());
82 EXPECT_EQ(1ul, one.getNodeCount());
90 manager->execute([&]() {
92 ASSERT_NO_THROW(zero = manager->getBddZero());
94 ASSERT_NO_THROW(one = manager->getBddOne());
96 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
97 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
98 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
99 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
100 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
101 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
115 EXPECT_TRUE(representative_false_x == zero);
122 EXPECT_TRUE(representative_true_x == bddX0);
124 storm::dd::Bdd<DdType> representative_true_xyz = one.existsAbstractRepresentative({x.first, y.first, z.first});
128 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
139 EXPECT_TRUE(bddX1Y0Z0 == representative_x);
145 EXPECT_TRUE(bddX1Y0Z0 == representative_y);
151 EXPECT_TRUE(bddX1Y0Z0 == representative_z);
157 EXPECT_TRUE(bddX1Y0Z0 == representative_xyz);
168 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_x);
174 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_y);
180 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_z);
186 EXPECT_TRUE(bddX0Y0Z0 == representative_xyz);
194 manager->execute([&]() {
196 ASSERT_NO_THROW(bddZero = manager->getBddZero());
198 ASSERT_NO_THROW(bddOne = manager->getBddOne());
201 ASSERT_NO_THROW(addZero = manager->template getAddZero<double>());
203 ASSERT_NO_THROW(addOne = manager->template getAddOne<double>());
205 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
206 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
207 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
208 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
209 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
210 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
220 ((bddX1 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.7)) +
221 ((bddX1 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
222 ((bddX1 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
223 ((bddX0 && (bddY1 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.9)) +
224 ((bddX0 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.5)) +
225 ((bddX0 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(1.0)) +
226 ((bddX0 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.0));
233 EXPECT_TRUE(representative_false_x == bddX0);
240 EXPECT_TRUE(representative_true_x == bddX0);
246 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
251 (((bddX0 && (bddY0 && bddZ0))) || ((bddX1 && (bddY0 && bddZ1))) || ((bddX0 && (bddY1 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
253 EXPECT_EQ(1ul, representative_complex_x.
getLeafCount());
254 EXPECT_EQ(3ul, representative_complex_x.
getNodeCount());
255 EXPECT_TRUE(representative_complex_x == comparison_complex_x);
260 (((bddX0 && (bddY0 && bddZ0))) || ((bddX0 && (bddY1 && bddZ1))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY0 && bddZ1))));
262 EXPECT_EQ(1ul, representative_complex_y.
getLeafCount());
263 EXPECT_EQ(5ul, representative_complex_y.
getNodeCount());
264 EXPECT_TRUE(representative_complex_y == comparison_complex_y);
269 (((bddX0 && (bddY0 && bddZ0))) || ((bddX0 && (bddY1 && bddZ0))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
271 EXPECT_EQ(1ul, representative_complex_z.
getLeafCount());
272 EXPECT_EQ(4ul, representative_complex_z.
getNodeCount());
273 EXPECT_TRUE(representative_complex_z == comparison_complex_z);
279 EXPECT_EQ(1ul, representative_complex_xyz.
getLeafCount());
280 EXPECT_EQ(4ul, representative_complex_xyz.
getNodeCount());
281 EXPECT_TRUE(representative_complex_xyz == comparison_complex_xyz);
289 manager->execute([&]() {
291 ASSERT_NO_THROW(bddZero = manager->getBddZero());
293 ASSERT_NO_THROW(bddOne = manager->getBddOne());
296 ASSERT_NO_THROW(addZero = manager->template getAddZero<double>());
298 ASSERT_NO_THROW(addOne = manager->template getAddOne<double>());
300 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
301 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
302 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
303 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
304 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
305 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
315 ((bddX1 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.7)) +
316 ((bddX1 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
317 ((bddX1 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
318 ((bddX0 && (bddY1 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.9)) +
319 ((bddX0 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.5)) +
320 ((bddX0 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(1.0)) +
321 ((bddX0 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.0));
328 EXPECT_TRUE(representative_false_x == bddX0);
335 EXPECT_TRUE(representative_true_x == bddX0);
341 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
346 (((bddX1 && (bddY0 && bddZ0))) || ((bddX0 && (bddY0 && bddZ1))) || ((bddX1 && (bddY1 && bddZ0))) || ((bddX0 && (bddY1 && bddZ1))));
348 EXPECT_EQ(1ul, representative_complex_x.
getLeafCount());
349 EXPECT_EQ(3ul, representative_complex_x.
getNodeCount());
350 EXPECT_TRUE(representative_complex_x == comparison_complex_x);
355 (((bddX0 && (bddY1 && bddZ0))) || ((bddX0 && (bddY0 && bddZ1))) || ((bddX1 && (bddY1 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
357 EXPECT_EQ(1ul, representative_complex_y.
getLeafCount());
358 EXPECT_EQ(5ul, representative_complex_y.
getNodeCount());
359 EXPECT_TRUE(representative_complex_y == comparison_complex_y);
364 (((bddX0 && (bddY0 && bddZ1))) || ((bddX0 && (bddY1 && bddZ1))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY1 && bddZ0))));
366 EXPECT_EQ(1ul, representative_complex_z.
getLeafCount());
367 EXPECT_EQ(3ul, representative_complex_z.
getNodeCount());
368 EXPECT_TRUE(representative_complex_z == comparison_complex_z);
374 EXPECT_EQ(1ul, representative_complex_xyz.
getLeafCount());
375 EXPECT_EQ(4ul, representative_complex_xyz.
getNodeCount());
376 EXPECT_TRUE(representative_complex_xyz == comparison_complex_xyz);
384 manager->execute([&]() {
385 ASSERT_NO_THROW(manager->addMetaVariable(
"x", 1, 9));
386 EXPECT_EQ(2ul, manager->getNumberOfMetaVariables());
390 ASSERT_NO_THROW(manager->addMetaVariable(
"y", 0, 3));
391 EXPECT_EQ(4ul, manager->getNumberOfMetaVariables());
393 EXPECT_TRUE(manager->hasMetaVariable(
"x'"));
394 EXPECT_TRUE(manager->hasMetaVariable(
"y'"));
396 std::set<std::string> metaVariableSet = {
"x",
"x'",
"y",
"y'"};
397 EXPECT_EQ(metaVariableSet, manager->getAllMetaVariableNames());
405 manager->execute([&]() {
406 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
411 ASSERT_NO_THROW(encoding = manager->getEncoding(x.first, 4));
420 ASSERT_NO_THROW(add = encoding.template toAdd<double>());
431 manager->execute([&]() {
432 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
433 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 1, 9));
436 ASSERT_NO_THROW(range = manager->getRange(x.first));
447 manager->execute([&]() {
448 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
451 ASSERT_NO_THROW(identity = manager->template getIdentity<double>(x.first));
462 manager->execute([&]() {
463 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
466 ASSERT_NO_THROW(identity = manager->template getIdentity<uint_fast64_t>(x.first));
477 manager->execute([&]() {
478 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
479 EXPECT_TRUE(manager->template getAddZero<double>() == manager->template getAddZero<double>());
480 EXPECT_FALSE(manager->template getAddZero<double>() == manager->template getAddOne<double>());
482 EXPECT_FALSE(manager->template getAddZero<double>() != manager->template getAddZero<double>());
483 EXPECT_TRUE(manager->template getAddZero<double>() != manager->template getAddOne<double>());
489 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
491 dd3 += manager->template getAddZero<double>();
492 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
494 dd3 = dd1 * manager->template getConstant<double>(3);
495 EXPECT_TRUE(dd3 == manager->template getConstant<double>(3));
497 dd3 *= manager->template getConstant<double>(2);
498 EXPECT_TRUE(dd3 == manager->template getConstant<double>(6));
501 EXPECT_TRUE(dd3.
isZero());
503 dd3 -= manager->template getConstant<double>(-2);
504 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
506 dd3 /= manager->template getConstant<double>(2);
507 EXPECT_TRUE(dd3.
isOne());
510 EXPECT_TRUE(bdd.
isZero());
513 EXPECT_TRUE(bdd.
isOne());
516 EXPECT_TRUE(bdd.
isOne());
518 dd1 = manager->template getIdentity<double>(x.first);
519 dd2 = manager->template getConstant<double>(5);
525 EXPECT_TRUE(bdd2 == !bdd);
539 dd3 = manager->getEncoding(x.first, 2).ite(dd2, dd1);
544 dd4 *= manager->getEncoding(x.first, 2).template toAdd<double>();
549 dd4 *= manager->getEncoding(x.first, 2).template toAdd<double>();
553 dd1 = manager->template getConstant<double>(0.01);
554 dd2 = manager->template getConstant<double>(0.01 + 1e-6);
563 manager->execute([&]() {
564 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
570 dd1 = manager->template getIdentity<double>(x.first);
571 dd2 = manager->template getConstant<double>(5);
577 EXPECT_EQ(1, bdd.template toAdd<double>().getMax());
579 dd3 = dd1.
equals(dd2).template toAdd<double>();
580 dd3 *= manager->template getConstant<double>(3);
583 ASSERT_NO_THROW(bdd = dd3.
toBdd().existsAbstract({x.first}));
584 EXPECT_TRUE(bdd.
isOne());
586 dd3 = dd1.
equals(dd2).template toAdd<double>();
587 dd3 *= manager->template getConstant<double>(3);
591 EXPECT_EQ(3, dd3.
getMax());
593 dd3 = dd1.
equals(dd2).template toAdd<double>();
594 dd3 *= manager->template getConstant<double>(3);
598 EXPECT_EQ(0, dd3.
getMax());
600 dd3 = dd1.
equals(dd2).template toAdd<double>();
601 dd3 *= manager->template getConstant<double>(3);
605 EXPECT_EQ(3, dd3.
getMax());
613 manager->execute([&]() {
614 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
615 std::pair<storm::expressions::Variable, storm::expressions::Variable> z = manager->addMetaVariable(
"z", 2, 8);
619 dd1 = manager->template getIdentity<double>(x.first);
621 ASSERT_NO_THROW(dd1 = dd1.
swapVariables({std::make_pair(x.first, x.second)}));
622 EXPECT_TRUE(dd1 == manager->template getIdentity<double>(x.second));
629 manager->execute([&]() {
630 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
633 manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>();
636 dd1 *= manager->template getConstant<double>(2);
639 ASSERT_NO_THROW(dd3 = dd3.
swapVariables({std::make_pair(x.first, x.second)}));
640 EXPECT_TRUE(dd3 == dd2 * manager->template getConstant<double>(2));
647 manager->execute([&]() {
648 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 0, 2);
649 std::pair<storm::expressions::Variable, storm::expressions::Variable> b = manager->addMetaVariable(
"b", 0, 2);
652 p += (manager->getEncoding(x.first, 2,
true) && manager->getEncoding(b.first, 0,
true)).
template toAdd<double>();
653 p += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(b.first, 2,
true)).
template toAdd<double>();
656 q += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(x.second, 0,
true)).
template toAdd<double>() *
657 manager->template getConstant<double>(0.3);
658 q += (manager->getEncoding(x.first, 1,
true) && manager->getEncoding(x.second, 0,
true)).
template toAdd<double>() *
659 manager->template getConstant<double>(0.3);
660 q += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(x.second, 2,
true)).
template toAdd<double>() *
661 manager->template getConstant<double>(0.7);
662 q += (manager->getEncoding(x.first, 1,
true) && manager->getEncoding(x.second, 2,
true)).
template toAdd<double>() *
663 manager->template getConstant<double>(0.7);
664 q += (manager->getEncoding(x.first, 2,
true) && manager->getEncoding(x.second, 0,
true)).
template toAdd<double>() *
665 manager->template getConstant<double>(1);
678 manager->execute([&]() {
679 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
682 ASSERT_NO_THROW(dd1.
setValue(x.first, 4, 2));
685 std::map<storm::expressions::Variable, int_fast64_t> metaVariableToValueMap;
686 metaVariableToValueMap.emplace(x.first, 1);
687 EXPECT_EQ(1, dd1.
getValue(metaVariableToValueMap));
689 metaVariableToValueMap.clear();
690 metaVariableToValueMap.emplace(x.first, 4);
691 EXPECT_EQ(2, dd1.
getValue(metaVariableToValueMap));
698 manager->execute([&]() {
699 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
700 std::pair<storm::expressions::Variable, storm::expressions::Variable> y = manager->addMetaVariable(
"y", 0, 3);
703 ASSERT_NO_THROW(dd = manager->getRange(x.first).template toAdd<double>());
706 ASSERT_NO_THROW(it = dd.
begin());
707 ASSERT_NO_THROW(ite = dd.
end());
708 std::pair<storm::expressions::SimpleValuation, double> valuationValuePair;
709 uint_fast64_t numberOfValuations = 0;
711 ASSERT_NO_THROW(valuationValuePair = *it);
712 ASSERT_NO_THROW(++it);
713 ++numberOfValuations;
715 EXPECT_EQ(9ul, numberOfValuations);
717 dd = manager->getRange(x.first).template toAdd<double>();
718 dd = dd.
notZero().ite(manager->template getAddOne<double>(), manager->template getAddOne<double>());
719 ASSERT_NO_THROW(it = dd.
begin());
720 ASSERT_NO_THROW(ite = dd.
end());
721 numberOfValuations = 0;
723 ASSERT_NO_THROW(valuationValuePair = *it);
724 ASSERT_NO_THROW(++it);
725 ++numberOfValuations;
727 EXPECT_EQ(16ul, numberOfValuations);
729 ASSERT_NO_THROW(it = dd.
begin(
false));
730 ASSERT_NO_THROW(ite = dd.
end());
731 numberOfValuations = 0;
733 ASSERT_NO_THROW(valuationValuePair = *it);
734 ASSERT_NO_THROW(++it);
735 ++numberOfValuations;
737 EXPECT_EQ(1ul, numberOfValuations);
744 manager->execute([&]() {
745 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
746 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
754 std::vector<double> ddAsVector;
755 ASSERT_NO_THROW(ddAsVector = dd.
toVector());
756 EXPECT_EQ(9ul, ddAsVector.size());
757 for (uint_fast64_t i = 0; i < ddAsVector.size(); ++i) {
758 EXPECT_TRUE(i + 1 == ddAsVector[i]);
762 dd = manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>() *
763 manager->getRange(x.first).template toAdd<double>();
764 dd += manager->getEncoding(x.first, 1).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() +
765 manager->getEncoding(x.second, 1).template toAdd<double>() * manager->getRange(x.first).template toAdd<double>();
769 ASSERT_NO_THROW(rowOdd = manager->getRange(x.first).template toAdd<double>().createOdd());
771 ASSERT_NO_THROW(columnOdd = manager->getRange(x.second).template toAdd<double>().createOdd());
775 ASSERT_NO_THROW(matrix = dd.
toMatrix({x.first}, {x.second}, rowOdd, columnOdd));
781 dd = manager->getRange(x.first).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() *
782 manager->getEncoding(a.first, 0).ite(dd, dd + manager->template getConstant<double>(1));
783 ASSERT_NO_THROW(matrix = dd.
toMatrix({a.first}, rowOdd, columnOdd));
794 manager->execute([&]() {
795 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
796 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
805 std::vector<double> ddAsVector;
806 ASSERT_NO_THROW(ddAsVector = dd.
toVector());
807 EXPECT_EQ(9ul, ddAsVector.size());
808 for (uint_fast64_t i = 0; i < ddAsVector.size(); ++i) {
809 EXPECT_EQ(i + 1, ddAsVector[i]);
815 dd = manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>() *
816 manager->getRange(x.first).template toAdd<double>();
817 dd += manager->getEncoding(x.first, 1).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() +
818 manager->getEncoding(x.second, 1).template toAdd<double>() * manager->getRange(x.first).template toAdd<double>();
822 ASSERT_NO_THROW(rowOdd = manager->getRange(x.first).createOdd());
824 ASSERT_NO_THROW(columnOdd = manager->getRange(x.second).createOdd());
828 ASSERT_NO_THROW(matrix = dd.
toMatrix({x.first}, {x.second}, rowOdd, columnOdd));
834 dd = manager->getRange(x.first).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() *
835 manager->getEncoding(a.first, 0).ite(dd, dd + manager->template getConstant<double>(1));
836 ASSERT_NO_THROW(matrix = dd.
toMatrix({a.first}, rowOdd, columnOdd));
847 manager->execute([&]() {
848 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
849 std::pair<storm::expressions::Variable, storm::expressions::Variable> b = manager->addMetaVariable(
"b");
852 bdd &= manager->getEncoding(a.first, 1);
853 bdd |= manager->getEncoding(b.first, 0);
855 std::shared_ptr<storm::expressions::ExpressionManager> manager = std::make_shared<storm::expressions::ExpressionManager>();
TYPED_TEST_SUITE(Dd, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
TYPED_TEST(Dd, AddConstants)
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
Add< LibraryType, ValueType > swapVariables(std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &metaVariablePairs) const
Swaps the given pairs of meta variables in the ADD.
Bdd< LibraryType > equals(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to one that have identical function values.
bool isOne() const
Retrieves whether this ADD represents the constant one function.
ValueType getMax() const
Retrieves the highest function value of any encoding.
Bdd< LibraryType > lessOrEqual(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to one whose function value in the first ADD are les...
Add< LibraryType, ValueType > minimum(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to the minimum of the function values of the two ADD...
storm::storage::SparseMatrix< ValueType > toMatrix() const
Converts the ADD to a (sparse) matrix.
ValueType getMin() const
Retrieves the lowest function value of any encoding.
Bdd< LibraryType > greater(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to one whose function value in the first ADD are gre...
Add< LibraryType, ValueType > maximum(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to the maximum of the function values of the two ADD...
ValueType getValue(std::map< storm::expressions::Variable, int_fast64_t > const &metaVariableToValueMap=std::map< storm::expressions::Variable, int_fast64_t >()) const
Retrieves the value of the function when all meta variables are assigned the values of the given mapp...
Add< LibraryType, ValueType > maxAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Max-abstracts from the given meta variables.
static Add< LibraryType, ValueType > fromVector(DdManager< LibraryType > const &ddManager, std::vector< ValueType > const &values, Odd const &odd, std::set< storm::expressions::Variable > const &metaVariables)
Builds an ADD representing the given vector.
AddIterator< LibraryType, ValueType > begin(bool enumerateDontCareMetaVariables=true) const
Retrieves an iterator that points to the first meta variable assignment with a non-zero function valu...
virtual uint_fast64_t getNonZeroCount() const override
Retrieves the number of encodings that are mapped to a non-zero value.
Add< LibraryType, ValueType > sumAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Sum-abstracts from the given meta variables.
virtual uint_fast64_t getNodeCount() const override
Retrieves the number of nodes necessary to represent the DD.
Bdd< LibraryType > minAbstractRepresentative(std::set< storm::expressions::Variable > const &metaVariables) const
Similar to minAbstract, but does not abstract from the variables but rather picks a valuation of each...
Bdd< LibraryType > greaterOrEqual(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to one whose function value in the first ADD are gre...
Add< LibraryType, ValueType > minAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Min-abstracts from the given meta variables.
Odd createOdd() const
Creates an ODD based on the current ADD.
AddIterator< LibraryType, ValueType > end() const
Retrieves an iterator that points past the end of the container.
bool isZero() const
Retrieves whether this ADD represents the constant zero function.
Add< LibraryType, ValueType > multiplyMatrix(Add< LibraryType, ValueType > const &otherMatrix, std::set< storm::expressions::Variable > const &summationMetaVariables) const
Multiplies the current ADD (representing a matrix) with the given matrix by summing over the given me...
virtual uint_fast64_t getLeafCount() const override
Retrieves the number of leaves of the ADD.
Bdd< LibraryType > toBdd() const
Converts the ADD to a BDD by mapping all values unequal to zero to 1.
bool equalModuloPrecision(Add< LibraryType, ValueType > const &other, ValueType const &precision, bool relative=true) const
Checks whether the current and the given ADD represent the same function modulo some given precision.
Bdd< LibraryType > notEquals(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to one that have distinct function values.
void setValue(storm::expressions::Variable const &metaVariable, int_fast64_t variableValue, ValueType const &targetValue)
Sets the function values of all encodings that have the given value of the meta variable to the given...
Bdd< LibraryType > notZero() const
Computes a BDD that represents the function in which all assignments with a function value unequal to...
Bdd< LibraryType > maxAbstractRepresentative(std::set< storm::expressions::Variable > const &metaVariables) const
Similar to maxAbstract, but does not abstract from the variables but rather picks a valuation of each...
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
Bdd< LibraryType > less(Add< LibraryType, ValueType > const &other) const
Retrieves the function that maps all evaluations to one whose function value in the first ADD are les...
Bdd< LibraryType > existsAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Existentially abstracts from the given meta variables.
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.
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...
virtual uint_fast64_t getNodeCount() const override
Retrieves the number of nodes necessary to represent the DD.
Odd createOdd() const
Creates an ODD based on the current BDD.
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...
bool isOne() const
Retrieves whether this DD represents the constant one function.
virtual uint_fast64_t getLeafCount() const override
Retrieves the number of leaves of the DD.
uint_fast64_t getNodeCount() const
Retrieves the size of the ODD.
uint_fast64_t getTotalOffset() const
Retrieves the total offset, i.e., the sum of the then- and else-offset.
A class that holds a possibly non-square matrix in the compressed row storage format.
index_type getRowGroupCount() const
Returns the number of row groups in the matrix.
index_type getColumnCount() const
Returns the number of columns of the matrix.
index_type getRowCount() const
Returns the number of rows of the matrix.
index_type getNonzeroEntryCount() const
Returns the cached number of nonzero entries in the matrix.
::testing::Types< Cudd, Sylvan > TestingTypes
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)