Storm
A Modern Probabilistic Model Checker
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LiftableTransitionRewardsVisitor.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
3
6
7namespace storm {
8namespace logic {
9
11 : symbolicModelDescription(symbolicModelDescription) {
12 // Intentionally left empty.
13}
14
16 return boost::any_cast<bool>(f.accept(*this, boost::any()));
17}
18
19boost::any LiftableTransitionRewardsVisitor::visit(AtomicExpressionFormula const&, boost::any const&) const {
20 return true;
21}
22
23boost::any LiftableTransitionRewardsVisitor::visit(AtomicLabelFormula const&, boost::any const&) const {
24 return true;
25}
26
27boost::any LiftableTransitionRewardsVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const {
28 return boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data)) && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
29}
30
31boost::any LiftableTransitionRewardsVisitor::visit(BinaryBooleanPathFormula const& f, boost::any const& data) const {
32 return boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data)) && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
33}
34
35boost::any LiftableTransitionRewardsVisitor::visit(BooleanLiteralFormula const&, boost::any const&) const {
36 return true;
37}
38
39boost::any LiftableTransitionRewardsVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
40 for (unsigned i = 0; i < f.getDimension(); ++i) {
41 if (f.getTimeBoundReference(i).isRewardBound() && rewardModelHasTransitionRewards(f.getTimeBoundReference(i).getRewardName())) {
42 return false;
43 }
44 }
45
46 bool result = true;
48 for (unsigned i = 0; i < f.getDimension(); ++i) {
49 result = result && boost::any_cast<bool>(f.getLeftSubformula(i).accept(*this, data));
50 result = result && boost::any_cast<bool>(f.getRightSubformula(i).accept(*this, data));
51 }
52 } else {
53 result = result && boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data));
54 result = result && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
55 }
56 return result;
57}
58
59boost::any LiftableTransitionRewardsVisitor::visit(ConditionalFormula const& f, boost::any const& data) const {
60 return !f.isConditionalRewardFormula() && boost::any_cast<bool>(f.getSubformula().accept(*this, data)) &&
61 boost::any_cast<bool>(f.getConditionFormula().accept(*this, data));
62}
63
64boost::any LiftableTransitionRewardsVisitor::visit(CumulativeRewardFormula const& f, boost::any const&) const {
65 for (unsigned i = 0; i < f.getDimension(); ++i) {
66 if (f.getTimeBoundReference(i).isRewardBound() && rewardModelHasTransitionRewards(f.getTimeBoundReference(i).getRewardName())) {
67 return false;
68 }
69 }
70 return true;
71}
72
73boost::any LiftableTransitionRewardsVisitor::visit(EventuallyFormula const& f, boost::any const& data) const {
74 return f.getSubformula().accept(*this, data);
75}
76
77boost::any LiftableTransitionRewardsVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const {
78 return f.getSubformula().accept(*this, data);
79}
80
81boost::any LiftableTransitionRewardsVisitor::visit(GloballyFormula const& f, boost::any const& data) const {
82 return f.getSubformula().accept(*this, data);
83}
84
85boost::any LiftableTransitionRewardsVisitor::visit(GameFormula const& f, boost::any const& data) const {
86 STORM_LOG_WARN("Transitionbranch-based rewards might be reduced to action-based rewards. Be sure that this is correct for your property.");
87 // TODO: Check if this is correct
88 return f.getSubformula().accept(*this, data);
89}
90
91boost::any LiftableTransitionRewardsVisitor::visit(InstantaneousRewardFormula const&, boost::any const&) const {
92 return true;
93}
94
95boost::any LiftableTransitionRewardsVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const {
96 return f.getSubformula().accept(*this, data);
97}
98
99boost::any LiftableTransitionRewardsVisitor::visit(LongRunAverageRewardFormula const&, boost::any const&) const {
100 return true;
101}
102
103boost::any LiftableTransitionRewardsVisitor::visit(MultiObjectiveFormula const& f, boost::any const& data) const {
104 bool result = true;
105 for (auto const& subF : f.getSubformulas()) {
106 result = result && boost::any_cast<bool>(subF->accept(*this, data));
107 }
108 return result;
109}
110
111boost::any LiftableTransitionRewardsVisitor::visit(QuantileFormula const& f, boost::any const& data) const {
112 return f.getSubformula().accept(*this, data);
113}
114
115boost::any LiftableTransitionRewardsVisitor::visit(NextFormula const& f, boost::any const& data) const {
116 return boost::any_cast<bool>(f.getSubformula().accept(*this, data));
117}
118
119boost::any LiftableTransitionRewardsVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
120 return f.getSubformula().accept(*this, data);
121}
122
123boost::any LiftableTransitionRewardsVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
124 return boost::any_cast<bool>(f.getSubformula().accept(*this, data));
125}
126
127boost::any LiftableTransitionRewardsVisitor::visit(TotalRewardFormula const&, boost::any const&) const {
128 return true;
129}
130
131boost::any LiftableTransitionRewardsVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
132 return f.getSubformula().accept(*this, data);
133}
134
135boost::any LiftableTransitionRewardsVisitor::visit(UnaryBooleanPathFormula const& f, boost::any const& data) const {
136 return f.getSubformula().accept(*this, data);
137}
138
139boost::any LiftableTransitionRewardsVisitor::visit(UntilFormula const& f, boost::any const& data) const {
140 return boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data)) && boost::any_cast<bool>(f.getRightSubformula().accept(*this));
141}
142
143boost::any LiftableTransitionRewardsVisitor::visit(HOAPathFormula const& f, boost::any const& data) const {
144 for (auto const& ap : f.getAPMapping()) {
145 if (!boost::any_cast<bool>(ap.second->accept(*this, data))) {
146 return false;
147 }
148 }
149 return true;
150}
151
152bool LiftableTransitionRewardsVisitor::rewardModelHasTransitionRewards(std::string const& rewardModelName) const {
153 if (symbolicModelDescription.hasModel()) {
154 if (symbolicModelDescription.isJaniModel()) {
155 return storm::jani::RewardModelInformation(symbolicModelDescription.asJaniModel(), rewardModelName).hasTransitionRewards();
156 } else if (symbolicModelDescription.isPrismProgram()) {
157 return symbolicModelDescription.asPrismProgram().getRewardModel(rewardModelName).hasTransitionRewards();
158 }
159 }
160 return false;
161}
162} // namespace logic
163} // namespace storm
bool hasTransitionRewards() const
Returns true iff the given reward model has transition rewards.
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
TimeBoundReference const & getTimeBoundReference(unsigned i=0) const
virtual bool isConditionalRewardFormula() const override
Formula const & getConditionFormula() const
Formula const & getSubformula() const
TimeBoundReference const & getTimeBoundReference() const
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
const ap_to_formula_map & getAPMapping() const
bool areTransitionRewardsLiftable(Formula const &f) const
Returns true, when lifting transition rewards to action rewards (by scaling with the transition proba...
virtual boost::any visit(AtomicExpressionFormula const &f, boost::any const &data) const override
LiftableTransitionRewardsVisitor(storm::storage::SymbolicModelDescription const &symbolicModelDescription=storm::storage::SymbolicModelDescription())
std::vector< std::shared_ptr< Formula const > > const & getSubformulas() const
Formula const & getSubformula() const
std::string const & getRewardName() const
Formula const & getSubformula() const
Formula const & getSubformula() const
RewardModel const & getRewardModel(std::string const &rewardModelName) const
Retrieves the reward model with the given name.
Definition Program.cpp:816
bool hasTransitionRewards() const
Retrieves whether there are any transition rewards.
storm::prism::Program const & asPrismProgram() const
storm::jani::Model const & asJaniModel() const
#define STORM_LOG_WARN(message)
Definition logging.h:30
LabParser.cpp.
Definition cli.cpp:18