LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer类 参考
类 LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer 继承关系图:
LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer 的协作图:

Public 成员函数

 Writer (ComputationContext &context)
std::string finish (const NodePtr &root)
void visit (const AddNode &n) override
void visit (const ComplexNode &n) override
void visit (const FiniteSetNode &n) override
void visit (const FunctionNode &n) override
void visit (const IntegralNode &n) override
void visit (const IntervalNode &n) override
void visit (const LimitNode &n) override
void visit (const LogicalNode &n) override
void visit (const MatrixNode &n) override
void visit (const MembershipNode &n) override
void visit (const MultiplyNode &n) override
void visit (const NumberNode &n) override
void visit (const PiecewiseNode &n) override
void visit (const PowerNode &n) override
void visit (const ProductNode &n) override
void visit (const QuantifierNode &n) override
void visit (const QuantityNode &n) override
void visit (const RelationalNode &n) override
void visit (const RootOfNode &n) override
void visit (const SetBuilderNode &n) override
void visit (const SummationNode &n) override
void visit (const TransformNode &n) override
void visit (const UninterpretedFunctionNode &n) override
void visit (const VariableNode &n) override

Protected 成员函数

RewriteBudget * rewrite_budget () const noexcept

Protected 属性

int current_depth = 0

静态 Protected 属性

static constexpr int MAX_DEPTH = 200

Private 成员函数

NodePtr base_value (const QuantityNode &n)
bool collect_exact_factors (const std::vector< NodePtr > &factors, Rational &coefficient, std::vector< NodePtr > &remaining)
void emit (const NodePtr &node)
template<typename Children>
void emit_list (const Children &children)
bool needs_scale (const QuantityNode &n, const NodePtr &base)
void put (std::string_view field)
void put_integer (const BigInt &value)
void put_rational (const Rational &value)
void put_size (std::size_t value)
NodePtr scaled_value (const NodePtr &base, const Rational &coefficient, std::vector< NodePtr > &remaining, bool exact_factor)

Private 属性

ComputationContext & context_
std::string output_
RewriteBudget * rewrite_budget_ = nullptr

详细描述

在文件 expr_serialization.cpp 第 17 行定义.

构造及析构函数说明

◆ Writer()

LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::Writer ( ComputationContext & context)
inlineexplicit

成员函数说明

◆ base_value()

NodePtr LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::base_value ( const QuantityNode & n)
inlineprivate

在文件 expr_serialization.cpp 第 156 行定义.

156 {
157 NodePtr base = n.value();
158 if (!needs_scale(n, base)) return base;
159 Rational coefficient = n.scale_to_base();
160 check(context_.require_integer_bits(coefficient.get_numerator().bit_length(), kEncode));
161 check(context_.require_integer_bits(coefficient.get_denominator().bit_length(), kEncode));
162 std::vector<NodePtr> factors;
163 if (const auto* product = dynamic_cast<const MultiplyNode*>(base.get()))
164 factors.assign(product->operands().begin(), product->operands().end());
165 else
166 factors.push_back(base);
167 std::vector<NodePtr> remaining;
168 remaining.reserve(factors.size() + 1);
169 const bool exact_factor = collect_exact_factors(factors, coefficient, remaining);
170 return scaled_value(base, coefficient, remaining, exact_factor);
171 }
Result< void > require_integer_bits(std::size_t amount, const std::string &operation={}) const
bool needs_scale(const QuantityNode &n, const NodePtr &base)
NodePtr scaled_value(const NodePtr &base, const Rational &coefficient, std::vector< NodePtr > &remaining, bool exact_factor)
bool collect_exact_factors(const std::vector< NodePtr > &factors, Rational &coefficient, std::vector< NodePtr > &remaining)
@ Rational
Rational numbers

引用了 LMCAS::serialization_detail::check(), collect_exact_factors(), context_, LMCAS::serialization_detail::kEncode, needs_scale(), LMCAS::QuantityNode::scale_to_base(), scaled_value() , 以及 LMCAS::QuantityNode::value().

被这些函数引用 visit().

函数调用图:
这是这个函数的调用关系图:

◆ collect_exact_factors()

bool LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::collect_exact_factors ( const std::vector< NodePtr > & factors,
Rational & coefficient,
std::vector< NodePtr > & remaining )
inlineprivate

在文件 expr_serialization.cpp 第 135 行定义.

