LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
symbolic_matrix.cpp
浏览该文件的文档.
5
6#include <new>
7
8namespace LMCAS {
9using namespace detail::matrix_api;
10ExpressionResult matrix_multiply_checked(const std::shared_ptr<SymbolicExpr>& A,
11 const std::shared_ptr<SymbolicExpr>& B,
13 const std::string operation = "matrix_multiply";
14 auto left = require_matrix(A, context, operation);
15 if (!left) return ExpressionResult::failure(left.error());
16 auto right = require_matrix(B, context, operation);
17 if (!right) return ExpressionResult::failure(right.error());
18 if (left.value()->cols() != right.value()->rows()) {
20 CasErrc::InvalidArgument, "matrix dimensions are not compatible", operation);
21 }
22 try {
23 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
24 context.limits().max_ast_nodes, "matrix_multiply");
25 const auto count = normalization_check_count(
26 &budget, left.value()->rows(), right.value()->cols());
27 auto output_terms = context.require_expansion_terms(count, operation);
28 if (!output_terms) { return ExpressionResult::failure(output_terms.error()); }
29 auto inner_terms = context.require_expansion_terms(left.value()->cols(), operation);
30 if (!inner_terms) { return ExpressionResult::failure(inner_terms.error()); }
31 normalization_check_arithmetic<MultiplyNode>(&budget, 0, left.value(), right.value());
33 std::vector<std::shared_ptr<const SymbolicNode>>{left.value(), right.value()});
35 product->accept(visitor);
36 auto result = visitor.get_result();
37 budget.measure(result);
38 if (!std::dynamic_pointer_cast<const MatrixNode>(result)) {
40 "matrix multiplication did not produce an explicit matrix", operation);
41 }
42 return detail::make_expression_ptr(std::move(result));
43 } catch (const CasError& error) {
44 return ExpressionResult::failure(error);
45 } catch (const std::bad_alloc&) {
47 "allocation failed while multiplying matrices", operation);
48 } catch (const std::exception& ex) {
49 return ExpressionResult::failure(CasErrc::InternalInvariant, ex.what(), operation);
50 }
51}
52
53ExpressionResult matrix_multiply_checked(const std::shared_ptr<SymbolicExpr>& A,
54 const std::shared_ptr<SymbolicExpr>& B) {
56 return matrix_multiply_checked(A, B, context);
57}
58
59
61 const std::shared_ptr<SymbolicExpr>& A,
63 const std::string operation = "matrix_determinant";
64 auto matrix = require_square_matrix(A, context, operation);
65 if (!matrix) return ExpressionResult::failure(matrix.error());
66 auto determinant = detail::determinant_exact(
67 exact_matrix_data(*matrix.value()), context, operation);
68 if (!determinant) return ExpressionResult::failure(determinant.error());
69 return ExpressionResult::success(std::move(determinant.value()));
70}
71
72ExpressionResult matrix_determinant_checked(const std::shared_ptr<SymbolicExpr>& A) {
75}
76
77
79 const std::shared_ptr<SymbolicExpr>& A,
81 const std::string operation = "matrix_inverse";
82 auto matrix = require_square_matrix(A, context, operation);
83 if (!matrix) return ExpressionResult::failure(matrix.error());
84 auto inverse = detail::inverse_exact(
85 exact_matrix_data(*matrix.value()), context, operation);
86 if (!inverse) return ExpressionResult::failure(inverse.error());
88 exact_matrix_expression(inverse.value()));
89}
90
91ExpressionResult matrix_inverse_checked(const std::shared_ptr<SymbolicExpr>& A) {
94}
95
96
98 const std::shared_ptr<SymbolicExpr>& A,
100 const std::string operation = "matrix_rank";
101 auto matrix = require_matrix(A, context, operation);
102 if (!matrix) return MatrixRankResult::failure(matrix.error());
103 auto rank = detail::rank_exact(
104 exact_matrix_data(*matrix.value()), matrix.value()->cols(),
105 context, operation);
106 if (!rank) return MatrixRankResult::failure(rank.error());
107 return MatrixRankResult::success(rank.value());
108}
109
111 const std::shared_ptr<SymbolicExpr>& A) {
113 return matrix_rank_checked(A, context);
114}
115
117 const std::shared_ptr<SymbolicExpr>& A,
119 const std::string operation = "matrix_rref";
120 auto matrix = require_matrix(A, context, operation);
121 if (!matrix) return ExpressionResult::failure(matrix.error());
122 auto rref = detail::rref_exact(
123 exact_matrix_data(*matrix.value()), matrix.value()->cols(),
124 context, operation);
125 if (!rref) return ExpressionResult::failure(rref.error());
127}
128
130 const std::shared_ptr<SymbolicExpr>& A) {
132 return matrix_rref_checked(A, context);
133}
134
135}
统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(std::shared_ptr< SymbolicExpr > value)
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
ExactMatrixData exact_matrix_data(const MatrixNode &matrix)
std::shared_ptr< SymbolicExpr > exact_matrix_expression(const ExactMatrixData &matrix)
Result< std::shared_ptr< const MatrixNode > > require_matrix(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation)
Result< std::shared_ptr< const MatrixNode > > require_square_matrix(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const FactsQuery & no_facts() noexcept
Result< std::size_t > rank_exact(ExactMatrixData input, std::size_t coefficient_columns, ComputationContext &context, const std::string &operation)
Result< ExprPtr > determinant_exact(const ExactMatrixData &input, ComputationContext &context, const std::string &operation)
std::shared_ptr< const Node > make_node(Args &&... args)
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)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExpressionResult matrix_rref_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
@ Real
Real numbers
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
ExpressionResult matrix_determinant_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
std::size_t normalization_check_count(detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)
ExpressionResult matrix_inverse_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
Result< std::size_t > MatrixRankResult
计算两个符号矩阵的乘积
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
ExpressionResult matrix_multiply_checked(const std::shared_ptr< SymbolicExpr > &A, const std::shared_ptr< SymbolicExpr > &B, ComputationContext &context)
const ExprPtr & right
MatrixRankResult matrix_rank_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
符号规范化访问器接口。