LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::RewriteVisitor类 参考
类 LMCAS::RewriteVisitor 继承关系图:
LMCAS::RewriteVisitor 的协作图:

Public 成员函数

 RewriteVisitor (const RewriteEngine &e, ComputationContext &ctx)
void finish_rewrite (std::shared_ptr< const SymbolicNode > node, bool child_changed, bool original_changed)
std::shared_ptr< const SymbolicNode > get_result () const
std::shared_ptr< const SymbolicNode > try_match (std::shared_ptr< const SymbolicNode > node)
void visit (const AddNode &node) override
void visit (const ComplexNode &node) override
void visit (const FiniteSetNode &node) override
void visit (const FunctionNode &node) override
void visit (const IntegralNode &node) override
void visit (const IntervalNode &node) override
void visit (const LimitNode &node) override
void visit (const LogicalNode &node) override
void visit (const MatrixNode &node) override
void visit (const MembershipNode &node) override
void visit (const MultiplyNode &node) override
void visit (const NumberNode &node) override
void visit (const PiecewiseNode &node) override
void visit (const PowerNode &node) override
void visit (const ProductNode &node) override
void visit (const QuantifierNode &node) override
void visit (const QuantityNode &node) override
void visit (const RelationalNode &node) override
void visit (const RootOfNode &node) override
void visit (const SetBuilderNode &node) override
void visit (const SummationNode &node) override
void visit (const TransformNode &node) override
void visit (const UninterpretedFunctionNode &node) override
void visit (const VariableNode &node) override
std::shared_ptr< const SymbolicNode > visit_child (const std::shared_ptr< const SymbolicNode > &child, bool &child_changed)

Public 属性

bool changed = false
ComputationContext & context
const RewriteEngine & engine
std::shared_ptr< const SymbolicNode > result

Protected 成员函数

RewriteBudget * rewrite_budget () const noexcept

Protected 属性

int current_depth = 0

静态 Protected 属性

static constexpr int MAX_DEPTH = 200

Private 属性

RewriteBudget * rewrite_budget_ = nullptr

详细描述

在文件 rewrite_engine.cpp 第 10 行定义.

构造及析构函数说明

◆ RewriteVisitor()

LMCAS::RewriteVisitor::RewriteVisitor ( const RewriteEngine & e,
ComputationContext & ctx )
inline

在文件 rewrite_engine.cpp 第 17 行定义.

18 : engine(e), context(ctx) {}
const RewriteEngine & engine
ComputationContext & context
ExprResult e()

引用了 context, LMCAS::e() , 以及 engine.

函数调用图:

成员函数说明

◆ finish_rewrite()

void LMCAS::RewriteVisitor::finish_rewrite ( std::shared_ptr< const SymbolicNode > node,
bool child_changed,
bool original_changed )
inline

在文件 rewrite_engine.cpp 第 61 行定义.

62 {
63 changed = child_changed;
64 auto matched = try_match(node);
65 if (matched != node && !matched->equals(*node)) changed = true;
66 result = matched;
67
68 if (changed) original_changed = true;
69 changed = original_changed;
70 }
std::shared_ptr< const SymbolicNode > result
std::shared_ptr< const SymbolicNode > try_match(std::shared_ptr< const SymbolicNode > node)

引用了 changed, result , 以及 try_match().

被这些函数引用 visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ get_result()

std::shared_ptr< const SymbolicNode > LMCAS::RewriteVisitor::get_result ( ) const
inline

在文件 rewrite_engine.cpp 第 20 行定义.

20{ return result; }

引用了 result.

◆ rewrite_budget()

RewriteBudget * LMCAS::detail::SymbolicVisitor::rewrite_budget ( ) const
inlineprotectednoexceptinherited

在文件 base.hpp 第 220 行定义.

220{ return rewrite_budget_; }

引用了 rewrite_budget_.

