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

类

class  ParametricBranchSolver

类型定义

using ParametricAssignment = std::map<std::string, std::shared_ptr<SymbolicExpr>>
using ParametricBasis = std::vector<std::shared_ptr<SymbolicExpr>>

函数

bool depends_on_remaining_unknown (const SymbolicExpr &expression, const std::vector< std::string > &unknowns, int last)
ParametricSolutionList free_unknowns (const std::vector< std::string > &unknowns)
Result< Tribool > parameter_constraint (const ExprPtr &expression, ComputationContext &context)
ParametricBasis parametric_basis (const std::vector< SymbolicExpr > &input_polys, const std::vector< std::string > &unknowns, ComputationContext &context)
std::vector< SymbolicExpr > parametric_input_polynomials (const std::vector< std::shared_ptr< SymbolicExpr > > &equations, ComputationContext &context)
std::shared_ptr< SymbolicExpr > substitute_assignment (const std::shared_ptr< SymbolicExpr > &expression, const ParametricAssignment &assignment, ComputationContext &context)

类型定义说明

◆ ParametricAssignment

using LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricAssignment = std::map<std::string, std::shared_ptr<SymbolicExpr>>

在文件 parametric_solver_branches.cpp 第 15 行定义.

◆ ParametricBasis

using LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBasis = std::vector<std::shared_ptr<SymbolicExpr>>

在文件 parametric_solver_branches.cpp 第 16 行定义.

函数说明

◆ depends_on_remaining_unknown()

bool LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::depends_on_remaining_unknown ( const SymbolicExpr & expression,
const std::vector< std::string > & unknowns,
int last )

在文件 parametric_solver_branches.cpp 第 75 行定义.

77 {
78 for (int index = 0; index <= last && index < static_cast<int>(unknowns.size()); ++index) {
79 if (contains(expression, unknowns[index])) {
80 return true;
81 }
82 }
83 return false;
84}
bool contains(const SymbolicExpr &expression, const std::string &variable)

引用了 LMCAS::contains() , 以及 depends_on_remaining_unknown().

被这些函数引用 depends_on_remaining_unknown(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::reduce_basis() , 以及 LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::select_target().

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

◆ free_unknowns()

ParametricSolutionList LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::free_unknowns ( const std::vector< std::string > & unknowns)

在文件 parametric_solver_branches.cpp 第 32 行定义.

32 {
33 ParametricAssignment solution;
34 for (const auto& variable : unknowns) solution[variable] = SymbolicExpr::variable(variable);
35 return {std::move(solution)};
36}
std::map< std::string, std::shared_ptr< SymbolicExpr > > ParametricAssignment
const std::string & variable

引用了 free_unknowns() , 以及 LMCAS::variable.

被这些函数引用 free_unknowns().

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

◆ parameter_constraint()

Result< Tribool > LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parameter_constraint ( const ExprPtr & expression,
ComputationContext & context )

在文件 parametric_solver_branches.cpp 第 18 行定义.

18 {
19 std::optional<detail::AssumptionFacts> assumptions;
20 if (context.assumptions()) { assumptions.emplace(*context.assumptions()); }
21 const FactsQuery& facts = assumptions ? static_cast<const FactsQuery&>(*assumptions) : detail::no_facts();
22 auto nonzero = detail::query_nonzero_value(detail::node(expression), facts, Domain::Complex, context);
23 if (!nonzero) { return Result<Tribool>::failure(nonzero.error()); }
24 if (nonzero.value() == Tribool::True) { return Tribool::False; }
25 if (nonzero.value() == Tribool::False) { return Tribool::True; }
26 auto residual = check_zero_residual(expression, context);
27 if (!residual) { return Result<Tribool>::failure(residual.error()); }
28 return std::holds_alternative<ProvedZeroResidual>(residual.value()) ?
30}
static Result failure(CasErrc code, std::string message, std::string operation={})
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const FactsQuery & no_facts() noexcept
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Complex
Complex numbers (default, least specific)
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
ResidualCheckResult check_zero_residual(const ExprPtr &residual, ComputationContext &context, const LMCAS::EqvOptions &options)

引用了 LMCAS::check_zero_residual(), LMCAS::Complex, LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::False, LMCAS::detail::no_facts(), LMCAS::detail::node(), parameter_constraint(), LMCAS::detail::query_nonzero_value(), LMCAS::True , 以及 LMCAS::Unknown.

被这些函数引用 parameter_constraint(), LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::reduce_basis() , 以及 LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::select_target().

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

◆ parametric_basis()

ParametricBasis LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parametric_basis ( const std::vector< SymbolicExpr > & input_polys,
const std::vector< std::string > & unknowns,
ComputationContext & context )

在文件 parametric_solver_branches.cpp 第 56 行定义.

57 {
58
59 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
60 (context).limits().max_ast_nodes, "transform");
61 auto G_basis = Solver::groebner_basis(input_polys, unknowns);
62
63 std::vector<std::shared_ptr<SymbolicExpr>> basis;
64 basis.reserve(G_basis.size());
65 for (const auto& g : G_basis) {
67 auto simp = detail::make_expression_ptr(detail::normalize_node(detail::node(g_ptr), transform_budget));
68 if (simp && !simp->is_zero()) {
69 basis.push_back(simp);
70 }
71 }
72 return basis;
73}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::vector< FGLMPoly > & basis

引用了 LMCAS::basis, LMCAS::context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 parametric_basis().

被这些函数引用 parametric_basis().

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

◆ parametric_input_polynomials()

std::vector< SymbolicExpr > LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::parametric_input_polynomials ( const std::vector< std::shared_ptr< SymbolicExpr > > & equations,
ComputationContext & context )

在文件 parametric_solver_branches.cpp 第 38 行定义.

39 {
40
41 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
42 (context).limits().max_ast_nodes, "transform");
43 std::vector<SymbolicExpr> input_polys;
44 input_polys.reserve(equations.size());
45 for (const auto& eq : equations) {
46 if (eq && LMCAS::detail::node(eq)) {
47 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(eq), transform_budget));
48 if (simplified && !simplified->is_zero()) {
49 input_polys.push_back(*simplified);
50 }
51 }
52 }
53 return input_polys;
54}
ExprResult eq(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::context, LMCAS::eq(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 parametric_input_polynomials().

被这些函数引用 parametric_input_polynomials().

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

◆ substitute_assignment()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::substitute_assignment ( const std::shared_ptr< SymbolicExpr > & expression,
const ParametricAssignment & assignment,
ComputationContext & context )

在文件 parametric_solver_branches.cpp 第 86 行定义.

87 {
88
89 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
90 (context).limits().max_ast_nodes, "transform");
91 auto result = expression;
92 for (const auto& [name, value] : assignment) {
94 if (!result) {
95 return nullptr;
96 }
97 }
98 return detail::make_expression_ptr(detail::normalize_node(detail::node(result), transform_budget));
99}
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(), substitute_assignment(), LMCAS::detail::substitute_node() , 以及 LMCAS::value.

被这些函数引用 LMCAS::anonymous_namespace{parametric_solver_branches.cpp}::ParametricBranchSolver::reduce_basis() , 以及 substitute_assignment().

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