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

类型定义

using SymbolicMatrix

函数

bool independent_of_variables (const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &variables)
std::vector< std::shared_ptr< SymbolicExpr > > make_variables (const std::vector< std::string > &names)
std::optional< SymbolicMatrix > quadratic_coefficients (const std::shared_ptr< SymbolicExpr > &expanded, const std::vector< std::string > &variables, ComputationContext &context)
std::shared_ptr< SymbolicExpr > reconstruct_quadratic_form (const std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > &matrix, const std::vector< std::shared_ptr< SymbolicExpr > > &variables)
bool reconstructs_expression (const std::shared_ptr< SymbolicExpr > &expanded, const SymbolicMatrix &matrix, const std::vector< std::shared_ptr< SymbolicExpr > > &variables, ComputationContext &context)
bool valid_variables (const std::vector< std::string > &variables)

类型定义说明

◆ SymbolicMatrix

using LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::SymbolicMatrix
初始值:
std::vector<std::vector<std::shared_ptr<SymbolicExpr>>>

在文件 matrix_quadratic_form.cpp 第 53 行定义.

函数说明

◆ independent_of_variables()

bool LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::independent_of_variables ( const std::shared_ptr< SymbolicExpr > & expression,
const std::vector< std::string > & variables )

在文件 matrix_quadratic_form.cpp 第 24 行定义.

26 {
27 if (!expression || !detail::node(expression)) return false;
28 for (const auto& variable : variables) {
30 detail::node(expression), variable)) {
31 return false;
32 }
33 }
34 return true;
35}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
const std::string & variable
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)

引用了 LMCAS::expression_depends_on_variable(), independent_of_variables(), LMCAS::detail::node() , 以及 LMCAS::variable.

被这些函数引用 independent_of_variables() , 以及 quadratic_coefficients().

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

◆ make_variables()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::make_variables ( const std::vector< std::string > & names)

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

57 {
58 std::vector<std::shared_ptr<SymbolicExpr>> variables;
59 variables.reserve(names.size());
60 for (const auto& name : names) {
61 variables.push_back(SymbolicExpr::variable(name));
62 }
63 return variables;
64}
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name

引用了 make_variables() , 以及 LMCAS::name.

被这些函数引用 make_variables().

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

◆ quadratic_coefficients()

std::optional< SymbolicMatrix > LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::quadratic_coefficients ( const std::shared_ptr< SymbolicExpr > & expanded,
const std::vector< std::string > & variables,
ComputationContext & context )

在文件 matrix_quadratic_form.cpp 第 66 行定义.

68 {
69
70 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
71 (context).limits().max_ast_nodes, "transform");
72 const auto half = SymbolicExpr::number(Rational(1, 2));
73 SymbolicMatrix matrix(
74 variables.size(),
75 std::vector<std::shared_ptr<SymbolicExpr>>(variables.size()));
76 for (std::size_t row = 0; row < variables.size(); ++row) {
77 auto first_derivative = detail::make_expression_ptr(detail::differentiate_node(detail::node(expanded), variables[row], transform_budget));
78 if (!first_derivative) {
79 return std::nullopt;
80 }
81 for (std::size_t column = 0; column < variables.size(); ++column) {
82 auto second_derivative =
83 detail::make_expression_ptr(detail::differentiate_node(detail::node(first_derivative), variables[column], transform_budget));
84 if (!second_derivative) {
85 return std::nullopt;
86 }
87 auto coefficient =
88 detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(half, second_derivative)), transform_budget));
89 if (!independent_of_variables(coefficient, variables)) {
90 return std::nullopt;
91 }
92 matrix[row][column] = std::move(coefficient);
93 }
94 }
95 return matrix;
96}
std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > SymbolicMatrix
bool independent_of_variables(const std::shared_ptr< SymbolicExpr > &expression, const std::vector< std::string > &variables)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
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< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 LMCAS::context, LMCAS::detail::differentiate_node(), independent_of_variables(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 quadratic_coefficients().

被这些函数引用 quadratic_coefficients().

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

◆ reconstruct_quadratic_form()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::reconstruct_quadratic_form ( const std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > & matrix,
const std::vector< std::shared_ptr< SymbolicExpr > > & variables )

在文件 matrix_quadratic_form.cpp 第 37 行定义.

39 {
40 auto reconstructed = SymbolicExpr::number(0);
41 for (std::size_t row = 0; row < matrix.size(); ++row) {
42 for (std::size_t column = 0; column < matrix.size(); ++column) {
43 if (detail::node(matrix[row][column])->is_zero()) continue;
44 auto term = SymbolicExpr::multiply(
45 matrix[row][column],
46 SymbolicExpr::multiply(variables[row], variables[column]));
47 reconstructed = SymbolicExpr::add(reconstructed, term);
48 }
49 }
50 return reconstructed;
51}

引用了 LMCAS::detail::node() , 以及 reconstruct_quadratic_form().

被这些函数引用 reconstruct_quadratic_form() , 以及 reconstructs_expression().

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

◆ reconstructs_expression()

bool LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::reconstructs_expression ( const std::shared_ptr< SymbolicExpr > & expanded,
const SymbolicMatrix & matrix,
const std::vector< std::shared_ptr< SymbolicExpr > > & variables,
ComputationContext & context )

在文件 matrix_quadratic_form.cpp 第 98 行定义.

101 {
102
103 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
104 (context).limits().max_ast_nodes, "transform");
105 auto reconstructed = reconstruct_quadratic_form(matrix, variables);
106 auto residual = SymbolicExpr::add(
107 expanded,
108 SymbolicExpr::multiply(
109 SymbolicExpr::number(-1), reconstructed));
110 residual = detail::make_expression_ptr(detail::expand_node(detail::node(residual), transform_budget));
111 if (residual) {
112 residual = detail::make_expression_ptr(detail::normalize_node(detail::node(residual), transform_budget));
113 }
114 return residual && detail::node(residual) &&
115 detail::node(residual)->is_zero();
116}
std::shared_ptr< SymbolicExpr > reconstruct_quadratic_form(const std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > &matrix, const std::vector< std::shared_ptr< SymbolicExpr > > &variables)
SymbolicNodePtr expand_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 LMCAS::context, LMCAS::detail::expand_node(), LMCAS::SymbolicNode::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), reconstruct_quadratic_form() , 以及 reconstructs_expression().

被这些函数引用 reconstructs_expression().

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

◆ valid_variables()

bool LMCAS::anonymous_namespace{matrix_quadratic_form.cpp}::valid_variables ( const std::vector< std::string > & variables)

在文件 matrix_quadratic_form.cpp 第 13 行定义.

13 {
14 if (variables.empty()) return false;
15 for (std::size_t index = 0; index < variables.size(); ++index) {
16 if (variables[index].empty()) return false;
17 for (std::size_t previous = 0; previous < index; ++previous) {
18 if (variables[index] == variables[previous]) return false;
19 }
20 }
21 return true;
22}

引用了 valid_variables().

被这些函数引用 valid_variables().

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