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

Public 成员函数

 SideBranchRewriter (LimitVisitor &visitor, const FactsQuery &facts, ComputationContext &context)
SymbolicNodePtr rewrite (const SymbolicNodePtr &node)
 SymbolicVisitor ()=default
 SymbolicVisitor (RewriteBudget *budget) noexcept
void visit (const FunctionNode &node) override
void visit (const PiecewiseNode &node) override
void visit (const PowerNode &node) override
void visit (const AddNode &node) override
void visit (const ComplexNode &node) override
void visit (const FiniteSetNode &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 &) 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 &) 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 &) 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 成员函数

bool rewrite_absolute (const NodePtr &argument)
bool rewrite_square_absolute (const NodePtr &argument)

Private 属性

ComputationContext & context_
SymbolicNodePtr current_
const FactsQuery & facts_
SymbolicNodePtr result_
RewriteBudget * rewrite_budget_ = nullptr
LimitVisitor & visitor_

详细描述

在文件 limit_result.cpp 第 273 行定义.

构造及析构函数说明

◆ SideBranchRewriter()

LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::SideBranchRewriter ( LimitVisitor & visitor,
const FactsQuery & facts,
ComputationContext & context )
inline

在文件 limit_result.cpp 第 275 行定义.

引用了 LMCAS::context, context_, facts_ , 以及 visitor_.

成员函数说明

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

bool LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::rewrite_absolute ( const NodePtr & argument)
inlineprivate

在文件 limit_result.cpp 第 310 行定义.

310 {
311 auto real = detail::query_real_value(argument, facts_, context_);
312 if (!real) throw real.error();
313 auto sign = real.value() == Tribool::True ? visitor_.sign_near_point(argument) : std::nullopt;
314 if (!sign) return false;
315 set_result(*sign < 0 ? detail::node(SymbolicExpr::multiply(
316 SymbolicExpr::number(-1), detail::make_expression_ptr(argument))) : argument);
317 return true;
318 }
CasError & error()
void set_result(SymbolicNodePtr result)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
@ True
Property definitely holds

引用了 context_, LMCAS::Result< T >::error(), facts_, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::query_real_value(), LMCAS::real(), LMCAS::detail::SymbolicRewriter::set_result(), LMCAS::True, LMCAS::Result< T >::value() , 以及 visitor_.

被这些函数引用 rewrite_square_absolute(), visit() , 以及 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_square_absolute()

bool LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::rewrite_square_absolute ( const NodePtr & argument)
inlineprivate

在文件 limit_result.cpp 第 304 行定义.

304 {
305 auto square = std::dynamic_pointer_cast<const PowerNode>(argument);
306 if (!square) { return false; }
308 return exponent && exponent.value() == Rational(2) && rewrite_absolute(square->base());
309 }
@ Rational
Rational numbers
const ExprPtr & exponent
Result< Rational > extract_coeff_value< Rational >(const std::shared_ptr< SymbolicExpr > &coefficient)

引用了 LMCAS::exponent, LMCAS::extract_coeff_value(), LMCAS::detail::make_expression_ptr() , 以及 rewrite_absolute().

