6#define LMCAS_INTERNAL_AST_INCLUDED 1
13#include <unordered_map>
14#include <unordered_set>
22#include "lmmc/config.h"
23#include "lmmc/numeric.h"
38class UninterpretedFunctionNode;
58 explicit Impl(std::shared_ptr<const SymbolicNode> root_node)
59 :
root(std::move(root_node)) {
61 throw std::invalid_argument(
"SymbolicExpr requires a non-null AST root");
65 const std::shared_ptr<const SymbolicNode>
root;
77 return expression.impl_->root;
81 return ::LMCAS::SymbolicExpr(
82 std::make_shared<const ::LMCAS::SymbolicExpr::Impl>(std::move(root)));
86 return std::shared_ptr<::LMCAS::SymbolicExpr>(new ::LMCAS::SymbolicExpr(
87 std::make_shared<const ::LMCAS::SymbolicExpr::Impl>(std::move(root))));
96 const std::shared_ptr<::LMCAS::SymbolicExpr>& expression)
noexcept {
98 return expression ?
node(*expression) : empty;
102 const std::shared_ptr<const ::LMCAS::SymbolicExpr>& expression)
noexcept {
104 return expression ?
node(*expression) : empty;
116 const ::LMCAS::SymbolicExpr& expression) {
117 return std::make_shared<::LMCAS::SymbolicExpr>(expression);
120class SymbolicVisitor;
122template <
typename Node,
typename... Args>
124 static_assert(std::is_base_of<SymbolicNode, Node>::value,
125 "make_node only constructs SymbolicNode implementations");
126 return std::shared_ptr<const Node>(
127 new Node(std::forward<Args>(args)...));
132#define LMCAS_AST_NODE_FACTORY_FRIEND \
133 template <typename Node, typename... Args> \
134 friend std::shared_ptr<const Node> \
135 LMCAS::detail::make_node(Args&&... args)
145 seed ^=
value + 0x9e3779b9 + (seed << 6) + (seed >> 2);
161 virtual std::shared_ptr<const SymbolicNode>
clone()
const = 0;
175 return cached_hash.load(std::memory_order_relaxed);
196 if (
this == &other)
return true;
197 if (
hash() != other.
hash())
return false;
202 virtual bool is_one()
const {
return false; }
203 virtual bool is_zero()
const {
return false; }
231 visitor.rewrite_budget_->enter();
233 throw std::runtime_error(
"AST traversal depth limit exceeded");
275 std::size_t
operator()(
const std::shared_ptr<const SymbolicNode>& node)
const {
276 return node ? node->hash() : 0;
280 bool operator()(
const std::shared_ptr<const SymbolicNode>& lhs,
const std::shared_ptr<const SymbolicNode>&
rhs)
const {
281 if (!lhs || !
rhs)
return lhs ==
rhs;
282 return lhs->equals(*
rhs);
292 static std::shared_ptr<const SymbolicNode>
create_number(const ::LMCAS::BigInt&
v);
293 static std::shared_ptr<const SymbolicNode>
create_number(const ::LMCAS::Rational&
v);
294 static std::shared_ptr<const SymbolicNode>
create_number(lmmc_real_t
v);
302 static std::shared_ptr<const SymbolicNode>
create_add(
303 std::vector<std::shared_ptr<const SymbolicNode>> ops,
312 std::vector<std::shared_ptr<const SymbolicNode>> ops,
321 static std::shared_ptr<const SymbolicNode>
create_power(std::shared_ptr<const SymbolicNode> base, std::shared_ptr<const SymbolicNode>
exponent);
326 static std::shared_ptr<const SymbolicNode>
create_complex(std::shared_ptr<const SymbolicNode>
real, std::shared_ptr<const SymbolicNode>
imag);
任意精度整数 BigInt,底层调用 LMMP 实现高性能大数运算。
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
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_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
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 accept(LMCAS::detail::SymbolicVisitor &visitor) const =0
virtual std::size_t compute_hash() const =0
virtual int compare_same_type(const SymbolicNode &other) const =0
SymbolicNode(const SymbolicNode &)
std::atomic< std::size_t > cached_hash
bool equals(const SymbolicNode &other) const
判断两个节点是否结构相等.
virtual bool is_number() const
std::size_t hash() const
获取节点哈希值(带缓存).
virtual bool is_zero() const
virtual bool is_positive() const
virtual bool is_one() const
virtual ~SymbolicNode()=default
SymbolicNode & operator=(const SymbolicNode &)
virtual int type_priority() const =0
std::atomic< bool > hash_computed
int compare(const SymbolicNode &other) const
与另一个节点进行全序比较.
virtual std::shared_ptr< const SymbolicNode > clone() const =0
virtual void visit(const ComplexNode &node)=0
virtual void visit(const QuantifierNode &node)=0
SymbolicVisitor()=default
virtual void visit(const MultiplyNode &node)=0
virtual void visit(const RelationalNode &node)=0
virtual void visit(const PiecewiseNode &node)=0
virtual void visit(const IntervalNode &node)=0
virtual void visit(const LogicalNode &node)=0
RewriteBudget * rewrite_budget() const noexcept
virtual void visit(const TransformNode &node)=0
SymbolicVisitor(RewriteBudget *budget) noexcept
virtual void visit(const VariableNode &node)=0
RewriteBudget * rewrite_budget_
virtual void visit(const IntegralNode &node)=0
virtual void visit(const QuantityNode &node)=0
virtual void visit(const NumberNode &node)=0
virtual void visit(const UninterpretedFunctionNode &node)=0
virtual void visit(const ProductNode &node)=0
virtual void visit(const FunctionNode &node)=0
virtual void visit(const MatrixNode &node)=0
virtual void visit(const LimitNode &node)=0
virtual void visit(const MembershipNode &node)=0
static constexpr int MAX_DEPTH
virtual void visit(const RootOfNode &node)=0
virtual void visit(const PowerNode &node)=0
virtual ~SymbolicVisitor()=default
virtual void visit(const SummationNode &node)=0
virtual void visit(const SetBuilderNode &node)=0
virtual void visit(const FiniteSetNode &node)=0
virtual void visit(const AddNode &node)=0
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const SymbolicNode > Node
std::shared_ptr< const SymbolicNode > SymbolicNodePtr
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
std::unordered_set< std::shared_ptr< const SymbolicNode >, NodeHash, NodeEqual > NodeSet
__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
ExprResult real(const ExprPtr &expression, ComputationContext &context)
void hash_combine(std::size_t &seed, std::size_t value)
将一个哈希值混合到种子中,用于组合多个字段的哈希.
std::unordered_map< std::shared_ptr< const SymbolicNode >, T, NodeHash, NodeEqual > NodeMap
const std::string const ExprPtr & value
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
精确有理数 Rational,基于 BigInt 分子/分母表示,自动约分。
bool operator()(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs) const
std::size_t operator()(const std::shared_ptr< const SymbolicNode > &node) const
Impl(std::shared_ptr< const SymbolicNode > root_node)
const std::shared_ptr< const SymbolicNode > root
static std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
static const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicVisitor & visitor
DepthGuard(SymbolicVisitor &v)
DepthGuard & operator=(const DepthGuard &)=delete
DepthGuard(const DepthGuard &)=delete
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.