LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
expr_arithmetic.cpp
浏览该文件的文档.
1#include <stdexcept>
3#include "expr.hpp"
7#include <cmath>
8#include <exception>
9#include <memory>
10#include <string>
11#include <utility>
12#include <vector>
13
14namespace LMCAS {
15
16using namespace expr_detail::expr_common;
17
19 const ExprPtr& rhs,
21 return quantity_add(lhs, rhs, context);
22}
23
24ExprResult add(const ExprPtr& lhs, const ExprPtr& rhs) {
26 return add(lhs, rhs, context);
27}
28
30 const ExprPtr& rhs,
32 return quantity_multiply(lhs, rhs, context);
33}
34
35ExprResult mul(const ExprPtr& lhs, const ExprPtr& rhs) {
37 return mul(lhs, rhs, context);
38}
39
40ExprResult div(const ExprPtr& numerator,
41 const ExprPtr& denominator,
43 return quantity_divide(numerator, denominator, context);
44}
45
46ExprResult div(const ExprPtr& numerator, const ExprPtr& denominator) {
48 return div(numerator, denominator, context);
49}
50
52 auto minus_one = integer(-1);
53 if (!minus_one) { return ExprResult::failure(minus_one.error()); }
54 return mul(minus_one.value(), expression, context);
55}
56
57ExprResult neg(const ExprPtr& expression) {
59 return neg(expression, context);
60}
61
63 const ExprPtr& rhs,
65 return quantity_subtract(lhs, rhs, context);
66}
67
68ExprResult sub(const ExprPtr& lhs, const ExprPtr& rhs) {
70 return sub(lhs, rhs, context);
71}
72
74 const ExprPtr& rhs,
76 if (!lhs || !rhs) {
78 "eq operands cannot be null", kExprOperation);
79 }
80 auto left_dimension = dimension_of(*lhs);
81 if (!left_dimension) { return ExprResult::failure(left_dimension.error()); }
82 auto right_dimension = dimension_of(*rhs);
83 if (!right_dimension) { return ExprResult::failure(right_dimension.error()); }
84 if (left_dimension.value() != right_dimension.value()) { return integer(0); }
85 auto left = comparison_value(lhs, context);
86 if (!left) { return left; }
88 if (!right) { return right; }
89 return make_binary_expr(left.value(), right.value(), context, "eq", SymbolicExpr::eq);
90}
91
92ExprResult eq(const ExprPtr& lhs, const ExprPtr& rhs) {
94 return eq(lhs, rhs, context);
95}
96
97
102
103ExprResult real(const ExprPtr& expression) {
105 return real(expression, context);
106}
107
112
113ExprResult imag(const ExprPtr& expression) {
115 return imag(expression, context);
116}
117
122
123ExprResult conj(const ExprPtr& expression) {
125 return conj(expression, context);
126}
127
129 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
130 (context).limits().max_ast_nodes, "transform");
131 auto step = context.consume_steps(1, kAbsOperation);
132 if (!step) {
133 return ExprResult::failure(step.error());
134 }
135 auto re = real(expression, context);
136 if (!re) {
137 return re;
138 }
139 auto im = imag(expression, context);
140 if (!im) {
141 return im;
142 }
143 try {
144 auto re_squared = SymbolicExpr::power(re.value(), SymbolicExpr::number(2));
145 auto im_squared = SymbolicExpr::power(im.value(), SymbolicExpr::number(2));
146 auto sum = SymbolicExpr::add(re_squared, im_squared);
147 auto result = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::sqrt(sum)), transform_budget));
148 if (!result || !LMCAS::detail::node(result)) {
150 "complex absolute value construction failed",
152 }
153 return ExprResult::success(std::move(result));
154 } catch (const std::bad_alloc&) {
156 "complex absolute value allocation failed",
158 } catch (const std::length_error& error) { return ExprResult::failure(CasErrc::ResourceLimit, error.what(), "abs"); } catch (const std::exception& error) {
161 }
162} catch (const CasError& error) {
163 return ExprResult::failure(error);
164} catch (const std::bad_alloc&) {
165 return ExprResult::failure(CasErrc::ResourceLimit, "allocation failed", "abs");
166} catch (const std::length_error& error) {
167 return ExprResult::failure(CasErrc::ResourceLimit, error.what(), "abs");
168} catch (const std::exception& error) {
169 return ExprResult::failure(CasErrc::InternalInvariant, error.what(), "abs");
170}
171
172ExprResult abs(const ExprPtr& expression) {
174 return abs(expression, context);
175}
176}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ExprPtr value)
复变函数分析:留数计算,柯西积分公式,解析延拓.
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
constexpr const char * kRealOperation
constexpr const char * kImagOperation
ExprResult make_binary_expr(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context, const char *operation_name, Factory &&factory)
constexpr const char * kExprOperation
constexpr const char * kAbsOperation
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
ExprResult comparison_value(const ExprPtr &expression, ComputationContext &context)
constexpr const char * kConjOperation
ExprResult expr_from_complex_result(const ExpressionResult &result, const char *operation)
Result< DimensionSignature > dimension_of(const SymbolicExpr &expression)
ExprResult eq(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult integer(Integer)=delete
ExprResult neg(const ExprPtr &expression, ComputationContext &context)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprResult sub(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult div(const ExprPtr &numerator, const ExprPtr &denominator, ComputationContext &context)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
Result< ExprPtr > ExprResult
ExpressionResult real_part_checked(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult conj(const ExprPtr &expression, ComputationContext &context)
QuantityResult quantity_divide(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
ExprPtr imag
ExpressionResult conjugate_checked(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
std::shared_ptr< SymbolicExpr > ExprPtr
const ExprPtr & right
const ExprPtr & rhs
ExpressionResult imag_part_checked(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
QuantityResult quantity_multiply(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
const ExprPtr & denominator
QuantityResult quantity_subtract(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
ExprResult abs(const ExprPtr &expression, ComputationContext &context)
QuantityResult quantity_add(const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs, ComputationContext &context)
内部 AST 定义。