LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{solver_groebner_system.cpp} 命名空间参考

类

class  PolynomialSystemSearch

类型定义

using Expressions = std::vector<std::shared_ptr<SymbolicExpr>>
using PolynomialSolution = std::map<std::string, SymbolicExpr>
using PolynomialSolutions = std::vector<PolynomialSolution>

函数

std::shared_ptr< SymbolicExpr > clear_denominators (const SymbolicExpr &equation, Expressions &constraints, ComputationContext &context)
Result< groebner_detail::Poly > convert_basis_polynomial (const SymbolicExpr &polynomial, const std::vector< std::string > &variables, groebner_detail::PolyContext &conversion, ComputationContext &context, std::shared_ptr< SymbolicExpr > &simplified)
PolynomialSystemResult filter_denominators (PolynomialSolutions candidates, const Expressions &constraints, ComputationContext &context)
Result< Expressions > simplified_basis (const std::vector< SymbolicExpr > &equations, const std::vector< std::string > &variables, ComputationContext &context)
PolynomialSystemResult solve_polynomial_system_impl (const std::vector< SymbolicExpr > &equations, const std::vector< std::string > &variables, ComputationContext &context)
PolynomialSystemResult solve_single_equation (const SymbolicExpr &equation, const std::string &variable, ComputationContext &context)
std::shared_ptr< SymbolicExpr > substitute_solution (const std::shared_ptr< SymbolicExpr > &expression, const PolynomialSolution &solution, ComputationContext &context)
Result< void > validate_basis_input (const std::vector< SymbolicExpr > &equations, const std::vector< std::string > &variables, groebner_detail::PolyContext &conversion, ComputationContext &context)

类型定义说明

◆ Expressions

using LMCAS::anonymous_namespace{solver_groebner_system.cpp}::Expressions = std::vector<std::shared_ptr<SymbolicExpr>>

在文件 solver_groebner_system.cpp 第 21 行定义.

◆ PolynomialSolution

using LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSolution = std::map<std::string, SymbolicExpr>

在文件 solver_groebner_system.cpp 第 19 行定义.

◆ PolynomialSolutions

using LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSolutions = std::vector<PolynomialSolution>

在文件 solver_groebner_system.cpp 第 20 行定义.

函数说明

