LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::DifferentiationVisitor类 参考

#include </home/runner/work/docs/docs/LMCAS/src/internal/visitors/differentiation_visitor.hpp>

类 LMCAS::DifferentiationVisitor 继承关系图:
LMCAS::DifferentiationVisitor 的协作图:

Public 成员函数

 DifferentiationVisitor (const std::string &v, detail::RewriteBudget &budget)
 构造普通求导访问器。
std::shared_ptr< const SymbolicNode > get_result () const
 获取求导结果。
void visit (const AddNode &node) override
void visit (const ComplexNode &node) override
void visit (const FiniteSetNode &) override
void visit (const FunctionNode &node) override
void visit (const IntegralNode &node) override
void visit (const IntervalNode &) override
void visit (const LimitNode &) override
void visit (const LogicalNode &) override
void visit (const MatrixNode &node) override
void visit (const MembershipNode &) 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 ProductNode &) override
void visit (const QuantifierNode &) override
void visit (const QuantityNode &node) override
void visit (const RelationalNode &) override
void visit (const RootOfNode &) override
void visit (const SetBuilderNode &) override
void visit (const SummationNode &) override
void visit (const TransformNode &) override
void visit (const UninterpretedFunctionNode &) override
void visit (const VariableNode &node) override

Public 属性

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 成员函数

void append_result (std::vector< std::shared_ptr< const SymbolicNode > > &nodes, std::size_t &size, std::shared_ptr< const SymbolicNode > candidate)
void differentiate_atan2 (const FunctionNode &node)
void set_result (std::shared_ptr< const SymbolicNode > candidate)
void unsupported (const char *node_type) const

Private 属性

RewriteBudget * rewrite_budget_ = nullptr
std::string var

详细描述

在文件 differentiation_visitor.hpp 第 12 行定义.

构造及析构函数说明

◆ DifferentiationVisitor()

LMCAS::DifferentiationVisitor::DifferentiationVisitor ( const std::string & v,
detail::RewriteBudget & budget )
inline

构造普通求导访问器。

参数
v求导变量名

在文件 differentiation_visitor.hpp 第 29 行定义.

30 : SymbolicVisitor(&budget), var(v), result(nullptr) {}
std::shared_ptr< const SymbolicNode > result
求导结果节点。
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v

引用了 LMCAS::detail::SymbolicVisitor::SymbolicVisitor(), result, LMCAS::v , 以及 var.

函数调用图:

成员函数说明

◆ append_result()

void LMCAS::DifferentiationVisitor::append_result ( std::vector< std::shared_ptr< const SymbolicNode > > & nodes,
std::size_t & size,
std::shared_ptr< const SymbolicNode > candidate )
inlineprivate

在文件 differentiation_visitor.hpp 第 70 行定义.

71 {
72 size = rewrite_budget()->append_size(size, rewrite_budget()->measure(candidate));
73 nodes.push_back(std::move(candidate));
74 }
std::size_t append_size(std::size_t current, std::size_t child)
RewriteBudget * rewrite_budget() const noexcept

引用了 LMCAS::detail::RewriteBudget::append_size() , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

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

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

◆ differentiate_atan2()

void LMCAS::DifferentiationVisitor::differentiate_atan2 ( const FunctionNode & node)
private

在文件 differentiation_functions.cpp 第 264 行定义.

264 {
265 auto* budget = rewrite_budget();
266 const auto& y = node.arguments()[0];
267 const auto& x = node.arguments()[1];
268 y->accept(*this);
269 auto dy = result;
270 x->accept(*this);
271 auto dx = result;
272 auto numerator = SymbolicFactory::create_add({
275 SymbolicFactory::create_number(BigInt(-1)), y, dx}, budget)
276 }, budget);
277 auto two = SymbolicFactory::create_number(BigInt(2));
281 }, budget);
284 set_result(SymbolicFactory::create_multiply({numerator, inverse}, budget));
285}
void set_result(std::shared_ptr< const SymbolicNode > candidate)
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
const ExprPtr & denominator

