Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExpressionSubstitutionVisitor.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
3#include <optional>
4
6
7namespace storm {
8namespace logic {
9
11 Formula const& f, std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const& substitutionFunction) const {
12 boost::any result = f.accept(*this, &substitutionFunction);
13 return boost::any_cast<std::shared_ptr<Formula>>(result);
14}
15
17 OperatorInformation const& operatorInformation,
18 std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const& substitutionFunction) {
19 boost::optional<Bound> bound;
20 if (operatorInformation.bound) {
21 bound = Bound(operatorInformation.bound->comparisonType, substitutionFunction(operatorInformation.bound->threshold));
22 }
23 return OperatorInformation(operatorInformation.optimalityType, bound);
24}
25
26boost::any ExpressionSubstitutionVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const {
27 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
28 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
29 return std::static_pointer_cast<Formula>(
30 std::make_shared<TimeOperatorFormula>(subformula, substituteOperatorInformation(f.getOperatorInformation(), substitutionFunction)));
31}
32
33boost::any ExpressionSubstitutionVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const {
34 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
35 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
36 return std::static_pointer_cast<Formula>(
37 std::make_shared<LongRunAverageOperatorFormula>(subformula, substituteOperatorInformation(f.getOperatorInformation(), substitutionFunction)));
38}
39
40boost::any ExpressionSubstitutionVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
41 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
42 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
43 return std::static_pointer_cast<Formula>(
44 std::make_shared<ProbabilityOperatorFormula>(subformula, substituteOperatorInformation(f.getOperatorInformation(), substitutionFunction)));
45}
46
47boost::any ExpressionSubstitutionVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
48 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
49 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
50 return std::static_pointer_cast<Formula>(std::make_shared<RewardOperatorFormula>(
51 subformula, f.getOptionalRewardModelName(), substituteOperatorInformation(f.getOperatorInformation(), substitutionFunction)));
52}
53
54boost::any ExpressionSubstitutionVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
55 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
56 std::vector<std::optional<TimeBound>> lowerBounds, upperBounds;
57 std::vector<TimeBoundReference> timeBoundReferences;
58 for (uint64_t i = 0; i < f.getDimension(); ++i) {
59 if (f.hasLowerBound(i)) {
60 lowerBounds.emplace_back(TimeBound(f.isLowerBoundStrict(i), substitutionFunction(f.getLowerBound(i))));
61 } else {
62 lowerBounds.emplace_back();
63 }
64 if (f.hasUpperBound(i)) {
65 upperBounds.emplace_back(TimeBound(f.isUpperBoundStrict(i), substitutionFunction(f.getUpperBound(i))));
66 } else {
67 upperBounds.emplace_back();
68 }
69 timeBoundReferences.push_back(f.getTimeBoundReference(i));
70 }
72 std::vector<std::shared_ptr<Formula const>> leftSubformulas, rightSubformulas;
73 for (uint64_t i = 0; i < f.getDimension(); ++i) {
74 leftSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula(i).accept(*this, data)));
75 rightSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula(i).accept(*this, data)));
76 }
77 return std::static_pointer_cast<Formula>(
78 std::make_shared<BoundedUntilFormula>(leftSubformulas, rightSubformulas, lowerBounds, upperBounds, timeBoundReferences));
79 } else {
80 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
81 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
82 return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, lowerBounds, upperBounds, timeBoundReferences));
83 }
84}
85
86boost::any ExpressionSubstitutionVisitor::visit(CumulativeRewardFormula const& f, boost::any const& data) const {
87 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
88 std::vector<TimeBound> bounds;
89 std::vector<TimeBoundReference> timeBoundReferences;
90 for (uint64_t i = 0; i < f.getDimension(); ++i) {
91 bounds.emplace_back(TimeBound(f.isBoundStrict(i), substitutionFunction(f.getBound(i))));
92 timeBoundReferences.push_back(f.getTimeBoundReference(i));
93 }
94 boost::optional<RewardAccumulation> optionalRewardAccumulation;
95 if (f.hasRewardAccumulation()) {
96 optionalRewardAccumulation = f.getRewardAccumulation();
97 }
98 return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(bounds, timeBoundReferences, optionalRewardAccumulation));
99}
100
101boost::any ExpressionSubstitutionVisitor::visit(DiscountedCumulativeRewardFormula const& f, boost::any const& data) const {
102 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
103 std::vector<TimeBound> bounds;
104 std::vector<TimeBoundReference> timeBoundReferences;
105 for (uint64_t i = 0; i < f.getDimension(); ++i) {
106 bounds.emplace_back(TimeBound(f.isBoundStrict(i), substitutionFunction(f.getBound(i))));
107 timeBoundReferences.push_back(f.getTimeBoundReference(i));
108 }
109 boost::optional<RewardAccumulation> optionalRewardAccumulation;
110 if (f.hasRewardAccumulation()) {
111 optionalRewardAccumulation = f.getRewardAccumulation();
112 }
113 return std::static_pointer_cast<Formula>(std::make_shared<DiscountedCumulativeRewardFormula>(substitutionFunction(f.getDiscountFactor()), bounds,
114 timeBoundReferences, optionalRewardAccumulation));
115}
116
117boost::any ExpressionSubstitutionVisitor::visit(DiscountedTotalRewardFormula const& f, boost::any const& data) const {
118 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
119 boost::optional<RewardAccumulation> optionalRewardAccumulation;
120 if (f.hasRewardAccumulation()) {
121 optionalRewardAccumulation = f.getRewardAccumulation();
122 }
123 return std::static_pointer_cast<Formula>(
124 std::make_shared<DiscountedTotalRewardFormula>(substitutionFunction(f.getDiscountFactor()), optionalRewardAccumulation));
125}
126
127boost::any ExpressionSubstitutionVisitor::visit(InstantaneousRewardFormula const& f, boost::any const& data) const {
128 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
129 return std::static_pointer_cast<Formula>(std::make_shared<InstantaneousRewardFormula>(substitutionFunction(f.getBound()), f.getTimeBoundType()));
130}
131
132boost::any ExpressionSubstitutionVisitor::visit(AtomicExpressionFormula const& f, boost::any const& data) const {
133 auto const& substitutionFunction = *boost::any_cast<std::function<storm::expressions::Expression(storm::expressions::Expression const&)> const*>(data);
134 return std::static_pointer_cast<Formula>(std::make_shared<AtomicExpressionFormula>(substitutionFunction(f.getExpression())));
135}
136
137} // namespace logic
138} // namespace storm
storm::expressions::Expression const & getExpression() const
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
storm::expressions::Expression const & getDiscountFactor() const
virtual boost::any visit(TimeOperatorFormula const &f, boost::any const &data) const override
std::shared_ptr< Formula > substitute(Formula const &f, std::function< storm::expressions::Expression(storm::expressions::Expression const &)> const &substitutionFunction) const
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
storm::expressions::Expression const & getBound() const
OperatorInformation const & getOperatorInformation() const
boost::optional< std::string > const & getOptionalRewardModelName() const
Retrieves the optional representing the reward model name this property refers to.
RewardAccumulation const & getRewardAccumulation() const
Formula const & getSubformula() const
OperatorInformation substituteOperatorInformation(OperatorInformation const &operatorInformation, std::function< storm::expressions::Expression(storm::expressions::Expression const &)> const &substitutionFunction)
boost::optional< Bound > bound
boost::optional< storm::solver::OptimizationDirection > optimalityType