Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
RewardAccumulationEliminationVisitor.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
4
9
12
13namespace storm {
14namespace logic {
15
17 // Intentionally left empty
18}
19
21 boost::any result = f.accept(*this, boost::any());
22 return boost::any_cast<std::shared_ptr<Formula>>(result);
23}
24
25void RewardAccumulationEliminationVisitor::eliminateRewardAccumulations(std::vector<storm::jani::Property>& properties) const {
26 for (auto& p : properties) {
28 }
29}
30
32 auto formula = eliminateRewardAccumulations(*property.getFilter().getFormula());
33 auto states = eliminateRewardAccumulations(*property.getFilter().getStatesFormula());
34 storm::jani::FilterExpression fe(formula, property.getFilter().getFilterType(), states);
35 property = storm::jani::Property(property.getName(), storm::jani::FilterExpression(formula, property.getFilter().getFilterType(), states),
36 property.getUndefinedConstants(), property.getComment());
37}
38
39boost::any RewardAccumulationEliminationVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
40 std::vector<boost::optional<TimeBound>> lowerBounds, upperBounds;
41 std::vector<TimeBoundReference> timeBoundReferences;
42 for (uint64_t i = 0; i < f.getDimension(); ++i) {
43 if (f.hasLowerBound(i)) {
44 lowerBounds.emplace_back(TimeBound(f.isLowerBoundStrict(i), f.getLowerBound(i)));
45 } else {
46 lowerBounds.emplace_back();
47 }
48 if (f.hasUpperBound(i)) {
49 upperBounds.emplace_back(TimeBound(f.isUpperBoundStrict(i), f.getUpperBound(i)));
50 } else {
51 upperBounds.emplace_back();
52 }
54 if (tbr.hasRewardAccumulation() && canEliminate(tbr.getRewardAccumulation(), tbr.getRewardName())) {
55 // Eliminate accumulation
56 tbr = storm::logic::TimeBoundReference(tbr.getRewardName(), boost::none);
57 }
58 timeBoundReferences.push_back(std::move(tbr));
59 }
61 std::vector<std::shared_ptr<Formula const>> leftSubformulas, rightSubformulas;
62 for (uint64_t i = 0; i < f.getDimension(); ++i) {
63 leftSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula(i).accept(*this, data)));
64 rightSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula(i).accept(*this, data)));
65 }
66 return std::static_pointer_cast<Formula>(
67 std::make_shared<BoundedUntilFormula>(leftSubformulas, rightSubformulas, lowerBounds, upperBounds, timeBoundReferences));
68 } else {
69 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
70 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
71 return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, lowerBounds, upperBounds, timeBoundReferences));
72 }
73}
74
75boost::any RewardAccumulationEliminationVisitor::visit(CumulativeRewardFormula const& f, boost::any const& data) const {
76 boost::optional<storm::logic::RewardAccumulation> rewAcc;
77 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException, "Formula " << f << " does not seem to be a subformula of a reward operator.");
78 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
79 if (f.hasRewardAccumulation() && !canEliminate(f.getRewardAccumulation(), rewName)) {
80 rewAcc = f.getRewardAccumulation();
81 }
82
83 std::vector<TimeBound> bounds;
84 std::vector<TimeBoundReference> timeBoundReferences;
85 for (uint64_t i = 0; i < f.getDimension(); ++i) {
86 bounds.emplace_back(TimeBound(f.isBoundStrict(i), f.getBound(i)));
88 if (tbr.hasRewardAccumulation() && canEliminate(tbr.getRewardAccumulation(), tbr.getRewardName())) {
89 // Eliminate accumulation
90 tbr = storm::logic::TimeBoundReference(tbr.getRewardName(), boost::none);
91 }
92 timeBoundReferences.push_back(std::move(tbr));
93 }
94 return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(bounds, timeBoundReferences, rewAcc));
95}
96
97boost::any RewardAccumulationEliminationVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const& data) const {
98 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException, "Formula " << f << " does not seem to be a subformula of a reward operator.");
99 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
100 if (!f.hasRewardAccumulation() || canEliminate(f.getRewardAccumulation(), rewName)) {
101 return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageRewardFormula>());
102 } else {
103 return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageRewardFormula>(f.getRewardAccumulation()));
104 }
105}
106
107boost::any RewardAccumulationEliminationVisitor::visit(EventuallyFormula const& f, boost::any const& data) const {
108 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
109 if (f.hasRewardAccumulation()) {
110 if (f.isTimePathFormula()) {
113 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext(), f.getRewardAccumulation()));
114 } else if (!model.isDiscreteTimeModel() &&
116 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext(), f.getRewardAccumulation()));
117 }
118 } else if (f.isRewardPathFormula()) {
119 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException,
120 "Formula " << f << " does not seem to be a subformula of a reward operator.");
121 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
122 if (!canEliminate(f.getRewardAccumulation(), rewName)) {
123 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext(), f.getRewardAccumulation()));
124 }
125 }
126 }
127 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext()));
128}
129
130boost::any RewardAccumulationEliminationVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
131 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, f.getOptionalRewardModelName()));
132 return std::static_pointer_cast<Formula>(std::make_shared<RewardOperatorFormula>(subformula, f.getOptionalRewardModelName(), f.getOperatorInformation()));
133}
134
135boost::any RewardAccumulationEliminationVisitor::visit(TotalRewardFormula const& f, boost::any const& data) const {
136 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException, "Formula " << f << " does not seem to be a subformula of a reward operator.");
137 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
138 if (!f.hasRewardAccumulation() || canEliminate(f.getRewardAccumulation(), rewName)) {
139 return std::static_pointer_cast<Formula>(std::make_shared<TotalRewardFormula>());
140 } else {
141 return std::static_pointer_cast<Formula>(std::make_shared<TotalRewardFormula>(f.getRewardAccumulation()));
142 }
143}
144
145bool RewardAccumulationEliminationVisitor::canEliminate(storm::logic::RewardAccumulation const& accumulation,
146 boost::optional<std::string> rewardModelName) const {
147 STORM_LOG_THROW(rewardModelName.is_initialized(), storm::exceptions::InvalidPropertyException,
148 "Unable to find transient variable for unique reward model.");
149 storm::jani::RewardModelInformation info(model, rewardModelName.get());
150
151 if ((info.hasActionRewards() || info.hasTransitionRewards()) && !accumulation.isStepsSet()) {
152 return false;
153 }
154 if (info.hasStateRewards()) {
155 if (model.isDiscreteTimeModel()) {
156 if (!accumulation.isExitSet()) {
157 return false;
158 }
159 // accumulating over time in discrete time models has no effect, i.e., the value of accumulation.isTimeSet() does not matter here.
160 } else {
161 if (accumulation.isExitSet() || !accumulation.isTimeSet()) {
162 return false;
163 }
164 }
165 }
166 return true;
167}
168} // namespace logic
169} // namespace storm
std::shared_ptr< storm::logic::Formula const > const & getFormula() const
Definition Property.h:48
std::shared_ptr< storm::logic::Formula const > const & getStatesFormula() const
Definition Property.h:52
storm::modelchecker::FilterType getFilterType() const
Definition Property.h:56
bool isDiscreteTimeModel() const
Determines whether this model is a discrete-time model.
Definition Model.cpp:1373
std::set< storm::expressions::Variable > const & getUndefinedConstants() const
Definition Property.cpp:96
std::string const & getName() const
Get the provided name.
Definition Property.cpp:23
std::string const & getComment() const
Get the provided comment, if any.
Definition Property.cpp:27
FilterExpression const & getFilter() const
Definition Property.cpp:88
TimeBoundReference const & getTimeBoundReference(unsigned i=0) const
bool isLowerBoundStrict(unsigned i=0) const
storm::expressions::Expression const & getUpperBound(unsigned i=0) const
storm::expressions::Expression const & getLowerBound(unsigned i=0) const
bool isUpperBoundStrict(unsigned i=0) const
TimeBoundReference const & getTimeBoundReference() const
RewardAccumulation const & getRewardAccumulation() const
storm::expressions::Expression const & getBound() const
FormulaContext const & getContext() const
virtual bool isTimePathFormula() const override
virtual bool isRewardPathFormula() const override
RewardAccumulation const & getRewardAccumulation() const
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
RewardAccumulation const & getRewardAccumulation() const
OperatorInformation const & getOperatorInformation() const
std::shared_ptr< Formula > eliminateRewardAccumulations(Formula const &f) const
Eliminates any reward accumulations of the formula, where the presence of the reward accumulation doe...
virtual boost::any visit(BoundedUntilFormula const &f, boost::any const &data) const override
boost::optional< std::string > const & getOptionalRewardModelName() const
Retrieves the optional representing the reward model name this property refers to.
std::string const & getRewardName() const
RewardAccumulation const & getRewardAccumulation() const
RewardAccumulation const & getRewardAccumulation() const
Formula const & getSubformula() const
Formula const & getSubformula() const
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.
Definition cli.cpp:18