LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
differentiation_structural.cpp
浏览该文件的文档.
1
#include "
internal/visitors/differentiation_visitor.hpp
"
2
#include "
internal/expression_transform.hpp
"
3
4
namespace
LMCAS
{
5
6
void
DifferentiationVisitor::visit
(
const
MatrixNode
& node) {
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());
11
MatrixNode::DenseStorage
new_dense;
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());
25
MatrixNode::SparseStorage
new_sparse;
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
}
36
37
void
DifferentiationVisitor::visit
(
const
RelationalNode
&) {
38
unsupported
(
"RelationalNode"
);
39
}
40
41
void
DifferentiationVisitor::visit
(
const
LogicalNode
&) {
42
unsupported
(
"LogicalNode"
);
43
}
44
45
void
DifferentiationVisitor::visit
(
const
ComplexNode
& node) {
46
node.real()->accept(*
this
);
47
auto
dr =
result
;
48
node.imag()->accept(*
this
);
49
auto
di =
result
;
50
set_result
(
SymbolicFactory::create_complex
(dr, di));
51
}
52
53
void
DifferentiationVisitor::visit
(
const
PiecewiseNode
& node) {
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
}
76
77
void
DifferentiationVisitor::visit
(
const
UninterpretedFunctionNode
&) {
78
unsupported
(
"UninterpretedFunctionNode"
);
79
}
80
81
void
DifferentiationVisitor::visit
(
const
SummationNode
&) {
82
unsupported
(
"SummationNode"
);
83
}
84
85
void
DifferentiationVisitor::visit
(
const
ProductNode
&) {
86
unsupported
(
"ProductNode"
);
87
}
88
89
void
DifferentiationVisitor::visit
(
const
TransformNode
&) {
90
unsupported
(
"TransformNode"
);
91
}
92
93
void
DifferentiationVisitor::visit
(
const
QuantifierNode
&) {
94
unsupported
(
"QuantifierNode"
);
95
}
96
97
void
DifferentiationVisitor::visit
(
const
SetBuilderNode
&) {
98
unsupported
(
"SetBuilderNode"
);
99
}
100
void
DifferentiationVisitor::visit
(
const
FiniteSetNode
&) {
unsupported
(
"FiniteSetNode"
); }
101
void
DifferentiationVisitor::visit
(
const
IntervalNode
&) {
unsupported
(
"IntervalNode"
); }
102
void
DifferentiationVisitor::visit
(
const
MembershipNode
&) {
unsupported
(
"MembershipNode"
); }
103
void
DifferentiationVisitor::visit
(
const
QuantityNode
& node) {
104
node.value()->accept(*
this
);
105
set_result
(
LMCAS::detail::make_node<QuantityNode>
(
106
result
, node.dimension(), node.scale_to_base(), node.display_unit()));
107
}
108
109
void
DifferentiationVisitor::visit
(
const
IntegralNode
& node) {
110
if
(!node.is_definite()) {
111
if
(node.variable() ==
var
) {
112
set_result
(node.body());
113
return
;
114
}
115
node.body()->accept(*
this
);
116
set_result
(
LMCAS::detail::make_node<IntegralNode>
(
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()) {
126
append_result
(terms, size,
LMCAS::detail::make_node<IntegralNode>
(
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
());
136
append_result
(terms, size,
SymbolicFactory::create_multiply
(
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
());
145
append_result
(terms, size,
SymbolicFactory::create_multiply
({
146
SymbolicFactory::create_number
(BigInt(-1)), at_lower,
147
lower_derivative},
rewrite_budget
()));
148
}
149
set_result
(
SymbolicFactory::create_add
(std::move(terms),
rewrite_budget
()));
150
}
151
void
DifferentiationVisitor::visit
(
const
LimitNode
&) {
unsupported
(
"LimitNode"
); }
152
void
DifferentiationVisitor::visit
(
const
RootOfNode
&) {
unsupported
(
"RootOfNode"
); }
153
154
}
LMCAS::ComplexNode
复数节点,表示 real + imag * i。
定义
numbers.hpp:74
LMCAS::DifferentiationVisitor::unsupported
void unsupported(const char *node_type) const
定义
differentiation_visitor.hpp:15
LMCAS::DifferentiationVisitor::result
std::shared_ptr< const SymbolicNode > result
求导结果节点。
定义
differentiation_visitor.hpp:22
LMCAS::DifferentiationVisitor::var
std::string var
定义
differentiation_visitor.hpp:13
LMCAS::DifferentiationVisitor::append_result
void append_result(std::vector< std::shared_ptr< const SymbolicNode > > &nodes, std::size_t &size, std::shared_ptr< const SymbolicNode > candidate)
定义
differentiation_visitor.hpp:70
LMCAS::DifferentiationVisitor::visit
void visit(const NumberNode &) override
定义
differentiation_arithmetic.cpp:5
LMCAS::DifferentiationVisitor::set_result
void set_result(std::shared_ptr< const SymbolicNode > candidate)
定义
differentiation_visitor.hpp:66
LMCAS::FiniteSetNode
定义
sets.hpp:142
LMCAS::IntegralNode
定义
integral.hpp:8
LMCAS::IntervalNode
定义
sets.hpp:204
LMCAS::LimitNode
定义
special_forms.hpp:12
LMCAS::LogicalNode
定义
relations.hpp:73
LMCAS::MatrixNode
矩阵节点,支持稠密和稀疏两种存储方式。
定义
matrix.hpp:12
LMCAS::MatrixNode::SparseStorage
std::map< size_t, std::shared_ptr< const SymbolicNode > > SparseStorage
稀疏存储,索引映射到节点。
定义
matrix.hpp:15
LMCAS::MatrixNode::DenseStorage
std::vector< std::shared_ptr< const SymbolicNode > > DenseStorage
稠密存储,按行优先展开。
定义
matrix.hpp:14
LMCAS::MembershipNode
定义
sets.hpp:248
LMCAS::PiecewiseNode
分段函数节点,表示条件分支表达式.
定义
bindings.hpp:12
LMCAS::PiecewiseNode::Branch::expression
std::shared_ptr< const SymbolicNode > expression
分支值。
定义
bindings.hpp:15
LMCAS::PiecewiseNode::Branch::condition
std::shared_ptr< const SymbolicNode > condition
条件(RelationalNode 或 LogicalNode)。
定义
bindings.hpp:16
LMCAS::PiecewiseNode::Branch
定义
bindings.hpp:14
LMCAS::ProductNode
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
定义
bindings.hpp:175
LMCAS::QuantifierNode
定义
sets.hpp:5
LMCAS::QuantityNode
定义
sets.hpp:286
LMCAS::RelationalNode
定义
relations.hpp:6
LMCAS::RootOfNode
定义
special_forms.hpp:76
LMCAS::SetBuilderNode
定义
sets.hpp:80
LMCAS::SummationNode
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
定义
bindings.hpp:101
LMCAS::SymbolicFactory::create_add
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
定义
symbolic_factory.cpp:12
LMCAS::SymbolicFactory::create_complex
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
定义
symbolic_factory.cpp:167
LMCAS::SymbolicFactory::create_multiply
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
定义
symbolic_factory.cpp:83
LMCAS::SymbolicFactory::create_number
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
定义
symbolic_factory.cpp:7
LMCAS::TransformNode
积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换.
定义
bindings.hpp:251
LMCAS::UninterpretedFunctionNode
定义
functions.hpp:96
LMCAS::detail::RewriteBudget::append_size
std::size_t append_size(std::size_t current, std::size_t child)
定义
rewrite_budget.cpp:188
LMCAS::detail::SymbolicVisitor::rewrite_budget
RewriteBudget * rewrite_budget() const noexcept
定义
base.hpp:220
differentiation_visitor.hpp
微分访问器,对 AST 执行符号求导。
expression_transform.hpp
LMCAS::detail::make_node
std::shared_ptr< const Node > make_node(Args &&... args)
定义
base.hpp:123
LMCAS::detail::substitute_node
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
定义
symbolic_core.cpp:247
LMCAS
定义
assumption.hpp:11
src
differentiation_structural.cpp
生成于
, 为 LMCAS使用
1.18.0