14 std::shared_ptr<const SymbolicNode>
result;
39 if (expanded_ops.empty()) {
46 for (
size_t i = 1; i < expanded_ops.size(); ++i) {
62 node.name(), std::move(arguments)), size);
68 if (
const auto* dense = std::get_if<MatrixNode::DenseStorage>(&node.storage())) {
70 for (
const auto&
element : *dense) {
74 const auto& sparse = std::get<MatrixNode::SparseStorage>(node.storage());
76 for (
const auto& entry : sparse) {
81 if (
const auto* dense = std::get_if<MatrixNode::DenseStorage>(&node.storage())) {
85 std::get<MatrixNode::SparseStorage>(node.storage())), size);
91 std::shared_ptr<const SymbolicNode>
lower;
92 std::shared_ptr<const SymbolicNode>
upper;
102 std::size_t size = 1;
109 std::size_t size = 1;
111 std::shared_ptr<const SymbolicNode> tail =
nullptr;
119 std::vector<PiecewiseNode::Branch> branches;
124 branches.reserve(node.branches().size());
125 std::size_t size = 1;
126 for (
const auto& branch : node.branches()) {
127 auto expression =
expand_child(branch.expression, size);
129 branches.push_back({expression, condition});
131 std::shared_ptr<const SymbolicNode> default_expr =
nullptr;
132 if (node.default_expr()) {
136 std::move(branches), default_expr), size);
140 std::size_t size = 1;
149 std::size_t size = 1;
158 std::size_t size = 1;
162 node.transform_type(), body, node.source_var(),
target), size);
166 std::size_t size = 1;
170 node.quantifier_type(), node.bound_var(),
domain, predicate), size);
174 std::size_t size = 1;
178 node.element_var(),
domain, predicate), size);
182 std::size_t size = 1;
188 std::size_t size = 1;
192 lower,
upper, node.lower_closed(), node.upper_closed()), size);
196 std::size_t size = 1;
203 std::size_t size = 1;
206 value, node.dimension(), node.scale_to_base(), node.display_unit()), size);
210 std::size_t size = 1;
216 std::size_t size = 1;
220 body, node.variable(),
point, node.direction()), size);
237 const std::shared_ptr<const SymbolicNode>& child)
const {
244 const std::shared_ptr<const SymbolicNode>& child, std::size_t& size) {
245 child->accept(*
this);
251 const std::vector<std::shared_ptr<const SymbolicNode>>& children, std::size_t& size) {
253 std::vector<std::shared_ptr<const SymbolicNode>> expanded;
254 expanded.reserve(children.size());
255 for (
const auto& child : children) {
257 expanded.push_back(std::move(expanded_child));
262 void set_result(std::shared_ptr<const SymbolicNode> candidate, std::size_t size) {
266 result = std::move(candidate);
269 void set_result(std::shared_ptr<const SymbolicNode> candidate) {
void visit(const IntegralNode &node) override
std::vector< std::shared_ptr< const SymbolicNode > > expand_children(const std::vector< std::shared_ptr< const SymbolicNode > > &children, std::size_t &size)
void visit(const IntervalNode &node) override
void visit(const QuantityNode &node) override
void visit(const ProductNode &node) override
void visit(const TransformNode &node) override
void visit(const VariableNode &node) override
void visit(const LogicalNode &node) override
void append_child(std::size_t &size, const std::shared_ptr< const SymbolicNode > &child) const
void visit(const NumberNode &node) override
void check_child_count(std::size_t count, std::size_t roots=1) const
void visit(const LimitNode &node) override
std::shared_ptr< const SymbolicNode > get_result() const
std::shared_ptr< const SymbolicNode > expand_child(const std::shared_ptr< const SymbolicNode > &child, std::size_t &size)
void visit(const RelationalNode &node) override
void visit(const PiecewiseNode &node) override
void set_result(std::shared_ptr< const SymbolicNode > candidate)
void visit(const MembershipNode &node) override
void visit(const MultiplyNode &node) override
void visit(const MatrixNode &node) override
void visit(const FunctionNode &node) override
ExpandVisitor(detail::RewriteBudget &budget)
void visit(const AddNode &node) override
void visit(const FiniteSetNode &node) override
void visit(const RootOfNode &node) override
void visit(const SummationNode &node) override
void visit(const SetBuilderNode &node) override
std::shared_ptr< const SymbolicNode > result
展开结果节点。
void visit(const QuantifierNode &node) override
void visit(const UninterpretedFunctionNode &node) override
void set_result(std::shared_ptr< const SymbolicNode > candidate, std::size_t size)
void visit(const ComplexNode &node) override
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。
std::shared_ptr< const SymbolicNode > expand_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
void require_nodes(std::size_t nodes) const
std::size_t append_size(std::size_t current, std::size_t child)
std::size_t measure_result(const std::shared_ptr< const SymbolicNode > &node)
SymbolicVisitor()=default
RewriteBudget * rewrite_budget() const noexcept
const FactsQuery & no_facts() noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
const std::string const LimitExprPtr & point
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
const NumberDomainSet & domain
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
const std::string const ExprPtr & value