◆ clear_denominators()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{solver_groebner_system.cpp}::clear_denominators ( const SymbolicExpr & equation,
Expressions & constraints,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 23 行定义.

24 {
25
26 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
27 (context).limits().max_ast_nodes, "transform");
28 if (!detail::node(equation)) return nullptr;
29 std::vector<std::shared_ptr<const SymbolicNode>> factors;
30 Expressions local_constraints;
31 if (!collect_denominator_factors(detail::node(equation), factors, local_constraints)) {
32 return nullptr;
33 }
34 auto cleared = to_ptr(equation);
35 if (factors.empty()) {
36 cleared = detail::make_expression_ptr(detail::normalize_node(detail::node(cleared), transform_budget));
37 } else if (auto sum = std::dynamic_pointer_cast<const AddNode>(detail::node(cleared))) {
38 std::vector<std::shared_ptr<const SymbolicNode>> terms;
39 terms.reserve(sum->operands().size());
40 for (const auto& term : sum->operands()) {
41 auto product = multiply_no_expand(term, factors);
42 terms.push_back(detail::node(product));
43 }
45 } else {
46 cleared = multiply_no_expand(detail::node(cleared), factors);
47 }
48 if (!cleared || !detail::node(cleared) || !is_polynomial_node(detail::node(cleared))) {
49 return nullptr;
50 }
51 for (const auto& constraint : local_constraints) constraints.push_back(constraint);
52 return cleared;
53}
std::vector< std::shared_ptr< SymbolicExpr > > Expressions
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
bool is_polynomial_node(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr< SymbolicExpr > multiply_no_expand(const std::shared_ptr< const SymbolicNode > &term, const std::vector< std::shared_ptr< const SymbolicNode > > &denominator_factors)
bool collect_denominator_factors(const std::shared_ptr< const SymbolicNode > &node, std::vector< std::shared_ptr< const SymbolicNode > > &denominator_factors, std::vector< std::shared_ptr< SymbolicExpr > > &denominator_constraints)
std::shared_ptr< SymbolicExpr > to_ptr(const SymbolicExpr &expression)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 clear_denominators(), LMCAS::solver_detail::collect_denominator_factors(), LMCAS::context, LMCAS::solver_detail::is_polynomial_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::solver_detail::multiply_no_expand(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::solver_detail::to_ptr().

被这些函数引用 clear_denominators() , 以及 solve_polynomial_system_impl().

函数调用图:
这是这个函数的调用关系图:

◆ convert_basis_polynomial()

Result< groebner_detail::Poly > LMCAS::anonymous_namespace{solver_groebner_system.cpp}::convert_basis_polynomial ( const SymbolicExpr & polynomial,
const std::vector< std::string > & variables,
groebner_detail::PolyContext & conversion,
ComputationContext & context,
std::shared_ptr< SymbolicExpr > & simplified )

在文件 solver_groebner_system.cpp 第 120 行定义.

123 {
124 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
125 (context).limits().max_ast_nodes, "transform");
126 constexpr const char* operation = "solve_polynomial_system";
127 auto budget = context.consume_steps(1, operation);
128 if (!budget) return Result<groebner_detail::Poly>::failure(budget.error());
129 simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(polynomial), transform_budget));
130 if (!simplified) return Result<groebner_detail::Poly>::failure(
131 CasErrc::Inconclusive, "basis polynomial cannot be converted", operation);
132 groebner_detail::PolyBuilder builder(variables, conversion, true);
133 detail::node(simplified)->accept(builder);
134 if (builder.failed) return Result<groebner_detail::Poly>::failure(
135 CasErrc::Inconclusive, "basis polynomial cannot be converted", operation);
136 return builder.get_result();
137} catch (const CasError& error) {
139} catch (const std::bad_alloc&) {
140 return Result<groebner_detail::Poly>::failure(CasErrc::ResourceLimit, "allocation failed", "solve_polynomial_system");
141} catch (const std::length_error& error) {
142 return Result<groebner_detail::Poly>::failure(CasErrc::ResourceLimit, error.what(), "solve_polynomial_system");
143} catch (const std::exception& error) {
144 return Result<groebner_detail::Poly>::failure(CasErrc::InternalInvariant, error.what(), "solve_polynomial_system");
145}
static Result failure(CasErrc code, std::string message, std::string operation={})

引用了 LMCAS::SymbolicNode::accept(), LMCAS::context, convert_basis_polynomial(), LMCAS::groebner_detail::PolyBuilder::failed, LMCAS::Result< T >::failure(), LMCAS::groebner_detail::PolyBuilder::get_result(), LMCAS::Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 convert_basis_polynomial() , 以及 simplified_basis().

函数调用图:
这是这个函数的调用关系图:

◆ filter_denominators()

PolynomialSystemResult LMCAS::anonymous_namespace{solver_groebner_system.cpp}::filter_denominators ( PolynomialSolutions candidates,
const Expressions & constraints,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 68 行定义.

69 {
70 std::optional<detail::AssumptionFacts> adapter;
71 if (context.assumptions()) adapter.emplace(*context.assumptions());
72 const FactsQuery& facts = adapter ? static_cast<const FactsQuery&>(*adapter) : detail::no_facts();
73 PolynomialSolutions filtered;
74 filtered.reserve(candidates.size());
75 for (auto& solution : candidates) {
76 bool valid = true;
77 for (const auto& denominator : constraints) {
78 auto bound = substitute_solution(denominator, solution, context);
80 "denominator substitution failed", "solve_polynomial_system");
82 if (!nonzero) return PolynomialSystemResult::failure(nonzero.error());
83 if (nonzero.value() == Tribool::False) { valid = false; break; }
84 if (nonzero.value() != Tribool::True)
86 "candidate denominator is not proved nonzero", "solve_polynomial_system");
87 }
88 if (valid) filtered.push_back(std::move(solution));
89 }
90 return filtered;
91}
std::shared_ptr< SymbolicExpr > substitute_solution(const std::shared_ptr< SymbolicExpr > &expression, const PolynomialSolution &solution, ComputationContext &context)
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const FactsQuery & no_facts() noexcept
@ Complex
Complex numbers (default, least specific)
@ True
Property definitely holds
@ False
Property definitely does not hold
const ExprPtr & denominator