引用了 LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::denominator, LMCAS::detail::make_node(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

被这些函数引用 visit().

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

◆ get_result()

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

获取求导结果。

返回
求导后的 AST 节点

在文件 differentiation_visitor.hpp 第 37 行定义.

37 {
38 return result;
39 }

引用了 result.

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

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

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

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

◆ set_result()

void LMCAS::DifferentiationVisitor::set_result ( std::shared_ptr< const SymbolicNode > candidate)
inlineprivate

在文件 differentiation_visitor.hpp 第 66 行定义.

66 {
67 rewrite_budget()->measure_result(candidate);
68 result = std::move(candidate);
69 }
std::size_t measure_result(const std::shared_ptr< const SymbolicNode > &node)

引用了 LMCAS::detail::RewriteBudget::measure_result(), result , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

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

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

◆ unsupported()

void LMCAS::DifferentiationVisitor::unsupported ( const char * node_type) const
inlineprivate

在文件 differentiation_visitor.hpp 第 15 行定义.

15 {
16 throw CasError{CasErrc::UnsupportedExpression, std::string(node_type) +
17 " differentiation is outside the current supported domain",
18 "LMCAS.differentiate"};
19 }

引用了 LMCAS::UnsupportedExpression.

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

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

◆ visit() [1/24]

void LMCAS::DifferentiationVisitor::visit ( const AddNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

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

17 {
18 std::vector<std::shared_ptr<const SymbolicNode>> diff_ops;
19 std::size_t size = 1;
20 rewrite_budget()->append_size(size, node.operands().size());
21 diff_ops.reserve(node.operands().size());
22 for (const auto& op : node.operands()) {
23 op->accept(*this);
24 append_result(diff_ops, size, result);
25 }
27}
void append_result(std::vector< std::shared_ptr< const SymbolicNode > > &nodes, std::size_t &size, std::shared_ptr< const SymbolicNode > candidate)
const ExprPtr RelationOp op

引用了 append_result(), LMCAS::detail::RewriteBudget::append_size(), LMCAS::SymbolicFactory::create_add(), LMCAS::op, result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [2/24]

void LMCAS::DifferentiationVisitor::visit ( const ComplexNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 45 行定义.

45 {
46 node.real()->accept(*this);
47 auto dr = result;
48 node.imag()->accept(*this);
49 auto di = result;
51}
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).

引用了 LMCAS::SymbolicFactory::create_complex(), result , 以及 set_result().

函数调用图:

◆ visit() [3/24]

void LMCAS::DifferentiationVisitor::visit ( const FiniteSetNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 100 行定义.

100{ unsupported("FiniteSetNode"); }
void unsupported(const char *node_type) const

引用了 unsupported().

函数调用图:

◆ visit() [4/24]

void LMCAS::DifferentiationVisitor::visit ( const FunctionNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_functions.cpp 第 287 行定义.

287 {
288 auto* budget = rewrite_budget();
289 if (node.type() == FunctionNode::FuncType::Atan2 && node.arguments().size() == 2) {
291 return;
292 }
293 if (node.type() == FunctionNode::FuncType::Log && node.arguments().size() == 2) {
294 const auto& arg = node.arguments()[0];
295 if (!valid_log_base(node.arguments()[1])) {
296 unsupported("FunctionNode");
297 }
298 arg->accept(*this);
299 auto d_arg = result;
300 if (d_arg->is_zero()) return;
301 auto inverse = logarithmic_outer(node, budget);
302 set_result(SymbolicFactory::create_multiply({std::move(d_arg), inverse}, budget));
303 return;
304 }
305 if (node.arguments().size() != 1) unsupported("FunctionNode");
306 node.arguments()[0]->accept(*this);
307 auto d_arg = result;
308 if (d_arg->is_zero()) {
309 return;
310 }
311
312 auto d_outer = trigonometric_outer(node, budget);
313 if (!d_outer) d_outer = inverse_trigonometric_outer(node, budget);
314 if (!d_outer) d_outer = hyperbolic_outer(node, budget);
315 if (!d_outer) d_outer = elementary_outer(node, budget);
316 if (!d_outer) d_outer = special_outer(node, budget);
317 if (!d_outer) unsupported("FunctionNode");
318 set_result(SymbolicFactory::create_multiply({std::move(d_outer), std::move(d_arg)}, budget));
319}
void differentiate_atan2(const FunctionNode &node)
@ Atan2
双参数反正切。
std::shared_ptr< const SymbolicNode > elementary_outer(const FunctionNode &node, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > special_outer(const FunctionNode &node, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > inverse_trigonometric_outer(const FunctionNode &node, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > trigonometric_outer(const FunctionNode &node, detail::RewriteBudget *budget)
std::shared_ptr< const SymbolicNode > logarithmic_outer(const FunctionNode &node, detail::RewriteBudget *budget)
bool valid_log_base(const std::shared_ptr< const SymbolicNode > &base)
std::shared_ptr< const SymbolicNode > hyperbolic_outer(const FunctionNode &node, detail::RewriteBudget *budget)

引用了 LMCAS::FunctionNode::Atan2, LMCAS::SymbolicFactory::create_multiply(), differentiate_atan2(), LMCAS::FunctionNode::Log, result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 unsupported().

函数调用图:

◆ visit() [5/24]

void LMCAS::DifferentiationVisitor::visit ( const IntegralNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 109 行定义.

109 {
110 if (!node.is_definite()) {
111 if (node.variable() == var) {
112 set_result(node.body());
113 return;
114 }
115 node.body()->accept(*this);
117 result, node.variable()));
118 return;
119 }
120
121 std::vector<std::shared_ptr<const SymbolicNode>> terms;
122 std::size_t size = 1;
123 if (node.variable() != var) {
124 node.body()->accept(*this);
125 if (!result->is_zero()) {
127 result, node.variable(), node.lower(), node.upper()));
128 }
129 }
130
131 node.upper()->accept(*this);
132 auto upper_derivative = result;
133 if (!upper_derivative->is_zero()) {
134 auto at_upper = detail::substitute_node(
135 node.body(), node.variable(), node.upper(), *rewrite_budget());
137 {at_upper, upper_derivative}, rewrite_budget()));
138 }
139
140 node.lower()->accept(*this);
141 auto lower_derivative = result;
142 if (!lower_derivative->is_zero()) {
143 auto at_lower = detail::substitute_node(
144 node.body(), node.variable(), node.lower(), *rewrite_budget());
146 SymbolicFactory::create_number(BigInt(-1)), at_lower,
147 lower_derivative}, rewrite_budget()));
148 }
150}
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 append_result(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::detail::make_node(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result(), LMCAS::detail::substitute_node() , 以及 var.

函数调用图:

◆ visit() [6/24]

void LMCAS::DifferentiationVisitor::visit ( const IntervalNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 101 行定义.

101{ unsupported("IntervalNode"); }

引用了 unsupported().

函数调用图:

◆ visit() [7/24]

void LMCAS::DifferentiationVisitor::visit ( const LimitNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 151 行定义.

151{ unsupported("LimitNode"); }

引用了 unsupported().

函数调用图:

◆ visit() [8/24]

void LMCAS::DifferentiationVisitor::visit ( const LogicalNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 41 行定义.

41 {
42 unsupported("LogicalNode");
43}

引用了 unsupported().

函数调用图:

◆ visit() [9/24]

void LMCAS::DifferentiationVisitor::visit ( const MatrixNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 6 行定义.

6 {
7 std::size_t size = 1;
8
9 if (std::holds_alternative<MatrixNode::DenseStorage>(node.storage())) {
10 const auto& dense = std::get<MatrixNode::DenseStorage>(node.storage());
12 rewrite_budget()->append_size(size, dense.size());
13 new_dense.reserve(dense.size());
14 for(const auto& item : dense) {
15 if (item) {
16 item->accept(*this);
17 append_result(new_dense, size, result);
18 } else {
19 new_dense.push_back(nullptr);
20 }
21 }
22 set_result(LMCAS::detail::make_node<MatrixNode>(node.rows(), node.cols(), new_dense));
23 } else {
24 const auto& sparse = std::get<MatrixNode::SparseStorage>(node.storage());
26 for(const auto& [idx, item] : sparse) {
27 item->accept(*this);
28 if (!result->is_zero()) {
29 size = rewrite_budget()->append_size(size, rewrite_budget()->measure(result));
30 new_sparse[idx] = result;
31 }
32 }
33 set_result(LMCAS::detail::make_node<MatrixNode>(node.rows(), node.cols(), new_sparse));
34 }
35}
std::map< size_t, std::shared_ptr< const SymbolicNode > > SparseStorage
稀疏存储,索引映射到节点。
std::vector< std::shared_ptr< const SymbolicNode > > DenseStorage
稠密存储,按行优先展开。

引用了 append_result(), LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::make_node(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [10/24]

void LMCAS::DifferentiationVisitor::visit ( const MembershipNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 102 行定义.

102{ unsupported("MembershipNode"); }

引用了 unsupported().

函数调用图:

◆ visit() [11/24]

void LMCAS::DifferentiationVisitor::visit ( const MultiplyNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_arithmetic.cpp 第 29 行定义.

29 {
30 if (node.operands().empty()) {
32 return;
33 }
34
35 std::vector<std::shared_ptr<const SymbolicNode>> sum_terms;
36 std::size_t sum_size = 1;
37
38 for (size_t i = 0; i < node.operands().size(); ++i) {
40
41 node.operands()[i]->accept(*this);
42 auto d_term = result;
43
44 if (d_term->is_zero()) continue;
45
46 std::vector<std::shared_ptr<const SymbolicNode>> prod_terms;
47 std::size_t product_size = 1;
48 rewrite_budget()->append_size(product_size, node.operands().size());
49 prod_terms.reserve(node.operands().size());
50
51 for (size_t j = 0; j < node.operands().size(); ++j) {
53 append_result(prod_terms, product_size,
54 i == j ? d_term : node.operands()[j]);
55 }
56 append_result(sum_terms, sum_size,
57 SymbolicFactory::create_multiply(std::move(prod_terms), rewrite_budget()));
58 }
59
60 if (sum_terms.empty()) {
62 } else {
64 }
65}

引用了 append_result(), LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::RewriteBudget::consume(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [12/24]

void LMCAS::DifferentiationVisitor::visit ( const NumberNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_arithmetic.cpp 第 5 行定义.

引用了 LMCAS::SymbolicFactory::create_number() , 以及 set_result().

函数调用图:

◆ visit() [13/24]

void LMCAS::DifferentiationVisitor::visit ( const PiecewiseNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 53 行定义.

53 {
54 std::vector<PiecewiseNode::Branch> new_branches;
55 std::size_t size = 1;
56 auto minimum = rewrite_budget()->append_size(size, node.branches().size());
57 rewrite_budget()->append_size(minimum, node.branches().size());
58 new_branches.reserve(node.branches().size());
59 for (const auto& br : node.branches()) {
60 PiecewiseNode::Branch new_br;
61 br.expression->accept(*this);
62 new_br.expression = result;
63 new_br.condition = br.condition;
64 size = rewrite_budget()->append_size(size, rewrite_budget()->measure(new_br.expression));
65 size = rewrite_budget()->append_size(size, rewrite_budget()->measure(new_br.condition));
66 new_branches.push_back(new_br);
67 }
68 std::shared_ptr<const SymbolicNode> new_def = nullptr;
69 if (node.default_expr()) {
70 node.default_expr()->accept(*this);
71 new_def = result;
72 rewrite_budget()->append_size(size, rewrite_budget()->measure(new_def));
73 }
74 set_result(LMCAS::detail::make_node<PiecewiseNode>(std::move(new_branches), new_def));
75}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::PiecewiseNode::Branch::condition, LMCAS::PiecewiseNode::Branch::expression, LMCAS::detail::make_node(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [14/24]

void LMCAS::DifferentiationVisitor::visit ( const PowerNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_arithmetic.cpp 第 67 行定义.

67 {
68
69 node.base()->accept(*this);
70 auto du = result;
71 node.exponent()->accept(*this);
72 auto dv = result;
73
74 auto u = node.base();
75 auto v = node.exponent();
76
77 if (dv->is_zero()) {
78
79 auto n = v;
80
81 auto n_minus_1 = SymbolicFactory::create_add(
83
84 auto u_pow = LMCAS::detail::make_node<PowerNode>(u, n_minus_1);
85
87 } else {
88
89 auto ln_u = LMCAS::detail::make_node<FunctionNode>(FunctionNode::FuncType::Ln, std::vector<std::shared_ptr<const SymbolicNode>>{u});
90
91 auto t1 = SymbolicFactory::create_multiply({dv, ln_u}, rewrite_budget());
92
94 auto t2 = SymbolicFactory::create_multiply({v, du, u_inv}, rewrite_budget());
95
96 auto sum = SymbolicFactory::create_add({t1, t2}, rewrite_budget());
97
100 }
101}
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u

引用了 LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::SymbolicFactory::create_number(), LMCAS::FunctionNode::Ln, LMCAS::detail::make_node(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result(), LMCAS::u , 以及 LMCAS::v.

函数调用图:

◆ visit() [15/24]

void LMCAS::DifferentiationVisitor::visit ( const ProductNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 85 行定义.

85 {
86 unsupported("ProductNode");
87}

引用了 unsupported().

函数调用图:

◆ visit() [16/24]

void LMCAS::DifferentiationVisitor::visit ( const QuantifierNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 93 行定义.

93 {
94 unsupported("QuantifierNode");
95}

引用了 unsupported().

函数调用图:

◆ visit() [17/24]

void LMCAS::DifferentiationVisitor::visit ( const QuantityNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 103 行定义.

103 {
104 node.value()->accept(*this);
106 result, node.dimension(), node.scale_to_base(), node.display_unit()));
107}

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

函数调用图:

◆ visit() [18/24]

void LMCAS::DifferentiationVisitor::visit ( const RelationalNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 37 行定义.

37 {
38 unsupported("RelationalNode");
39}

引用了 unsupported().

函数调用图:

◆ visit() [19/24]

void LMCAS::DifferentiationVisitor::visit ( const RootOfNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 152 行定义.

152{ unsupported("RootOfNode"); }

引用了 unsupported().

函数调用图:

◆ visit() [20/24]

void LMCAS::DifferentiationVisitor::visit ( const SetBuilderNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 97 行定义.

97 {
98 unsupported("SetBuilderNode");
99}

引用了 unsupported().

函数调用图:

◆ visit() [21/24]

void LMCAS::DifferentiationVisitor::visit ( const SummationNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

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

81 {
82 unsupported("SummationNode");
83}

引用了 unsupported().

函数调用图:

◆ visit() [22/24]

void LMCAS::DifferentiationVisitor::visit ( const TransformNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_structural.cpp 第 89 行定义.

89 {
90 unsupported("TransformNode");
91}

引用了 unsupported().

函数调用图:

◆ visit() [23/24]

void LMCAS::DifferentiationVisitor::visit ( const UninterpretedFunctionNode & )
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

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

77 {
78 unsupported("UninterpretedFunctionNode");
79}

引用了 unsupported().

函数调用图:

◆ visit() [24/24]

void LMCAS::DifferentiationVisitor::visit ( const VariableNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 differentiation_arithmetic.cpp 第 9 行定义.

9 {
10 if (!node.is_constant() && node.name() == var) {
12 } else {
14 }
15}

引用了 LMCAS::SymbolicFactory::create_number(), set_result() , 以及 var.

函数调用图:

类成员变量说明

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

◆ result

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

◆ rewrite_budget_

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

◆ var

std::string LMCAS::DifferentiationVisitor::var
private

在文件 differentiation_visitor.hpp 第 13 行定义.

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


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