被这些函数引用 LMCAS::ExpandVisitor::append_child(), LMCAS::DifferentiationVisitor::append_result(), LMCAS::ExpandVisitor::check_child_count(), LMCAS::NormalizationVisitor::collect_expanded_product(), LMCAS::NormalizationVisitor::collect_product(), LMCAS::NormalizationVisitor::collect_sum(), LMCAS::DifferentiationVisitor::differentiate_atan2(), LMCAS::NormalizationVisitor::distribute_power(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::NormalizationVisitor::expand_complex_product(), LMCAS::NormalizationVisitor::expand_product(), LMCAS::NormalizationVisitor::extract_term_coefficient(), LMCAS::NormalizationVisitor::finish_squared_norm(), LMCAS::NormalizationVisitor::fuse_matrix_product(), LMCAS::NormalizationVisitor::matrix_product_element(), LMCAS::NormalizationVisitor::merge_complex_terms(), LMCAS::NormalizationVisitor::normalize_bound_body(), LMCAS::NormalizationVisitor::normalize_function_parity(), LMCAS::NormalizationVisitor::normalize_logarithm(), LMCAS::NormalizationVisitor::normalize_matrix_product(), LMCAS::NormalizationVisitor::normalize_matrix_sum(), LMCAS::NormalizationVisitor::normalize_natural_logarithm(), LMCAS::NormalizationVisitor::normalize_nested_imaginary_power(), LMCAS::NormalizationVisitor::normalize_nested_power(), LMCAS::NormalizationVisitor::normalize_power_identity(), LMCAS::NormalizationVisitor::normalize_unary_function(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::rewrite_scoped(), LMCAS::NormalizationVisitor::scale_matrix(), LMCAS::DifferentiationVisitor::set_result(), LMCAS::ExpandVisitor::set_result(), LMCAS::ExpandVisitor::set_result(), LMCAS::NormalizationVisitor::set_result(), LMCAS::NormalizationVisitor::simplify_assumed_absolute(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), LMCAS::NormalizationVisitor::try_normalize_squared_norm(), LMCAS::groebner_detail::PolyBuilder::use_numeric_function(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::NormalizationVisitor::visit().

这是这个函数的调用关系图:

◆ try_match()

std::shared_ptr< const SymbolicNode > LMCAS::RewriteVisitor::try_match ( std::shared_ptr< const SymbolicNode > node)
inline

在文件 rewrite_engine.cpp 第 22 行定义.

22 {
23 auto current_expr = LMCAS::detail::expression_from_node(node);
24 const auto& rules = engine.get_rules();
25 const AssumptionContext* ctx = context.assumptions().get();
26 for (const auto& rule : rules) {
28
29 if (Matcher::match(rule.pattern, current_expr, rule.wildcards, bindings)) {
30
31 if (rule.condition && !rule.condition(bindings)) {
32 continue;
33 }
34 if (rule.assumption_condition &&
35 (!ctx || !rule.assumption_condition(bindings, ctx))) {
36 continue;
37 }
38
39 SymbolicExpr new_expr = Matcher::replace(rule.replacement, bindings, true);
40
41 changed = true;
42 return LMCAS::detail::node(new_expr);
43 }
44 }
45 return node;
46 }
const std::shared_ptr< const AssumptionContext > & assumptions() const noexcept
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
const std::vector< Binding > & bindings
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式

引用了 LMCAS::bindings, changed, context, engine, LMCAS::detail::expression_from_node() , 以及 LMCAS::detail::node().

被这些函数引用 finish_rewrite(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ visit() [1/24]

void LMCAS::RewriteVisitor::visit ( const AddNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 81 行定义.

81 {
82
83 std::vector<std::shared_ptr<const SymbolicNode>> new_ops;
84 bool child_changed = false;
85
86 bool original_changed = changed;
87 changed = false;
88
89 for (auto& op : node.operands()) {
90 bool current_changed = changed;
91 changed = false;
92 op->accept(*this);
93 new_ops.push_back(result);
94 if (changed) child_changed = true;
95 else changed = current_changed;
96 }
97
98 std::shared_ptr<const SymbolicNode> node_to_match;
99 if (child_changed) {
100 node_to_match = SymbolicFactory::create_add(new_ops);
101 } else {
102 node_to_match = LMCAS::detail::make_node<AddNode>(node.operands());
103 }
104
105 changed = child_changed;
106 auto matched = try_match(node_to_match);
107 if (matched != node_to_match && !matched->equals(*node_to_match)) changed = true;
108 result = matched;
109
110 if (changed) original_changed = true;
111 changed = original_changed;
112 }
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
std::shared_ptr< const Node > make_node(Args &&... args)
const ExprPtr RelationOp op

引用了 changed, LMCAS::SymbolicFactory::create_add(), LMCAS::detail::make_node(), LMCAS::op, result , 以及 try_match().

函数调用图:

◆ visit() [2/24]

void LMCAS::RewriteVisitor::visit ( const ComplexNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 306 行定义.

306 {
307 bool original_changed = changed;
308 bool child_changed = false;
309 auto real = visit_child(node.real(), child_changed);
310 auto imag = visit_child(node.imag(), child_changed);
312 child_changed, original_changed);
313 }
std::shared_ptr< const SymbolicNode > visit_child(const std::shared_ptr< const SymbolicNode > &child, bool &child_changed)
void finish_rewrite(std::shared_ptr< const SymbolicNode > node, bool child_changed, bool original_changed)
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprPtr imag

引用了 changed, LMCAS::SymbolicFactory::create_complex(), finish_rewrite(), LMCAS::imag, LMCAS::real() , 以及 visit_child().

函数调用图:

◆ visit() [3/24]

void LMCAS::RewriteVisitor::visit ( const FiniteSetNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 314 行定义.

314 {
315 bool original_changed = changed;
316 bool child_changed = false;
317 std::vector<std::shared_ptr<const SymbolicNode>> elements;
318 for (const auto& element : node.elements()) {
319 elements.push_back(visit_child(element, child_changed));
320 }
322 child_changed, original_changed);
323 }
const ExprPtr & element

引用了 changed, LMCAS::element, finish_rewrite(), LMCAS::detail::make_node() , 以及 visit_child().

函数调用图:

◆ visit() [4/24]

void LMCAS::RewriteVisitor::visit ( const FunctionNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 170 行定义.

170 {
171 bool original_changed = changed;
172 changed = false;
173 bool child_changed = false;
174
175 std::vector<std::shared_ptr<const SymbolicNode>> new_args;
176 for (auto& arg : node.arguments()) {
177 bool current_changed = changed;
178 changed = false;
179 arg->accept(*this);
180 new_args.push_back(result);
181 if (changed) child_changed = true;
182 else changed = current_changed;
183 }
184
185 auto node_to_match = LMCAS::detail::make_node<FunctionNode>(node.type(), new_args);
186
187 changed = child_changed;
188 auto matched = try_match(node_to_match);
189 if (matched != node_to_match && !matched->equals(*node_to_match)) changed = true;
190 result = matched;
191
192 if (changed) original_changed = true;
193 changed = original_changed;
194 }

引用了 changed, LMCAS::detail::make_node(), result , 以及 try_match().

函数调用图:

◆ visit() [5/24]

void LMCAS::RewriteVisitor::visit ( const IntegralNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 361 行定义.

361 {
362 bool original_changed = changed;
363 bool child_changed = false;
364 auto body = visit_child(node.body(), child_changed);
365 auto lower = node.lower()
366 ? visit_child(node.lower(), child_changed) : nullptr;
367 auto upper = node.upper()
368 ? visit_child(node.upper(), child_changed) : nullptr;
370 body, node.variable(), lower, upper),
371 child_changed, original_changed);
372 }
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const ExprPtr & lower

引用了 changed, finish_rewrite(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::upper , 以及 visit_child().

函数调用图:

◆ visit() [6/24]

void LMCAS::RewriteVisitor::visit ( const IntervalNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 324 行定义.

324 {
325 bool original_changed = changed;
326 bool child_changed = false;
327 auto lower = visit_child(node.lower(), child_changed);
328 auto upper = visit_child(node.upper(), child_changed);
330 lower, upper, node.lower_closed(), node.upper_closed()),
331 child_changed, original_changed);
332 }

引用了 changed, finish_rewrite(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::upper , 以及 visit_child().

函数调用图:

◆ visit() [7/24]

void LMCAS::RewriteVisitor::visit ( const LimitNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 373 行定义.

373 {
374 bool original_changed = changed;
375 bool child_changed = false;
376 auto body = visit_child(node.body(), child_changed);
377 auto point = visit_child(node.point(), child_changed);
379 body, node.variable(), point, node.direction()),
380 child_changed, original_changed);
381 }
const std::string const LimitExprPtr & point

引用了 changed, finish_rewrite(), LMCAS::detail::make_node(), LMCAS::point , 以及 visit_child().

函数调用图:

◆ visit() [8/24]

void LMCAS::RewriteVisitor::visit ( const LogicalNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 230 行定义.

230 {
231 bool original_changed = changed;
232 bool child_changed = false;
233 auto left = visit_child(node.left(), child_changed);
234 std::shared_ptr<const SymbolicNode> right = nullptr;
235 if (node.right()) right = visit_child(node.right(), child_changed);
237 child_changed, original_changed);
238 }
const ExprPtr & right

引用了 changed, finish_rewrite(), LMCAS::detail::make_node(), LMCAS::right , 以及 visit_child().

函数调用图:

◆ visit() [9/24]

void LMCAS::RewriteVisitor::visit ( const MatrixNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 196 行定义.

196 {
197 bool original_changed = changed;
198 bool child_changed = false;
199 if (const auto* dense =
200 std::get_if<MatrixNode::DenseStorage>(&node.storage())) {
202 entries.reserve(dense->size());
203 for (const auto& entry : *dense) {
204 entries.push_back(visit_child(entry, child_changed));
205 }
207 node.rows(), node.cols(), std::move(entries)),
208 child_changed, original_changed);
209 return;
210 }
212 for (const auto& [index, entry] :
213 std::get<MatrixNode::SparseStorage>(node.storage())) {
214 entries.emplace(index, visit_child(entry, child_changed));
215 }
217 node.rows(), node.cols(), std::move(entries)),
218 child_changed, original_changed);
219 }
std::map< size_t, std::shared_ptr< const SymbolicNode > > SparseStorage
稀疏存储,索引映射到节点。
std::vector< std::shared_ptr< const SymbolicNode > > DenseStorage
稠密存储,按行优先展开。

引用了 changed, finish_rewrite(), LMCAS::detail::make_node() , 以及 visit_child().

函数调用图:

◆ visit() [10/24]

void LMCAS::RewriteVisitor::visit ( const MembershipNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 333 行定义.

333 {
334 bool original_changed = changed;
335 bool child_changed = false;
336 auto element = visit_child(node.element(), child_changed);
337 auto set = visit_child(node.set(), child_changed);
339 child_changed, original_changed);
340 }
const ExprPtr & set

引用了 changed, LMCAS::element, finish_rewrite(), LMCAS::detail::make_node(), LMCAS::set , 以及 visit_child().

函数调用图:

◆ visit() [11/24]

void LMCAS::RewriteVisitor::visit ( const MultiplyNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 114 行定义.

114 {
115 std::vector<std::shared_ptr<const SymbolicNode>> new_ops;
116 bool child_changed = false;
117 bool original_changed = changed;
118 changed = false;
119
120 for (auto& op : node.operands()) {
121 bool current_changed = changed;
122 changed = false;
123 op->accept(*this);
124 new_ops.push_back(result);
125 if (changed) child_changed = true;
126 else changed = current_changed;
127 }
128
129 std::shared_ptr<const SymbolicNode> node_to_match;
130 if (child_changed) {
131 node_to_match = SymbolicFactory::create_multiply(new_ops);
132 } else {
133 node_to_match = LMCAS::detail::make_node<MultiplyNode>(node.operands());
134 }
135
136 changed = child_changed;
137 auto matched = try_match(node_to_match);
138 if (matched != node_to_match && !matched->equals(*node_to_match)) changed = true;
139 result = matched;
140
141 if (changed) original_changed = true;
142 changed = original_changed;
143 }
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.

引用了 changed, LMCAS::SymbolicFactory::create_multiply(), LMCAS::detail::make_node(), LMCAS::op, result , 以及 try_match().

函数调用图:

◆ visit() [12/24]

void LMCAS::RewriteVisitor::visit ( const NumberNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 72 行定义.

72 {
73
74 result = try_match(node.clone());
75 }

引用了 result , 以及 try_match().

函数调用图:

◆ visit() [13/24]

void LMCAS::RewriteVisitor::visit ( const PiecewiseNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 240 行定义.

240 {
241 bool original_changed = changed;
242 bool child_changed = false;
243 std::vector<PiecewiseNode::Branch> branches;
244 branches.reserve(node.branches().size());
245 for (const auto& branch : node.branches()) {
246 auto expression = visit_child(branch.expression, child_changed);
247 auto condition = visit_child(branch.condition, child_changed);
248 branches.push_back({expression, condition});
249 }
250 std::shared_ptr<const SymbolicNode> default_expr = nullptr;
251 if (node.default_expr()) default_expr = visit_child(node.default_expr(), child_changed);
252 finish_rewrite(LMCAS::detail::make_node<PiecewiseNode>(std::move(branches), default_expr),
253 child_changed, original_changed);
254 }

引用了 changed, finish_rewrite(), LMCAS::detail::make_node() , 以及 visit_child().

函数调用图:

◆ visit() [14/24]

void LMCAS::RewriteVisitor::visit ( const PowerNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 145 行定义.

145 {
146 bool original_changed = changed;
147 changed = false;
148
149 node.base()->accept(*this);
150 auto new_base = result;
151 bool base_changed = changed;
152
153 changed = false;
154 node.exponent()->accept(*this);
155 auto new_exp = result;
156 bool exp_changed = changed;
157
158 bool child_changed = base_changed || exp_changed;
159 auto node_to_match = LMCAS::detail::make_node<PowerNode>(new_base, new_exp);
160
161 changed = child_changed;
162 auto matched = try_match(node_to_match);
163 if (matched != node_to_match && !matched->equals(*node_to_match)) changed = true;
164 result = matched;
165
166 if (changed) original_changed = true;
167 changed = original_changed;
168 }

引用了 changed, LMCAS::detail::make_node(), result , 以及 try_match().

函数调用图:

◆ visit() [15/24]

void LMCAS::RewriteVisitor::visit ( const ProductNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 266 行定义.

266 {
267 bool original_changed = changed;
268 bool child_changed = false;
269 auto body = visit_child(node.body(), child_changed);
270 auto lower = visit_child(node.lower_bound(), child_changed);
271 auto upper = visit_child(node.upper_bound(), child_changed);
273 child_changed, original_changed);
274 }

引用了 changed, finish_rewrite(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::upper , 以及 visit_child().

函数调用图:

◆ visit() [16/24]

void LMCAS::RewriteVisitor::visit ( const QuantifierNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 286 行定义.

286 {
287 bool original_changed = changed;
288 bool child_changed = false;
289 auto domain = visit_child(node.domain(), child_changed);
290 auto predicate = visit_child(node.predicate(), child_changed);
292 node.quantifier_type(), node.bound_var(), domain, predicate),
293 child_changed, original_changed);
294 }
const NumberDomainSet & domain

引用了 changed, LMCAS::domain, finish_rewrite(), LMCAS::detail::make_node() , 以及 visit_child().

函数调用图:

◆ visit() [17/24]

void LMCAS::RewriteVisitor::visit ( const QuantityNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 353 行定义.

353 {
354 bool original_changed = changed;
355 bool child_changed = false;
356 auto value = visit_child(node.value(), child_changed);
358 value, node.dimension(), node.scale_to_base(), node.display_unit()),
359 child_changed, original_changed);
360 }
const std::string const ExprPtr & value

引用了 changed, finish_rewrite(), LMCAS::detail::make_node(), LMCAS::value , 以及 visit_child().

函数调用图:

◆ visit() [18/24]

void LMCAS::RewriteVisitor::visit ( const RelationalNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 221 行定义.

221 {
222 bool original_changed = changed;
223 bool child_changed = false;
224 auto left = visit_child(node.left(), child_changed);
225 auto right = visit_child(node.right(), child_changed);
227 child_changed, original_changed);
228 }

引用了 changed, finish_rewrite(), LMCAS::detail::make_node(), LMCAS::right , 以及 visit_child().

函数调用图:

◆ visit() [19/24]

void LMCAS::RewriteVisitor::visit ( const RootOfNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 382 行定义.

382 {
383 const bool original_changed = changed;
384 finish_rewrite(node.clone(), false, original_changed);
385 }

引用了 changed , 以及 finish_rewrite().

函数调用图:

◆ visit() [20/24]

void LMCAS::RewriteVisitor::visit ( const SetBuilderNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 296 行定义.

296 {
297 bool original_changed = changed;
298 bool child_changed = false;
299 auto domain = visit_child(node.domain(), child_changed);
300 auto predicate = visit_child(node.predicate(), child_changed);
302 node.element_var(), domain, predicate),
303 child_changed, original_changed);
304 }

引用了 changed, LMCAS::domain, finish_rewrite(), LMCAS::detail::make_node() , 以及 visit_child().

函数调用图:

◆ visit() [21/24]

void LMCAS::RewriteVisitor::visit ( const SummationNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 256 行定义.

256 {
257 bool original_changed = changed;
258 bool child_changed = false;
259 auto body = visit_child(node.body(), child_changed);
260 auto lower = visit_child(node.lower_bound(), child_changed);
261 auto upper = visit_child(node.upper_bound(), child_changed);
263 child_changed, original_changed);
264 }

引用了 changed, finish_rewrite(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::upper , 以及 visit_child().

函数调用图:

◆ visit() [22/24]

void LMCAS::RewriteVisitor::visit ( const TransformNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 276 行定义.

276 {
277 bool original_changed = changed;
278 bool child_changed = false;
279 auto body = visit_child(node.body(), child_changed);
280 auto target = visit_child(node.target(), child_changed);
282 node.transform_type(), body, node.source_var(), target),
283 child_changed, original_changed);
284 }
const ExprPtr & target

引用了 changed, finish_rewrite(), LMCAS::detail::make_node(), LMCAS::target , 以及 visit_child().

函数调用图:

◆ visit() [23/24]

void LMCAS::RewriteVisitor::visit ( const UninterpretedFunctionNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 341 行定义.

341 {
342 bool original_changed = changed;
343 bool child_changed = false;
344 std::vector<std::shared_ptr<const SymbolicNode>> arguments;
345 arguments.reserve(node.arguments().size());
346 for (const auto& argument : node.arguments()) {
347 arguments.push_back(visit_child(argument, child_changed));
348 }
350 node.name(), std::move(arguments)),
351 child_changed, original_changed);
352 }

引用了 changed, finish_rewrite(), LMCAS::detail::make_node() , 以及 visit_child().

函数调用图:

◆ visit() [24/24]

void LMCAS::RewriteVisitor::visit ( const VariableNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 rewrite_engine.cpp 第 77 行定义.

77 {
78 result = try_match(node.clone());
79 }

引用了 result , 以及 try_match().

函数调用图:

◆ visit_child()

std::shared_ptr< const SymbolicNode > LMCAS::RewriteVisitor::visit_child ( const std::shared_ptr< const SymbolicNode > & child,
bool & child_changed )
inline

在文件 rewrite_engine.cpp 第 48 行定义.

49 {
50 bool saved_changed = changed;
51 changed = false;
52 child->accept(*this);
53 auto rewritten = result;
54 if (changed || !rewritten->equals(*child)) {
55 child_changed = true;
56 }
57 changed = saved_changed;
58 return rewritten;
59 }

引用了 changed , 以及 result.

被这些函数引用 visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

这是这个函数的调用关系图:

类成员变量说明

◆ changed

bool LMCAS::RewriteVisitor::changed = false

◆ context

ComputationContext& LMCAS::RewriteVisitor::context

在文件 rewrite_engine.cpp 第 13 行定义.

被这些函数引用 RewriteVisitor() , 以及 try_match().

◆ current_depth

int LMCAS::detail::SymbolicVisitor::current_depth = 0
protectedinherited

◆ engine

const RewriteEngine& LMCAS::RewriteVisitor::engine

在文件 rewrite_engine.cpp 第 12 行定义.

被这些函数引用 RewriteVisitor() , 以及 try_match().

◆ MAX_DEPTH

int LMCAS::detail::SymbolicVisitor::MAX_DEPTH = 200
staticconstexprprotectedinherited

在文件 base.hpp 第 219 行定义.

被这些函数引用 LMCAS::detail::SymbolicVisitor::DepthGuard::DepthGuard().

◆ result

std::shared_ptr<const SymbolicNode> LMCAS::RewriteVisitor::result

在文件 rewrite_engine.cpp 第 14 行定义.

被这些函数引用 finish_rewrite(), get_result(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit_child().

◆ rewrite_budget_

RewriteBudget* LMCAS::detail::SymbolicVisitor::rewrite_budget_ = nullptr
privateinherited

该类的文档由以下文件生成: