7 #include "dreal/symbolic/symbolic_expression.h" 25 template <
typename Result,
typename Visitor,
typename... Args>
26 Result VisitPolynomial(Visitor* v,
const Expression& e, Args&&... args) {
27 assert(e.is_polynomial());
28 switch (e.get_kind()) {
29 case ExpressionKind::Constant:
30 return v->VisitConstant(e, std::forward<Args>(args)...);
32 case ExpressionKind::RealConstant:
33 return v->VisitRealConstant(e, std::forward<Args>(args)...);
35 case ExpressionKind::Var:
36 return v->VisitVariable(e, std::forward<Args>(args)...);
38 case ExpressionKind::Add:
39 return v->VisitAddition(e, std::forward<Args>(args)...);
41 case ExpressionKind::Mul:
42 return v->VisitMultiplication(e, std::forward<Args>(args)...);
44 case ExpressionKind::Div:
45 return v->VisitDivision(e, std::forward<Args>(args)...);
47 case ExpressionKind::Pow:
48 return v->VisitPow(e, std::forward<Args>(args)...);
50 case ExpressionKind::NaN:
51 throw std::runtime_error(
"NaN is detected while visiting an expression.");
53 case ExpressionKind::Log:
54 case ExpressionKind::Abs:
55 case ExpressionKind::Exp:
56 case ExpressionKind::Sqrt:
57 case ExpressionKind::Sin:
58 case ExpressionKind::Cos:
59 case ExpressionKind::Tan:
60 case ExpressionKind::Asin:
61 case ExpressionKind::Acos:
62 case ExpressionKind::Atan:
63 case ExpressionKind::Atan2:
64 case ExpressionKind::Sinh:
65 case ExpressionKind::Cosh:
66 case ExpressionKind::Tanh:
67 case ExpressionKind::Min:
68 case ExpressionKind::Max:
69 case ExpressionKind::IfThenElse:
70 case ExpressionKind::UninterpretedFunction:
73 throw std::runtime_error(
"Should not be reachable.");
77 throw std::runtime_error(
"Should not be reachable.");
91 template <
typename Result,
typename Visitor,
typename... Args>
92 Result VisitExpression(Visitor* v,
const Expression& e, Args&&... args) {
93 switch (e.get_kind()) {
94 case ExpressionKind::Constant:
95 return v->VisitConstant(e, std::forward<Args>(args)...);
97 case ExpressionKind::RealConstant:
98 return v->VisitRealConstant(e, std::forward<Args>(args)...);
100 case ExpressionKind::Var:
101 return v->VisitVariable(e, std::forward<Args>(args)...);
103 case ExpressionKind::Add:
104 return v->VisitAddition(e, std::forward<Args>(args)...);
106 case ExpressionKind::Mul:
107 return v->VisitMultiplication(e, std::forward<Args>(args)...);
109 case ExpressionKind::Div:
110 return v->VisitDivision(e, std::forward<Args>(args)...);
112 case ExpressionKind::Log:
113 return v->VisitLog(e, std::forward<Args>(args)...);
115 case ExpressionKind::Abs:
116 return v->VisitAbs(e, std::forward<Args>(args)...);
118 case ExpressionKind::Exp:
119 return v->VisitExp(e, std::forward<Args>(args)...);
121 case ExpressionKind::Sqrt:
122 return v->VisitSqrt(e, std::forward<Args>(args)...);
124 case ExpressionKind::Pow:
125 return v->VisitPow(e, std::forward<Args>(args)...);
127 case ExpressionKind::Sin:
128 return v->VisitSin(e, std::forward<Args>(args)...);
130 case ExpressionKind::Cos:
131 return v->VisitCos(e, std::forward<Args>(args)...);
133 case ExpressionKind::Tan:
134 return v->VisitTan(e, std::forward<Args>(args)...);
136 case ExpressionKind::Asin:
137 return v->VisitAsin(e, std::forward<Args>(args)...);
139 case ExpressionKind::Acos:
140 return v->VisitAcos(e, std::forward<Args>(args)...);
142 case ExpressionKind::Atan:
143 return v->VisitAtan(e, std::forward<Args>(args)...);
145 case ExpressionKind::Atan2:
146 return v->VisitAtan2(e, std::forward<Args>(args)...);
148 case ExpressionKind::Sinh:
149 return v->VisitSinh(e, std::forward<Args>(args)...);
151 case ExpressionKind::Cosh:
152 return v->VisitCosh(e, std::forward<Args>(args)...);
154 case ExpressionKind::Tanh:
155 return v->VisitTanh(e, std::forward<Args>(args)...);
157 case ExpressionKind::Min:
158 return v->VisitMin(e, std::forward<Args>(args)...);
160 case ExpressionKind::Max:
161 return v->VisitMax(e, std::forward<Args>(args)...);
163 case ExpressionKind::IfThenElse:
164 return v->VisitIfThenElse(e, std::forward<Args>(args)...);
166 case ExpressionKind::NaN:
167 throw std::runtime_error(
"NaN is detected while visiting an expression.");
169 case ExpressionKind::UninterpretedFunction:
170 return v->VisitUninterpretedFunction(e, std::forward<Args>(args)...);
174 throw std::runtime_error(
"Should not be reachable.");
Sum type of symbolic::Expression and symbolic::Formula.
Definition: api.cc:9