20 resultPredicates.clear();
21 expression.
accept(*
this, boost::none);
24 std::vector<storm::expressions::Expression> expressionsToKeep;
25 for (
auto const& atom : resultPredicates) {
26 if (!atom.isTrue() && !atom.isFalse()) {
27 expressionsToKeep.push_back(atom);
30 resultPredicates = std::move(expressionsToKeep);
32 return resultPredicates;
36 std::set<storm::expressions::Variable> conditionVariables;
37 expression.
getCondition()->gatherVariables(conditionVariables);
38 bool conditionOnlyIrrelevantVariables =
39 std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), conditionVariables.begin(), conditionVariables.end());
41 std::set<storm::expressions::Variable> tmp;
42 std::set_intersection(conditionVariables.begin(), conditionVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(),
43 std::inserter(tmp, tmp.begin()));
44 bool conditionHasIrrelevantVariables = !tmp.empty();
46 std::set<storm::expressions::Variable> thenVariables;
48 bool thenOnlyIrrelevantVariables = std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), thenVariables.begin(), thenVariables.end());
51 std::set_intersection(thenVariables.begin(), thenVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(), std::inserter(tmp, tmp.begin()));
52 bool thenHasIrrelevantVariables = !tmp.empty();
54 std::set<storm::expressions::Variable> elseVariables;
56 bool elseOnlyIrrelevantVariables = std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), elseVariables.begin(), elseVariables.end());
59 std::set_intersection(elseVariables.begin(), elseVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(), std::inserter(tmp, tmp.begin()));
60 bool elseHasIrrelevantVariables = !tmp.empty();
62 if (conditionHasIrrelevantVariables || thenHasIrrelevantVariables || elseHasIrrelevantVariables) {
63 STORM_LOG_THROW(conditionOnlyIrrelevantVariables && thenOnlyIrrelevantVariables && elseOnlyIrrelevantVariables,
64 storm::exceptions::InvalidArgumentException,
65 "Cannot split expression based on variable set as variables of different type are related.");
73 std::set<storm::expressions::Variable> leftContainedVariables;
75 bool leftOnlyIrrelevantVariables =
76 std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), leftContainedVariables.begin(), leftContainedVariables.end());
78 std::set<storm::expressions::Variable> tmp;
79 std::set_intersection(leftContainedVariables.begin(), leftContainedVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(),
80 std::inserter(tmp, tmp.begin()));
81 bool leftHasIrrelevantVariables = !tmp.empty();
83 std::set<storm::expressions::Variable> rightContainedVariables;
85 bool rightOnlyIrrelevantVariables =
86 std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), rightContainedVariables.begin(), rightContainedVariables.end());
89 std::set_intersection(rightContainedVariables.begin(), rightContainedVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(),
90 std::inserter(tmp, tmp.begin()));
91 bool rightHasIrrelevantVariables = !tmp.empty();
93 if (leftOnlyIrrelevantVariables && rightOnlyIrrelevantVariables) {
97 if (!leftHasIrrelevantVariables && !rightHasIrrelevantVariables) {
101 if (!leftHasIrrelevantVariables) {
102 resultPredicates.push_back(expression.
getFirstOperand()->toExpression());
103 }
else if (!leftOnlyIrrelevantVariables) {
107 if (!rightHasIrrelevantVariables) {
109 }
else if (!rightOnlyIrrelevantVariables) {
120 std::set<storm::expressions::Variable> leftContainedVariables;
122 bool leftOnlyIrrelevantVariables =
123 std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), leftContainedVariables.begin(), leftContainedVariables.end());
125 std::set<storm::expressions::Variable> tmp;
126 std::set_intersection(leftContainedVariables.begin(), leftContainedVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(),
127 std::inserter(tmp, tmp.begin()));
128 bool leftHasIrrelevantVariables = !tmp.empty();
130 std::set<storm::expressions::Variable> rightContainedVariables;
132 bool rightOnlyIrrelevantVariables =
133 std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), rightContainedVariables.begin(), rightContainedVariables.end());
136 std::set_intersection(rightContainedVariables.begin(), rightContainedVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(),
137 std::inserter(tmp, tmp.begin()));
138 bool rightHasIrrelevantVariables = !tmp.empty();
140 if (!leftHasIrrelevantVariables && !rightHasIrrelevantVariables) {
143 STORM_LOG_THROW(leftOnlyIrrelevantVariables && rightOnlyIrrelevantVariables, storm::exceptions::InvalidArgumentException,
144 "Cannot abstract from variable set in expression as it mixes variables of different types.");
157 std::set<storm::expressions::Variable> containedVariables;
159 bool onlyIrrelevantVariables = std::includes(irrelevantVariables.begin(), irrelevantVariables.end(), containedVariables.begin(), containedVariables.end());
161 if (onlyIrrelevantVariables) {
165 std::set<storm::expressions::Variable> tmp;
166 std::set_intersection(containedVariables.begin(), containedVariables.end(), irrelevantVariables.begin(), irrelevantVariables.end(),
167 std::inserter(tmp, tmp.begin()));
168 bool hasIrrelevantVariables = !tmp.empty();
170 if (hasIrrelevantVariables) {