1#include "storm-config.h"
18#ifndef STORM_HAVE_CUDD
19 GTEST_SKIP() <<
"Library CUDD not available.";
29#ifndef STORM_HAVE_SYLVAN
30 GTEST_SKIP() <<
"Library Sylvan not available.";
37template<
typename TestType>
38class Dd :
public ::testing::Test {
41 TestType::checkLibraryAvailable();
53 manager->execute([&]() {
55 ASSERT_NO_THROW(zero = manager->template getAddZero<double>());
57 EXPECT_EQ(0ul, zero.getNonZeroCount());
58 EXPECT_EQ(1ul, zero.getLeafCount());
59 EXPECT_EQ(1ul, zero.getNodeCount());
60 EXPECT_EQ(0, zero.getMin());
61 EXPECT_EQ(0, zero.getMax());
64 ASSERT_NO_THROW(one = manager->template getAddOne<double>());
66 EXPECT_EQ(0ul, one.getNonZeroCount());
67 EXPECT_EQ(1ul, one.getLeafCount());
68 EXPECT_EQ(1ul, one.getNodeCount());
69 EXPECT_EQ(1, one.getMin());
70 EXPECT_EQ(1, one.getMax());
73 ASSERT_NO_THROW(two = manager->template getConstant<double>(2));
78 EXPECT_EQ(2, two.
getMin());
79 EXPECT_EQ(2, two.
getMax());
86 manager->execute([&]() {
88 ASSERT_NO_THROW(zero = manager->getBddZero());
90 EXPECT_EQ(0ul, zero.getNonZeroCount());
91 EXPECT_EQ(1ul, zero.getLeafCount());
92 EXPECT_EQ(1ul, zero.getNodeCount());
95 ASSERT_NO_THROW(one = manager->getBddOne());
97 EXPECT_EQ(0ul, one.getNonZeroCount());
98 EXPECT_EQ(1ul, one.getLeafCount());
99 EXPECT_EQ(1ul, one.getNodeCount());
107 manager->execute([&]() {
109 ASSERT_NO_THROW(zero = manager->getBddZero());
111 ASSERT_NO_THROW(one = manager->getBddOne());
113 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
114 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
115 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
116 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
117 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
118 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
132 EXPECT_TRUE(representative_false_x == zero);
139 EXPECT_TRUE(representative_true_x == bddX0);
141 storm::dd::Bdd<DdType> representative_true_xyz = one.existsAbstractRepresentative({x.first, y.first, z.first});
145 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
156 EXPECT_TRUE(bddX1Y0Z0 == representative_x);
162 EXPECT_TRUE(bddX1Y0Z0 == representative_y);
168 EXPECT_TRUE(bddX1Y0Z0 == representative_z);
174 EXPECT_TRUE(bddX1Y0Z0 == representative_xyz);
185 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_x);
191 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_y);
197 EXPECT_TRUE(bddAllTrueOrAllFalse == representative_z);
203 EXPECT_TRUE(bddX0Y0Z0 == representative_xyz);
211 manager->execute([&]() {
213 ASSERT_NO_THROW(bddZero = manager->getBddZero());
215 ASSERT_NO_THROW(bddOne = manager->getBddOne());
218 ASSERT_NO_THROW(addZero = manager->template getAddZero<double>());
220 ASSERT_NO_THROW(addOne = manager->template getAddOne<double>());
222 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
223 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
224 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
225 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
226 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
227 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
237 ((bddX1 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.7)) +
238 ((bddX1 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
239 ((bddX1 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
240 ((bddX0 && (bddY1 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.9)) +
241 ((bddX0 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.5)) +
242 ((bddX0 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(1.0)) +
243 ((bddX0 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.0));
250 EXPECT_TRUE(representative_false_x == bddX0);
257 EXPECT_TRUE(representative_true_x == bddX0);
263 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
268 (((bddX0 && (bddY0 && bddZ0))) || ((bddX1 && (bddY0 && bddZ1))) || ((bddX0 && (bddY1 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
270 EXPECT_EQ(1ul, representative_complex_x.
getLeafCount());
271 EXPECT_EQ(3ul, representative_complex_x.
getNodeCount());
272 EXPECT_TRUE(representative_complex_x == comparison_complex_x);
277 (((bddX0 && (bddY0 && bddZ0))) || ((bddX0 && (bddY1 && bddZ1))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY0 && bddZ1))));
279 EXPECT_EQ(1ul, representative_complex_y.
getLeafCount());
280 EXPECT_EQ(5ul, representative_complex_y.
getNodeCount());
281 EXPECT_TRUE(representative_complex_y == comparison_complex_y);
286 (((bddX0 && (bddY0 && bddZ0))) || ((bddX0 && (bddY1 && bddZ0))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
288 EXPECT_EQ(1ul, representative_complex_z.
getLeafCount());
289 EXPECT_EQ(4ul, representative_complex_z.
getNodeCount());
290 EXPECT_TRUE(representative_complex_z == comparison_complex_z);
296 EXPECT_EQ(1ul, representative_complex_xyz.
getLeafCount());
297 EXPECT_EQ(4ul, representative_complex_xyz.
getNodeCount());
298 EXPECT_TRUE(representative_complex_xyz == comparison_complex_xyz);
306 manager->execute([&]() {
308 ASSERT_NO_THROW(bddZero = manager->getBddZero());
310 ASSERT_NO_THROW(bddOne = manager->getBddOne());
313 ASSERT_NO_THROW(addZero = manager->template getAddZero<double>());
315 ASSERT_NO_THROW(addOne = manager->template getAddOne<double>());
317 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
318 std::pair<storm::expressions::Variable, storm::expressions::Variable> y;
319 std::pair<storm::expressions::Variable, storm::expressions::Variable> z;
320 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 0, 1));
321 ASSERT_NO_THROW(y = manager->addMetaVariable(
"y", 0, 1));
322 ASSERT_NO_THROW(z = manager->addMetaVariable(
"z", 0, 1));
332 ((bddX1 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.7)) +
333 ((bddX1 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
334 ((bddX1 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.3)) +
335 ((bddX0 && (bddY1 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(0.9)) +
336 ((bddX0 && (bddY1 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.5)) +
337 ((bddX0 && (bddY0 && bddZ1)).template toAdd<double>() * manager->template getConstant<double>(1.0)) +
338 ((bddX0 && (bddY0 && bddZ0)).template toAdd<double>() * manager->template getConstant<double>(0.0));
345 EXPECT_TRUE(representative_false_x == bddX0);
352 EXPECT_TRUE(representative_true_x == bddX0);
358 EXPECT_TRUE(representative_true_xyz == ((bddX0 && bddY0) && bddZ0));
363 (((bddX1 && (bddY0 && bddZ0))) || ((bddX0 && (bddY0 && bddZ1))) || ((bddX1 && (bddY1 && bddZ0))) || ((bddX0 && (bddY1 && bddZ1))));
365 EXPECT_EQ(1ul, representative_complex_x.
getLeafCount());
366 EXPECT_EQ(3ul, representative_complex_x.
getNodeCount());
367 EXPECT_TRUE(representative_complex_x == comparison_complex_x);
372 (((bddX0 && (bddY1 && bddZ0))) || ((bddX0 && (bddY0 && bddZ1))) || ((bddX1 && (bddY1 && bddZ0))) || ((bddX1 && (bddY1 && bddZ1))));
374 EXPECT_EQ(1ul, representative_complex_y.
getLeafCount());
375 EXPECT_EQ(5ul, representative_complex_y.
getNodeCount());
376 EXPECT_TRUE(representative_complex_y == comparison_complex_y);
381 (((bddX0 && (bddY0 && bddZ1))) || ((bddX0 && (bddY1 && bddZ1))) || ((bddX1 && (bddY0 && bddZ0))) || ((bddX1 && (bddY1 && bddZ0))));
383 EXPECT_EQ(1ul, representative_complex_z.
getLeafCount());
384 EXPECT_EQ(3ul, representative_complex_z.
getNodeCount());
385 EXPECT_TRUE(representative_complex_z == comparison_complex_z);
391 EXPECT_EQ(1ul, representative_complex_xyz.
getLeafCount());
392 EXPECT_EQ(4ul, representative_complex_xyz.
getNodeCount());
393 EXPECT_TRUE(representative_complex_xyz == comparison_complex_xyz);
401 manager->execute([&]() {
402 ASSERT_NO_THROW(manager->addMetaVariable(
"x", 1, 9));
403 EXPECT_EQ(2ul, manager->getNumberOfMetaVariables());
407 ASSERT_NO_THROW(manager->addMetaVariable(
"y", 0, 3));
408 EXPECT_EQ(4ul, manager->getNumberOfMetaVariables());
410 EXPECT_TRUE(manager->hasMetaVariable(
"x'"));
411 EXPECT_TRUE(manager->hasMetaVariable(
"y'"));
413 std::set<std::string> metaVariableSet = {
"x",
"x'",
"y",
"y'"};
414 EXPECT_EQ(metaVariableSet, manager->getAllMetaVariableNames());
422 manager->execute([&]() {
423 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
428 ASSERT_NO_THROW(encoding = manager->getEncoding(x.first, 4));
437 ASSERT_NO_THROW(add = encoding.template toAdd<double>());
448 manager->execute([&]() {
449 std::pair<storm::expressions::Variable, storm::expressions::Variable> x;
450 ASSERT_NO_THROW(x = manager->addMetaVariable(
"x", 1, 9));
453 ASSERT_NO_THROW(range = manager->getRange(x.first));
464 manager->execute([&]() {
465 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
468 ASSERT_NO_THROW(identity = manager->template getIdentity<double>(x.first));
479 manager->execute([&]() {
480 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
483 ASSERT_NO_THROW(identity = manager->template getIdentity<uint_fast64_t>(x.first));
494 manager->execute([&]() {
495 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
496 EXPECT_TRUE(manager->template getAddZero<double>() == manager->template getAddZero<double>());
497 EXPECT_FALSE(manager->template getAddZero<double>() == manager->template getAddOne<double>());
499 EXPECT_FALSE(manager->template getAddZero<double>() != manager->template getAddZero<double>());
500 EXPECT_TRUE(manager->template getAddZero<double>() != manager->template getAddOne<double>());
506 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
508 dd3 += manager->template getAddZero<double>();
509 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
511 dd3 = dd1 * manager->template getConstant<double>(3);
512 EXPECT_TRUE(dd3 == manager->template getConstant<double>(3));
514 dd3 *= manager->template getConstant<double>(2);
515 EXPECT_TRUE(dd3 == manager->template getConstant<double>(6));
518 EXPECT_TRUE(dd3.
isZero());
520 dd3 -= manager->template getConstant<double>(-2);
521 EXPECT_TRUE(dd3 == manager->template getConstant<double>(2));
523 dd3 /= manager->template getConstant<double>(2);
524 EXPECT_TRUE(dd3.
isOne());
527 EXPECT_TRUE(bdd.
isZero());
530 EXPECT_TRUE(bdd.
isOne());
533 EXPECT_TRUE(bdd.
isOne());
535 dd1 = manager->template getIdentity<double>(x.first);
536 dd2 = manager->template getConstant<double>(5);
542 EXPECT_TRUE(bdd2 == !bdd);
556 dd3 = manager->getEncoding(x.first, 2).ite(dd2, dd1);
561 dd4 *= manager->getEncoding(x.first, 2).template toAdd<double>();
566 dd4 *= manager->getEncoding(x.first, 2).template toAdd<double>();
570 dd1 = manager->template getConstant<double>(0.01);
571 dd2 = manager->template getConstant<double>(0.01 + 1e-6);
580 manager->execute([&]() {
581 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
587 dd1 = manager->template getIdentity<double>(x.first);
588 dd2 = manager->template getConstant<double>(5);
594 EXPECT_EQ(1, bdd.template toAdd<double>().getMax());
596 dd3 = dd1.
equals(dd2).template toAdd<double>();
597 dd3 *= manager->template getConstant<double>(3);
600 ASSERT_NO_THROW(bdd = dd3.
toBdd().existsAbstract({x.first}));
601 EXPECT_TRUE(bdd.
isOne());
603 dd3 = dd1.
equals(dd2).template toAdd<double>();
604 dd3 *= manager->template getConstant<double>(3);
608 EXPECT_EQ(3, dd3.
getMax());
610 dd3 = dd1.
equals(dd2).template toAdd<double>();
611 dd3 *= manager->template getConstant<double>(3);
615 EXPECT_EQ(0, dd3.
getMax());
617 dd3 = dd1.
equals(dd2).template toAdd<double>();
618 dd3 *= manager->template getConstant<double>(3);
622 EXPECT_EQ(3, dd3.
getMax());
630 manager->execute([&]() {
631 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
632 std::pair<storm::expressions::Variable, storm::expressions::Variable> z = manager->addMetaVariable(
"z", 2, 8);
636 dd1 = manager->template getIdentity<double>(x.first);
638 ASSERT_NO_THROW(dd1 = dd1.
swapVariables({std::make_pair(x.first, x.second)}));
639 EXPECT_TRUE(dd1 == manager->template getIdentity<double>(x.second));
646 manager->execute([&]() {
647 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
650 manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>();
653 dd1 *= manager->template getConstant<double>(2);
656 ASSERT_NO_THROW(dd3 = dd3.
swapVariables({std::make_pair(x.first, x.second)}));
657 EXPECT_TRUE(dd3 == dd2 * manager->template getConstant<double>(2));
664 manager->execute([&]() {
665 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 0, 2);
666 std::pair<storm::expressions::Variable, storm::expressions::Variable> b = manager->addMetaVariable(
"b", 0, 2);
669 p += (manager->getEncoding(x.first, 2,
true) && manager->getEncoding(b.first, 0,
true)).
template toAdd<double>();
670 p += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(b.first, 2,
true)).
template toAdd<double>();
673 q += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(x.second, 0,
true)).
template toAdd<double>() *
674 manager->template getConstant<double>(0.3);
675 q += (manager->getEncoding(x.first, 1,
true) && manager->getEncoding(x.second, 0,
true)).
template toAdd<double>() *
676 manager->template getConstant<double>(0.3);
677 q += (manager->getEncoding(x.first, 0,
true) && manager->getEncoding(x.second, 2,
true)).
template toAdd<double>() *
678 manager->template getConstant<double>(0.7);
679 q += (manager->getEncoding(x.first, 1,
true) && manager->getEncoding(x.second, 2,
true)).
template toAdd<double>() *
680 manager->template getConstant<double>(0.7);
681 q += (manager->getEncoding(x.first, 2,
true) && manager->getEncoding(x.second, 0,
true)).
template toAdd<double>() *
682 manager->template getConstant<double>(1);
695 manager->execute([&]() {
696 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
699 ASSERT_NO_THROW(dd1.
setValue(x.first, 4, 2));
702 std::map<storm::expressions::Variable, int_fast64_t> metaVariableToValueMap;
703 metaVariableToValueMap.emplace(x.first, 1);
704 EXPECT_EQ(1, dd1.
getValue(metaVariableToValueMap));
706 metaVariableToValueMap.clear();
707 metaVariableToValueMap.emplace(x.first, 4);
708 EXPECT_EQ(2, dd1.
getValue(metaVariableToValueMap));
715 manager->execute([&]() {
716 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
717 std::pair<storm::expressions::Variable, storm::expressions::Variable> y = manager->addMetaVariable(
"y", 0, 3);
720 ASSERT_NO_THROW(dd = manager->getRange(x.first).template toAdd<double>());
723 ASSERT_NO_THROW(it = dd.
begin());
724 ASSERT_NO_THROW(ite = dd.
end());
725 std::pair<storm::expressions::SimpleValuation, double> valuationValuePair;
726 uint_fast64_t numberOfValuations = 0;
728 ASSERT_NO_THROW(valuationValuePair = *it);
729 ASSERT_NO_THROW(++it);
730 ++numberOfValuations;
732 EXPECT_EQ(9ul, numberOfValuations);
734 dd = manager->getRange(x.first).template toAdd<double>();
735 dd = dd.
notZero().ite(manager->template getAddOne<double>(), manager->template getAddOne<double>());
736 ASSERT_NO_THROW(it = dd.
begin());
737 ASSERT_NO_THROW(ite = dd.
end());
738 numberOfValuations = 0;
740 ASSERT_NO_THROW(valuationValuePair = *it);
741 ASSERT_NO_THROW(++it);
742 ++numberOfValuations;
744 EXPECT_EQ(16ul, numberOfValuations);
746 ASSERT_NO_THROW(it = dd.
begin(
false));
747 ASSERT_NO_THROW(ite = dd.
end());
748 numberOfValuations = 0;
750 ASSERT_NO_THROW(valuationValuePair = *it);
751 ASSERT_NO_THROW(++it);
752 ++numberOfValuations;
754 EXPECT_EQ(1ul, numberOfValuations);
761 manager->execute([&]() {
762 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
763 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
771 std::vector<double> ddAsVector;
772 ASSERT_NO_THROW(ddAsVector = dd.
toVector());
773 EXPECT_EQ(9ul, ddAsVector.size());
774 for (uint_fast64_t i = 0; i < ddAsVector.size(); ++i) {
775 EXPECT_TRUE(i + 1 == ddAsVector[i]);
779 dd = manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>() *
780 manager->getRange(x.first).template toAdd<double>();
781 dd += manager->getEncoding(x.first, 1).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() +
782 manager->getEncoding(x.second, 1).template toAdd<double>() * manager->getRange(x.first).template toAdd<double>();
786 ASSERT_NO_THROW(rowOdd = manager->getRange(x.first).template toAdd<double>().createOdd());
788 ASSERT_NO_THROW(columnOdd = manager->getRange(x.second).template toAdd<double>().createOdd());
792 ASSERT_NO_THROW(matrix = dd.
toMatrix({x.first}, {x.second}, rowOdd, columnOdd));
798 dd = manager->getRange(x.first).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() *
799 manager->getEncoding(a.first, 0).ite(dd, dd + manager->template getConstant<double>(1));
800 ASSERT_NO_THROW(matrix = dd.
toMatrix({a.first}, rowOdd, columnOdd));
811 manager->execute([&]() {
812 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
813 std::pair<storm::expressions::Variable, storm::expressions::Variable> x = manager->addMetaVariable(
"x", 1, 9);
822 std::vector<double> ddAsVector;
823 ASSERT_NO_THROW(ddAsVector = dd.
toVector());
824 EXPECT_EQ(9ul, ddAsVector.size());
825 for (uint_fast64_t i = 0; i < ddAsVector.size(); ++i) {
826 EXPECT_EQ(i + 1, ddAsVector[i]);
832 dd = manager->template getIdentity<double>(x.first).equals(manager->template getIdentity<double>(x.second)).template toAdd<double>() *
833 manager->getRange(x.first).template toAdd<double>();
834 dd += manager->getEncoding(x.first, 1).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() +
835 manager->getEncoding(x.second, 1).template toAdd<double>() * manager->getRange(x.first).template toAdd<double>();
839 ASSERT_NO_THROW(rowOdd = manager->getRange(x.first).createOdd());
841 ASSERT_NO_THROW(columnOdd = manager->getRange(x.second).createOdd());
845 ASSERT_NO_THROW(matrix = dd.
toMatrix({x.first}, {x.second}, rowOdd, columnOdd));
851 dd = manager->getRange(x.first).template toAdd<double>() * manager->getRange(x.second).template toAdd<double>() *
852 manager->getEncoding(a.first, 0).ite(dd, dd + manager->template getConstant<double>(1));
853 ASSERT_NO_THROW(matrix = dd.
toMatrix({a.first}, rowOdd, columnOdd));
864 manager->execute([&]() {
865 std::pair<storm::expressions::Variable, storm::expressions::Variable> a = manager->addMetaVariable(
"a");
866 std::pair<storm::expressions::Variable, storm::expressions::Variable> b = manager->addMetaVariable(
"b");
869 bdd &= manager->getEncoding(a.first, 1);
870 bdd |= manager->getEncoding(b.first, 0);
872 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 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)