LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
solver_groebner_conversion.cpp
浏览该文件的文档.
1
#include "
internal/expression_transform.hpp
"
2
#include "
internal/solver_groebner_builder.hpp
"
3
#include "
internal/expression_analysis.hpp
"
4
5
namespace
LMCAS::groebner_detail
{
6
7
size_t
PolyBuilder::get_or_create_aux_var
(
const
std::shared_ptr<const SymbolicNode>& node) {
8
9
auto
tmp =
LMCAS::detail::expression_from_node
(node);
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
40
bool
PolyBuilder::function_depends_on_variables
(
const
FunctionNode
& node)
const
{
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
49
bool
PolyBuilder::use_numeric_function
(
const
FunctionNode
& node) {
50
auto
expression =
LMCAS::detail::expression_from_node
(
51
LMCAS::detail::make_node<FunctionNode>
(node.type(), node.arguments()));
52
auto
simplified =
detail::make_expression_ptr
(
detail::normalize_node
(
detail::node
(expression), *
rewrite_budget
()));
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
69
void
PolyBuilder::visit
(
const
FunctionNode
& node) {
70
if
(
strict_mode
) {
71
failed
=
true
;
72
return
;
73
}
74
if
(!
function_depends_on_variables
(node) &&
use_numeric_function
(node))
return
;
75
represent_as_aux_or_fail
(
76
LMCAS::detail::make_node<FunctionNode>
(node.type(), node.arguments()));
77
}
78
79
void
PolyBuilder::visit
(
const
UninterpretedFunctionNode
& node) {
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
87
void
PolyBuilder::visit
(
const
RelationalNode
& node) {
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
95
void
PolyBuilder::visit
(
const
PiecewiseNode
& node) {
96
represent_as_aux_or_fail
(node.clone());
97
}
98
99
void
PolyBuilder::visit
(
const
SummationNode
& node) {
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
107
void
PolyBuilder::visit
(
const
TransformNode
& node) {
108
represent_as_aux_or_fail
(node.clone());
109
}
110
111
void
PolyBuilder::visit
(
const
QuantifierNode
& node) {
112
represent_as_aux_or_fail
(node.clone());
113
}
114
115
void
PolyBuilder::visit
(
const
SetBuilderNode
& node) {
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
131
void
PolyBuilder::visit
(
const
IntegralNode
& node) {
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
}
LMCAS::ComplexNode
复数节点,表示 real + imag * i。
定义
numbers.hpp:74
LMCAS::FiniteSetNode
定义
sets.hpp:142
LMCAS::FunctionNode
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
定义
functions.hpp:10
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::MembershipNode
定义
sets.hpp:248
LMCAS::PiecewiseNode
分段函数节点,表示条件分支表达式.
定义
bindings.hpp:12
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::TransformNode
积分变换节点,表示 Laplace,Fourier,Z 变换及其逆变换.
定义
bindings.hpp:251
LMCAS::UninterpretedFunctionNode
定义
functions.hpp:96
LMCAS::detail::SymbolicVisitor::rewrite_budget
RewriteBudget * rewrite_budget() const noexcept
定义
base.hpp:220
LMCAS::groebner_detail::PolyBuilder
定义
solver_groebner_builder.hpp:8
LMCAS::groebner_detail::PolyBuilder::function_depends_on_variables
bool function_depends_on_variables(const FunctionNode &node) const
定义
solver_groebner_conversion.cpp:40
LMCAS::groebner_detail::PolyBuilder::ext_vars
std::vector< std::string > & ext_vars
定义
solver_groebner_builder.hpp:11
LMCAS::groebner_detail::PolyBuilder::get_or_create_aux_var
size_t get_or_create_aux_var(const std::shared_ptr< const SymbolicNode > &node)
定义
solver_groebner_conversion.cpp:7
LMCAS::groebner_detail::PolyBuilder::use_numeric_function
bool use_numeric_function(const FunctionNode &node)
定义
solver_groebner_conversion.cpp:49
LMCAS::groebner_detail::PolyBuilder::vars
std::vector< std::string > vars
定义
solver_groebner_builder.hpp:9
LMCAS::groebner_detail::PolyBuilder::failed
bool failed
定义
solver_groebner_builder.hpp:41
LMCAS::groebner_detail::PolyBuilder::transcendental_map
std::unordered_map< std::string, size_t > & transcendental_map
定义
solver_groebner_builder.hpp:13
LMCAS::groebner_detail::PolyBuilder::aux_to_node
std::unordered_map< size_t, std::shared_ptr< const SymbolicNode > > * aux_to_node
定义
solver_groebner_builder.hpp:15
LMCAS::groebner_detail::PolyBuilder::visit
void visit(const NumberNode &node) override
定义
solver_groebner_builder.cpp:46
LMCAS::groebner_detail::PolyBuilder::result
Poly result
定义
solver_groebner_builder.hpp:16
LMCAS::groebner_detail::PolyBuilder::represent_as_aux_or_fail
void represent_as_aux_or_fail(const std::shared_ptr< const SymbolicNode > &node)
定义
solver_groebner_conversion.cpp:28
LMCAS::groebner_detail::PolyBuilder::strict_mode
bool strict_mode
定义
solver_groebner_builder.hpp:17
expression_analysis.hpp
expression_transform.hpp
LMCAS::detail::make_expression_ptr
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
定义
base.hpp:111
LMCAS::detail::node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
定义
base.hpp:91
LMCAS::detail::expression_from_node
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
定义
base.hpp:107
LMCAS::detail::make_node
std::shared_ptr< const Node > make_node(Args &&... args)
定义
base.hpp:123
LMCAS::detail::normalize_node
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
定义
symbolic_core.cpp:201
LMCAS::groebner_detail
定义
solver_groebner_builder.hpp:6
LMCAS::groebner_detail::to_poly
Poly to_poly(const SymbolicExpr &expression, PolyContext &context)
定义
solver_groebner_conversion.cpp:144
LMCAS::groebner_detail::Monomial
std::vector< int > Monomial
定义
solver_groebner_internal.hpp:16
LMCAS::variable
const std::string & variable
定义
expr.hpp:286
LMCAS::expression_depends_on_variable
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
定义
expression_analysis.cpp:319
LMCAS::b
const MultiPoly & b
定义
multivariate_factor.hpp:92
solver_groebner_builder.hpp
LMCAS::groebner_detail::PolyContext
定义
solver_groebner_internal.hpp:42
LMCAS::groebner_detail::PolyContext::ext_vars
std::vector< std::string > ext_vars
定义
solver_groebner_internal.hpp:43
LMCAS::groebner_detail::Poly
定义
solver_groebner_internal.hpp:28
LMCAS::groebner_detail::Poly::Poly
Poly()
定义
solver_groebner_internal.hpp:33
LMCAS::groebner_detail::Poly::add_term
void add_term(const Monomial &monomial, const Rational &coefficient)
定义
solver_groebner_poly.cpp:31
src
solver_groebner_conversion.cpp
生成于
, 为 LMCAS使用
1.18.0