Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
TerminalStatesGetter.cpp
Go to the documentation of this file.
2
6
7namespace storm {
8namespace builder {
10 std::function<void(storm::expressions::Expression const&, bool)> const& terminalExpressionCallback,
11 std::function<void(std::string const&, bool)> const& terminalLabelCallback) {
12 auto isAtomic = [](auto const& f) { return f.isAtomicExpressionFormula() || f.isAtomicLabelFormula() || f.isBooleanLiteralFormula(); };
13 if (formula.isAtomicExpressionFormula()) {
14 terminalExpressionCallback(formula.asAtomicExpressionFormula().getExpression(), true);
15 } else if (formula.isAtomicLabelFormula()) {
16 terminalLabelCallback(formula.asAtomicLabelFormula().getLabel(), true);
17 } else if (formula.isEventuallyFormula()) {
19 if (isAtomic(sub)) {
20 getTerminalStatesFromFormula(sub, terminalExpressionCallback, terminalLabelCallback);
21 }
22 } else if (formula.isUntilFormula()) {
25 if (isAtomic(left) && isAtomic(right)) {
26 getTerminalStatesFromFormula(right, terminalExpressionCallback, terminalLabelCallback);
27 if (left.isAtomicExpressionFormula()) {
28 terminalExpressionCallback(left.asAtomicExpressionFormula().getExpression(), false);
29 } else if (left.isAtomicLabelFormula()) {
30 terminalLabelCallback(left.asAtomicLabelFormula().getLabel(), false);
31 }
32 }
34 storm::logic::BoundedUntilFormula const& boundedUntil = formula.asBoundedUntilFormula();
35 storm::logic::Formula const& right = boundedUntil.getRightSubformula();
36 storm::logic::Formula const& left = boundedUntil.getLeftSubformula();
37 if (isAtomic(left) && isAtomic(right)) {
38 bool hasLowerBound = false;
39 for (uint64_t i = 0; i < boundedUntil.getDimension(); ++i) {
40 if (boundedUntil.hasLowerBound(i) &&
42 hasLowerBound = true;
43 break;
44 }
45 }
46 if (!hasLowerBound) {
47 getTerminalStatesFromFormula(right, terminalExpressionCallback, terminalLabelCallback);
48 }
49 if (left.isAtomicExpressionFormula()) {
50 terminalExpressionCallback(left.asAtomicExpressionFormula().getExpression(), false);
51 } else if (left.isAtomicLabelFormula()) {
52 terminalLabelCallback(left.asAtomicLabelFormula().getLabel(), false);
53 }
54 }
55 } else if (formula.isProbabilityOperatorFormula()) {
57 if (sub.isEventuallyFormula() || sub.isUntilFormula() || sub.isBoundedUntilFormula()) {
58 getTerminalStatesFromFormula(sub, terminalExpressionCallback, terminalLabelCallback);
59 }
60 } else if (formula.isRewardOperatorFormula() || formula.isTimeOperatorFormula()) {
62 if (sub.isEventuallyFormula()) {
63 getTerminalStatesFromFormula(sub, terminalExpressionCallback, terminalLabelCallback);
64 }
65 }
66}
67
74
76 return terminalExpressions.empty() && negatedTerminalExpressions.empty() && terminalLabels.empty() && negatedTerminalLabels.empty();
77}
78
80 std::function<storm::expressions::Expression(std::string const&)> const& labelToExpressionMap) const {
81 auto allTerminalExpressions = terminalExpressions;
82 for (auto const& e : negatedTerminalExpressions) {
83 allTerminalExpressions.push_back(!e);
84 }
85 for (auto const& l : terminalLabels) {
86 allTerminalExpressions.push_back(labelToExpressionMap(l));
87 }
88 for (auto const& l : negatedTerminalLabels) {
89 allTerminalExpressions.push_back(!labelToExpressionMap(l));
90 }
91 STORM_LOG_ASSERT(!allTerminalExpressions.empty(), "Unable to convert empty terminal state set to expression");
92 return storm::expressions::disjunction(allTerminalExpressions);
93}
94
96 TerminalStates result;
98 formula,
99 [&result](storm::expressions::Expression const& expr, bool inverted) {
100 if (inverted) {
101 result.terminalExpressions.push_back(expr);
102 } else {
103 result.negatedTerminalExpressions.push_back(expr);
104 }
105 },
106 [&result](std::string const& label, bool inverted) {
107 if (inverted) {
108 result.terminalLabels.push_back(label);
109 } else {
110 result.negatedTerminalLabels.push_back(label);
111 }
112 });
113 return result;
114}
115
116} // namespace builder
117} // namespace storm
storm::RationalNumber evaluateAsRational() const
Evaluates the expression and returns the resulting rational number.
bool containsVariables() const
Retrieves whether the expression contains a variable.
storm::expressions::Expression const & getExpression() const
std::string const & getLabel() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
storm::expressions::Expression const & getLowerBound(unsigned i=0) const
UntilFormula & asUntilFormula()
Definition Formula.cpp:317
BoundedUntilFormula & asBoundedUntilFormula()
Definition Formula.cpp:325
virtual bool isProbabilityOperatorFormula() const
Definition Formula.cpp:172
ProbabilityOperatorFormula & asProbabilityOperatorFormula()
Definition Formula.cpp:453
OperatorFormula & asOperatorFormula()
Definition Formula.cpp:469
AtomicExpressionFormula & asAtomicExpressionFormula()
Definition Formula.cpp:293
virtual bool isUntilFormula() const
Definition Formula.cpp:80
virtual bool isRewardOperatorFormula() const
Definition Formula.cpp:176
EventuallyFormula & asEventuallyFormula()
Definition Formula.cpp:333
virtual bool isBoundedUntilFormula() const
Definition Formula.cpp:84
virtual bool isEventuallyFormula() const
Definition Formula.cpp:88
virtual bool isTimeOperatorFormula() const
Definition Formula.cpp:140
AtomicLabelFormula & asAtomicLabelFormula()
Definition Formula.cpp:301
virtual bool isAtomicLabelFormula() const
Definition Formula.cpp:76
virtual bool isAtomicExpressionFormula() const
Definition Formula.cpp:72
Formula const & getSubformula() const
Formula const & getSubformula() const
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
void getTerminalStatesFromFormula(storm::logic::Formula const &formula, std::function< void(storm::expressions::Expression const &, bool)> const &terminalExpressionCallback, std::function< void(std::string const &, bool)> const &terminalLabelCallback)
Traverses the formula.
Expression disjunction(std::vector< storm::expressions::Expression > const &expressions)
bool isZero(ValueType const &a)
Definition constants.cpp:41
LabParser.cpp.
Definition cli.cpp:18
std::vector< storm::expressions::Expression > terminalExpressions
std::vector< std::string > terminalLabels
std::vector< storm::expressions::Expression > negatedTerminalExpressions
bool empty() const
True if no terminal states are specified.
std::vector< std::string > negatedTerminalLabels
void clear()
Clears all terminal states.
storm::expressions::Expression asExpression(std::function< storm::expressions::Expression(std::string const &)> const &labelToExpressionMap) const
Returns an expression that evaluates to true only if the exploration can stop at the corresponding st...