Storm 1.11.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DiscountedCumulativeRewardFormula.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
3#include <ostream>
4#include <utility>
5
8
13
14namespace storm {
15namespace logic {
17 TimeBoundReference const& timeBoundReference,
18 boost::optional<RewardAccumulation> rewardAccumulation)
19 : CumulativeRewardFormula(bound, timeBoundReference, std::move(rewardAccumulation)), discountFactor(discountFactor) {
20 // Intentionally left empty.
21}
22
24 std::vector<TimeBoundReference> const& timeBoundReferences,
25 boost::optional<RewardAccumulation> rewardAccumulation)
26 : CumulativeRewardFormula(bounds, timeBoundReferences, std::move(rewardAccumulation)), discountFactor(discountFactor) {
27 // Intentionally left empty.
28}
29
33
37
38void DiscountedCumulativeRewardFormula::checkNoVariablesInDiscountFactor(storm::expressions::Expression const& factor) {
39 STORM_LOG_THROW(!factor.containsVariables(), storm::exceptions::InvalidOperationException,
40 "Cannot evaluate discount factor '" << factor << "' as it contains undefined constants.");
41}
42
43void DiscountedCumulativeRewardFormula::gatherUsedVariables(std::set<storm::expressions::Variable>& usedVariables) const {
44 for (unsigned i = 0; i < this->getDimension(); ++i) {
45 this->getBound(i).gatherVariables(usedVariables);
46 }
47 this->getDiscountFactor().gatherVariables(usedVariables);
48}
49
53
54template<>
56 checkNoVariablesInDiscountFactor(discountFactor);
57 double value = discountFactor.evaluateAsDouble();
58 STORM_LOG_THROW(value > 0 && value < 1, storm::exceptions::InvalidPropertyException, "Discount factor must be strictly between 0 and 1.");
59 return value;
60}
61
62template<>
64 checkNoVariablesInDiscountFactor(discountFactor);
65 storm::RationalNumber value = discountFactor.evaluateAsRational();
66 STORM_LOG_THROW(value > 0 && value < 1, storm::exceptions::InvalidPropertyException, "Discount factor must be strictly between 0 and 1.");
67 return value;
68}
69
70std::ostream& DiscountedCumulativeRewardFormula::writeToStream(std::ostream& out, bool /*allowParentheses*/) const {
71 // No parentheses necessary
72 out << "C";
74 out << "[" << getRewardAccumulation() << "]";
75 }
76 if (this->isMultiDimensional()) {
77 out << "^{";
78 }
79 for (unsigned i = 0; i < this->getDimension(); ++i) {
80 if (i > 0) {
81 out << ", ";
82 }
83 if (this->getTimeBoundReference(i).isRewardBound()) {
84 out << "rew";
86 out << "[" << this->getTimeBoundReference(i).getRewardAccumulation() << "]";
87 }
88 out << "{\"" << this->getTimeBoundReference(i).getRewardName() << "\"}";
89 } else if (this->getTimeBoundReference(i).isStepBound()) {
90 out << "steps";
91 //} else if (this->getTimeBoundReference(i).isStepBound())
92 // Note: the 'time' keyword is optional.
93 // out << "time";
94 }
95 if (this->isBoundStrict(i)) {
96 out << "<";
97 } else {
98 out << "<=";
99 }
100 out << this->getBound(i);
101 }
102 if (this->isMultiDimensional()) {
103 out << "}";
104 }
105 out << "discount=";
106 out << discountFactor;
107 return out;
108}
109
110boost::any DiscountedCumulativeRewardFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const {
111 return visitor.visit(*this, data);
112}
113
114} // namespace logic
115} // namespace storm
double evaluateAsDouble(Valuation const *valuation=nullptr) const
Evaluates the expression under the valuation of variables given by the valuation and returns the resu...
storm::RationalNumber evaluateAsRational() const
Evaluates the expression and returns the resulting rational number.
bool containsVariables() const
Retrieves whether the expression contains a variable.
void gatherVariables(std::set< storm::expressions::Variable > &variables) const
Retrieves the set of all variables that appear in the expression.
TimeBoundReference const & getTimeBoundReference() const
RewardAccumulation const & getRewardAccumulation() const
storm::expressions::Expression const & getBound() const
virtual boost::any accept(FormulaVisitor const &visitor, boost::any const &data) const override
void gatherUsedVariables(std::set< storm::expressions::Variable > &usedVariables) const override
DiscountedCumulativeRewardFormula(storm::expressions::Expression const &discountFactor, TimeBound const &bound, TimeBoundReference const &timeBoundReference=TimeBoundReference(TimeBoundType::Time), boost::optional< RewardAccumulation > rewardAccumulation=boost::none)
storm::expressions::Expression const & getDiscountFactor() const
std::ostream & writeToStream(std::ostream &out, bool allowParentheses=false) const override
Writes the forumla to the given output stream.
virtual boost::any visit(AtomicExpressionFormula const &f, boost::any const &data) const =0
std::string const & getRewardName() const
RewardAccumulation const & getRewardAccumulation() const
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.