Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
RewardModelNameSubstitutionVisitor.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
3#include <optional>
5
8
11
12namespace storm {
13namespace logic {
14
15RewardModelNameSubstitutionVisitor::RewardModelNameSubstitutionVisitor(std::map<std::string, std::string> const& rewardModelNameMapping)
16 : rewardModelNameMapping(rewardModelNameMapping) {
17 // Intentionally left empty
18}
19
20std::shared_ptr<Formula> RewardModelNameSubstitutionVisitor::substitute(Formula const& f) const {
21 boost::any result = f.accept(*this, boost::any());
22 return boost::any_cast<std::shared_ptr<Formula>>(result);
23}
24
25boost::any RewardModelNameSubstitutionVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
26 std::vector<std::optional<TimeBound>> lowerBounds, upperBounds;
27 std::vector<TimeBoundReference> timeBoundReferences;
28 for (uint64_t i = 0; i < f.getDimension(); ++i) {
29 if (f.hasLowerBound(i)) {
30 lowerBounds.emplace_back(TimeBound(f.isLowerBoundStrict(i), f.getLowerBound(i)));
31 } else {
32 lowerBounds.emplace_back();
33 }
34 if (f.hasUpperBound(i)) {
35 upperBounds.emplace_back(TimeBound(f.isUpperBoundStrict(i), f.getUpperBound(i)));
36 } else {
37 upperBounds.emplace_back();
38 }
39 auto const& tbr = f.getTimeBoundReference(i);
40 if (tbr.isRewardBound()) {
41 timeBoundReferences.emplace_back(getNewName(tbr.getRewardName()), tbr.getOptionalRewardAccumulation());
42 } else {
43 timeBoundReferences.push_back(tbr);
44 }
45 }
47 std::vector<std::shared_ptr<Formula const>> leftSubformulas, rightSubformulas;
48 for (uint64_t i = 0; i < f.getDimension(); ++i) {
49 leftSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula(i).accept(*this, data)));
50 rightSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula(i).accept(*this, data)));
51 }
52 return std::static_pointer_cast<Formula>(
53 std::make_shared<BoundedUntilFormula>(leftSubformulas, rightSubformulas, lowerBounds, upperBounds, timeBoundReferences));
54 } else {
55 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
56 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
57 return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, lowerBounds, upperBounds, timeBoundReferences));
58 }
59}
60
61boost::any RewardModelNameSubstitutionVisitor::visit(CumulativeRewardFormula const& f, boost::any const&) const {
62 // Data is unused; no children to pass this on.
63 std::vector<TimeBound> bounds;
64 std::vector<TimeBoundReference> timeBoundReferences;
65 for (uint64_t i = 0; i < f.getDimension(); ++i) {
66 bounds.emplace_back(TimeBound(f.isBoundStrict(i), f.getBound(i)));
68 if (tbr.isRewardBound()) {
70 }
71 timeBoundReferences.push_back(std::move(tbr));
72 }
73 if (f.hasRewardAccumulation()) {
74 return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(bounds, timeBoundReferences, f.getRewardAccumulation()));
75 } else {
76 return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(bounds, timeBoundReferences));
77 }
78}
79
80boost::any RewardModelNameSubstitutionVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
81 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
82 if (f.hasRewardModelName()) {
83 return std::static_pointer_cast<Formula>(
84 std::make_shared<RewardOperatorFormula>(subformula, getNewName(f.getRewardModelName()), f.getOperatorInformation()));
85 } else {
86 return std::static_pointer_cast<Formula>(std::make_shared<RewardOperatorFormula>(subformula, boost::none, f.getOperatorInformation()));
87 }
88}
89
90std::string const& RewardModelNameSubstitutionVisitor::getNewName(std::string const& oldName) const {
91 auto nameIt = rewardModelNameMapping.find(oldName);
92 if (nameIt == rewardModelNameMapping.end()) {
93 return oldName;
94 } else {
95 return nameIt->second;
96 }
97}
98
100 // Data is unused; no children to pass this on.
101 std::vector<TimeBound> bounds;
102 std::vector<TimeBoundReference> timeBoundReferences;
103 for (uint64_t i = 0; i < f.getDimension(); ++i) {
104 bounds.emplace_back(TimeBound(f.isBoundStrict(i), f.getBound(i)));
106 if (tbr.isRewardBound()) {
108 }
109 timeBoundReferences.push_back(std::move(tbr));
110 }
111 if (f.hasRewardAccumulation()) {
112 return std::static_pointer_cast<Formula>(
113 std::make_shared<DiscountedCumulativeRewardFormula>(f.getDiscountFactor(), bounds, timeBoundReferences, f.getRewardAccumulation()));
114 } else {
115 return std::static_pointer_cast<Formula>(std::make_shared<DiscountedCumulativeRewardFormula>(f.getDiscountFactor(), bounds, timeBoundReferences));
116 }
117}
118
119} // namespace logic
120} // namespace storm
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
storm::expressions::Expression const & getDiscountFactor() const
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
OperatorInformation const & getOperatorInformation() const
std::shared_ptr< Formula > substitute(Formula const &f) const
RewardModelNameSubstitutionVisitor(std::map< std::string, std::string > const &rewardModelNameMapping)
virtual boost::any visit(BoundedUntilFormula const &f, boost::any const &data) const override
std::string const & getRewardModelName() const
Retrieves the name of the reward model this property refers to (if any).
bool hasRewardModelName() const
Retrieves whether the reward model refers to a specific reward model.
std::string const & getRewardName() const
boost::optional< RewardAccumulation > const & getOptionalRewardAccumulation() const
Formula const & getSubformula() const