LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution类 参考final
类 LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution 继承关系图:
LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution 的协作图:

Public 成员函数

 FreeSubstitution (std::string target, detail::SymbolicNodePtr replacement, std::set< std::string > replacement_free, std::set< std::string > occupied, detail::RewriteBudget *budget)
SymbolicNodePtr rewrite (const SymbolicNodePtr &node)
 SymbolicVisitor ()=default
 SymbolicVisitor (RewriteBudget *budget) noexcept
void visit (const IntegralNode &node) override
void visit (const LimitNode &node) override
void visit (const ProductNode &node) override
void visit (const QuantifierNode &node) override
void visit (const RootOfNode &) override
void visit (const SetBuilderNode &node) override
void visit (const SummationNode &node) override
void visit (const TransformNode &node) override
void visit (const VariableNode &node) override
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 IntervalNode &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 &) override
void visit (const PiecewiseNode &node) override
void visit (const PowerNode &node) override
void visit (const QuantityNode &node) override
void visit (const RelationalNode &node) override
void visit (const UninterpretedFunctionNode &node) override

Protected 成员函数

SymbolicNodePtr current () const noexcept
RewriteBudget * rewrite_budget () const noexcept
SymbolicNodePtr rewrite_child (const SymbolicNodePtr &child, bool &changed)
template<class Range>
std::vector< SymbolicNodePtr > rewrite_children (const Range &children, bool &changed)
void set_result (SymbolicNodePtr result)

Protected 属性

int current_depth = 0

静态 Protected 属性

static constexpr int MAX_DEPTH = 200

Private 成员函数

detail::SymbolicNodePtr rewrite_scoped (const detail::SymbolicNodePtr &original_body, std::string &binder, bool &changed)

Private 属性

SymbolicNodePtr current_
std::set< std::string > occupied_
detail::SymbolicNodePtr replacement_
const std::set< std::string > replacement_free_
SymbolicNodePtr result_
RewriteBudget * rewrite_budget_ = nullptr
std::string target_

详细描述

在文件 expression_analysis.cpp 第 132 行定义.

构造及析构函数说明

◆ FreeSubstitution()

LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::FreeSubstitution ( std::string target,
detail::SymbolicNodePtr replacement,
std::set< std::string > replacement_free,
std::set< std::string > occupied,
detail::RewriteBudget * budget )
inline

成员函数说明

◆ current()

SymbolicNodePtr LMCAS::detail::SymbolicRewriter::current ( ) const
inlineprotectednoexceptinherited

在文件 traversal.hpp 第 183 行定义.

183{ return current_; }

引用了 current_.

