LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::detail::matrix_decomposition 命名空间参考

命名空间

namespace  anonymous_namespace{matrix_decomposition_support.cpp}

函数

std::optional< std::vector< Rational > > exact_diagonal_entries (const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
std::shared_ptr< SymbolicExpr > exact_number_expr (const Rational &value)
std::optional< Rational > exact_rational_expr (const std::shared_ptr< const SymbolicNode > &node)
std::optional< Rational > exact_rational_expr (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
std::optional< std::vector< std::vector< Rational > > > exact_rational_matrix (const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
std::optional< std::vector< Rational > > exact_rectangular_diagonal_entries (const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
std::shared_ptr< SymbolicExpr > identity_matrix_expr (size_t n)
std::shared_ptr< SymbolicExpr > identity_matrix_expr (std::size_t n)
std::shared_ptr< SymbolicExpr > rectangular_diagonal_expr (size_t rows, size_t cols, const std::vector< Rational > &diagonal)
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< void > validate_decomposition_output (const std::shared_ptr< SymbolicExpr > &expr, const std::string &name, const std::string &operation)

函数说明

◆ exact_diagonal_entries()

std::optional< std::vector< Rational > > LMCAS::detail::matrix_decomposition::exact_diagonal_entries ( const std::shared_ptr< const MatrixNode > & matrix,
ComputationContext & context )

在文件 matrix_decomposition_support.cpp 第 172 行定义.

173 {
174 auto values = exact_rational_matrix(matrix, context);
175 if (!values) return std::nullopt;
176 const size_t rows = values->size();
177 const size_t cols = rows == 0 ? 0 : (*values)[0].size();
178 if (rows != cols) return std::nullopt;
179 std::vector<Rational> diagonal(rows, Rational(0));
180 for (size_t row = 0; row < rows; ++row) {
181 for (size_t col = 0; col < cols; ++col) {
182 if (row == col) {
183 diagonal[row] = (*values)[row][col];
184 } else if ((*values)[row][col] != Rational(0)) {
185 return std::nullopt;
186 }
187 }
188 }
189 return diagonal;
190}
std::optional< std::vector< std::vector< Rational > > > exact_rational_matrix(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
std::size_t std::size_t ComputationContext & context

引用了 LMCAS::detail::context, exact_diagonal_entries() , 以及 exact_rational_matrix().

被这些函数引用 LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::diagonalization_checked(), exact_diagonal_entries(), identity_matrix_expr() , 以及 LMCAS::jordan_form_checked().

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

◆ exact_number_expr()

std::shared_ptr< SymbolicExpr > LMCAS::detail::matrix_decomposition::exact_number_expr ( const Rational & value)

在文件 matrix_decomposition_support.cpp 第 114 行定义.

114 {
115 if (value.get_denominator() == BigInt(1)) {
118 }
121}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
const std::string const ExprPtr & value

引用了 exact_number_expr(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node() , 以及 LMCAS::value.

被这些函数引用 exact_number_expr(), LMCAS::jordan_form_checked(), LMCAS::anonymous_namespace{matrix_decomposition.cpp}::maximum_axis_sum(), LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::rational_rows_expression() , 以及 rectangular_diagonal_expr().

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

◆ exact_rational_expr() [1/2]

std::optional< Rational > LMCAS::detail::matrix_decomposition::exact_rational_expr ( const std::shared_ptr< const SymbolicNode > & node)

在文件 matrix_decomposition_support.cpp 第 72 行定义.

72 {
73 if (!node) return std::nullopt;
74 if (auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
76 }
77 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
78 return exact_rational_sum(*add);
79 }
80 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
81 return exact_rational_product(*mul);
82 }
83 if (auto fn = std::dynamic_pointer_cast<const FunctionNode>(node)) {
84 if (fn->type() == FunctionNode::FuncType::Abs && fn->arguments().size() == 1) {
85 auto value = exact_rational_expr(fn->arguments()[0]);
86 if (!value) return std::nullopt;
87 return (*value < Rational(0)) ? (Rational(0) - *value) : *value;
88 }
89 }
90 return std::nullopt;
91}
std::optional< Rational > exact_rational_expr(const std::shared_ptr< const SymbolicNode > &node)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::optional< Rational > exact_rational_value(const NumberNode &number)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::FunctionNode::Abs, LMCAS::add(), exact_rational_expr(), LMCAS::detail::exact_rational_value(), LMCAS::mul(), LMCAS::detail::node() , 以及 LMCAS::value.

被这些函数引用 exact_rational_expr(), exact_rational_expr(), exact_rational_matrix(), LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::exact_rational_product(), LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::exact_rational_sum(), LMCAS::anonymous_namespace{matrix_decomposition.cpp}::matrix_axis_sum(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::quadratic_eigenvalue_sign() , 以及 LMCAS::detail::matrix_decomposition::anonymous_namespace{matrix_decomposition_support.cpp}::simplify_exact_rational_expr().

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

◆ exact_rational_expr() [2/2]

std::optional< Rational > LMCAS::detail::matrix_decomposition::exact_rational_expr ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )

在文件 matrix_decomposition_support.cpp 第 107 行定义.

107 {
108 if (!expr || !LMCAS::detail::node(expr)) return std::nullopt;
109 const auto& node = LMCAS::detail::node(expr);
110 if (auto direct = exact_rational_expr(node)) return direct;
111 return simplify_exact_rational_expr(node, context);
112}

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

函数调用图:

◆ exact_rational_matrix()

std::optional< std::vector< std::vector< Rational > > > LMCAS::detail::matrix_decomposition::exact_rational_matrix ( const std::shared_ptr< const MatrixNode > & matrix,
ComputationContext & context )

在文件 matrix_decomposition_support.cpp 第 123 行定义.

124 {
125 if (!matrix) return std::nullopt;
126 std::vector<std::vector<Rational>> values(
127 matrix->rows(), std::vector<Rational>(matrix->cols(), Rational(0)));
128 for (size_t row = 0; row < matrix->rows(); ++row) {
129 for (size_t col = 0; col < matrix->cols(); ++col) {
130 const auto& node = matrix->get(row, col);
132 if (!value) {
133 value = simplify_exact_rational_expr(node, context);
134 }
135 if (!value) return std::nullopt;
136 values[row][col] = *value;
137 }
138 }
139 return values;
140}

引用了 LMCAS::detail::context, exact_rational_expr(), exact_rational_matrix(), LMCAS::detail::node() , 以及 LMCAS::value.

被这些函数引用 exact_diagonal_entries(), exact_rational_matrix(), exact_rectangular_diagonal_entries(), LMCAS::jordan_form_checked(), LMCAS::lu_decomposition_checked(), LMCAS::anonymous_namespace{matrix_decomposition_qr.cpp}::prove_exact_full_column_rank_qr_support() , 以及 LMCAS::anonymous_namespace{matrix_decomposition_cholesky.cpp}::prove_exact_spd().

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

◆ exact_rectangular_diagonal_entries()

std::optional< std::vector< Rational > > LMCAS::detail::matrix_decomposition::exact_rectangular_diagonal_entries ( const std::shared_ptr< const MatrixNode > & matrix,
ComputationContext & context )

在文件 matrix_decomposition_support.cpp 第 150 行定义.

151 {
152 auto values = exact_rational_matrix(matrix, context);
153 if (!values) return std::nullopt;
154 const size_t rows = values->size();
155 const size_t cols = rows == 0 ? 0 : (*values)[0].size();
156 const size_t diag_count = std::min(rows, cols);
157 std::vector<Rational> diagonal(diag_count, Rational(0));
158 for (size_t row = 0; row < rows; ++row) {
159 for (size_t col = 0; col < cols; ++col) {
160 const bool is_diag = row == col && row < diag_count;
161 if (!is_diag && (*values)[row][col] != Rational(0)) {
162 return std::nullopt;
163 }
164 if (is_diag) {
165 diagonal[row] = (*values)[row][col];
166 }
167 }
168 }
169 return diagonal;
170}

引用了 LMCAS::detail::context, exact_rational_matrix() , 以及 exact_rectangular_diagonal_entries().

被这些函数引用 exact_rectangular_diagonal_entries(), identity_matrix_expr() , 以及 LMCAS::svd_decomposition_checked().

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

◆ identity_matrix_expr() [1/2]

std::shared_ptr< SymbolicExpr > LMCAS::detail::matrix_decomposition::identity_matrix_expr ( size_t n)

在文件 matrix_decomposition_support.cpp 第 141 行定义.

141 {
142 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(
143 n, std::vector<std::shared_ptr<SymbolicExpr>>(n, SymbolicExpr::number(0)));
144 for (size_t i = 0; i < n; ++i) {
145 grid[i][i] = SymbolicExpr::number(1);
146 }
147 return SymbolicExpr::matrix(grid);
148}

引用了 identity_matrix_expr().

函数调用图:

◆ identity_matrix_expr() [2/2]

std::shared_ptr< SymbolicExpr > LMCAS::detail::matrix_decomposition::identity_matrix_expr ( std::size_t n)

引用了 LMCAS::detail::context, exact_diagonal_entries(), exact_rectangular_diagonal_entries() , 以及 identity_matrix_expr().

被这些函数引用 LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::diagonalization_checked(), identity_matrix_expr(), identity_matrix_expr(), LMCAS::jordan_form_checked() , 以及 LMCAS::svd_decomposition_checked().

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

◆ rectangular_diagonal_expr() [1/2]

std::shared_ptr< SymbolicExpr > LMCAS::detail::matrix_decomposition::rectangular_diagonal_expr ( size_t rows,
size_t cols,
const std::vector< Rational > & diagonal )

在文件 matrix_decomposition_support.cpp 第 192 行定义.

195 {
196 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(
197 rows, std::vector<std::shared_ptr<SymbolicExpr>>(cols, SymbolicExpr::number(0)));
198 for (size_t i = 0; i < diagonal.size(); ++i) {
199 grid[i][i] = exact_number_expr(diagonal[i]);
200 }
201 return SymbolicExpr::matrix(grid);
202}
std::shared_ptr< SymbolicExpr > exact_number_expr(const Rational &value)

引用了 exact_number_expr() , 以及 rectangular_diagonal_expr().

函数调用图:

◆ rectangular_diagonal_expr() [2/2]

std::shared_ptr< SymbolicExpr > LMCAS::detail::matrix_decomposition::rectangular_diagonal_expr ( std::size_t rows,
std::size_t cols,
const std::vector< Rational > & diagonal )

引用了 rectangular_diagonal_expr().

被这些函数引用 LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::diagonalization_checked(), LMCAS::jordan_form_checked(), rectangular_diagonal_expr(), rectangular_diagonal_expr() , 以及 LMCAS::svd_decomposition_checked().

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

◆ validate_decomposition_matrix()

Result< std::shared_ptr< const MatrixNode > > LMCAS::detail::matrix_decomposition::validate_decomposition_matrix ( const std::shared_ptr< SymbolicExpr > & A,
bool require_square,
ComputationContext & context,
const std::string & operation )

在文件 matrix_decomposition_support.cpp 第 6 行定义.

11{
12 auto step = context.consume_steps(1, operation);
13 if (!step) return Result<std::shared_ptr<const MatrixNode>>::failure(step.error());
14 if (!A || !LMCAS::detail::node(A)) {
17 "matrix input cannot be null",
18 operation);
19 }
20 auto matrix = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(A));
21 if (!matrix) {
24 "input must be a matrix",
25 operation);
26 }
27 if (require_square && matrix->rows() != matrix->cols()) {
30 "matrix must be square",
31 operation);
32 }
33 return Result<std::shared_ptr<const MatrixNode>>::success(matrix);
34}
ComputationContext const std::string & operation

