LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
solver_groebner_conversion.cpp
浏览该文件的文档.
4
6
7 size_t PolyBuilder::get_or_create_aux_var(const std::shared_ptr<const SymbolicNode>& node) {
8
10 std::string key = tmp.to_string();
11
12 auto it = transcendental_map.find(key);
13 if (it != transcendental_map.end()) {
14 return it->second;
15 }
16
17 size_t idx = ext_vars.size();
18 std::string aux_name = "__aux_" + std::to_string(idx) + "_";
19 ext_vars.push_back(aux_name);
20 transcendental_map[key] = idx;
21
22 if (aux_to_node) {
23 (*aux_to_node)[idx] = node;
24 }
25 return idx;
26 }
27
28 void PolyBuilder::represent_as_aux_or_fail(const std::shared_ptr<const SymbolicNode>& node) {
29 if (strict_mode) {
30 failed = true;
31 return;
32 }
33 size_t idx = get_or_create_aux_var(node);
34 result = Poly(ext_vars.size());
35 Monomial m(ext_vars.size(), 0);
36 m[idx] = 1;
37 result.add_term(m, Rational(1));
38 }
39
41 for (const auto& argument : node.arguments()) {
42 for (const auto& variable : vars) {
43 if (expression_depends_on_variable(argument, variable)) return true;
44 }
45 }
46 return false;
47}
48
51 LMCAS::detail::make_node<FunctionNode>(node.type(), node.arguments()));
53 if (!simplified || !simplified->is_number()) return false;
54 auto number = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(simplified));
55 if (!number) return false;
56 if (std::holds_alternative<Rational>(number->value())) {
57 result = Poly(ext_vars.size());
58 result.add_term(Monomial(ext_vars.size(), 0), std::get<Rational>(number->value()));
59 return true;
60 }
61 if (std::holds_alternative<BigInt>(number->value())) {
62 result = Poly(ext_vars.size());
63 result.add_term(Monomial(ext_vars.size(), 0), Rational(std::get<BigInt>(number->value())));
64 return true;
65 }
66 return false;
67}
68
70 if (strict_mode) {
71 failed = true;
72 return;
73 }
74 if (!function_depends_on_variables(node) && use_numeric_function(node)) return;
76 LMCAS::detail::make_node<FunctionNode>(node.type(), node.arguments()));
77}
78
80 represent_as_aux_or_fail(node.clone());
81 }
82
83 void PolyBuilder::visit(const MatrixNode& node) {
84 represent_as_aux_or_fail(node.clone());
85 }
86
88 represent_as_aux_or_fail(node.clone());
89 }
90
91 void PolyBuilder::visit(const LogicalNode& node) {
92 represent_as_aux_or_fail(node.clone());
93 }
94
96 represent_as_aux_or_fail(node.clone());
97 }
98
100 represent_as_aux_or_fail(node.clone());
101 }
102
103 void PolyBuilder::visit(const ProductNode& node) {
104 represent_as_aux_or_fail(node.clone());
105 }
106
108 represent_as_aux_or_fail(node.clone());
109 }
110
112 represent_as_aux_or_fail(node.clone());
113 }
114
116 represent_as_aux_or_fail(node.clone());
117 }
118
119 void PolyBuilder::visit(const ComplexNode& node) {
120 represent_as_aux_or_fail(node.clone());
121 }
122
123 void PolyBuilder::visit(const FiniteSetNode& node) { represent_as_aux_or_fail(node.clone()); }
124
125 void PolyBuilder::visit(const IntervalNode& node) { represent_as_aux_or_fail(node.clone()); }
126
127 void PolyBuilder::visit(const MembershipNode& node) { represent_as_aux_or_fail(node.clone()); }
128
129 void PolyBuilder::visit(const QuantityNode& node) { represent_as_aux_or_fail(node.clone()); }
130
132 represent_as_aux_or_fail(node.clone());
133 }
134
135 void PolyBuilder::visit(const LimitNode& node) {
136 represent_as_aux_or_fail(node.clone());
137 }
138
139 void PolyBuilder::visit(const RootOfNode& node) {
140 represent_as_aux_or_fail(node.clone());
141 }
142
143
144 Poly to_poly(const SymbolicExpr& expr, PolyContext& ctx) {
145 PolyBuilder b(ctx.ext_vars, ctx);
146 LMCAS::detail::node(expr)->accept(b);
147 return b.get_result();
148 }
149
150}
复数节点,表示 real + imag * i。
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
矩阵节点,支持稠密和稀疏两种存储方式。
分段函数节点,表示条件分支表达式.
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换.
RewriteBudget * rewrite_budget() const noexcept
bool function_depends_on_variables(const FunctionNode &node) const
size_t get_or_create_aux_var(const std::shared_ptr< const SymbolicNode > &node)
std::unordered_map< std::string, size_t > & transcendental_map
std::unordered_map< size_t, std::shared_ptr< const SymbolicNode > > * aux_to_node
void visit(const NumberNode &node) override
void represent_as_aux_or_fail(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Poly to_poly(const SymbolicExpr &expression, PolyContext &context)
const std::string & variable
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
const MultiPoly & b
void add_term(const Monomial &monomial, const Rational &coefficient)