被这些函数引用 LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::specialize_absolute(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::anonymous_namespace{residual_verification.cpp}::ResidualBranch::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::RealPrimitiveCandidate::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

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

◆ rewrite()

SymbolicNodePtr LMCAS::detail::SymbolicRewriter::rewrite ( const SymbolicNodePtr & node)
inlineinherited

在文件 traversal.hpp 第 168 行定义.

168 {
169 if (!node) return nullptr;
170 const auto previous_current = current_;
171 const auto previous_result = result_;
172 current_ = node;
173 result_.reset();
174 node->accept(*this);
175 auto rewritten = result_;
176 current_ = previous_current;
177 result_ = previous_result;
178 if (!rewritten) throw std::logic_error("SymbolicRewriter visit did not set a result");
179 return rewritten;
180 }
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept

引用了 current_, LMCAS::detail::node() , 以及 result_.

被这些函数引用 LMCAS::anonymous_namespace{limit_result.cpp}::limit_one_sided_checked(), LMCAS::anonymous_namespace{residual_verification.cpp}::prove_piecewise_residual(), rewrite_child(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit() , 以及 LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit().

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

◆ 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().

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

◆ rewrite_child()

SymbolicNodePtr LMCAS::detail::SymbolicRewriter::rewrite_child ( const SymbolicNodePtr & child,
bool & changed )
inlineprotectedinherited

在文件 traversal.hpp 第 186 行定义.

186 {
187 auto rewritten = rewrite(child);
188 changed = changed || rewritten != child;
189 return rewritten;
190 }
SymbolicNodePtr rewrite(const SymbolicNodePtr &node)

引用了 rewrite().

被这些函数引用 rewrite_children(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::rewrite_scoped(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

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

◆ rewrite_children()

template<class Range>
std::vector< SymbolicNodePtr > LMCAS::detail::SymbolicRewriter::rewrite_children ( const Range & children,
bool & changed )
inlineprotectedinherited

在文件 traversal.hpp 第 193 行定义.

193 {
194 std::vector<SymbolicNodePtr> rewritten;
195 rewritten.reserve(children.size());
196 for (const auto& child : children) {
197 rewritten.push_back(rewrite_child(child, changed));
198 }
199 return rewritten;
200 }
SymbolicNodePtr rewrite_child(const SymbolicNodePtr &child, bool &changed)

引用了 rewrite_child().

被这些函数引用 LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::RealPrimitiveCandidate::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

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

◆ rewrite_scoped()

detail::SymbolicNodePtr LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::rewrite_scoped ( const detail::SymbolicNodePtr & original_body,
std::string & binder,
bool & changed )
inlineprivate

在文件 expression_analysis.cpp 第 218 行定义.

221 {
222 if (binder == target_) return original_body;
223
224 auto body = original_body;
226 replacement_free_.find(binder) != replacement_free_.end()) {
227 const auto renamed = fresh_name(binder, occupied_);
228 body = substitute_free(body, binder,
230 binder = renamed;
231 changed = true;
232 }
233 return rewrite_child(body, changed);
234 }
static std::shared_ptr< const SymbolicNode > create_variable(const std::string &name)
RewriteBudget * rewrite_budget() const noexcept
std::string fresh_name(const std::string &base, std::set< std::string > &occupied)
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
detail::SymbolicNodePtr substitute_free(const detail::SymbolicNodePtr &expression, const std::string &variable, const detail::SymbolicNodePtr &replacement, detail::RewriteBudget *budget)

引用了 LMCAS::SymbolicFactory::create_variable(), LMCAS::expression_depends_on_variable(), LMCAS::anonymous_namespace{expression_analysis.cpp}::fresh_name(), occupied_, replacement_free_, LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::detail::SymbolicRewriter::rewrite_child(), LMCAS::substitute_free() , 以及 target_.

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

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

◆ set_result()

void LMCAS::detail::SymbolicRewriter::set_result ( SymbolicNodePtr result)
inlineprotectedinherited

在文件 traversal.hpp 第 184 行定义.

184{ result_ = std::move(result); }

引用了 result_.

被这些函数引用 LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::rewrite_absolute(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::specialize_absolute(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit(), LMCAS::anonymous_namespace{residual_verification.cpp}::ResidualBranch::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::RealPrimitiveCandidate::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

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

◆ SymbolicVisitor() [1/2]

◆ SymbolicVisitor() [2/2]

LMCAS::detail::SymbolicVisitor::SymbolicVisitor ( RewriteBudget * budget)
inlineexplicitnoexceptinherited

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

◆ visit() [1/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const IntegralNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 166 行定义.

166 {
167 bool changed = false;
168 auto lower = node.lower() ? rewrite_child(node.lower(), changed) : nullptr;
169 auto upper = node.upper() ? rewrite_child(node.upper(), changed) : nullptr;
170 auto binder = node.variable();
171 auto body = rewrite_scoped(node.body(), binder, changed);
172 set_result(changed ? detail::make_node<IntegralNode>(body, binder, lower, upper)
173 : current());
174 }
detail::SymbolicNodePtr rewrite_scoped(const detail::SymbolicNodePtr &original_body, std::string &binder, bool &changed)
void set_result(SymbolicNodePtr result)
SymbolicNodePtr current() const noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const ExprPtr & lower

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped(), LMCAS::detail::SymbolicRewriter::set_result() , 以及 LMCAS::upper.

函数调用图:

◆ visit() [2/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const LimitNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 205 行定义.

205 {
206 bool changed = false;
207 auto point = rewrite_child(node.point(), changed);
208 auto binder = node.variable();
209 auto body = rewrite_scoped(node.body(), binder, changed);
211 body, binder, point, node.direction())
212 : current());
213 }
const std::string const LimitExprPtr & point

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::detail::make_node(), LMCAS::point, LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped() , 以及 LMCAS::detail::SymbolicRewriter::set_result().

函数调用图:

◆ visit() [3/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const ProductNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 156 行定义.

156 {
157 bool changed = false;
158 auto lower = rewrite_child(node.lower_bound(), changed);
159 auto upper = rewrite_child(node.upper_bound(), changed);
160 auto binder = node.index_var();
161 auto body = rewrite_scoped(node.body(), binder, changed);
162 set_result(changed ? detail::make_node<ProductNode>(body, binder, lower, upper)
163 : current());
164 }

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped(), LMCAS::detail::SymbolicRewriter::set_result() , 以及 LMCAS::upper.

函数调用图:

◆ visit() [4/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const QuantifierNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 186 行定义.

186 {
187 bool changed = false;
188 auto domain = rewrite_child(node.domain(), changed);
189 auto binder = node.bound_var();
190 auto predicate = rewrite_scoped(node.predicate(), binder, changed);
191 set_result(changed ? detail::make_node<QuantifierNode>(node.quantifier_type(), binder,
192 domain, predicate)
193 : current());
194 }
const NumberDomainSet & domain

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::domain, LMCAS::detail::make_node(), LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped() , 以及 LMCAS::detail::SymbolicRewriter::set_result().

函数调用图:

◆ visit() [5/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const RootOfNode & )
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 215 行定义.

215{ set_result(current()); }

引用了 LMCAS::detail::SymbolicRewriter::current() , 以及 LMCAS::detail::SymbolicRewriter::set_result().

函数调用图:

◆ visit() [6/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const SetBuilderNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

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

196 {
197 bool changed = false;
198 auto domain = rewrite_child(node.domain(), changed);
199 auto binder = node.element_var();
200 auto predicate = rewrite_scoped(node.predicate(), binder, changed);
201 set_result(changed ? detail::make_node<SetBuilderNode>(binder, domain, predicate)
202 : current());
203 }

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::domain, LMCAS::detail::make_node(), LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped() , 以及 LMCAS::detail::SymbolicRewriter::set_result().

函数调用图:

◆ visit() [7/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const SummationNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 146 行定义.

146 {
147 bool changed = false;
148 auto lower = rewrite_child(node.lower_bound(), changed);
149 auto upper = rewrite_child(node.upper_bound(), changed);
150 auto binder = node.index_var();
151 auto body = rewrite_scoped(node.body(), binder, changed);
153 : current());
154 }

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped(), LMCAS::detail::SymbolicRewriter::set_result() , 以及 LMCAS::upper.

函数调用图:

◆ visit() [8/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const TransformNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 176 行定义.

176 {
177 bool changed = false;
178 auto target = rewrite_child(node.target(), changed);
179 auto binder = node.source_var();
180 auto body = rewrite_scoped(node.body(), binder, changed);
181 set_result(changed ? detail::make_node<TransformNode>(node.transform_type(), body,
182 binder, target)
183 : current());
184 }

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::detail::make_node(), LMCAS::detail::SymbolicRewriter::rewrite_child(), rewrite_scoped(), LMCAS::detail::SymbolicRewriter::set_result() , 以及 LMCAS::target.

函数调用图:

◆ visit() [9/24]

void LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::visit ( const VariableNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expression_analysis.cpp 第 142 行定义.

142 {
143 set_result(!node.is_constant() && node.name() == target_ ? replacement_ : current());
144 }

引用了 LMCAS::detail::SymbolicRewriter::current(), replacement_, LMCAS::detail::SymbolicRewriter::set_result() , 以及 target_.

函数调用图:

◆ visit() [10/24]

void LMCAS::detail::SymbolicRewriter::visit ( const AddNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 205 行定义.

205 {
206 bool changed = false;
207 auto operands = rewrite_children(node.operands(), changed);
208 set_result(changed ? SymbolicFactory::create_add(std::move(operands), rewrite_budget()) : current());
209 }
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
std::vector< SymbolicNodePtr > rewrite_children(const Range &children, bool &changed)

引用了 LMCAS::SymbolicFactory::create_add(), current(), LMCAS::detail::node(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), rewrite_children() , 以及 set_result().

函数调用图:

◆ visit() [11/24]

void LMCAS::detail::SymbolicRewriter::visit ( const ComplexNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 337 行定义.

337 {
338 bool changed = false;
339 auto real = rewrite_child(node.real(), changed);
340 auto imag = rewrite_child(node.imag(), changed);
342 }
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

引用了 LMCAS::SymbolicFactory::create_complex(), current(), LMCAS::imag, LMCAS::detail::node(), LMCAS::real(), rewrite_child() , 以及 set_result().

函数调用图:

◆ visit() [12/24]

void LMCAS::detail::SymbolicRewriter::visit ( const FiniteSetNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 311 行定义.

311 {
312 bool changed = false;
313 auto elements = rewrite_children(node.elements(), changed);
314 set_result(changed ? make_node<FiniteSetNode>(std::move(elements)) : current());
315 }

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_children() , 以及 set_result().

函数调用图:

◆ visit() [13/24]

void LMCAS::detail::SymbolicRewriter::visit ( const FunctionNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 221 行定义.

221 {
222 bool changed = false;
223 auto arguments = rewrite_children(node.arguments(), changed);
224 set_result(changed ? make_node<FunctionNode>(node.type(), std::move(arguments)) : current());
225 }

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_children() , 以及 set_result().

函数调用图:

◆ visit() [14/24]

void LMCAS::detail::SymbolicRewriter::visit ( const IntervalNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 316 行定义.

316 {
317 bool changed = false;
318 auto lower = rewrite_child(node.lower(), changed);
319 auto upper = rewrite_child(node.upper(), changed);
321 node.lower_closed(), node.upper_closed())
322 : current());
323 }

引用了 current(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child(), set_result() , 以及 LMCAS::upper.

函数调用图:

◆ visit() [15/24]

void LMCAS::detail::SymbolicRewriter::visit ( const LogicalNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 254 行定义.

254 {
255 bool changed = false;
256 auto left = rewrite_child(node.left(), changed);
257 auto right = node.right() ? rewrite_child(node.right(), changed) : nullptr;
258 set_result(changed ? make_node<LogicalNode>(left, right, node.op()) : current());
259 }
const ExprPtr & right

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child(), LMCAS::right , 以及 set_result().

函数调用图:

◆ visit() [16/24]

void LMCAS::detail::SymbolicRewriter::visit ( const MatrixNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 232 行定义.

232 {
233 bool changed = false;
234 if (const auto* dense = std::get_if<MatrixNode::DenseStorage>(&node.storage())) {
235 auto entries = rewrite_children(*dense, changed);
236 set_result(changed ? make_node<MatrixNode>(node.rows(), node.cols(), std::move(entries))
237 : current());
238 return;
239 }
240 auto entries = std::get<MatrixNode::SparseStorage>(node.storage());
241 for (auto& [index, value] : entries) {
242 (void)index;
243 value = rewrite_child(value, changed);
244 }
245 set_result(changed ? make_node<MatrixNode>(node.rows(), node.cols(), std::move(entries))
246 : current());
247 }
const std::string const ExprPtr & value

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child(), rewrite_children(), set_result() , 以及 LMCAS::value.

函数调用图:

◆ visit() [17/24]

void LMCAS::detail::SymbolicRewriter::visit ( const MembershipNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 324 行定义.

324 {
325 bool changed = false;
326 auto element = rewrite_child(node.element(), changed);
327 auto set = rewrite_child(node.set(), changed);
329 }
const ExprPtr & element
const ExprPtr & set

引用了 current(), LMCAS::element, LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child(), LMCAS::set , 以及 set_result().

函数调用图:

◆ visit() [18/24]

void LMCAS::detail::SymbolicRewriter::visit ( const MultiplyNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 210 行定义.

210 {
211 bool changed = false;
212 auto operands = rewrite_children(node.operands(), changed);
213 set_result(changed ? SymbolicFactory::create_multiply(std::move(operands), rewrite_budget()) : current());
214 }
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.

引用了 LMCAS::SymbolicFactory::create_multiply(), current(), LMCAS::detail::node(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), rewrite_children() , 以及 set_result().

函数调用图:

◆ visit() [19/24]

void LMCAS::detail::SymbolicRewriter::visit ( const NumberNode & )
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 203 行定义.

203{ set_result(current()); }

引用了 current() , 以及 set_result().

函数调用图:

◆ visit() [20/24]

void LMCAS::detail::SymbolicRewriter::visit ( const PiecewiseNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 260 行定义.

260 {
261 bool changed = false;
262 std::vector<PiecewiseNode::Branch> branches;
263 branches.reserve(node.branches().size());
264 for (const auto& branch : node.branches()) {
265 branches.push_back({rewrite_child(branch.expression, changed),
266 rewrite_child(branch.condition, changed)});
267 }
268 auto fallback = node.default_expr()
269 ? rewrite_child(node.default_expr(), changed) : nullptr;
270 set_result(changed ? make_node<PiecewiseNode>(std::move(branches), fallback) : current());
271 }

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child() , 以及 set_result().

函数调用图:

◆ visit() [21/24]

void LMCAS::detail::SymbolicRewriter::visit ( const PowerNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 215 行定义.

215 {
216 bool changed = false;
217 auto base = rewrite_child(node.base(), changed);
218 auto exponent = rewrite_child(node.exponent(), changed);
220 }
static std::shared_ptr< const SymbolicNode > create_power(std::shared_ptr< const SymbolicNode > base, std::shared_ptr< const SymbolicNode > exponent)
创建幂运算节点,自动处理指数为 0/1 及底数为 0/1 的情况.
const ExprPtr & exponent

引用了 LMCAS::SymbolicFactory::create_power(), current(), LMCAS::exponent, LMCAS::detail::node(), rewrite_child() , 以及 set_result().

函数调用图:

◆ visit() [22/24]

void LMCAS::detail::SymbolicRewriter::visit ( const QuantityNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 330 行定义.

330 {
331 bool changed = false;
332 auto value = rewrite_child(node.value(), changed);
333 set_result(changed ? make_node<QuantityNode>(value, node.dimension(),
334 node.scale_to_base(), node.display_unit())
335 : current());
336 }

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child(), set_result() , 以及 LMCAS::value.

函数调用图:

◆ visit() [23/24]

void LMCAS::detail::SymbolicRewriter::visit ( const RelationalNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 248 行定义.

248 {
249 bool changed = false;
250 auto left = rewrite_child(node.left(), changed);
251 auto right = rewrite_child(node.right(), changed);
252 set_result(changed ? make_node<RelationalNode>(left, right, node.op()) : current());
253 }

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_child(), LMCAS::right , 以及 set_result().

函数调用图:

◆ visit() [24/24]

void LMCAS::detail::SymbolicRewriter::visit ( const UninterpretedFunctionNode & node)
inlineoverridevirtualinherited

实现了 LMCAS::detail::SymbolicVisitor.

在文件 traversal.hpp 第 226 行定义.

226 {
227 bool changed = false;
228 auto arguments = rewrite_children(node.arguments(), changed);
229 set_result(changed ? make_node<UninterpretedFunctionNode>(node.name(), std::move(arguments))
230 : current());
231 }

引用了 current(), LMCAS::detail::make_node(), LMCAS::detail::node(), rewrite_children() , 以及 set_result().

函数调用图:

类成员变量说明

◆ current_

SymbolicNodePtr LMCAS::detail::SymbolicRewriter::current_
privateinherited

在文件 traversal.hpp 第 362 行定义.

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

◆ current_depth

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

◆ MAX_DEPTH

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

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

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

◆ occupied_

std::set<std::string> LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::occupied_
private

在文件 expression_analysis.cpp 第 239 行定义.

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

◆ replacement_

detail::SymbolicNodePtr LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::replacement_
private

在文件 expression_analysis.cpp 第 237 行定义.

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

◆ replacement_free_

const std::set<std::string> LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::replacement_free_
private

在文件 expression_analysis.cpp 第 238 行定义.

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

◆ result_

SymbolicNodePtr LMCAS::detail::SymbolicRewriter::result_
privateinherited

在文件 traversal.hpp 第 363 行定义.

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

◆ rewrite_budget_

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

◆ target_

std::string LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::target_
private

在文件 expression_analysis.cpp 第 236 行定义.

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


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