被这些函数引用 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{limit_result.cpp}::SideBranchRewriter::visit ( const FunctionNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 limit_result.cpp 第 294 行定义.

294 {
295 bool changed = false;
296 auto args = rewrite_children(node.arguments(), changed);
297 if (args.size() == 1) {
298 if (node.type() == FunctionNode::FuncType::Abs && rewrite_absolute(args[0])) { return; }
299 if (node.type() == FunctionNode::FuncType::Sqrt && rewrite_square_absolute(args[0])) { return; }
300 }
301 set_result(changed ? detail::make_node<FunctionNode>(node.type(), std::move(args)) : current());
302 }
@ Sqrt
对数、绝对值、平方根。
std::vector< SymbolicNodePtr > rewrite_children(const Range &children, bool &changed)
SymbolicNodePtr current() const noexcept
std::shared_ptr< const Node > make_node(Args &&... args)

引用了 LMCAS::FunctionNode::Abs, LMCAS::detail::SymbolicRewriter::current(), LMCAS::detail::make_node(), rewrite_absolute(), LMCAS::detail::SymbolicRewriter::rewrite_children(), rewrite_square_absolute(), LMCAS::detail::SymbolicRewriter::set_result() , 以及 LMCAS::FunctionNode::Sqrt.

函数调用图:

◆ visit() [2/24]

void LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit ( const PiecewiseNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 limit_result.cpp 第 277 行定义.

277 {
278 auto selected = visitor_.select_piecewise_near_point(node);
279 set_result(selected ? rewrite(selected) : current());
280 }

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

函数调用图:

◆ visit() [3/24]

void LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visit ( const PowerNode & node)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 limit_result.cpp 第 281 行定义.

281 {
282 bool changed = false;
283 auto base = rewrite_child(node.base(), changed);
284 auto exponent = rewrite_child(node.exponent(), changed);
285 const auto square = std::dynamic_pointer_cast<const PowerNode>(base);
286 if (square) {
288 auto inner = extract_coeff_value<Rational>(detail::make_expression_ptr(square->exponent()));
289 if (outer && inner && outer.value() == Rational(1, 2) &&
290 inner.value() == Rational(2) && rewrite_absolute(square->base())) return;
291 }
293 }

引用了 LMCAS::detail::SymbolicRewriter::current(), LMCAS::exponent, LMCAS::extract_coeff_value(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), rewrite_absolute(), LMCAS::detail::SymbolicRewriter::rewrite_child() , 以及 LMCAS::detail::SymbolicRewriter::set_result().

函数调用图:

◆ visit() [4/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)
创建加法节点,自动扁平化嵌套加法并消除零项.
RewriteBudget * rewrite_budget() const noexcept

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

函数调用图:

◆ visit() [5/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,则返回实部).
ExprPtr imag

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

函数调用图:

◆ visit() [6/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() [7/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

343 {
344 bool changed = false;
345 auto body = rewrite_child(node.body(), changed);
346 auto lower = node.lower() ? rewrite_child(node.lower(), changed) : nullptr;
347 auto upper = node.upper() ? rewrite_child(node.upper(), changed) : nullptr;
348 set_result(changed ? make_node<IntegralNode>(body, node.variable(), lower, upper)
349 : current());
350 }
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const ExprPtr & lower

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

函数调用图:

◆ visit() [8/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() [9/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

351 {
352 bool changed = false;
353 auto body = rewrite_child(node.body(), changed);
354 auto point = rewrite_child(node.point(), changed);
356 body, node.variable(), point, node.direction())
357 : current());
358 }
const std::string const LimitExprPtr & point

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

函数调用图:

◆ visit() [10/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() [11/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() [12/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() [13/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() [14/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

203{ set_result(current()); }

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

函数调用图:

◆ visit() [15/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

280 {
281 bool changed = false;
282 auto body = rewrite_child(node.body(), changed);
283 auto lower = rewrite_child(node.lower_bound(), changed);
284 auto upper = rewrite_child(node.upper_bound(), changed);
285 set_result(changed ? make_node<ProductNode>(body, node.index_var(), lower, upper)
286 : current());
287 }

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

函数调用图:

◆ visit() [16/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

296 {
297 bool changed = false;
298 auto domain = rewrite_child(node.domain(), changed);
299 auto predicate = rewrite_child(node.predicate(), changed);
300 set_result(changed ? make_node<QuantifierNode>(node.quantifier_type(), node.bound_var(),
301 domain, predicate)
302 : current());
303 }
RewriteBudget const FactsQuery Domain domain

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

函数调用图:

◆ visit() [17/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() [18/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() [19/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

359{ set_result(current()); }

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

函数调用图:

◆ visit() [20/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

304 {
305 bool changed = false;
306 auto domain = rewrite_child(node.domain(), changed);
307 auto predicate = rewrite_child(node.predicate(), changed);
308 set_result(changed ? make_node<SetBuilderNode>(node.element_var(), domain, predicate)
309 : current());
310 }

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

函数调用图:

◆ visit() [21/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

272 {
273 bool changed = false;
274 auto body = rewrite_child(node.body(), changed);
275 auto lower = rewrite_child(node.lower_bound(), changed);
276 auto upper = rewrite_child(node.upper_bound(), changed);
277 set_result(changed ? make_node<SummationNode>(body, node.index_var(), lower, upper)
278 : current());
279 }

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

函数调用图:

◆ visit() [22/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

288 {
289 bool changed = false;
290 auto body = rewrite_child(node.body(), changed);
291 auto target = rewrite_child(node.target(), changed);
292 set_result(changed ? make_node<TransformNode>(node.transform_type(), body,
293 node.source_var(), target)
294 : current());
295 }
const ExprPtr & target

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

函数调用图:

◆ visit() [23/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().

函数调用图:

◆ visit() [24/24]

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

实现了 LMCAS::detail::SymbolicVisitor.

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

204{ set_result(current()); }

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

函数调用图:

类成员变量说明

◆ context_

ComputationContext& LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::context_
private

在文件 limit_result.cpp 第 321 行定义.

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

◆ current_

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

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

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

◆ current_depth

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

◆ facts_

const FactsQuery& LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::facts_
private

在文件 limit_result.cpp 第 320 行定义.

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

◆ MAX_DEPTH

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

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

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

◆ result_

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

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

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

◆ rewrite_budget_

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

◆ visitor_

LimitVisitor& LMCAS::anonymous_namespace{limit_result.cpp}::SideBranchRewriter::visitor_
private

在文件 limit_result.cpp 第 319 行定义.

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


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