8 std::vector<std::shared_ptr<const SymbolicNode>>& children,
9 std::shared_ptr<const SymbolicNode> child) {
13 children.push_back(std::move(child));
17 std::size_t rows, std::size_t cols,
bool wrapped) {
19 const auto maximum = std::numeric_limits<std::size_t>::max();
20 if (cols != 0 && rows > maximum / cols) {
30 const std::shared_ptr<const SymbolicNode>&
right) {
36 return left->compare(*
right) < 0;
40 const std::shared_ptr<const NumberNode>& node, BigInt&
value) {
44 if (
const auto*
integer = std::get_if<BigInt>(&node->value())) {
48 const auto&
rational = std::get<Rational>(node->value());
49 if (
rational.get_denominator() != BigInt(1)) {
65 if (std::dynamic_pointer_cast<const VariableNode>(node)) {
68 if (
auto p = std::dynamic_pointer_cast<const PowerNode>(node)) {
69 const auto e = std::dynamic_pointer_cast<const NumberNode>(p->exponent());
76 if (
auto m = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
84 const std::vector<std::shared_ptr<const SymbolicNode>>& ops,
86 std::size_t nodes = 0;
88 for (
const auto&
op : ops) {
96 if (ops.size() == 1) {
102 const std::shared_ptr<const SymbolicNode>& node,
103 const std::string& index_var,
125 bool isNum1 = std::dynamic_pointer_cast<const NumberNode>(lhs) !=
nullptr;
126 bool isNum2 = std::dynamic_pointer_cast<const NumberNode>(
rhs) !=
nullptr;
127 if (isNum1 != isNum2) {
131 if (lhs->type_priority() !=
rhs->type_priority()) {
132 return lhs->type_priority() <
rhs->type_priority();
135 return lhs->compare(*
rhs) < 0;
138 if (
const auto*
rational = std::get_if<Rational>(&node.value())) {
141 return Rational(std::get<BigInt>(node.value()));
150std::shared_ptr<const NumberNode>
add_numbers(
const std::shared_ptr<const NumberNode>&
a,
const std::shared_ptr<const NumberNode>&
b) {
151 if (std::holds_alternative<Rational>(
a->
value()) || std::holds_alternative<Rational>(
b->value())) {
158 std::get<BigInt>(
a->
value()) + std::get<BigInt>(
b->value()));
167std::shared_ptr<const NumberNode>
multiply_numbers(
const std::shared_ptr<const NumberNode>&
a,
const std::shared_ptr<const NumberNode>&
b) {
168 if (std::holds_alternative<Rational>(
a->
value()) || std::holds_alternative<Rational>(
b->value())) {
175 std::get<BigInt>(
a->
value()) * std::get<BigInt>(
b->value()));
182bool get_pi_coeff(
const std::shared_ptr<const SymbolicNode>& node, Rational& k) {
183 const auto variable = std::dynamic_pointer_cast<const VariableNode>(node);
188 const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node);
194 for (
const auto& operand : multiply->operands()) {
195 if (
const auto variable = std::dynamic_pointer_cast<const VariableNode>(operand)) {
200 const auto number = std::dynamic_pointer_cast<const NumberNode>(operand);
204 if (
const auto*
rational = std::get_if<Rational>(&number->value())) {
208 const auto*
integer = std::get_if<BigInt>(&number->value());
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
std::size_t append_size(std::size_t current, std::size_t child)
std::shared_ptr< const Node > make_node(Args &&... args)
std::shared_ptr< const NumberNode > add_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相加
const std::string & variable
ExprResult integer(Integer)=delete
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
std::size_t normalization_check_count(detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)
std::shared_ptr< const SymbolicNode > norm_subst_index(const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var, const std::shared_ptr< const SymbolicNode > &value, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const NumberNode > multiply_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相乘
const ExprPtr RelationOp op
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
static bool is_pi_variable(const VariableNode &variable)
BigInt get_node_degree_helper(const std::shared_ptr< const SymbolicNode > &node)
计算 AST 节点的多项式次数
const std::string const ExprPtr & value
bool normalization_factor_less(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)
Rational exact_number_as_rational(const NumberNode &node)
bool get_pi_coeff(const std::shared_ptr< const SymbolicNode > &node, Rational &coefficient)
ExprResult rational(const Rational &value)
void normalization_append(detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)
detail::SymbolicNodePtr substitute_free(const detail::SymbolicNodePtr &expression, const std::string &variable, const detail::SymbolicNodePtr &replacement, detail::RewriteBudget *budget)
bool operator()(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right) const