引用了 LMCAS::Complex, LMCAS::context, LMCAS::denominator, LMCAS::Result< std::vector< std::map< std::string, SymbolicExpr > > >::failure(), LMCAS::False, filter_denominators(), LMCAS::Inconclusive, LMCAS::InternalInvariant, LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::detail::query_nonzero_value(), substitute_solution() , 以及 LMCAS::True.

被这些函数引用 filter_denominators() , 以及 solve_polynomial_system_impl().

函数调用图:
这是这个函数的调用关系图:

◆ simplified_basis()

Result< Expressions > LMCAS::anonymous_namespace{solver_groebner_system.cpp}::simplified_basis ( const std::vector< SymbolicExpr > & equations,
const std::vector< std::string > & variables,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 147 行定义.

149 {
150 constexpr const char* operation = "solve_polynomial_system";
151 groebner_detail::PolyContext conversion(variables, context);
152 auto validated = validate_basis_input(equations, variables, conversion, context);
153 if (!validated) return Result<Expressions>::failure(validated.error());
154 auto groebner = groebner_detail::reduced_groebner_basis_impl(equations, variables, context);
156 std::vector<FGLMPoly> leading;
157 basis.reserve(groebner.size());
158 leading.reserve(groebner.size());
159 for (const auto& polynomial : groebner) {
160 std::shared_ptr<SymbolicExpr> simplified;
161 auto converted = convert_basis_polynomial(polynomial, variables, conversion, context, simplified);
162 if (!converted) return Result<Expressions>::failure(converted.error());
163 if (simplified->is_number() && !simplified->is_zero()) return Expressions{simplified};
164 if (converted.value().is_zero()) continue;
165 FGLMPoly term(variables.size());
166 term.add_term(converted.value().lead_monomial(), converted.value().lead_coeff());
167 leading.push_back(std::move(term));
168 basis.push_back(std::move(simplified));
169 }
170 if (!is_zero_dimensional(leading, variables.size())) {
172 "polynomial system has no certified finite solution set", operation);
173 }
174 return basis;
175}
Result< groebner_detail::Poly > convert_basis_polynomial(const SymbolicExpr &polynomial, const std::vector< std::string > &variables, groebner_detail::PolyContext &conversion, ComputationContext &context, std::shared_ptr< SymbolicExpr > &simplified)
Result< void > validate_basis_input(const std::vector< SymbolicExpr > &equations, const std::vector< std::string > &variables, groebner_detail::PolyContext &conversion, ComputationContext &context)
std::vector< SymbolicExpr > reduced_groebner_basis_impl(const std::vector< SymbolicExpr > &polynomials, const std::vector< std::string > &variables, ComputationContext &context)
bool is_zero_dimensional(const std::vector< FGLMPoly > &basis, size_t num_vars)
const std::vector< FGLMPoly > & basis

