LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
matrix_decomposition_lu.cpp
浏览该文件的文档.
1
#include "
internal/matrix_decomposition_support.hpp
"
2
3
#include <algorithm>
4
#include <new>
5
6
namespace
LMCAS
{
7
using namespace
detail::matrix_decomposition
;
8
namespace
{
9
using
RationalRows
= std::vector<std::vector<Rational>>;
10
11
void
eliminate_lu_column
(
RationalRows
&
lower
,
RationalRows
&
upper
,
12
std::size_t column) {
13
const
std::size_t n =
upper
.size();
14
for
(std::size_t row = column + 1; row < n; ++row) {
15
const
Rational multiplier =
16
upper
[row][column] /
upper
[column][column];
17
lower
[row][column] = multiplier;
18
for
(std::size_t col = column; col < n; ++col) {
19
upper
[row][col] =
20
upper
[row][col] -
21
multiplier *
upper
[column][col];
22
}
23
}
24
}
25
26
Result<void>
factor_lu
(
RationalRows
&
lower
,
RationalRows
&
upper
,
27
RationalRows
& permutation,
const
std::string& operation) {
28
const
std::size_t n =
upper
.size();
29
for
(std::size_t i = 0; i < n; ++i) {
30
lower
[i][i] = Rational(1);
31
permutation[i][i] = Rational(1);
32
}
33
for
(std::size_t column = 0; column < n; ++column) {
34
std::size_t pivot = column;
35
while
(pivot < n &&
upper
[pivot][column] == Rational(0)) ++pivot;
36
if
(pivot == n) {
37
return
Result<void>::failure
(
38
CasErrc::DomainError
,
39
"PLU decomposition requires a nonsingular matrix"
,
40
operation);
41
}
42
if
(pivot != column) {
43
std::swap(
upper
[pivot],
upper
[column]);
44
std::swap(permutation[pivot], permutation[column]);
45
for
(std::size_t prior = 0; prior < column; ++prior) {
46
std::swap(
lower
[pivot][prior],
lower
[column][prior]);
47
}
48
}
49
eliminate_lu_column
(
lower
,
upper
, column);
50
}
51
return
Result<void>::success
();
52
}
53
54
std::shared_ptr<SymbolicExpr>
rational_rows_expression
(
const
RationalRows
& input) {
55
const
std::size_t n = input.size();
56
std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(
57
n, std::vector<std::shared_ptr<SymbolicExpr>>(n));
58
for
(std::size_t row = 0; row < n; ++row) {
59
for
(std::size_t col = 0; col < n; ++col) {
60
grid[row][col] =
exact_number_expr
(input[row][col]);
61
}
62
}
63
return
SymbolicExpr::matrix(grid);
64
}
65
}
66
67
LUDecompositionResult
lu_decomposition_checked
(
68
const
std::shared_ptr<SymbolicExpr>& A,
69
ComputationContext
&
context
)
70
{
71
const
std::string operation =
"lu_decomposition"
;
72
auto
matrix =
validate_decomposition_matrix
(A,
true
,
context
, operation);
73
if
(!matrix)
return
LUDecompositionResult::failure
(matrix.error());
74
auto
budget =
context
.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 8 + 8,
75
operation);
76
if
(!budget)
return
LUDecompositionResult::failure
(budget.error());
77
auto
values =
exact_rational_matrix
(matrix.value(),
context
);
78
if
(!values) {
79
return
LUDecompositionResult::failure
(
80
CasErrc::Inconclusive
,
81
"exact PLU requires a rational matrix or proved symbolic pivots"
,
82
operation);
83
}
84
try
{
85
const
std::size_t n = values->size();
86
auto
U_values = *values;
87
std::vector<std::vector<Rational>> L_values(
88
n, std::vector<Rational>(n, Rational(0)));
89
std::vector<std::vector<Rational>> P_values(
90
n, std::vector<Rational>(n, Rational(0)));
91
auto
factored = factor_lu(L_values, U_values, P_values, operation);
92
if
(!factored)
return
LUDecompositionResult::failure
(factored.error());
93
return
LUDecompositionResult::success
(
LUDecomposition
{
94
rational_rows_expression(P_values),
95
rational_rows_expression(L_values),
96
rational_rows_expression(U_values)});
97
}
catch
(
const
std::bad_alloc&) {
98
return
LUDecompositionResult::failure
(
CasErrc::ResourceLimit
,
99
"allocation failed while calculating LU decomposition"
,
100
operation);
101
}
catch
(
const
std::exception& ex) {
102
return
LUDecompositionResult::failure
(
CasErrc::InternalInvariant
,
103
ex.what(),
104
operation);
105
}
106
}
107
LUDecompositionResult
lu_decomposition_checked
(
108
const
std::shared_ptr<SymbolicExpr>& A)
109
{
110
ComputationContext
context
;
111
return
lu_decomposition_checked
(A,
context
);
112
}
113
114
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Result
定义
result.hpp:39
LMCAS::Result::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::Result::success
static Result success(T value)
定义
result.hpp:48
matrix_decomposition_support.hpp
LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::factor_lu
Result< void > factor_lu(RationalRows &lower, RationalRows &upper, RationalRows &permutation, const std::string &operation)
定义
matrix_decomposition_lu.cpp:26
LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::RationalRows
std::vector< std::vector< Rational > > RationalRows
定义
matrix_decomposition_lu.cpp:9
LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::rational_rows_expression
std::shared_ptr< SymbolicExpr > rational_rows_expression(const RationalRows &input)
定义
matrix_decomposition_lu.cpp:54
LMCAS::anonymous_namespace{matrix_decomposition_lu.cpp}::eliminate_lu_column
void eliminate_lu_column(RationalRows &lower, RationalRows &upper, std::size_t column)
定义
matrix_decomposition_lu.cpp:11
LMCAS::detail::matrix_decomposition
定义
matrix_decomposition_support.hpp:9
LMCAS::detail::matrix_decomposition::exact_number_expr
std::shared_ptr< SymbolicExpr > exact_number_expr(const Rational &value)
定义
matrix_decomposition_support.cpp:114
LMCAS::detail::matrix_decomposition::validate_decomposition_matrix
Result< std::shared_ptr< const MatrixNode > > validate_decomposition_matrix(const std::shared_ptr< SymbolicExpr > &A, bool require_square, ComputationContext &context, const std::string &operation)
定义
matrix_decomposition_support.cpp:6
LMCAS::detail::matrix_decomposition::exact_rational_matrix
std::optional< std::vector< std::vector< Rational > > > exact_rational_matrix(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
定义
matrix_decomposition_support.cpp:123
LMCAS
定义
assumption.hpp:11
LMCAS::LUDecompositionResult
Result< LUDecomposition > LUDecompositionResult
定义
matrix_decomposition.hpp:41
LMCAS::upper
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
定义
expr.hpp:148
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::lower
const ExprPtr & lower
定义
expr.hpp:255
LMCAS::CasErrc::Inconclusive
@ Inconclusive
定义
result.hpp:24
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::CasErrc::DomainError
@ DomainError
定义
result.hpp:16
LMCAS::lu_decomposition_checked
LUDecompositionResult lu_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
定义
matrix_decomposition_lu.cpp:67
LMCAS::LUDecomposition
定义
matrix_decomposition.hpp:15
src
matrix_decomposition_lu.cpp
生成于
, 为 LMCAS使用
1.18.0