1#include "storm-config.h"
19#ifndef STORM_HAVE_CUDD
20 GTEST_SKIP() <<
"Library CUDD not available.";
30#ifndef STORM_HAVE_SYLVAN
31 GTEST_SKIP() <<
"Library Sylvan not available.";
38template<
typename TestType>
39class Dd :
public ::testing::Test {
42 TestType::checkLibraryAvailable();
56 manager->execute([&]() {
58 ASSERT_NO_THROW(zero = manager->template getAddZero<double>());
60 EXPECT_EQ(0ul, zero.getNonZeroCount());
61 EXPECT_EQ(1ul, zero.getLeafCount());
62 EXPECT_EQ(1ul, zero.getNodeCount());
63 EXPECT_EQ(0, zero.getMin());
64 EXPECT_EQ(0, zero.getMax());
67 ASSERT_NO_THROW(one = manager->template getAddOne<double>());
69 EXPECT_EQ(0ul, one.getNonZeroCount());
70 EXPECT_EQ(1ul, one.getLeafCount());
71 EXPECT_EQ(1ul, one.getNodeCount());
72 EXPECT_EQ(1, one.getMin());
73 EXPECT_EQ(1, one.getMax());
76 ASSERT_NO_THROW(two = manager->template getConstant<double>(2));
81 EXPECT_EQ(2, two.
getMin());
82 EXPECT_EQ(2, two.
getMax());
89 manager->execute([&]() {
91 ASSERT_NO_THROW(zero = manager->getBddZero());
93 EXPECT_EQ(0ul, zero.getNonZeroCount());
94 EXPECT_EQ(1ul, zero.getLeafCount());
95 EXPECT_EQ(1ul, zero.getNodeCount());
98 ASSERT_NO_THROW(one = manager->getBddOne());
100 EXPECT_EQ(0ul, one.getNonZeroCount());
101 EXPECT_EQ(1ul, one.getLeafCount());
102 EXPECT_EQ(1ul, one.getNodeCount());
110 manager->execute([&]() {
112 ASSERT_NO_THROW(zero = manager->getBddZero());
114 ASSERT_NO_THROW(one = manager->getBddOne());
116 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
117 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
118 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
119 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
120 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
121 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
135 EXPECT_TRUE(representative_false_x == zero);
142 EXPECT_TRUE(representative_true_x == bddX0);
144 storm::dd::Bdd<DdType> representative_true_xyz = one.existsAbstractRepresentative({x.first, y.first, z.first});
148 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
159 EXPECT_TRUE(bddX1Y0Z0 == representative_x);
165 EXPECT_TRUE(bddX1Y0Z0 == representative_y);
171 EXPECT_TRUE(bddX1Y0Z0 == representative_z);
177 EXPECT_TRUE(bddX1Y0Z0 == representative_xyz);
188 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_x);
194 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_y);
200 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_z);
206 EXPECT_TRUE(bddX0Y0Z0 == representative_xyz);
214 manager->execute([&]() {
216 ASSERT_NO_THROW(bddZero = manager->getBddZero());
218 ASSERT_NO_THROW(bddOne = manager->getBddOne());
221 ASSERT_NO_THROW(addZero = manager->template getAddZero<double>());
223 ASSERT_NO_THROW(addOne = manager->template getAddOne<double>());
225 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
226 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
227 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
228 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
229 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
230 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
240 ((bddX1 && (bddY1 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.7)) +
241 ((bddX1 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
242 ((bddX1 && (bddY0 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.3)) +
243 ((bddX0 && (bddY1 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.9)) +
244 ((bddX0 && (bddY1 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.5)) +
245 ((bddX0 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(1.0)) +
246 ((bddX0 && (bddY0 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.0));
253 EXPECT_TRUE(representative_false_x == bddX0);
260 EXPECT_TRUE(representative_true_x == bddX0);
266 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
271 (((bddX0 && (bddY0 && bddZ0))) || ((bddX1 && (bddY0 && bddZ1))) || ((bddX0 && (bddY1 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
273 EXPECT_EQ(1ul, representative_complex_x.
getLeafCount());
274 EXPECT_EQ(3ul, representative_complex_x.
getNodeCount());
275 EXPECT_TRUE(representative_complex_x == comparison_complex_x);
280 (((bddX0 && (bddY0 && bddZ0))) || ((bddX0 && (bddY1 && bddZ1))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY0 && bddZ1))));
282 EXPECT_EQ(1ul, representative_complex_y.
getLeafCount());
283 EXPECT_EQ(5ul, representative_complex_y.
getNodeCount());
284 EXPECT_TRUE(representative_complex_y == comparison_complex_y);
289 (((bddX0 && (bddY0 && bddZ0))) || ((bddX0 && (bddY1 && bddZ0))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
291 EXPECT_EQ(1ul, representative_complex_z.
getLeafCount());
292 EXPECT_EQ(4ul, representative_complex_z.
getNodeCount());
293 EXPECT_TRUE(representative_complex_z == comparison_complex_z);
299 EXPECT_EQ(1ul, representative_complex_xyz.
getLeafCount());
300 EXPECT_EQ(4ul, representative_complex_xyz.
getNodeCount());
301 EXPECT_TRUE(representative_complex_xyz == comparison_complex_xyz);
309 manager->execute([&]() {
311 ASSERT_NO_THROW(bddZero = manager->getBddZero());
313 ASSERT_NO_THROW(bddOne = manager->getBddOne());
316 ASSERT_NO_THROW(addZero = manager->template getAddZero<double>());
318 ASSERT_NO_THROW(addOne = manager->template getAddOne<double>());
320 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
321 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
322 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
323 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
324 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
325 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
335 ((bddX1 && (bddY1 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.7)) +
336 ((bddX1 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
337 ((bddX1 && (bddY0 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.3)) +
338 ((bddX0 && (bddY1 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.9)) +
339 ((bddX0 && (bddY1 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.5)) +
340 ((bddX0 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(1.0)) +
341 ((bddX0 && (bddY0 && bddZ0)).
template toAdd<double>() * manager->template getConstant<double>(0.0));
348 EXPECT_TRUE(representative_false_x == bddX0);
355 EXPECT_TRUE(representative_true_x == bddX0);
361 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
366 (((bddX1 && (bddY0 && bddZ0))) || ((bddX0 && (bddY0 && bddZ1))) || ((bddX1 && (bddY1 && bddZ0))) || ((bddX0 && (bddY1 && bddZ1))));
368 EXPECT_EQ(1ul, representative_complex_x.
getLeafCount());
369 EXPECT_EQ(3ul, representative_complex_x.
getNodeCount());
370 EXPECT_TRUE(representative_complex_x == comparison_complex_x);
375 (((bddX0 && (bddY1 && bddZ0))) || ((bddX0 && (bddY0 && bddZ1))) || ((bddX1 && (bddY1 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
377 EXPECT_EQ(1ul, representative_complex_y.
getLeafCount());
378 EXPECT_EQ(5ul, representative_complex_y.
getNodeCount());
379 EXPECT_TRUE(representative_complex_y == comparison_complex_y);
384 (((bddX0 && (bddY0 && bddZ1))) || ((bddX0 && (bddY1 && bddZ1))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY1 && bddZ0))));
386 EXPECT_EQ(1ul, representative_complex_z.
getLeafCount());
387 EXPECT_EQ(3ul, representative_complex_z.
getNodeCount());
388 EXPECT_TRUE(representative_complex_z == comparison_complex_z);
394 EXPECT_EQ(1ul, representative_complex_xyz.
getLeafCount());
395 EXPECT_EQ(4ul, representative_complex_xyz.
getNodeCount());
396 EXPECT_TRUE(representative_complex_xyz == comparison_complex_xyz);
404 manager->execute([&]() {
405 ASSERT_NO_THROW(manager->addMetaVariable(
"x", 1, 9));
406 EXPECT_EQ(2ul, manager->getNumberOfMetaVariables());
410 ASSERT_NO_THROW(manager->addMetaVariable(
"y", 0, 3));
411 EXPECT_EQ(4ul, manager->getNumberOfMetaVariables());
413 EXPECT_TRUE(manager->hasMetaVariable(
"x'"));
414 EXPECT_TRUE(manager->hasMetaVariable(
"y'"));
416 std::set<std::string> metaVariableSet = {
"x",
"x'",
"y",
"y'"};
417 EXPECT_EQ(metaVariableSet, manager->getAllMetaVariableNames());
425 manager->execute([&]() {
426 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
431 ASSERT_NO_THROW(encoding = manager->getEncoding(x.first, 4));
440 ASSERT_NO_THROW(add = encoding.template toAdd<double>());
451 manager->execute([&]() {
452 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
453 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 1, 9));
456 ASSERT_NO_THROW(range = manager->getRange(x.first));
467 manager->execute([&]() {
468 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
471 ASSERT_NO_THROW(identity = manager->template getIdentity<double>(x.first));
482 manager->execute([&]() {
483 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
486 ASSERT_NO_THROW(identity = manager->template getIdentity<uint_fast64_t>(x.first));
497 manager->execute([&]() {
498 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
499 EXPECT_TRUE(manager->template getAddZero<double>() == manager->template getAddZero<double>());
500 EXPECT_FALSE(manager->template getAddZero<double>() == manager->template getAddOne<double>());
502 EXPECT_FALSE(manager->template getAddZero<double>() != manager->template getAddZero<double>());
503 EXPECT_TRUE(manager->template getAddZero<double>() != manager->template getAddOne<double>());
509 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
511 dd3 += manager->template getAddZero<double>();
512 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
514 dd3 = dd1 * manager->template getConstant<double>(3);
515 EXPECT_TRUE(dd3 == manager->template getConstant<double>(3));
517 dd3 *= manager->template getConstant<double>(2);
518 EXPECT_TRUE(dd3 == manager->template getConstant<double>(6));
521 EXPECT_TRUE(dd3.
isZero());
523 dd3 -= manager->template getConstant<double>(-2);
524 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
526 dd3 /= manager->template getConstant<double>(2);
527 EXPECT_TRUE(dd3.
isOne());
530 EXPECT_TRUE(bdd.
isZero());
533 EXPECT_TRUE(bdd.
isOne());
536 EXPECT_TRUE(bdd.
isOne());
538 dd1 = manager->template getIdentity<double>(x.first);
539 dd2 = manager->template getConstant<double>(5);
545 EXPECT_TRUE(bdd2 == !bdd);
559 dd3 = manager->getEncoding(x.first, 2).ite(dd2, dd1);
564 dd4 *= manager->getEncoding(x.first, 2).template toAdd<double>();
569 dd4 *= manager->getEncoding(x.first, 2).template toAdd<double>();
573 dd1 = manager->template getConstant<double>(0.01);
574 dd2 = manager->template getConstant<double>(0.01 + 1e-6);
583 manager->execute([&]() {
584 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
590 dd1 = manager->template getIdentity<double>(x.first);
591 dd2 = manager->template getConstant<double>(5);
597 EXPECT_EQ(1, bdd.template toAdd<double>().getMax());
599 dd3 = dd1.
equals(dd2).template toAdd<double>();
600 dd3 *= manager->template getConstant<double>(3);
603 ASSERT_NO_THROW(bdd = dd3.
toBdd().existsAbstract({x.first}));
604 EXPECT_TRUE(bdd.
isOne());
606 dd3 = dd1.
equals(dd2).template toAdd<double>();
607 dd3 *= manager->template getConstant<double>(3);
611 EXPECT_EQ(3, dd3.
getMax());
613 dd3 = dd1.
equals(dd2).template toAdd<double>();
614 dd3 *= manager->template getConstant<double>(3);
618 EXPECT_EQ(0, dd3.
getMax());
620 dd3 = dd1.
equals(dd2).template toAdd<double>();
621 dd3 *= manager->template getConstant<double>(3);
625 EXPECT_EQ(3, dd3.
getMax());
633 manager->execute([&]() {
634 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
635 std::pair<storm::expressions::Variable, storm::expressions::Variable> z = manager->addMetaVariable(
"z", 2, 8);
639 dd1 = manager->template getIdentity<double>(x.first);
641 ASSERT_NO_THROW(dd1 = dd1.
swapVariables({std::make_pair(x.first, x.second)}));
642 EXPECT_TRUE(dd1 == manager->template getIdentity<double>(x.second));
649 manager->execute([&]() {
650 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
653 manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>();
656 dd1 *= manager->template getConstant<double>(2);
659 ASSERT_NO_THROW(dd3 = dd3.
swapVariables({std::make_pair(x.first, x.second)}));
660 EXPECT_TRUE(dd3 == dd2 * manager->template getConstant<double>(2));
667 manager->execute([&]() {
668 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 0, 2);
669 std::pair<storm::expressions::Variable, storm::expressions::Variable> b = manager->addMetaVariable(
"b", 0, 2);
672 p += (manager->getEncoding(x.first, 2,
true) && manager->getEncoding(b.first, 0,
true)).template toAdd<double>();
673 p += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(b.first, 2,
true)).template toAdd<double>();
676 q += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(x.second, 0,
true)).template toAdd<double>() *
677 manager->template getConstant<double>(0.3);
678 q += (manager->getEncoding(x.first, 1,
true) && manager->getEncoding(x.second, 0,
true)).template toAdd<double>() *
679 manager->template getConstant<double>(0.3);
680 q += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(x.second, 2,
true)).template toAdd<double>() *
681 manager->template getConstant<double>(0.7);
682 q += (manager->getEncoding(x.first, 1,
true) && manager->getEncoding(x.second, 2,
true)).template toAdd<double>() *
683 manager->template getConstant<double>(0.7);
684 q += (manager->getEncoding(x.first, 2,
true) && manager->getEncoding(x.second, 0,
true)).template toAdd<double>() *
685 manager->template getConstant<double>(1);
698 manager->execute([&]() {
699 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
702 ASSERT_NO_THROW(dd1.
setValue(x.first, 4, 2));
705 std::map<storm::expressions::Variable, int_fast64_t> metaVariableToValueMap;
706 metaVariableToValueMap.emplace(x.first, 1);
707 EXPECT_EQ(1, dd1.
getValue(metaVariableToValueMap));
709 metaVariableToValueMap.clear();
710 metaVariableToValueMap.emplace(x.first, 4);
711 EXPECT_EQ(2, dd1.
getValue(metaVariableToValueMap));
718 manager->execute([&]() {
719 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
720 std::pair<storm::expressions::Variable, storm::expressions::Variable> y = manager->addMetaVariable(
"y", 0, 3);
723 ASSERT_NO_THROW(dd = manager->getRange(x.first).template toAdd<double>());
726 ASSERT_NO_THROW(it = dd.
begin());
727 ASSERT_NO_THROW(ite = dd.
end());
728 std::pair<storm::expressions::SimpleValuation, double> valuationValuePair;
729 uint_fast64_t numberOfValuations = 0;
731 ASSERT_NO_THROW(valuationValuePair = *it);
732 ASSERT_NO_THROW(++it);
733 ++numberOfValuations;
735 EXPECT_EQ(9ul, numberOfValuations);
737 dd = manager->getRange(x.first).template toAdd<double>();
738 dd = dd.
notZero().ite(manager->template getAddOne<double>(), manager->template getAddOne<double>());
739 ASSERT_NO_THROW(it = dd.
begin());
740 ASSERT_NO_THROW(ite = dd.
end());
741 numberOfValuations = 0;
743 ASSERT_NO_THROW(valuationValuePair = *it);
744 ASSERT_NO_THROW(++it);
745 ++numberOfValuations;
747 EXPECT_EQ(16ul, numberOfValuations);
749 ASSERT_NO_THROW(it = dd.
begin(
false));
750 ASSERT_NO_THROW(ite = dd.
end());
751 numberOfValuations = 0;
753 ASSERT_NO_THROW(valuationValuePair = *it);
754 ASSERT_NO_THROW(++it);
755 ++numberOfValuations;
757 EXPECT_EQ(1ul, numberOfValuations);
764 manager->execute([&]() {
765 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
766 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
774 std::vector<double> ddAsVector;
775 ASSERT_NO_THROW(ddAsVector = dd.
toVector());
776 EXPECT_EQ(9ul, ddAsVector.size());
777 for (uint_fast64_t i = 0; i < ddAsVector.size(); ++i) {
778 EXPECT_TRUE(i + 1 == ddAsVector[i]);
782 dd = manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>() *
783 manager->getRange(x.first).template toAdd<double>();
784 dd += manager->getEncoding(x.first, 1).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() +
785 manager->getEncoding(x.second, 1).template toAdd<double>() * manager->getRange(x.first).template toAdd<double>();
789 ASSERT_NO_THROW(rowOdd = manager->getRange(x.first).template toAdd<double>().createOdd());
791 ASSERT_NO_THROW(columnOdd = manager->getRange(x.second).template toAdd<double>().createOdd());
795 ASSERT_NO_THROW(matrix = dd.
toMatrix({x.first}, {x.second}, rowOdd, columnOdd));
801 dd = manager->getRange(x.first).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() *
802 manager->getEncoding(a.first, 0).ite(dd, dd + manager->template getConstant<double>(1));
803 ASSERT_NO_THROW(matrix = dd.
toMatrix({a.first}, rowOdd, columnOdd));
814 manager->execute([&]() {
815 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
816 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
825 std::vector<double> ddAsVector;
826 ASSERT_NO_THROW(ddAsVector = dd.
toVector());
827 EXPECT_EQ(9ul, ddAsVector.size());
828 for (uint_fast64_t i = 0; i < ddAsVector.size(); ++i) {
829 EXPECT_EQ(i + 1, ddAsVector[i]);
835 dd = manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>() *
836 manager->getRange(x.first).template toAdd<double>();
837 dd += manager->getEncoding(x.first, 1).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() +
838 manager->getEncoding(x.second, 1).template toAdd<double>() * manager->getRange(x.first).template toAdd<double>();
842 ASSERT_NO_THROW(rowOdd = manager->getRange(x.first).createOdd());
844 ASSERT_NO_THROW(columnOdd = manager->getRange(x.second).createOdd());
848 ASSERT_NO_THROW(matrix = dd.
toMatrix({x.first}, {x.second}, rowOdd, columnOdd));
854 dd = manager->getRange(x.first).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() *
855 manager->getEncoding(a.first, 0).ite(dd, dd + manager->template getConstant<double>(1));
856 ASSERT_NO_THROW(matrix = dd.
toMatrix({a.first}, rowOdd, columnOdd));
867 manager->execute([&]() {
868 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
869 std::pair<storm::expressions::Variable, storm::expressions::Variable> b = manager->addMetaVariable(
"b");
872 bdd &= manager->getEncoding(a.first, 1);
873 bdd |= manager->getEncoding(b.first, 0);
875 std::shared_ptr<storm::expressions::ExpressionManager> manager = std::make_shared<storm::expressions::ExpressionManager>();
TYPED_TEST_SUITE(Dd, TestingTypes,)
TYPED_TEST(Dd, AddConstants)
static void checkLibraryAvailable()
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
static void checkLibraryAvailable()
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)