引用了 LMCAS::basis, LMCAS::context, convert_basis_polynomial(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::is_zero_dimensional(), LMCAS::groebner_detail::reduced_groebner_basis_impl(), simplified_basis() , 以及 validate_basis_input().

被这些函数引用 simplified_basis() , 以及 solve_polynomial_system_impl().

函数调用图:
这是这个函数的调用关系图:

◆ solve_polynomial_system_impl()

PolynomialSystemResult LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_polynomial_system_impl ( const std::vector< SymbolicExpr > & equations,
const std::vector< std::string > & variables,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 290 行定义.

292 {
293 std::vector<SymbolicExpr> cleared_equations;
294 Expressions constraints;
295 cleared_equations.reserve(equations.size());
296 for (const auto& equation : equations) {
297 auto cleared = clear_denominators(equation, constraints, context);
299 "equation cannot be converted to a polynomial without losing its domain", "solve_polynomial_system");
300 cleared_equations.push_back(*cleared);
301 }
302 if (cleared_equations.size() == 1 && variables.size() == 1) {
303 auto solved = solve_single_equation(cleared_equations[0], variables[0], context);
304 if (!solved) return solved;
305 return filter_denominators(std::move(solved.value()), constraints, context);
306 }
307 auto basis = simplified_basis(cleared_equations, variables, context);
308 if (!basis) return PolynomialSystemResult::failure(basis.error());
309 if (basis.value().size() == 1 && basis.value().front()->is_number() &&
310 !basis.value().front()->is_zero()) return PolynomialSolutions{};
311 PolynomialSystemSearch search(basis.value(), variables, context);
312 auto solved = search.solve(static_cast<int>(variables.size()) - 1, PolynomialSolution{});
313 if (!solved) return solved;
314 return filter_denominators(std::move(solved.value()), constraints, context);
315}
PolynomialSystemResult filter_denominators(PolynomialSolutions candidates, const Expressions &constraints, ComputationContext &context)
Result< Expressions > simplified_basis(const std::vector< SymbolicExpr > &equations, const std::vector< std::string > &variables, ComputationContext &context)
std::shared_ptr< SymbolicExpr > clear_denominators(const SymbolicExpr &equation, Expressions &constraints, ComputationContext &context)
PolynomialSystemResult solve_single_equation(const SymbolicExpr &equation, const std::string &variable, ComputationContext &context)

引用了 LMCAS::basis, clear_denominators(), LMCAS::context, LMCAS::Result< std::vector< std::map< std::string, SymbolicExpr > > >::failure(), filter_denominators(), LMCAS::Inconclusive, simplified_basis(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::solve(), solve_polynomial_system_impl() , 以及 solve_single_equation().

被这些函数引用 solve_polynomial_system_impl().

函数调用图:
这是这个函数的调用关系图:

◆ solve_single_equation()

PolynomialSystemResult LMCAS::anonymous_namespace{solver_groebner_system.cpp}::solve_single_equation ( const SymbolicExpr & equation,
const std::string & variable,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 93 行定义.

95 {
98 if (!solved) return PolynomialSystemResult::failure(solved.error());
99 PolynomialSolutions solutions;
100 for (const auto& root : solved.value()) solutions.push_back({{variable, *root}});
101 return solutions;
102}
const std::string & variable
LMCAS::FiniteSolveResult solve_finite_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
方程求解选项,控制数值求解行为和结果形式.

引用了 LMCAS::context, LMCAS::Result< std::vector< std::map< std::string, SymbolicExpr > > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::solve_finite_checked(), solve_single_equation() , 以及 LMCAS::variable.

被这些函数引用 solve_polynomial_system_impl() , 以及 solve_single_equation().

函数调用图:
这是这个函数的调用关系图:

◆ substitute_solution()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{solver_groebner_system.cpp}::substitute_solution ( const std::shared_ptr< SymbolicExpr > & expression,
const PolynomialSolution & solution,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 55 行定义.

56 {
57
58 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
59 (context).limits().max_ast_nodes, "transform");
60 auto result = expression;
61 for (const auto& [name, value] : solution) {
63 if (!result) return nullptr;
64 }
65 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
66}
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::string const ExprPtr & value
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name

引用了 LMCAS::context, LMCAS::detail::make_expression_ptr(), LMCAS::name, LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::substitute_node(), substitute_solution() , 以及 LMCAS::value.

被这些函数引用 filter_denominators(), LMCAS::anonymous_namespace{solver_groebner_system.cpp}::PolynomialSystemSearch::substitute_basis() , 以及 substitute_solution().

函数调用图:
这是这个函数的调用关系图:

◆ validate_basis_input()

Result< void > LMCAS::anonymous_namespace{solver_groebner_system.cpp}::validate_basis_input ( const std::vector< SymbolicExpr > & equations,
const std::vector< std::string > & variables,
groebner_detail::PolyContext & conversion,
ComputationContext & context )

在文件 solver_groebner_system.cpp 第 104 行定义.

107 {
108 constexpr const char* operation = "solve_polynomial_system";
109 for (const auto& equation : equations) {
110 auto budget = context.consume_steps(1, operation);
111 if (!budget) return Result<void>::failure(budget.error());
112 groebner_detail::PolyBuilder builder(variables, conversion, true);
113 detail::node(equation)->accept(builder);
114 if (builder.failed) return Result<void>::failure(
115 CasErrc::Inconclusive, "equation is not an exact polynomial in the system variables", operation);
116 }
117 return Result<void>::success();
118}
static Result success(T value)

引用了 LMCAS::SymbolicNode::accept(), LMCAS::context, LMCAS::groebner_detail::PolyBuilder::failed, LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 validate_basis_input().

被这些函数引用 simplified_basis() , 以及 validate_basis_input().

函数调用图:
这是这个函数的调用关系图: