14 template <
typename Node,
typename... Args>
15 friend std::shared_ptr<const Node>
18 const std::shared_ptr<const SymbolicNode>
body_;
20 const std::shared_ptr<const SymbolicNode>
point_;
25 std::shared_ptr<const SymbolicNode>
point,
30 throw std::invalid_argument(
"limit body and point cannot be null");
33 throw std::invalid_argument(
"limit variable cannot be empty");
55 const auto& limit =
static_cast<const LimitNode&
>(other);
56 int comparison =
variable_.compare(limit.variable_);
57 if (comparison != 0)
return comparison;
59 return static_cast<int>(
direction_) <
static_cast<int>(limit.direction_) ? -1 : 1;
61 comparison =
point_->compare(*limit.point_);
62 return comparison != 0 ? comparison :
body_->compare(*limit.body_);
71 std::shared_ptr<const SymbolicNode>
clone()
const override {
78 template <
typename Node,
typename... Args>
79 friend std::shared_ptr<const Node>
87 std::string display_variable =
"_root")
93 throw std::invalid_argument(
"RootOf identity is invalid");
104 const auto variable_node =
106 std::vector<std::shared_ptr<const SymbolicNode>> terms;
107 for (std::size_t degree = 0;
110 if (coefficient == Rational(0))
continue;
111 auto coefficient_node =
114 terms.push_back(coefficient_node);
117 auto variable_power = degree == 1
123 coefficient == Rational(1)
126 {coefficient_node, variable_power}));
134 std::size_t seed =
static_cast<std::size_t
>(
type_priority());
146 visitor.
visit(*
this);
149 std::shared_ptr<const SymbolicNode>
clone()
const override {
int type_priority() const override
const std::string & variable() const noexcept
const std::shared_ptr< const SymbolicNode > point_
const LimitDirection direction_
std::size_t compute_hash() const override
int compare_same_type(const SymbolicNode &other) const override
LimitNode(std::shared_ptr< const SymbolicNode > body, std::string variable, std::shared_ptr< const SymbolicNode > point, LimitDirection direction)
const std::string variable_
const auto & point() const noexcept
const auto & body() const noexcept
std::shared_ptr< const SymbolicNode > clone() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
const std::shared_ptr< const SymbolicNode > body_
LimitDirection direction() const noexcept
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
int degree() const
获取多项式的次数
std::size_t compute_hash() const override
const std::string display_variable_
int type_priority() const override
const std::string & variable() const noexcept
std::shared_ptr< const SymbolicNode > clone() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
std::size_t index() const noexcept
RootOfNode(LMCAS::detail::ExactRootId id, std::string display_variable="_root")
const LMCAS::detail::ExactRootId id_
const LMCAS::detail::ExactRootId & exact_id() const noexcept
int compare_same_type(const SymbolicNode &other) const override
std::shared_ptr< const SymbolicNode > polynomial() const
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
static std::shared_ptr< const SymbolicNode > create_variable(const std::string &name)
static std::shared_ptr< const SymbolicNode > create_power(std::shared_ptr< const SymbolicNode > base, std::shared_ptr< const SymbolicNode > exponent)
创建幂运算节点,自动处理指数为 0/1 及底数为 0/1 的情况.
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
virtual void visit(const NumberNode &node)=0
std::shared_ptr< const Node > make_node(Args &&... args)
void hash_combine(std::size_t &seed, std::size_t value)
将一个哈希值混合到种子中,用于组合多个字段的哈希.
LimitDirection
Direction from which a limit approaches its point.
Polynomial< Rational > polynomial
int compare(const ExactRootId &other) const