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

类

struct  QuadraticSigns

函数

JordanDecompositionResult certified_jordan (const ExprPtr &A, JordanDecomposition value, ComputationContext &context)
JordanDecompositionResult diagonalization_checked (const ExprPtr &A, ComputationContext &context)
bool is_defective_upper_pair (const std::vector< std::vector< Rational > > &matrix)
bool jordan_dimensions_match (const MatrixNode &a, const MatrixNode &p, const MatrixNode &j)
std::optional< int > quadratic_eigenvalue_sign (const ExprPtr &eigenvalue, const detail::AssumptionFacts &facts, ComputationContext &context)
std::optional< int > symbolic_quadratic_sign (const ExprPtr &value, const detail::AssumptionFacts &facts, ComputationContext &context)
Result< void > verify_jordan_decomposition (const ExprPtr &A, const JordanDecomposition &value, ComputationContext &context)
Result< void > verify_jordan_identity (const ExprPtr &A, const JordanDecomposition &value, const MatrixNode &matrix, ComputationContext &context, const std::string &operation)

函数说明

◆ certified_jordan()

JordanDecompositionResult LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::certified_jordan ( const ExprPtr & A,
JordanDecomposition value,
ComputationContext & context )

在文件 matrix_decomposition_eigen.cpp 第 70 行定义.

