LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
differentiation_structural.cpp
浏览该文件的文档.
3
4namespace LMCAS {
5
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}
36
38 unsupported("RelationalNode");
39}
40
42 unsupported("LogicalNode");
43}
44
46 node.real()->accept(*this);
47 auto dr = result;
48 node.imag()->accept(*this);
49 auto di = result;
51}
52
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()) {
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
78 unsupported("UninterpretedFunctionNode");
79}
80
82 unsupported("SummationNode");
83}
84
86 unsupported("ProductNode");
87}
88
90 unsupported("TransformNode");
91}
92
94 unsupported("QuantifierNode");
95}
96
98 unsupported("SetBuilderNode");
99}
104 node.value()->accept(*this);
106 result, node.dimension(), node.scale_to_base(), node.display_unit()));
107}
108
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}
153
154}
复数节点,表示 real + imag * i。
void unsupported(const char *node_type) const
std::shared_ptr< const SymbolicNode > result
求导结果节点。
void append_result(std::vector< std::shared_ptr< const SymbolicNode > > &nodes, std::size_t &size, std::shared_ptr< const SymbolicNode > candidate)
void visit(const NumberNode &) override
void set_result(std::shared_ptr< const SymbolicNode > candidate)
矩阵节点,支持稠密和稀疏两种存储方式。
std::map< size_t, std::shared_ptr< const SymbolicNode > > SparseStorage
稀疏存储,索引映射到节点。
std::vector< std::shared_ptr< const SymbolicNode > > DenseStorage
稠密存储,按行优先展开。
分段函数节点,表示条件分支表达式.
std::shared_ptr< const SymbolicNode > expression
分支值。
std::shared_ptr< const SymbolicNode > condition
条件(RelationalNode 或 LogicalNode)。
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
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_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
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)
积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换.
std::size_t append_size(std::size_t current, std::size_t child)
RewriteBudget * rewrite_budget() const noexcept
微分访问器,对 AST 执行符号求导。
std::shared_ptr< const Node > make_node(Args &&... args)
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)