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