71 {
73 if (!proof) return JordanDecompositionResult::failure(proof.error());
75}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(JordanDecomposition value)
Result< void > verify_jordan_decomposition(const ExprPtr &A, const JordanDecomposition &value, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::string const ExprPtr & value

引用了 certified_jordan(), LMCAS::context, LMCAS::Result< JordanDecomposition >::failure(), LMCAS::Result< JordanDecomposition >::success(), LMCAS::value , 以及 verify_jordan_decomposition().

被这些函数引用 certified_jordan() , 以及 diagonalization_checked().

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

◆ diagonalization_checked()

JordanDecompositionResult LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::diagonalization_checked ( const ExprPtr & A,
ComputationContext & context )

在文件 matrix_decomposition_eigen.cpp 第 77 行定义.

78 {
79 auto matrix = validate_decomposition_matrix(A, true, context, "matrix.diagonalize");
80 if (!matrix) { return JordanDecompositionResult::failure(matrix.error()); }
81 if (auto diagonal = exact_diagonal_entries(matrix.value(), context)) {
82 return certified_jordan(A, {rectangular_diagonal_expr(matrix.value()->rows(),
83 matrix.value()->cols(), *diagonal), identity_matrix_expr(matrix.value()->rows())}, context);
84 }
86 if (!spaces) { return JordanDecompositionResult::failure(spaces.error()); }
87 const auto n = matrix.value()->rows();
88 std::size_t count = 0;
89 for (const auto& space : spaces.value()) { count += space.second.size(); }
90 if (count != n) {
92 "ordinary eigenspaces do not span the matrix", "matrix.diagonalize");
93 }
94 std::vector<std::vector<ExprPtr>> p(n, std::vector<ExprPtr>(n));
95 std::vector<std::vector<ExprPtr>> j(n,
96 std::vector<ExprPtr>(n, SymbolicExpr::number(0)));
97 std::size_t column = 0;
98 for (const auto& space : spaces.value()) {
99 for (const auto& vector : space.second) {
100 if (vector.size() != n) {
102 "eigenspace vector has invalid dimensions", "matrix.diagonalize");
103 }
104 for (std::size_t row = 0; row < n; ++row) { p[row][column] = vector[row]; }
105 j[column][column] = space.first;
106 ++column;
107 }
108 }
109 return certified_jordan(A,
110 {SymbolicExpr::matrix(j), SymbolicExpr::matrix(p)}, context);
111}
JordanDecompositionResult certified_jordan(const ExprPtr &A, JordanDecomposition value, ComputationContext &context)
std::shared_ptr< SymbolicExpr > identity_matrix_expr(std::size_t n)
std::optional< std::vector< Rational > > exact_diagonal_entries(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
std::shared_ptr< SymbolicExpr > rectangular_diagonal_expr(std::size_t rows, std::size_t cols, const std::vector< Rational > &diagonal)
Result< std::shared_ptr< const MatrixNode > > validate_decomposition_matrix(const std::shared_ptr< SymbolicExpr > &A, bool require_square, ComputationContext &context, const std::string &operation)
Result< std::vector< std::pair< ExprPtr, std::vector< std::vector< ExprPtr > > > > > matrix_eigenspaces_checked(const ExprPtr &matrix, ComputationContext &context)

引用了 certified_jordan(), LMCAS::context, diagonalization_checked(), LMCAS::detail::matrix_decomposition::exact_diagonal_entries(), LMCAS::Result< JordanDecomposition >::failure(), LMCAS::detail::matrix_decomposition::identity_matrix_expr(), LMCAS::Inconclusive, LMCAS::InternalInvariant, LMCAS::detail::matrix_eigenspaces_checked(), LMCAS::detail::matrix_decomposition::rectangular_diagonal_expr() , 以及 LMCAS::detail::matrix_decomposition::validate_decomposition_matrix().

被这些函数引用 diagonalization_checked().

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

◆ is_defective_upper_pair()

bool LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::is_defective_upper_pair ( const std::vector< std::vector< Rational > > & matrix)

在文件 matrix_decomposition_eigen.cpp 第 157 行定义.

157 {
158 return matrix.size() == 2 && matrix[0].size() == 2 &&
159 matrix[0][0] == matrix[1][1] && matrix[1][0] == Rational(0) &&
160 matrix[0][1] != Rational(0);
161}

引用了 is_defective_upper_pair().

被这些函数引用 is_defective_upper_pair().

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

◆ jordan_dimensions_match()

bool LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::jordan_dimensions_match ( const MatrixNode & a,
const MatrixNode & p,
const MatrixNode & j )

在文件 matrix_decomposition_eigen.cpp 第 45 行定义.

46 {
47 return a.rows() == a.cols() && p.rows() == a.rows() && p.cols() == a.cols() &&
48 j.rows() == a.rows() && j.cols() == a.cols();
49}
size_t cols() const noexcept
size_t rows() const noexcept
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a

引用了 LMCAS::a, LMCAS::MatrixNode::cols(), jordan_dimensions_match() , 以及 LMCAS::MatrixNode::rows().

被这些函数引用 jordan_dimensions_match() , 以及 verify_jordan_decomposition().

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

◆ quadratic_eigenvalue_sign()

std::optional< int > LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::quadratic_eigenvalue_sign ( const ExprPtr & eigenvalue,
const detail::AssumptionFacts & facts,
ComputationContext & context )

在文件 matrix_decomposition_eigen.cpp 第 146 行定义.

147 {
148 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
149 (context).limits().max_ast_nodes, "transform");
150 auto value = detail::make_expression_ptr(detail::normalize_node(detail::node(eigenvalue), transform_budget));
152 return *rational > Rational(0) ? 1 : (*rational < Rational(0) ? -1 : 0);
153 }
154 return symbolic_quadratic_sign(value, facts, context);
155}
std::optional< int > symbolic_quadratic_sign(const ExprPtr &value, const detail::AssumptionFacts &facts, ComputationContext &context)
std::optional< Rational > exact_rational_expr(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
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
ExprResult rational(const Rational &value)

引用了 LMCAS::context, LMCAS::detail::matrix_decomposition::exact_rational_expr(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), quadratic_eigenvalue_sign(), LMCAS::rational(), symbolic_quadratic_sign() , 以及 LMCAS::value.

被这些函数引用 quadratic_eigenvalue_sign().

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

◆ symbolic_quadratic_sign()

std::optional< int > LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::symbolic_quadratic_sign ( const ExprPtr & value,
const detail::AssumptionFacts & facts,
ComputationContext & context )

在文件 matrix_decomposition_eigen.cpp 第 130 行定义.

131 {
133 if (!real || real.value() != Tribool::True) { return std::nullopt; }
134 auto zero = detail::classify_exact_zero(value, context, "matrix.quadratic_sign");
135 if (!zero) { return std::nullopt; }
136 if (zero.value() == detail::ZeroProof::Zero) { return 0; }
137 auto positive = detail::query_positive_value(detail::node(value), facts, context);
138 if (!positive) { return std::nullopt; }
139 if (positive.value() == Tribool::True) { return 1; }
140 auto negative_value = SymbolicExpr::multiply(SymbolicExpr::number(-1), value);
141 auto negative = detail::query_positive_value(detail::node(negative_value), facts, context);
142 if (!negative || negative.value() != Tribool::True) { return std::nullopt; }
143 return -1;
144}
Result< ZeroProof > classify_exact_zero(const ExprPtr &expression, ComputationContext &context, const std::string &operation)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
@ True
Property definitely holds

引用了 LMCAS::detail::classify_exact_zero(), LMCAS::context, LMCAS::detail::node(), LMCAS::detail::query_positive_value(), LMCAS::detail::query_real_value(), LMCAS::real(), symbolic_quadratic_sign(), LMCAS::True, LMCAS::Result< T >::value(), LMCAS::value , 以及 LMCAS::detail::Zero.

被这些函数引用 quadratic_eigenvalue_sign() , 以及 symbolic_quadratic_sign().

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

◆ verify_jordan_decomposition()

Result< void > LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_decomposition ( const ExprPtr & A,
const JordanDecomposition & value,
ComputationContext & context )

在文件 matrix_decomposition_eigen.cpp 第 51 行定义.

52 {
53 const std::string operation = "jordan_form.verify";
54 auto a = std::dynamic_pointer_cast<const MatrixNode>(detail::node(A));
55 auto p = std::dynamic_pointer_cast<const MatrixNode>(detail::node(value.P));
56 auto j = std::dynamic_pointer_cast<const MatrixNode>(detail::node(value.J));
57 if (!a || !p || !j || !jordan_dimensions_match(*a, *p, *j)) {
59 "Jordan certificate has invalid dimensions", operation);
60 }
61 auto rank = matrix_rank_checked(value.P, context);
62 if (!rank) { return Result<void>::failure(rank.error()); }
63 if (rank.value() != a->rows()) {
65 "Jordan change of basis is singular", operation);
66 }
67 return verify_jordan_identity(A, value, *a, context, operation);
68}
Result< void > verify_jordan_identity(const ExprPtr &A, const JordanDecomposition &value, const MatrixNode &matrix, ComputationContext &context, const std::string &operation)
bool jordan_dimensions_match(const MatrixNode &a, const MatrixNode &p, const MatrixNode &j)
MatrixRankResult matrix_rank_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 LMCAS::a, LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InternalInvariant, jordan_dimensions_match(), LMCAS::matrix_rank_checked(), LMCAS::detail::node(), LMCAS::value, verify_jordan_decomposition() , 以及 verify_jordan_identity().

