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

函数

static bool cholesky_decomposition_impl (const std::shared_ptr< SymbolicExpr > &A, std::shared_ptr< SymbolicExpr > &L)
Result< void > prove_exact_spd (const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context, const std::string &operation)

函数说明

◆ cholesky_decomposition_impl()

bool LMCAS::anonymous_namespace{matrix_decomposition_cholesky.cpp}::cholesky_decomposition_impl ( const std::shared_ptr< SymbolicExpr > & A,
std::shared_ptr< SymbolicExpr > & L )
static

在文件 matrix_decomposition_cholesky.cpp 第 52 行定义.

54 {
55 auto mat = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(A));
56 if (!mat || mat->rows() != mat->cols()) return false;
57 size_t n = mat->rows();
58 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> L_grid(n, std::vector<std::shared_ptr<SymbolicExpr>>(n, SymbolicExpr::number(0)));
59 for (size_t i = 0; i < n; i++) {
60 for (size_t j = 0; j <= i; j++) {
61 auto sum = SymbolicExpr::number(0);
62 for (size_t k = 0; k < j; k++) sum = SymbolicExpr::add(sum, SymbolicExpr::multiply(L_grid[i][k], L_grid[j][k]));
63 auto a_ij = LMCAS::detail::make_expression_ptr(mat->get(i, j));
64 auto diff = SymbolicExpr::add(a_ij, SymbolicExpr::multiply(SymbolicExpr::number(-1), sum));
65 if (i == j) L_grid[i][j] = SymbolicExpr::sqrt(diff);
66 else L_grid[i][j] = SymbolicExpr::divide(diff, L_grid[j][j]);
67 }
68 }
69 L = SymbolicExpr::matrix(L_grid);
70 return true;
71}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept

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

被这些函数引用 cholesky_decomposition_impl().

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

◆ prove_exact_spd()

Result< void > LMCAS::anonymous_namespace{matrix_decomposition_cholesky.cpp}::prove_exact_spd ( const std::shared_ptr< const MatrixNode > & matrix,
ComputationContext & context,
const std::string & operation )

在文件 matrix_decomposition_cholesky.cpp 第 10 行定义.

13 {
14 auto values = exact_rational_matrix(matrix, context);
15 if (!values) {
18 "Cholesky input is outside the exact rational SPD support domain",
19 operation);
20 }
21 const size_t n = values->size();
22 for (size_t row = 0; row < n; ++row) {
23 for (size_t col = row + 1; col < n; ++col) {
24 if ((*values)[row][col] != (*values)[col][row]) {
27 "Cholesky input must be symmetric",
28 operation);
29 }
30 }
31 }
32 for (size_t order = 1; order <= n; ++order) {
33 std::vector<Rational> leading;
34 leading.reserve(order * order);
35 for (size_t row = 0; row < order; ++row) {
36 for (size_t col = 0; col < order; ++col) {
37 leading.push_back((*values)[row][col]);
38 }
39 }
40 auto determinant = detail::rational_determinant_exact(
41 order, std::move(leading), context, operation);
42 if (!determinant) return Result<void>::failure(determinant.error());
43 if (determinant.value() <= Rational(0)) {
46 "Cholesky input is not positive definite",
47 operation);
48 }
49 }
50 return Result<void>::success();
51}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
std::optional< std::vector< std::vector< Rational > > > exact_rational_matrix(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
Result< Rational > rational_determinant_exact(std::size_t dimension, std::vector< Rational > values, ComputationContext &context, const std::string &operation)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::vector< FGLMPoly > const MonomialOrder & order
@ Rational
Rational numbers

引用了 LMCAS::context, LMCAS::DomainError, LMCAS::detail::matrix_decomposition::exact_rational_matrix(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::order, prove_exact_spd(), LMCAS::detail::rational_determinant_exact() , 以及 LMCAS::Result< T >::success().

被这些函数引用 prove_exact_spd().

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