LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
normalization_visitor.hpp
浏览该文件的文档.
1/**
2 * @file normalization_visitor.hpp
3 * @brief 符号规范化访问器接口。
4 */
5#pragma once
6
9
10#include <memory>
11
12namespace LMCAS {
13
14/**
15 * @brief 统一规范化数值幂。
16 * 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。
17 * 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。
18 */
20public:
23 : SymbolicVisitor(&budget), context_(budget.context()), facts_(facts),
24 domain_(domain) {}
26
27 [[nodiscard]] std::shared_ptr<const SymbolicNode> get_result() const;
28
29 std::shared_ptr<const SymbolicNode> expand_product(
30 const std::shared_ptr<const SymbolicNode>& lhs,
31 const std::shared_ptr<const SymbolicNode>& rhs);
32
33 void visit(const NumberNode& node) override;
34 void visit(const VariableNode& node) override;
35 void visit(const AddNode& node) override;
36 void visit(const MultiplyNode& node) override;
37 void visit(const PowerNode& node) override;
38 void visit(const FunctionNode& node) override;
39 void visit(const UninterpretedFunctionNode& node) override;
40 void visit(const MatrixNode& node) override;
41 void visit(const RelationalNode& node) override;
42 void visit(const LogicalNode& node) override;
43 void visit(const PiecewiseNode& node) override;
44 void visit(const SummationNode& node) override;
45 void visit(const ProductNode& node) override;
46 void visit(const TransformNode& node) override;
47 void visit(const QuantifierNode& node) override;
48 void visit(const SetBuilderNode& node) override;
49 void visit(const FiniteSetNode& node) override;
50 void visit(const IntervalNode& node) override;
51 void visit(const MembershipNode& node) override;
52 void visit(const QuantityNode& node) override;
53 void visit(const ComplexNode& node) override;
54 void visit(const IntegralNode& node) override;
55 void visit(const LimitNode& node) override;
56 void visit(const RootOfNode& node) override;
57
58private:
60 std::shared_ptr<const SymbolicNode> result;
63
64 void set_result(std::shared_ptr<const SymbolicNode> candidate);
65
66 std::shared_ptr<const SymbolicNode> normalize_bound_body(const SymbolicNode& node);
67
68 void merge_complex_terms(std::vector<std::shared_ptr<const SymbolicNode>>& operands);
69 std::shared_ptr<const NumberNode> extract_term_coefficient(
70 std::shared_ptr<const SymbolicNode>& term);
71 std::shared_ptr<const SymbolicNode> collect_sum(
72 const std::vector<std::shared_ptr<const SymbolicNode>>& operands);
73 std::shared_ptr<const SymbolicNode> collect_product(
74 const std::vector<std::shared_ptr<const SymbolicNode>>& operands);
75 std::shared_ptr<const SymbolicNode> collect_expanded_product(
76 const std::shared_ptr<const SymbolicNode>& lhs,
77 const std::shared_ptr<const SymbolicNode>& rhs);
78 std::shared_ptr<const SymbolicNode> expand_complex_product(
79 const std::shared_ptr<const SymbolicNode>& lhs,
80 const std::shared_ptr<const SymbolicNode>& rhs);
81 std::shared_ptr<const SymbolicNode> distribute_product(
82 const std::shared_ptr<const SymbolicNode>& lhs,
83 const std::shared_ptr<const SymbolicNode>& rhs);
85 const std::vector<std::shared_ptr<const SymbolicNode>>& operands);
86 std::shared_ptr<const SymbolicNode> normalize_matrix_product(
87 const std::vector<std::shared_ptr<const SymbolicNode>>& operands);
88 std::shared_ptr<const SymbolicNode> fuse_matrix_product(
89 const std::shared_ptr<const SymbolicNode>& left,
90 const std::shared_ptr<const SymbolicNode>& right);
91 std::shared_ptr<const SymbolicNode> matrix_product_element(
92 const MatrixNode& left, const MatrixNode& right, std::size_t row, std::size_t col);
93 std::shared_ptr<const SymbolicNode> scale_matrix(
94 const MatrixNode& matrix, const std::shared_ptr<const NumberNode>& scalar);
96 const std::shared_ptr<const SymbolicNode>& base,
97 const std::shared_ptr<const SymbolicNode>& exponent);
99 const MultiplyNode& base, const std::shared_ptr<const SymbolicNode>& exponent);
100 void distribute_power(
101 const MultiplyNode& base, const std::shared_ptr<const SymbolicNode>& exponent);
103 const PowerNode& base, const std::shared_ptr<const NumberNode>& exponent);
105 const PowerNode& base, const std::shared_ptr<const SymbolicNode>& exponent);
106 bool finish_squared_norm(const SymbolicNode& node,
107 std::shared_ptr<const SymbolicNode>& argument, bool normalize_argument);
109 const std::vector<std::shared_ptr<const SymbolicNode>>& arguments);
110 bool normalize_natural_logarithm(const std::shared_ptr<const SymbolicNode>& argument);
112 const std::shared_ptr<const SymbolicNode>& argument);
114 const std::shared_ptr<const SymbolicNode>& argument);
115
117 const SymbolicNode& node, std::shared_ptr<const SymbolicNode>& argument);
118 static bool is_positive_integer_number(
119 const std::shared_ptr<const NumberNode>& node);
121 const PowerNode& inner,
122 const std::shared_ptr<const NumberNode>& outer_exponent) const;
123 std::shared_ptr<const SymbolicNode> try_assumption_simplify(
124 const std::shared_ptr<const SymbolicNode>& node);
125 std::shared_ptr<const SymbolicNode> simplify_assumed_square_root(
126 const std::shared_ptr<const SymbolicNode>& argument) const;
127 std::shared_ptr<const SymbolicNode> simplify_assumed_absolute(
128 const std::shared_ptr<const SymbolicNode>& argument) const;
129};
130
131}
加法节点,表示多个操作数的求和。
复数节点,表示 real + imag * i。
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
矩阵节点,支持稠密和稀疏两种存储方式。
乘法节点,表示多个操作数的乘积。
bool can_combine_nested_power(const PowerNode &inner, const std::shared_ptr< const NumberNode > &outer_exponent) const
bool try_normalize_squared_norm(const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument)
bool normalize_unary_function(FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > try_assumption_simplify(const std::shared_ptr< const SymbolicNode > &node)
bool normalize_nested_imaginary_power(const PowerNode &base, const std::shared_ptr< const NumberNode > &exponent)
bool finish_squared_norm(const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument, bool normalize_argument)
void visit(const NumberNode &node) override
std::shared_ptr< const SymbolicNode > collect_product(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > distribute_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const NumberNode > extract_term_coefficient(std::shared_ptr< const SymbolicNode > &term)
bool normalize_natural_logarithm(const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > expand_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > expand_complex_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > scale_matrix(const MatrixNode &matrix, const std::shared_ptr< const NumberNode > &scalar)
bool normalize_nested_power(const PowerNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
bool normalize_logarithm(FunctionNode::FuncType type, const std::vector< std::shared_ptr< const SymbolicNode > > &arguments)
NormalizationVisitor(detail::RewriteBudget &, FactsQuery &&, Domain)=delete
NormalizationVisitor(detail::RewriteBudget &budget, const FactsQuery &facts, Domain domain)
void set_result(std::shared_ptr< const SymbolicNode > candidate)
std::shared_ptr< const SymbolicNode > collect_expanded_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > collect_sum(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > simplify_assumed_square_root(const std::shared_ptr< const SymbolicNode > &argument) const
std::shared_ptr< const SymbolicNode > result
bool normalize_matrix_sum(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > normalize_matrix_product(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
bool normalize_product_power(const MultiplyNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
void distribute_power(const MultiplyNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
void merge_complex_terms(std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > matrix_product_element(const MatrixNode &left, const MatrixNode &right, std::size_t row, std::size_t col)
bool normalize_function_parity(FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > fuse_matrix_product(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::shared_ptr< const SymbolicNode > simplify_assumed_absolute(const std::shared_ptr< const SymbolicNode > &argument) const
static bool is_positive_integer_number(const std::shared_ptr< const NumberNode > &node)
bool normalize_power_identity(const std::shared_ptr< const SymbolicNode > &base, const std::shared_ptr< const SymbolicNode > &exponent)
std::shared_ptr< const SymbolicNode > get_result() const
std::shared_ptr< const SymbolicNode > normalize_bound_body(const SymbolicNode &node)
分段函数节点,表示条件分支表达式.
幂运算节点,表示 base^exponent。
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换.
变量节点,表示一个符号变量。
#define LMCAS_API
const FactsQuery & no_facts() noexcept
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Real
Real numbers
const ExprPtr & exponent
const NumberDomainSet & domain
const ExprPtr & right
const ExprPtr & rhs
内部 AST 定义。