被这些函数引用 certified_jordan() , 以及 verify_jordan_decomposition().

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

◆ verify_jordan_identity()

Result< void > LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::verify_jordan_identity ( const ExprPtr & A,
const JordanDecomposition & value,
const MatrixNode & matrix,
ComputationContext & context,
const std::string & operation )

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

15 {
16 auto ap = matrix_multiply_checked(A, value.P, context);
17 if (!ap) { return Result<void>::failure(ap.error()); }
19 if (!pj) { return Result<void>::failure(pj.error()); }
20 auto left = std::dynamic_pointer_cast<const MatrixNode>(detail::node(ap.value()));
21 auto right = std::dynamic_pointer_cast<const MatrixNode>(detail::node(pj.value()));
22 if (!left || !right) {
24 "Jordan matrix product did not produce a matrix", operation);
25 }
26 for (std::size_t row = 0; row < matrix.rows(); ++row) {
27 for (std::size_t col = 0; col < matrix.cols(); ++col) {
28 auto difference = SymbolicExpr::add(detail::make_expression_ptr(left->get(row, col)),
29 SymbolicExpr::multiply(SymbolicExpr::number(-1),
30 detail::make_expression_ptr(right->get(row, col))));
31 auto proof = detail::classify_exact_zero(difference, context, operation);
32 if (!proof) { return Result<void>::failure(proof.error()); }
33 if (proof.value() != detail::ZeroProof::Zero) {
36 "Jordan intertwining identity is not proved at (" +
37 std::to_string(row) + "," + std::to_string(col) +
38 "): " + difference->to_string(), operation);
39 }
40 }
41 }
42 return Result<void>::success();
43}
ExpressionResult matrix_multiply_checked(const std::shared_ptr< SymbolicExpr > &A, const std::shared_ptr< SymbolicExpr > &B, ComputationContext &context)
const ExprPtr & right

引用了 LMCAS::detail::classify_exact_zero(), LMCAS::MatrixNode::cols(), LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::matrix_multiply_checked(), LMCAS::detail::node(), LMCAS::right, LMCAS::MatrixNode::rows(), LMCAS::Result< T >::success(), LMCAS::detail::Unknown, LMCAS::value, verify_jordan_identity() , 以及 LMCAS::detail::Zero.

被这些函数引用 verify_jordan_decomposition() , 以及 verify_jordan_identity().

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