LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
differentiation_visitor.hpp
浏览该文件的文档.
1/**
2 * @file differentiation_visitor.hpp
3 * @brief 微分访问器,对 AST 执行符号求导。
4 */
5#pragma once
7#include <stdexcept>
8#include <string>
9
10namespace LMCAS {
11
13 std::string var;
14
15 [[noreturn]] void unsupported(const char* node_type) const {
16 throw CasError{CasErrc::UnsupportedExpression, std::string(node_type) +
17 " differentiation is outside the current supported domain",
18 "LMCAS.differentiate"};
19 }
20
21public:
22 std::shared_ptr<const SymbolicNode> result; /**< 求导结果节点。 */
23
24
25 /**
26 * @brief 构造普通求导访问器。
27 * @param v 求导变量名
28 */
29 DifferentiationVisitor(const std::string& v, detail::RewriteBudget& budget)
30 : SymbolicVisitor(&budget), var(v), result(nullptr) {}
31
32
33 /**
34 * @brief 获取求导结果。
35 * @return 求导后的 AST 节点
36 */
37 std::shared_ptr<const SymbolicNode> get_result() const {
38 return result;
39 }
40 void visit(const NumberNode&) override;
41 void visit(const VariableNode& node) override;
42 void visit(const AddNode& node) override;
43 void visit(const MultiplyNode& node) override;
44 void visit(const PowerNode& node) override;
45 void visit(const FunctionNode& node) override;
46 void visit(const MatrixNode& node) override;
47 void visit(const RelationalNode&) override;
48 void visit(const LogicalNode&) override;
49 void visit(const ComplexNode& node) override;
50 void visit(const PiecewiseNode& node) override;
51 void visit(const UninterpretedFunctionNode&) override;
52 void visit(const SummationNode&) override;
53 void visit(const ProductNode&) override;
54 void visit(const TransformNode&) override;
55 void visit(const QuantifierNode&) override;
56 void visit(const SetBuilderNode&) override;
57 void visit(const FiniteSetNode&) override;
58 void visit(const IntervalNode&) override;
59 void visit(const MembershipNode&) override;
60 void visit(const QuantityNode& node) override;
61 void visit(const IntegralNode& node) override;
62 void visit(const LimitNode&) override;
63 void visit(const RootOfNode&) override;
64
65private:
66 void set_result(std::shared_ptr<const SymbolicNode> candidate) {
67 rewrite_budget()->measure_result(candidate);
68 result = std::move(candidate);
69 }
70 void append_result(std::vector<std::shared_ptr<const SymbolicNode>>& nodes,
71 std::size_t& size, std::shared_ptr<const SymbolicNode> candidate) {
72 size = rewrite_budget()->append_size(size, rewrite_budget()->measure(candidate));
73 nodes.push_back(std::move(candidate));
74 }
75
76 void differentiate_atan2(const FunctionNode& node);
77};
78
79}
加法节点,表示多个操作数的求和。
复数节点,表示 real + imag * i。
void unsupported(const char *node_type) const
std::shared_ptr< const SymbolicNode > result
求导结果节点。
DifferentiationVisitor(const std::string &v, detail::RewriteBudget &budget)
构造普通求导访问器。
void differentiate_atan2(const FunctionNode &node)
std::shared_ptr< const SymbolicNode > get_result() const
获取求导结果。
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)
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
矩阵节点,支持稠密和稀疏两种存储方式。
乘法节点,表示多个操作数的乘积。
分段函数节点,表示条件分支表达式.
幂运算节点,表示 base^exponent。
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换.
变量节点,表示一个符号变量。
std::size_t append_size(std::size_t current, std::size_t child)
std::size_t measure_result(const std::shared_ptr< const SymbolicNode > &node)
RewriteBudget * rewrite_budget() const noexcept
__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
内部 AST 定义。