LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
numbers.hpp
浏览该文件的文档.
1/** @file internal/symbolic_ast/numbers.hpp */
2#pragma once
4#include <stdexcept>
5
6namespace LMCAS {
7
8class NumberNode : public SymbolicNode {
9private:
11
12 const std::variant<BigInt, Rational> value_;
13
14 explicit NumberNode(const BigInt& v) : value_(v) {}
15 explicit NumberNode(const Rational& v) : value_(v) {}
16 explicit NumberNode(lmmc_real_t v);
17 explicit NumberNode(std::variant<BigInt, Rational> v)
18 : value_(std::move(v)) {}
19
20public:
21 const std::variant<BigInt, Rational>& value() const noexcept {
22 return value_;
23 }
24
25 int type_priority() const override { return -10; }
26
27protected:
28 std::size_t compute_hash() const override {
29 if (std::holds_alternative<Rational>(value_)) {
30 return std::get<Rational>(value_).hash();
31 }
32 return Rational(std::get<BigInt>(value_)).hash();
33 }
34
35 int compare_same_type(const SymbolicNode& other) const override;
36
37public:
38 void accept(LMCAS::detail::SymbolicVisitor& visitor) const override { LMCAS::detail::SymbolicVisitor::DepthGuard guard(visitor); visitor.visit(*this); }
39 std::shared_ptr<const SymbolicNode> clone() const override {
40
41 if (std::holds_alternative<BigInt>(value_)) {
42 return LMCAS::detail::make_node<NumberNode>(std::get<BigInt>(value_));
43 }
44 return LMCAS::detail::make_node<NumberNode>(std::get<Rational>(value_));
45 }
46
47 bool is_number() const override { return true; }
48 bool is_zero() const override {
49
50 if (std::holds_alternative<BigInt>(value_)) {
51 return std::get<BigInt>(value_) == BigInt(0);
52 }
53 return std::get<Rational>(value_) == Rational(0);
54 }
55 bool is_one() const override {
56 if (std::holds_alternative<BigInt>(value_)) {
57 return std::get<BigInt>(value_) == BigInt(1);
58 }
59 return std::get<Rational>(value_) == Rational(1);
60 }
61 bool is_negative_one() const;
62 bool is_positive() const override {
63 if (std::holds_alternative<BigInt>(value_)) {
64 const auto& b = std::get<BigInt>(value_);
65 return !b.is_negative() && !(b == BigInt(0));
66 }
67 return std::get<Rational>(value_) > Rational(0);
68 }
69};
70
71/**
72 * @brief 复数节点,表示 real + imag * i。
73 */
74class ComplexNode : public SymbolicNode {
75private:
77
78 const std::shared_ptr<const SymbolicNode> real_;
79 const std::shared_ptr<const SymbolicNode> imag_;
80
81 ComplexNode(std::shared_ptr<const SymbolicNode> r, std::shared_ptr<const SymbolicNode> i)
82 : real_(std::move(r)), imag_(std::move(i)) {
83 if (!real_ || !imag_) {
84 throw std::invalid_argument("ComplexNode real and imaginary parts cannot be null");
85 }
86 }
87
88public:
89 const std::shared_ptr<const SymbolicNode>& real() const noexcept { return real_; }
90 const std::shared_ptr<const SymbolicNode>& imag() const noexcept { return imag_; }
91
92 int type_priority() const override { return -5; } /**< 优先级介于 NumberNode 与 VariableNode 之间。 */
93
94protected:
95 std::size_t compute_hash() const override {
96 std::size_t seed = 0;
98 hash_combine(seed, real_->hash());
99 hash_combine(seed, imag_->hash());
100 return seed;
101 }
102
103 int compare_same_type(const SymbolicNode& other) const override {
104 const auto& o = static_cast<const ComplexNode&>(other);
105 int cmp_r = real_->compare(*o.real_);
106 if (cmp_r != 0) {
107 return cmp_r;
108 }
109 return imag_->compare(*o.imag_);
110 }
111
112public:
113 void accept(LMCAS::detail::SymbolicVisitor& visitor) const override { LMCAS::detail::SymbolicVisitor::DepthGuard guard(visitor); visitor.visit(*this); }
114 std::shared_ptr<const SymbolicNode> clone() const override {
115 return LMCAS::detail::make_node<ComplexNode>(real_->clone(), imag_->clone());
116 }
117
118 bool is_zero() const override {
119 return real_->is_zero() && imag_->is_zero();
120 }
121};
122
123}
内部 AST 的所有权、节点协议、访问者契约与工厂声明。
bool is_zero() const override
int type_priority() const override
优先级介于 NumberNode 与 VariableNode 之间。
std::shared_ptr< const SymbolicNode > clone() const override
const std::shared_ptr< const SymbolicNode > imag_
ComplexNode(std::shared_ptr< const SymbolicNode > r, std::shared_ptr< const SymbolicNode > i)
std::size_t compute_hash() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
int compare_same_type(const SymbolicNode &other) const override
const std::shared_ptr< const SymbolicNode > & real() const noexcept
const std::shared_ptr< const SymbolicNode > & imag() const noexcept
const std::shared_ptr< const SymbolicNode > real_
std::size_t compute_hash() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
int compare_same_type(const SymbolicNode &other) const override
const std::variant< BigInt, Rational > & value() const noexcept
NumberNode(const BigInt &v)
bool is_positive() const override
const std::variant< BigInt, Rational > value_
NumberNode(std::variant< BigInt, Rational > v)
std::shared_ptr< const SymbolicNode > clone() const override
int type_priority() const override
bool is_zero() const override
bool is_number() const override
bool is_one() const override
NumberNode(const Rational &v)
SymbolicNode()=default
virtual void visit(const NumberNode &node)=0
std::shared_ptr< const Node > make_node(Args &&... args)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
void hash_combine(std::size_t &seed, std::size_t value)
将一个哈希值混合到种子中,用于组合多个字段的哈希.
const MultiPoly & b