Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
CloneVisitor.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
3#include <optional>
4
6
7namespace storm {
8namespace logic {
9
10std::shared_ptr<Formula> CloneVisitor::clone(Formula const& f) const {
11 boost::any result = f.accept(*this, boost::any());
12 return boost::any_cast<std::shared_ptr<Formula>>(result);
13}
14
15boost::any CloneVisitor::visit(AtomicExpressionFormula const& f, boost::any const&) const {
16 return std::static_pointer_cast<Formula>(std::make_shared<AtomicExpressionFormula>(f));
17}
18
19boost::any CloneVisitor::visit(AtomicLabelFormula const& f, boost::any const&) const {
20 return std::static_pointer_cast<Formula>(std::make_shared<AtomicLabelFormula>(f));
21}
22
23boost::any CloneVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const {
24 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
25 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
26 return std::static_pointer_cast<Formula>(std::make_shared<BinaryBooleanStateFormula>(f.getOperator(), left, right));
27}
28
29boost::any CloneVisitor::visit(BinaryBooleanPathFormula const& f, boost::any const& data) const {
30 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
31 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
32 return std::static_pointer_cast<Formula>(std::make_shared<BinaryBooleanPathFormula>(f.getOperator(), left, right));
33}
34
35boost::any CloneVisitor::visit(BooleanLiteralFormula const& f, boost::any const&) const {
36 return std::static_pointer_cast<Formula>(std::make_shared<BooleanLiteralFormula>(f));
37}
38
39boost::any CloneVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
40 std::vector<std::optional<TimeBound>> lowerBounds, upperBounds;
41 std::vector<TimeBoundReference> timeBoundReferences;
42 for (uint64_t i = 0; i < f.getDimension(); ++i) {
43 if (f.hasLowerBound(i)) {
44 lowerBounds.emplace_back(TimeBound(f.isLowerBoundStrict(i), f.getLowerBound(i)));
45 } else {
46 lowerBounds.emplace_back();
47 }
48 if (f.hasUpperBound(i)) {
49 upperBounds.emplace_back(TimeBound(f.isUpperBoundStrict(i), f.getUpperBound(i)));
50 } else {
51 upperBounds.emplace_back();
52 }
53 timeBoundReferences.push_back(f.getTimeBoundReference(i));
54 }
56 std::vector<std::shared_ptr<Formula const>> leftSubformulas, rightSubformulas;
57 for (uint64_t i = 0; i < f.getDimension(); ++i) {
58 leftSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula(i).accept(*this, data)));
59 rightSubformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula(i).accept(*this, data)));
60 }
61 return std::static_pointer_cast<Formula>(
62 std::make_shared<BoundedUntilFormula>(leftSubformulas, rightSubformulas, lowerBounds, upperBounds, timeBoundReferences));
63 } else {
64 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
65 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
66 return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, lowerBounds, upperBounds, timeBoundReferences));
67 }
68}
69
70boost::any CloneVisitor::visit(ConditionalFormula const& f, boost::any const& data) const {
71 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
72 std::shared_ptr<Formula> conditionFormula = boost::any_cast<std::shared_ptr<Formula>>(f.getConditionFormula().accept(*this, data));
73 return std::static_pointer_cast<Formula>(std::make_shared<ConditionalFormula>(subformula, conditionFormula, f.getContext()));
74}
75
76boost::any CloneVisitor::visit(CumulativeRewardFormula const& f, boost::any const&) const {
77 return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(f));
78}
79
80boost::any CloneVisitor::visit(EventuallyFormula 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.hasRewardAccumulation()) {
83 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext(), f.getRewardAccumulation()));
84 } else {
85 return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext()));
86 }
87}
88
89boost::any CloneVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const {
90 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
91 return std::static_pointer_cast<Formula>(std::make_shared<TimeOperatorFormula>(subformula, f.getOperatorInformation()));
92}
93
94boost::any CloneVisitor::visit(GloballyFormula const& f, boost::any const& data) const {
95 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
96 return std::static_pointer_cast<Formula>(std::make_shared<GloballyFormula>(subformula));
97}
98
99boost::any CloneVisitor::visit(GameFormula const& f, boost::any const& data) const {
100 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
101 return std::static_pointer_cast<Formula>(std::make_shared<GameFormula>(f.getCoalition(), subformula));
102}
103
104boost::any CloneVisitor::visit(InstantaneousRewardFormula const& f, boost::any const&) const {
105 return std::static_pointer_cast<Formula>(std::make_shared<InstantaneousRewardFormula>(f));
106}
107
108boost::any CloneVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const {
109 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
110 return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageOperatorFormula>(subformula, f.getOperatorInformation()));
111}
112
113boost::any CloneVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const&) const {
114 return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageRewardFormula>(f));
115}
116
117boost::any CloneVisitor::visit(MultiObjectiveFormula const& f, boost::any const& data) const {
118 std::vector<std::shared_ptr<Formula const>> subformulas;
119 for (auto const& subF : f.getSubformulas()) {
120 subformulas.push_back(boost::any_cast<std::shared_ptr<Formula>>(subF->accept(*this, data)));
121 }
122 return std::static_pointer_cast<Formula>(std::make_shared<MultiObjectiveFormula>(subformulas, f.getType()));
123}
124
125boost::any CloneVisitor::visit(QuantileFormula const& f, boost::any const& data) const {
126 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
127 return std::static_pointer_cast<Formula>(std::make_shared<QuantileFormula>(f.getBoundVariables(), subformula));
128}
129
130boost::any CloneVisitor::visit(NextFormula const& f, boost::any const& data) const {
131 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
132 return std::static_pointer_cast<Formula>(std::make_shared<NextFormula>(subformula));
133}
134
135boost::any CloneVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
136 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
137 return std::static_pointer_cast<Formula>(std::make_shared<ProbabilityOperatorFormula>(subformula, f.getOperatorInformation()));
138}
139
140boost::any CloneVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
141 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
142 return std::static_pointer_cast<Formula>(std::make_shared<RewardOperatorFormula>(subformula, f.getOptionalRewardModelName(), f.getOperatorInformation()));
143}
144
145boost::any CloneVisitor::visit(TotalRewardFormula const& f, boost::any const&) const {
146 return std::static_pointer_cast<Formula>(std::make_shared<TotalRewardFormula>(f));
147}
148
149boost::any CloneVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
150 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
151 return std::static_pointer_cast<Formula>(std::make_shared<UnaryBooleanStateFormula>(f.getOperator(), subformula));
152}
153
154boost::any CloneVisitor::visit(UnaryBooleanPathFormula const& f, boost::any const& data) const {
155 std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data));
156 return std::static_pointer_cast<Formula>(std::make_shared<UnaryBooleanPathFormula>(f.getOperator(), subformula));
157}
158
159boost::any CloneVisitor::visit(UntilFormula const& f, boost::any const& data) const {
160 std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data));
161 std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data));
162 return std::static_pointer_cast<Formula>(std::make_shared<UntilFormula>(left, right));
163}
164
165boost::any CloneVisitor::visit(HOAPathFormula const& f, boost::any const& data) const {
166 std::shared_ptr<HOAPathFormula> result = std::make_shared<HOAPathFormula>(f.getAutomatonFile());
167 for (auto& mapped : f.getAPMapping()) {
168 std::shared_ptr<Formula> clonedExpression = boost::any_cast<std::shared_ptr<Formula>>(mapped.second->accept(*this, data));
169 result->addAPMapping(mapped.first, clonedExpression);
170 }
171 return std::static_pointer_cast<Formula>(result);
172}
173
174boost::any CloneVisitor::visit(DiscountedCumulativeRewardFormula const& f, boost::any const&) const {
175 return std::static_pointer_cast<Formula>(std::make_shared<DiscountedCumulativeRewardFormula>(f));
176}
177
178boost::any CloneVisitor::visit(DiscountedTotalRewardFormula const& f, boost::any const&) const {
179 return std::static_pointer_cast<Formula>(std::make_shared<DiscountedTotalRewardFormula>(f));
180}
181} // namespace logic
182} // namespace storm
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() 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
std::shared_ptr< Formula > clone(Formula const &f) const
virtual boost::any visit(AtomicExpressionFormula const &f, boost::any const &data) const override
Formula const & getConditionFormula() const
Formula const & getSubformula() const
FormulaContext const & getContext() const
FormulaContext const & getContext() const
RewardAccumulation const & getRewardAccumulation() const
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
PlayerCoalition const & getCoalition() const
const ap_to_formula_map & getAPMapping() const
const std::string & getAutomatonFile() const
std::vector< std::shared_ptr< Formula const > > const & getSubformulas() const
OperatorInformation const & getOperatorInformation() const
std::vector< storm::expressions::Variable > const & getBoundVariables() const
Formula const & getSubformula() const
boost::optional< std::string > const & getOptionalRewardModelName() const
Retrieves the optional representing the reward model name this property refers to.
Formula const & getSubformula() const
Formula const & getSubformula() const