19 return BinderView{sum->index_var(), sum->body(),
20 {sum->lower_bound(), sum->upper_bound()}};
23 return BinderView{product->index_var(), product->body(),
24 {product->lower_bound(), product->upper_bound()}};
27 std::vector<SymbolicNodePtr> bounds;
28 if (integral->lower()) bounds.push_back(integral->lower());
29 if (integral->upper()) bounds.push_back(integral->upper());
30 return BinderView{integral->variable(), integral->body(), std::move(bounds)};
33 return BinderView{transform->source_var(), transform->body(),
34 {transform->target()}};
37 return BinderView{quantifier->bound_var(), quantifier->predicate(),
38 {quantifier->domain()}};
41 return BinderView{set_builder->element_var(), set_builder->predicate(),
42 {set_builder->domain()}};
44 if (
const auto* limit =
dynamic_cast<const LimitNode*
>(&
node)) {
45 return BinderView{limit->variable(), limit->body(), {limit->point()}};
52 if (child) child->accept(*
this);
55 template <
class Range>
57 for (
const auto& child : children)
visit_child(child);
75 if (
const auto* dense = std::get_if<MatrixNode::DenseStorage>(&
node.storage())) {
79 for (
const auto& [index,
value] :
80 std::get<MatrixNode::SparseStorage>(
node.storage())) {
94 for (
const auto& branch :
node.branches()) {
160 if (!root)
return false;
162 root->accept(detector);
163 return detector.
found();
169 if (!
node)
return nullptr;
170 const auto previous_current =
current_;
171 const auto previous_result =
result_;
178 if (!rewritten)
throw std::logic_error(
"SymbolicRewriter visit did not set a result");
187 auto rewritten =
rewrite(child);
188 changed = changed || rewritten != child;
192 template <
class Range>
194 std::vector<SymbolicNodePtr> rewritten;
195 rewritten.reserve(children.size());
196 for (
const auto& child : children) {
206 bool changed =
false;
211 bool changed =
false;
216 bool changed =
false;
222 bool changed =
false;
227 bool changed =
false;
233 bool changed =
false;
234 if (
const auto* dense = std::get_if<MatrixNode::DenseStorage>(&
node.storage())) {
240 auto entries = std::get<MatrixNode::SparseStorage>(
node.storage());
241 for (
auto& [index,
value] : entries) {
249 bool changed =
false;
255 bool changed =
false;
261 bool changed =
false;
262 std::vector<PiecewiseNode::Branch> branches;
263 branches.reserve(
node.branches().size());
264 for (
const auto& branch :
node.branches()) {
265 branches.push_back({
rewrite_child(branch.expression, changed),
268 auto fallback =
node.default_expr()
273 bool changed =
false;
281 bool changed =
false;
289 bool changed =
false;
297 bool changed =
false;
305 bool changed =
false;
312 bool changed =
false;
317 bool changed =
false;
321 node.lower_closed(),
node.upper_closed())
325 bool changed =
false;
331 bool changed =
false;
334 node.scale_to_base(),
node.display_unit())
338 bool changed =
false;
344 bool changed =
false;
352 bool changed =
false;
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
连乘节点,表示符号有限/无限连乘 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_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)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
bool found() const noexcept
void visit(const Node &) override
void visit(const LogicalNode &node) override
void visit(const MultiplyNode &node) override
SymbolicVisitor()=default
void visit(const NumberNode &) override
void visit(const VariableNode &) override
void visit(const RootOfNode &) override
void visit(const LimitNode &node) override
void visit(const PiecewiseNode &node) override
void visit(const ComplexNode &node) override
void visit(const FiniteSetNode &node) override
void visit(const SetBuilderNode &node) override
void visit(const IntegralNode &node) override
void visit(const QuantifierNode &node) override
void visit(const MatrixNode &node) override
void visit(const AddNode &node) override
void visit(const ProductNode &node) override
void visit(const UninterpretedFunctionNode &node) override
void visit(const RelationalNode &node) override
void visit(const IntervalNode &node) override
void visit(const QuantityNode &node) override
void visit(const TransformNode &node) override
void visit(const SummationNode &node) override
void visit(const FunctionNode &node) override
virtual void visit_child(const SymbolicNodePtr &child)
void visit_children(const Range &children)
void visit(const MembershipNode &node) override
void visit(const PowerNode &node) override
void visit(const FunctionNode &node) override
void visit(const AddNode &node) override
SymbolicVisitor()=default
void visit(const IntegralNode &node) override
void visit(const MultiplyNode &node) override
void visit(const SetBuilderNode &node) override
void set_result(SymbolicNodePtr result)
void visit(const QuantityNode &node) override
SymbolicNodePtr rewrite(const SymbolicNodePtr &node)
void visit(const FiniteSetNode &node) override
void visit(const IntervalNode &node) override
void visit(const ComplexNode &node) override
void visit(const TransformNode &node) override
void visit(const RootOfNode &) override
void visit(const LimitNode &node) override
void visit(const UninterpretedFunctionNode &node) override
void visit(const NumberNode &) override
void visit(const LogicalNode &node) override
void visit(const MatrixNode &node) override
void visit(const SummationNode &node) override
void visit(const VariableNode &) override
void visit(const QuantifierNode &node) override
void visit(const PowerNode &node) override
SymbolicNodePtr rewrite_child(const SymbolicNodePtr &child, bool &changed)
void visit(const RelationalNode &node) override
void visit(const ProductNode &node) override
void visit(const PiecewiseNode &node) override
std::vector< SymbolicNodePtr > rewrite_children(const Range &children, bool &changed)
void visit(const MembershipNode &node) override
SymbolicNodePtr current() const noexcept
SymbolicVisitor()=default
RewriteBudget * rewrite_budget() const noexcept
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::vector< SymbolicNodePtr > outside_scope
std::optional< BinderView > binder_view(const SymbolicNode &node)
std::shared_ptr< const SymbolicNode > Node
bool contains_node_type(const SymbolicNodePtr &root)
RewriteBudget const FactsQuery Domain domain
SymbolicNodePtr scoped_body
std::shared_ptr< const SymbolicNode > SymbolicNodePtr
std::shared_ptr< const Node > make_node(Args &&... args)
std::string_view bound_name
const std::string const LimitExprPtr & point
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
ExprResult real(const ExprPtr &expression, ComputationContext &context)
const std::string const ExprPtr & value