136 {
137 bool exact_factor = false;
138 for (const auto& factor : factors) {
139 const auto* number = dynamic_cast<const NumberNode*>(factor.get());
140 if (!number) {
141 remaining.push_back(factor);
142 continue;
143 }
144 const Rational value = std::holds_alternative<BigInt>(number->value())
145 ? Rational(std::get<BigInt>(number->value()))
146 : std::get<Rational>(number->value());
147 check(context_.require_integer_bits(value.get_numerator().bit_length(), kEncode));
148 check(context_.require_integer_bits(value.get_denominator().bit_length(), kEncode));
149 coefficient = coefficient * value;
150 check(context_.require_integer_bits(coefficient.get_numerator().bit_length(), kEncode));
151 check(context_.require_integer_bits(coefficient.get_denominator().bit_length(), kEncode));
152 exact_factor = true;
153 }
154 return exact_factor;
155 }
const std::string const ExprPtr & value

引用了 LMCAS::serialization_detail::check(), context_, LMCAS::serialization_detail::kEncode , 以及 LMCAS::value.

被这些函数引用 base_value().

函数调用图:
这是这个函数的调用关系图:

◆ emit()

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::emit ( const NodePtr & node)
inlineprivate

在文件 expr_serialization.cpp 第 219 行定义.

219 {
220 Recursion depth(context_, kEncode);
221 if (!node) throw CasError{CasErrc::InvalidArgument, "null expression node", kEncode};
222 try {
223 node->accept(*this);
224 } catch (const std::runtime_error& error) {
225 if (std::string_view(error.what()) == "AST traversal depth limit exceeded")
226 throw CasError{CasErrc::ResourceLimit, error.what(), kEncode};
227 throw;
228 }
229 }
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::size_t std::size_t depth

引用了 context_, LMCAS::depth, LMCAS::InvalidArgument, LMCAS::serialization_detail::kEncode , 以及 LMCAS::ResourceLimit.

