11 const std::shared_ptr<SymbolicExpr>& B,
13 const std::string operation =
"matrix_multiply";
18 if (left.value()->cols() !=
right.value()->rows()) {
24 context.limits().max_ast_nodes,
"matrix_multiply");
26 &budget, left.value()->rows(),
right.value()->cols());
27 auto output_terms =
context.require_expansion_terms(count, operation);
29 auto inner_terms =
context.require_expansion_terms(left.value()->cols(), operation);
33 std::vector<std::shared_ptr<const SymbolicNode>>{left.value(),
right.value()});
35 product->accept(visitor);
36 auto result = visitor.get_result();
38 if (!std::dynamic_pointer_cast<const MatrixNode>(result)) {
40 "matrix multiplication did not produce an explicit matrix", operation);
45 }
catch (
const std::bad_alloc&) {
47 "allocation failed while multiplying matrices", operation);
48 }
catch (
const std::exception& ex) {
54 const std::shared_ptr<SymbolicExpr>& B) {
61 const std::shared_ptr<SymbolicExpr>& A,
63 const std::string operation =
"matrix_determinant";
79 const std::shared_ptr<SymbolicExpr>& A,
81 const std::string operation =
"matrix_inverse";
98 const std::shared_ptr<SymbolicExpr>& A,
100 const std::string operation =
"matrix_rank";
111 const std::shared_ptr<SymbolicExpr>& A) {
117 const std::shared_ptr<SymbolicExpr>& A,
119 const std::string operation =
"matrix_rref";
130 const std::shared_ptr<SymbolicExpr>& A) {
统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 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)
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)
MatrixRankResult matrix_rank_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)