22 std::size_t column,
const ExprPtr& pivot_value,
25 for (std::size_t row = pivot_row + 1; row < matrix.
rows; ++row) {
37 for (std::size_t pivot_index = result.
rank; pivot_index-- > 0;) {
38 const std::size_t row = pivot_index;
62 std::size_t pivot_row = 0;
63 for (std::size_t column = 0;
64 column < coefficient_columns && pivot_row < result.
matrix.
rows;
69 if (!pivot.value())
continue;
70 if (*pivot.value() != pivot_row) {
89 std::size_t coefficient_columns,
95 if (coefficient_columns == 0 || coefficient_columns > input.
cols) {
98 "coefficient column count is outside matrix shape",
operation);
102 result.
matrix = std::move(input);
103 auto forward = eliminate_forward(result, coefficient_columns,
context,
operation);
111 }
catch (
const std::bad_alloc&) {
114 "exact elimination allocation failed",
operation);
115 }
catch (
const std::exception& error) {
123 std::size_t coefficient_columns,
127 std::move(input), coefficient_columns,
131 std::move(eliminated.value().matrix));
136 std::size_t coefficient_columns,
140 std::move(input), coefficient_columns,
155 "inverse requires a square matrix",
operation);
157 const std::size_t n = input.
rows;
159 augmented.
entries.reserve(n * 2 * n);
160 for (std::size_t row = 0; row < n; ++row) {
161 for (std::size_t column = 0; column < n; ++column) {
162 augmented.
entries.push_back(input.
at(row, column));
164 for (std::size_t column = 0; column < n; ++column) {
166 SymbolicExpr::number(row == column ? 1 : 0));
170 std::move(augmented), n,
173 if (eliminated.value().rank != n) {
176 "matrix is singular and has no inverse",
operation);
179 inverse.
entries.reserve(n * n);
180 for (std::size_t row = 0; row < n; ++row) {
181 for (std::size_t column = 0; column < n; ++column) {
183 eliminated.value().matrix.at(row, n + column));
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
Result< void > reduce_above(EliminationResult &result, ComputationContext &context, const std::string &operation)
Result< void > eliminate_forward(EliminationResult &result, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)
void subtract_pivot_row(ExactMatrixData &matrix, std::size_t row, std::size_t pivot_row, const ExprPtr &factor, ComputationContext &context)
Result< void > eliminate_below(ExactMatrixData &matrix, std::size_t pivot_row, std::size_t column, const ExprPtr &pivot_value, ComputationContext &context, const std::string &operation)
ExprPtr simplify_expr(ExprPtr expression, ComputationContext &context)
Result< std::optional< std::size_t > > choose_pivot(const ExactMatrixData &matrix, std::size_t first_row, std::size_t column, ComputationContext &context, const std::string &operation)
ExprPtr exact_multiply(const ExprPtr &left, const ExprPtr &right, ComputationContext &context)
ExprPtr exact_subtract(const ExprPtr &left, const ExprPtr &right, ComputationContext &context)
void swap_rows(ExactMatrixData &matrix, std::size_t first, std::size_t second)
Result< void > validate_matrix(const ExactMatrixData &matrix, const std::string &operation)
ExprPtr exact_divide(const ExprPtr &numerator, const ExprPtr &denominator, ComputationContext &context)
Result< EliminationResult > eliminate_exact(ExactMatrixData input, std::size_t coefficient_columns, EliminationForm form, ComputationContext &context, const std::string &operation)
Result< ZeroProof > classify_exact_zero(const ExprPtr &expression, ComputationContext &context, const std::string &operation)
std::vector< std::size_t > pivot_columns
Result< std::size_t > rank_exact(ExactMatrixData input, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)
ComputationContext const std::string & operation
std::vector< ExprPtr > pivot_values
std::size_t std::size_t ComputationContext & context
Result< ExactMatrixData > inverse_exact(const ExactMatrixData &input, ComputationContext &context, const std::string &operation)
Result< ExactMatrixData > rref_exact(ExactMatrixData input, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
std::shared_ptr< SymbolicExpr > ExprPtr
const ExprPtr & at(std::size_t row, std::size_t col) const
std::vector< ExprPtr > entries