引用了 LMCAS::detail::context, LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::detail::operation , 以及 validate_decomposition_matrix().

被这些函数引用 LMCAS::cholesky_decomposition_checked(), LMCAS::anonymous_namespace{matrix_decomposition_eigen.cpp}::diagonalization_checked(), LMCAS::jordan_form_checked(), LMCAS::lu_decomposition_checked(), LMCAS::qr_decomposition_checked(), LMCAS::svd_decomposition_checked() , 以及 validate_decomposition_matrix().

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

◆ validate_decomposition_output()

Result< void > LMCAS::detail::matrix_decomposition::validate_decomposition_output ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & name,
const std::string & operation )

在文件 matrix_decomposition_support.cpp 第 36 行定义.

40{
41 if (!expr || !LMCAS::detail::node(expr) ||
42 !std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(expr))) {
45 name + " output is not a matrix",
46 operation);
47 }
48 return Result<void>::success();
49}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name

引用了 LMCAS::Result< T >::failure(), LMCAS::InternalInvariant, LMCAS::name, LMCAS::detail::node(), LMCAS::detail::operation, LMCAS::Result< T >::success() , 以及 validate_decomposition_output().

被这些函数引用 LMCAS::cholesky_decomposition_checked(), LMCAS::qr_decomposition_checked() , 以及 validate_decomposition_output().

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