2#include <boost/any.hpp>
22 boost::any result = f.
accept(*
this, boost::any());
23 return boost::any_cast<std::shared_ptr<Formula>>(result);
27 for (
auto& p : properties) {
41 std::vector<std::optional<TimeBound>> lowerBounds, upperBounds;
42 std::vector<TimeBoundReference> timeBoundReferences;
47 lowerBounds.emplace_back();
52 upperBounds.emplace_back();
59 timeBoundReferences.push_back(std::move(tbr));
62 std::vector<std::shared_ptr<Formula const>> leftSubformulas, rightSubformulas;
64 leftSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.
getLeftSubformula(i).
accept(*
this, data)));
67 return std::static_pointer_cast<Formula>(
68 std::make_shared<BoundedUntilFormula>(leftSubformulas, rightSubformulas, lowerBounds, upperBounds, timeBoundReferences));
70 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.
getLeftSubformula().accept(*
this, data));
71 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.
getRightSubformula().accept(*
this, data));
72 return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, lowerBounds, upperBounds, timeBoundReferences));
77 boost::optional<storm::logic::RewardAccumulation> rewAcc;
78 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException,
"Formula " << f <<
" does not seem to be a subformula of a reward operator.");
79 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
84 std::vector<TimeBound> bounds;
85 std::vector<TimeBoundReference> timeBoundReferences;
93 timeBoundReferences.push_back(std::move(tbr));
95 return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(bounds, timeBoundReferences, rewAcc));
99 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException,
"Formula " << f <<
" does not seem to be a subformula of a reward operator.");
100 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
102 return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageRewardFormula>());
104 return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageRewardFormula>(f.
getRewardAccumulation()));
109 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.
getSubformula().accept(*
this, data));
115 }
else if (!model.isDiscreteTimeModel() &&
121 "Formula " << f <<
" does not seem to be a subformula of a reward operator.");
122 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
128 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.
getContext()));
137 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException,
"Formula " << f <<
" does not seem to be a subformula of a reward operator.");
138 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
140 return std::static_pointer_cast<Formula>(std::make_shared<TotalRewardFormula>());
142 return std::static_pointer_cast<Formula>(std::make_shared<TotalRewardFormula>(f.
getRewardAccumulation()));
147 boost::optional<std::string> rewardModelName)
const {
148 STORM_LOG_THROW(rewardModelName.is_initialized(), storm::exceptions::InvalidPropertyException,
149 "Unable to find transient variable for unique reward model.");
152 if ((info.hasActionRewards() || info.hasTransitionRewards()) && !accumulation.
isStepsSet()) {
155 if (info.hasStateRewards()) {
171 boost::optional<storm::logic::RewardAccumulation> rewAcc;
172 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException,
"Formula " << f <<
" does not seem to be a subformula of a reward operator.");
173 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
178 std::vector<TimeBound> bounds;
179 std::vector<TimeBoundReference> timeBoundReferences;
187 timeBoundReferences.push_back(std::move(tbr));
190 return std::static_pointer_cast<Formula>(std::make_shared<DiscountedCumulativeRewardFormula>(f.
getDiscountFactor(), bounds, timeBoundReferences, rewAcc));
194 STORM_LOG_THROW(!data.empty(), storm::exceptions::UnexpectedException,
"Formula " << f <<
" does not seem to be a subformula of a reward operator.");
195 auto rewName = boost::any_cast<boost::optional<std::string>>(data);
197 return std::static_pointer_cast<Formula>(std::make_shared<DiscountedTotalRewardFormula>(f.
getDiscountFactor()));
std::shared_ptr< storm::logic::Formula const > const & getFormula() const
std::shared_ptr< storm::logic::Formula const > const & getStatesFormula() const
storm::modelchecker::FilterType getFilterType() const
bool isDiscreteTimeModel() const
Determines whether this model is a discrete-time model.
std::set< storm::expressions::Variable > const & getUndefinedConstants() const
std::string const & getName() const
Get the provided name.
std::string const & getComment() const
Get the provided comment, if any.
FilterExpression const & getFilter() const
RewardAccumulationEliminationVisitor(storm::jani::Model const &model)
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
std::string const & getRewardName() const
RewardAccumulation const & getRewardAccumulation() const
bool hasRewardAccumulation() const
#define STORM_LOG_THROW(cond, exception, message)