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