被这些函数引用 emit_list(), finish(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

这是这个函数的调用关系图:

◆ emit_list()

template<typename Children>
void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::emit_list ( const Children & children)
inlineprivate

在文件 expr_serialization.cpp 第 215 行定义.

215 {
216 put_size(children.size());
217 for (const auto& child : children) emit(child);
218 }

引用了 emit() , 以及 put_size().

被这些函数引用 visit(), visit(), visit(), visit() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ finish()

std::string LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::finish ( const NodePtr & root)
inline

在文件 expr_serialization.cpp 第 21 行定义.

21 {
22 emit(root);
23 return std::move(output_);
24 }

引用了 emit() , 以及 output_.

函数调用图:

◆ needs_scale()

bool LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::needs_scale ( const QuantityNode & n,
const NodePtr & base )
inlineprivate

在文件 expr_serialization.cpp 第 129 行定义.

129 {
130 if (n.scale_to_base() != Rational(1)) return true;
131 if (dynamic_cast<const MultiplyNode*>(base.get())) return true;
132 const auto* number = dynamic_cast<const NumberNode*>(base.get());
133 return number && std::holds_alternative<Rational>(number->value());
134 }

引用了 LMCAS::QuantityNode::scale_to_base().

被这些函数引用 base_value().

函数调用图:
这是这个函数的调用关系图:

◆ put()

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put ( std::string_view field)
inlineprivate

在文件 expr_serialization.cpp 第 185 行定义.

185 {
187 char digits[std::numeric_limits<std::size_t>::digits10 + 2];
188 auto end = std::to_chars(digits, digits + sizeof(digits), field.size()).ptr;
189 const auto width = static_cast<std::size_t>(end - digits);
190 const auto extra = width + 2;
191 if (field.size() > context_.limits().max_input_bytes ||
192 output_.size() > context_.limits().max_input_bytes - field.size() ||
193 extra > context_.limits().max_input_bytes - field.size() - output_.size()) {
194 throw CasError{CasErrc::ResourceLimit, "serialized expression byte limit exceeded", kEncode};
195 }
196 output_.append(digits, width);
197 output_ += ':';
198 output_.append(field.data(), field.size());
199 output_ += ',';
200 }
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
const ResourceLimits & limits() const noexcept
std::size_t max_input_bytes
One checked input buffer.

引用了 LMCAS::serialization_detail::check(), context_, LMCAS::serialization_detail::kEncode, output_ , 以及 LMCAS::ResourceLimit.

被这些函数引用 put_integer(), put_size(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ put_integer()

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put_integer ( const BigInt & value)
inlineprivate

在文件 expr_serialization.cpp 第 206 行定义.

206 {
208 put(value.to_string());
209 }

引用了 LMCAS::serialization_detail::check(), context_, LMCAS::serialization_detail::kEncode, put() , 以及 LMCAS::value.

被这些函数引用 put_rational() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ put_rational()

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put_rational ( const Rational & value)
inlineprivate

在文件 expr_serialization.cpp 第 210 行定义.

210 {
211 put_integer(value.get_numerator());
212 put_integer(value.get_denominator());
213 }

引用了 put_integer() , 以及 LMCAS::value.

被这些函数引用 visit(), visit() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ put_size()

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::put_size ( std::size_t value)
inlineprivate

在文件 expr_serialization.cpp 第 201 行定义.

201 {
202 char digits[std::numeric_limits<std::size_t>::digits10 + 2];
203 auto end = std::to_chars(digits, digits + sizeof(digits), value).ptr;
204 put(std::string_view(digits, static_cast<std::size_t>(end - digits)));
205 }

引用了 put() , 以及 LMCAS::value.

被这些函数引用 emit_list(), visit(), visit(), visit() , 以及 visit().

函数调用图:
这是这个函数的调用关系图:

◆ rewrite_budget()

RewriteBudget * LMCAS::detail::SymbolicVisitor::rewrite_budget ( ) const
inlineprotectednoexceptinherited

在文件 base.hpp 第 220 行定义.

220{ return rewrite_budget_; }

引用了 rewrite_budget_.

被这些函数引用 LMCAS::ExpandVisitor::append_child(), LMCAS::DifferentiationVisitor::append_result(), LMCAS::ExpandVisitor::check_child_count(), LMCAS::NormalizationVisitor::collect_expanded_product(), LMCAS::NormalizationVisitor::collect_product(), LMCAS::NormalizationVisitor::collect_sum(), LMCAS::DifferentiationVisitor::differentiate_atan2(), LMCAS::NormalizationVisitor::distribute_power(), LMCAS::NormalizationVisitor::distribute_product(), LMCAS::NormalizationVisitor::expand_complex_product(), LMCAS::NormalizationVisitor::expand_product(), LMCAS::NormalizationVisitor::extract_term_coefficient(), LMCAS::NormalizationVisitor::finish_squared_norm(), LMCAS::NormalizationVisitor::fuse_matrix_product(), LMCAS::NormalizationVisitor::matrix_product_element(), LMCAS::NormalizationVisitor::merge_complex_terms(), LMCAS::NormalizationVisitor::normalize_bound_body(), LMCAS::NormalizationVisitor::normalize_function_parity(), LMCAS::NormalizationVisitor::normalize_logarithm(), LMCAS::NormalizationVisitor::normalize_matrix_product(), LMCAS::NormalizationVisitor::normalize_matrix_sum(), LMCAS::NormalizationVisitor::normalize_natural_logarithm(), LMCAS::NormalizationVisitor::normalize_nested_imaginary_power(), LMCAS::NormalizationVisitor::normalize_nested_power(), LMCAS::NormalizationVisitor::normalize_power_identity(), LMCAS::NormalizationVisitor::normalize_unary_function(), LMCAS::anonymous_namespace{expression_analysis.cpp}::FreeSubstitution::rewrite_scoped(), LMCAS::NormalizationVisitor::scale_matrix(), LMCAS::DifferentiationVisitor::set_result(), LMCAS::ExpandVisitor::set_result(), LMCAS::ExpandVisitor::set_result(), LMCAS::NormalizationVisitor::set_result(), LMCAS::NormalizationVisitor::simplify_assumed_absolute(), LMCAS::NormalizationVisitor::simplify_assumed_square_root(), LMCAS::NormalizationVisitor::try_normalize_squared_norm(), LMCAS::groebner_detail::PolyBuilder::use_numeric_function(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::detail::SymbolicRewriter::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::DifferentiationVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::ExpandVisitor::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::groebner_detail::PolyBuilder::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit(), LMCAS::NormalizationVisitor::visit() , 以及 LMCAS::NormalizationVisitor::visit().

这是这个函数的调用关系图:

◆ scaled_value()

NodePtr LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::scaled_value ( const NodePtr & base,
const Rational & coefficient,
std::vector< NodePtr > & remaining,
bool exact_factor )
inlineprivate

在文件 expr_serialization.cpp 第 172 行定义.

173 {
174 if (exact_factor || coefficient != Rational(1)) {
175 if (coefficient != Rational(1) || remaining.empty()) {
176 remaining.push_back(coefficient.is_integer()
177 ? SymbolicFactory::create_number(coefficient.to_bigint())
178 : SymbolicFactory::create_number(coefficient));
179 }
180 return remaining.size() == 1 ? remaining.front()
181 : SymbolicFactory::create_multiply(std::move(remaining));
182 }
183 return base;
184 }
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)

引用了 LMCAS::SymbolicFactory::create_multiply() , 以及 LMCAS::SymbolicFactory::create_number().

被这些函数引用 base_value().

函数调用图:
这是这个函数的调用关系图:

◆ visit() [1/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const AddNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 39 行定义.

39{ put("add"); emit_list(n.operands()); }

引用了 emit_list(), LMCAS::AddNode::operands() , 以及 put().

函数调用图:

◆ visit() [2/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const ComplexNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 109 行定义.

109 {
110 put("complex"); emit(n.real()); emit(n.imag());
111 }

引用了 emit(), LMCAS::ComplexNode::imag(), put() , 以及 LMCAS::ComplexNode::real().

函数调用图:

◆ visit() [3/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const FiniteSetNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 93 行定义.

93{ put("set"); emit_list(n.elements()); }

引用了 LMCAS::FiniteSetNode::elements(), emit_list() , 以及 put().

函数调用图:

◆ visit() [4/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const FunctionNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 44 行定义.

44 {
45 put("function"); put(enum_name(n.type(), kFunctions, kEncode));
46 emit_list(n.arguments());
47 }
std::string_view enum_name(Enum value, const std::array< std::string_view, N > &names, const char *operation)
constexpr std::array< std::string_view, 36 > kFunctions

引用了 LMCAS::FunctionNode::arguments(), emit_list(), LMCAS::serialization_detail::enum_name(), LMCAS::serialization_detail::kEncode, LMCAS::serialization_detail::kFunctions, put() , 以及 LMCAS::FunctionNode::type().

函数调用图:

◆ visit() [5/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const IntegralNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 112 行定义.

112 {
113 put("integral"); put(n.variable()); put(n.is_definite() ? "1" : "0");
114 if (n.is_definite()) { emit(n.lower()); emit(n.upper()); }
115 emit(n.body());
116 }

引用了 LMCAS::IntegralNode::body(), emit(), LMCAS::IntegralNode::is_definite(), LMCAS::IntegralNode::lower(), put(), LMCAS::IntegralNode::upper() , 以及 LMCAS::IntegralNode::variable().

函数调用图:

◆ visit() [6/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const IntervalNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 94 行定义.

94 {
95 put("interval"); put(n.lower_closed() ? "1" : "0");
96 put(n.upper_closed() ? "1" : "0"); emit(n.lower()); emit(n.upper());
97 }

引用了 emit(), LMCAS::IntervalNode::lower(), LMCAS::IntervalNode::lower_closed(), put(), LMCAS::IntervalNode::upper() , 以及 LMCAS::IntervalNode::upper_closed().

函数调用图:

◆ visit() [7/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const LimitNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 117 行定义.

117 {
118 put("limit"); put(n.variable()); put(enum_name(n.direction(), kDirections, kEncode));
119 emit(n.point()); emit(n.body());
120 }
constexpr std::array< std::string_view, 3 > kDirections

引用了 LMCAS::LimitNode::body(), LMCAS::LimitNode::direction(), emit(), LMCAS::serialization_detail::enum_name(), LMCAS::serialization_detail::kDirections, LMCAS::serialization_detail::kEncode, LMCAS::LimitNode::point(), put() , 以及 LMCAS::LimitNode::variable().

函数调用图:

◆ visit() [8/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const LogicalNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 61 行定义.

61 {
62 put("logic"); put(enum_name(n.op(), kLogic, kEncode));
63 emit(n.left());
64 if (n.op() != LogicalNode::Op::Not) emit(n.right());
65 }
@ Not
一元逻辑非,right 为 nullptr。
constexpr std::array< std::string_view, 4 > kLogic

引用了 emit(), LMCAS::serialization_detail::enum_name(), LMCAS::serialization_detail::kEncode, LMCAS::serialization_detail::kLogic, LMCAS::LogicalNode::left(), LMCAS::LogicalNode::Not, LMCAS::LogicalNode::op(), put() , 以及 LMCAS::LogicalNode::right().

函数调用图:

◆ visit() [9/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const MatrixNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 51 行定义.

51 {
52 put("matrix"); put_size(n.rows()); put_size(n.cols());
53 for (std::size_t r = 0; r < n.rows(); ++r)
54 for (std::size_t c = 0; c < n.cols(); ++c)
55 emit(n.get(r, c));
56 }
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
const VectorField const VectorField & c

引用了 LMCAS::c, LMCAS::MatrixNode::cols(), emit(), LMCAS::MatrixNode::get(), put(), put_size(), LMCAS::r , 以及 LMCAS::MatrixNode::rows().

函数调用图:

◆ visit() [10/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const MembershipNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 98 行定义.

98 {
99 put("membership"); emit(n.element()); emit(n.set());
100 }

引用了 LMCAS::MembershipNode::element(), emit(), put() , 以及 LMCAS::MembershipNode::set().

函数调用图:

◆ visit() [11/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const MultiplyNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 40 行定义.

40{ put("multiply"); emit_list(n.operands()); }

引用了 emit_list(), LMCAS::MultiplyNode::operands() , 以及 put().

函数调用图:

◆ visit() [12/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const NumberNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 26 行定义.

26 {
27 const auto& value = n.value();
28 if (const auto* integer = std::get_if<BigInt>(&value)) {
29 put("integer");
31 } else {
32 put("rational");
33 put_rational(std::get<Rational>(value));
34 }
35 }
ExprResult integer(Integer)=delete

引用了 LMCAS::integer, put(), put_integer(), put_rational(), LMCAS::NumberNode::value() , 以及 LMCAS::value.

函数调用图:

◆ visit() [13/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const PiecewiseNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 66 行定义.

66 {
67 put("piecewise"); put_size(n.branches().size());
68 for (const auto& branch : n.branches()) {
69 emit(branch.expression); emit(branch.condition);
70 }
71 put(n.default_expr() ? "1" : "0");
72 if (n.default_expr()) emit(n.default_expr());
73 }

引用了 LMCAS::PiecewiseNode::branches(), LMCAS::PiecewiseNode::default_expr(), emit(), put() , 以及 put_size().

函数调用图:

◆ visit() [14/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const PowerNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 41 行定义.

41 {
42 put("power"); emit(n.base()); emit(n.exponent());
43 }

引用了 LMCAS::PowerNode::base(), emit(), LMCAS::PowerNode::exponent() , 以及 put().

函数调用图:

◆ visit() [15/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const ProductNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 78 行定义.

78 {
79 put("product"); put(n.index_var()); emit(n.lower_bound());
80 emit(n.upper_bound()); emit(n.body());
81 }

引用了 LMCAS::ProductNode::body(), emit(), LMCAS::ProductNode::index_var(), LMCAS::ProductNode::lower_bound(), put() , 以及 LMCAS::ProductNode::upper_bound().

函数调用图:

◆ visit() [16/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const QuantifierNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 86 行定义.

86 {
87 put("quantifier"); put(enum_name(n.quantifier_type(), kQuantifiers, kEncode));
88 put(n.bound_var()); emit(n.domain()); emit(n.predicate());
89 }
constexpr std::array< std::string_view, 2 > kQuantifiers

引用了 LMCAS::QuantifierNode::bound_var(), LMCAS::QuantifierNode::domain(), emit(), LMCAS::serialization_detail::enum_name(), LMCAS::serialization_detail::kEncode, LMCAS::serialization_detail::kQuantifiers, LMCAS::QuantifierNode::predicate(), put() , 以及 LMCAS::QuantifierNode::quantifier_type().

函数调用图:

◆ visit() [17/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const QuantityNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 101 行定义.

101 {
102 put("quantity"); put_size(n.dimension().exponents().size());
103 for (const auto& [name, exponent] : n.dimension().exponents()) {
105 }
106 // A quantity's physical value is its displayed value multiplied by its exact scale.
107 emit(base_value(n));
108 }
const ExprPtr & exponent
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name

引用了 base_value(), LMCAS::QuantityNode::dimension(), emit(), LMCAS::exponent, LMCAS::name, put(), put_rational() , 以及 put_size().

函数调用图:

◆ visit() [18/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const RelationalNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 57 行定义.

57 {
58 put("relation"); put(enum_name(n.op(), kRelations, kEncode));
59 emit(n.left()); emit(n.right());
60 }
constexpr std::array< std::string_view, 6 > kRelations

引用了 emit(), LMCAS::serialization_detail::enum_name(), LMCAS::serialization_detail::kEncode, LMCAS::serialization_detail::kRelations, LMCAS::RelationalNode::left(), LMCAS::RelationalNode::op(), put() , 以及 LMCAS::RelationalNode::right().

函数调用图:

◆ visit() [19/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const RootOfNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 121 行定义.

121 {
122 put("root_of"); put(n.variable()); put_size(n.index());
123 put_size(n.exact_id().polynomial.coeffs.size());
124 for (const auto& coefficient : n.exact_id().polynomial.coeffs)
125 put_rational(coefficient);
126 }

引用了 LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::RootOfNode::exact_id(), LMCAS::RootOfNode::index(), LMCAS::detail::ExactRootId::polynomial, put(), put_rational(), put_size() , 以及 LMCAS::RootOfNode::variable().

函数调用图:

◆ visit() [20/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const SetBuilderNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 90 行定义.

90 {
91 put("set_builder"); put(n.element_var()); emit(n.domain()); emit(n.predicate());
92 }

引用了 LMCAS::SetBuilderNode::domain(), LMCAS::SetBuilderNode::element_var(), emit(), LMCAS::SetBuilderNode::predicate() , 以及 put().

函数调用图:

◆ visit() [21/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const SummationNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 74 行定义.

74 {
75 put("sum"); put(n.index_var()); emit(n.lower_bound());
76 emit(n.upper_bound()); emit(n.body());
77 }

引用了 LMCAS::SummationNode::body(), emit(), LMCAS::SummationNode::index_var(), LMCAS::SummationNode::lower_bound(), put() , 以及 LMCAS::SummationNode::upper_bound().

函数调用图:

◆ visit() [22/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const TransformNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 82 行定义.

82 {
83 put("transform"); put(enum_name(n.transform_type(), kTransforms, kEncode));
84 put(n.source_var()); emit(n.target()); emit(n.body());
85 }
constexpr std::array< std::string_view, 5 > kTransforms

引用了 LMCAS::TransformNode::body(), emit(), LMCAS::serialization_detail::enum_name(), LMCAS::serialization_detail::kEncode, LMCAS::serialization_detail::kTransforms, put(), LMCAS::TransformNode::source_var(), LMCAS::TransformNode::target() , 以及 LMCAS::TransformNode::transform_type().

函数调用图:

◆ visit() [23/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const UninterpretedFunctionNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 48 行定义.

48 {
49 put("call"); put(n.name()); emit_list(n.arguments());
50 }

引用了 LMCAS::UninterpretedFunctionNode::arguments(), emit_list(), LMCAS::UninterpretedFunctionNode::name() , 以及 put().

函数调用图:

◆ visit() [24/24]

void LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::visit ( const VariableNode & n)
inlineoverridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 expr_serialization.cpp 第 36 行定义.

36 {
37 put(n.is_constant() ? "constant" : "symbol"); put(n.name());
38 }

引用了 LMCAS::VariableNode::is_constant(), LMCAS::VariableNode::name() , 以及 put().

函数调用图:

类成员变量说明

◆ context_

ComputationContext& LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::context_
private

在文件 expr_serialization.cpp 第 231 行定义.

被这些函数引用 Writer(), base_value(), collect_exact_factors(), emit(), put() , 以及 put_integer().

◆ current_depth

int LMCAS::detail::SymbolicVisitor::current_depth = 0
protectedinherited

◆ MAX_DEPTH

int LMCAS::detail::SymbolicVisitor::MAX_DEPTH = 200
staticconstexprprotectedinherited

在文件 base.hpp 第 219 行定义.

被这些函数引用 LMCAS::detail::SymbolicVisitor::DepthGuard::DepthGuard().

◆ output_

std::string LMCAS::anonymous_namespace{expr_serialization.cpp}::Writer::output_
private

在文件 expr_serialization.cpp 第 232 行定义.

被这些函数引用 Writer(), finish() , 以及 put().

◆ rewrite_budget_

RewriteBudget* LMCAS::detail::SymbolicVisitor::rewrite_budget_ = nullptr
privateinherited

该类的文档由以下文件生成: