LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::NormalizationVisitor类 参考final

统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。 更多...

#include </home/runner/work/docs/docs/LMCAS/src/internal/visitors/normalization_visitor.hpp>

类 LMCAS::NormalizationVisitor 继承关系图:
LMCAS::NormalizationVisitor 的协作图:

Public 成员函数

 NormalizationVisitor (detail::RewriteBudget &, FactsQuery &&, Domain)=delete
 NormalizationVisitor (detail::RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr< const SymbolicNode > expand_product (const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > get_result () const
void visit (const AddNode &node) override
void visit (const ComplexNode &node) override
void visit (const FiniteSetNode &node) override
void visit (const FunctionNode &node) override
void visit (const IntegralNode &node) override
void visit (const IntervalNode &node) override
void visit (const LimitNode &node) override
void visit (const LogicalNode &node) override
void visit (const MatrixNode &node) override
void visit (const MembershipNode &node) override
void visit (const MultiplyNode &node) override
void visit (const NumberNode &node) override
void visit (const PiecewiseNode &node) override
void visit (const PowerNode &node) override
void visit (const ProductNode &node) override
void visit (const QuantifierNode &node) override
void visit (const QuantityNode &node) override
void visit (const RelationalNode &node) override
void visit (const RootOfNode &node) override
void visit (const SetBuilderNode &node) override
void visit (const SummationNode &node) override
void visit (const TransformNode &node) override
void visit (const UninterpretedFunctionNode &node) override
void visit (const VariableNode &node) override

Protected 成员函数

RewriteBudget * rewrite_budget () const noexcept

Protected 属性

int current_depth = 0

静态 Protected 属性

static constexpr int MAX_DEPTH = 200

Private 成员函数

bool can_combine_nested_power (const PowerNode &inner, const std::shared_ptr< const NumberNode > &outer_exponent) const
std::shared_ptr< const SymbolicNode > collect_expanded_product (const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > collect_product (const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > collect_sum (const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
void distribute_power (const MultiplyNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
std::shared_ptr< const SymbolicNode > distribute_product (const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > expand_complex_product (const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const NumberNode > extract_term_coefficient (std::shared_ptr< const SymbolicNode > &term)
bool finish_squared_norm (const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument, bool normalize_argument)
std::shared_ptr< const SymbolicNode > fuse_matrix_product (const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::shared_ptr< const SymbolicNode > matrix_product_element (const MatrixNode &left, const MatrixNode &right, std::size_t row, std::size_t col)
void merge_complex_terms (std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > normalize_bound_body (const SymbolicNode &node)
bool normalize_function_parity (FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
bool normalize_logarithm (FunctionNode::FuncType type, const std::vector< std::shared_ptr< const SymbolicNode > > &arguments)
std::shared_ptr< const SymbolicNode > normalize_matrix_product (const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
bool normalize_matrix_sum (const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
bool normalize_natural_logarithm (const std::shared_ptr< const SymbolicNode > &argument)
bool normalize_nested_imaginary_power (const PowerNode &base, const std::shared_ptr< const NumberNode > &exponent)
bool normalize_nested_power (const PowerNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
bool normalize_power_identity (const std::shared_ptr< const SymbolicNode > &base, const std::shared_ptr< const SymbolicNode > &exponent)
bool normalize_product_power (const MultiplyNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
bool normalize_unary_function (FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > scale_matrix (const MatrixNode &matrix, const std::shared_ptr< const NumberNode > &scalar)
void set_result (std::shared_ptr< const SymbolicNode > candidate)
std::shared_ptr< const SymbolicNode > simplify_assumed_absolute (const std::shared_ptr< const SymbolicNode > &argument) const
std::shared_ptr< const SymbolicNode > simplify_assumed_square_root (const std::shared_ptr< const SymbolicNode > &argument) const
std::shared_ptr< const SymbolicNode > try_assumption_simplify (const std::shared_ptr< const SymbolicNode > &node)
bool try_normalize_squared_norm (const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument)

静态 Private 成员函数

static bool is_positive_integer_number (const std::shared_ptr< const NumberNode > &node)

Private 属性

ComputationContext & context_
Domain domain_ = Domain::Real
const FactsQuery & facts_ = detail::no_facts()
std::shared_ptr< const SymbolicNode > result
RewriteBudget * rewrite_budget_ = nullptr

详细描述

统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。

在文件 normalization_visitor.hpp 第 19 行定义.

构造及析构函数说明

◆ NormalizationVisitor() [1/2]

LMCAS::NormalizationVisitor::NormalizationVisitor ( detail::RewriteBudget & budget,
const FactsQuery & facts,
Domain domain )
inline

在文件 normalization_visitor.hpp 第 21 行定义.

引用了 LMCAS::detail::SymbolicVisitor::SymbolicVisitor(), LMCAS::context, context_, LMCAS::domain, domain_ , 以及 facts_.

被这些函数引用 expand_complex_product(), extract_term_coefficient(), matrix_product_element(), merge_complex_terms(), normalize_bound_body(), normalize_logarithm(), normalize_natural_logarithm(), visit() , 以及 visit().

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

◆ NormalizationVisitor() [2/2]

LMCAS::NormalizationVisitor::NormalizationVisitor ( detail::RewriteBudget & ,
FactsQuery && ,
Domain  )
delete

引用了 expand_product(), get_result(), LMCAS::rhs , 以及 visit().

函数调用图:

成员函数说明

◆ can_combine_nested_power()

bool LMCAS::NormalizationVisitor::can_combine_nested_power ( const PowerNode & inner,
const std::shared_ptr< const NumberNode > & outer_exponent ) const
private

在文件 normalization_powers.cpp 第 167 行定义.

169 {
170 if (!is_positive_integer_number(outer_exponent)) {
171 return false;
172 }
173 auto exponent = std::dynamic_pointer_cast<const NumberNode>(inner.exponent());
175 return true;
176 }
177 if (!exponent) {
178 return false;
179 }
180 const auto* rational = std::get_if<Rational>(&exponent->value());
181 if (!rational || rational->get_numerator() <= BigInt(0)) {
182 return false;
183 }
185}
static bool is_positive_integer_number(const std::shared_ptr< const NumberNode > &node)
Result< Tribool > query_nonnegative_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const ExprPtr & exponent
bool normalization_proved(const Result< Tribool > &result)
ExprResult rational(const Rational &value)

引用了 LMCAS::PowerNode::base(), context_, LMCAS::exponent, LMCAS::PowerNode::exponent(), facts_, is_positive_integer_number(), LMCAS::normalization_proved(), LMCAS::detail::query_nonnegative_value() , 以及 LMCAS::rational().

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

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

◆ collect_expanded_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::collect_expanded_product ( const std::shared_ptr< const SymbolicNode > & lhs,
const std::shared_ptr< const SymbolicNode > & rhs )
private

在文件 normalization_products.cpp 第 247 行定义.

249 {
250 ProductAccumulator accumulated;
251 const auto process = [&](const std::shared_ptr<const SymbolicNode>& factor) {
252 if (accumulated.add_number(factor)) {
253 return;
254 }
255 auto base = factor;
257 accumulated.add_base(factor, base, exponent, rewrite_budget());
258 };
259 for (const auto* node : {&lhs, &rhs}) {
260 const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(*node);
261 if (!multiply) {
262 process(*node);
263 continue;
264 }
265 for (const auto& operand : multiply->operands()) {
266 process(operand);
267 }
268 }
269 return accumulated.finish(facts_, domain_, context_, true, rewrite_budget());
270}
RewriteBudget * rewrite_budget() const noexcept
std::shared_ptr< const NumberNode > collectable_power_exponent(const std::shared_ptr< const SymbolicNode > &factor, std::shared_ptr< const SymbolicNode > &base, const FactsQuery &facts, Domain domain, ComputationContext &context)
const ExprPtr & rhs

引用了 context_, domain_, LMCAS::exponent, facts_, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 LMCAS::rhs.

被这些函数引用 expand_product().

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

◆ collect_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::collect_product ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands)
private

在文件 normalization_products.cpp 第 132 行定义.

133 {
134 ProductAccumulator accumulated;
135 for (const auto& operand : operands) {
136 if (accumulated.add_number(operand)) {
137 continue;
138 }
139 auto base = operand;
141 if (base == operand) {
142 const auto power = std::dynamic_pointer_cast<const PowerNode>(operand);
143 if (power && can_combine_nested_power(*power, exponent)) {
144 base = power->base();
145 exponent = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
146 }
147 }
148 accumulated.add_base(operand, base, exponent, rewrite_budget());
149 }
150 return accumulated.finish(facts_, domain_, context_, false, rewrite_budget());
151}
bool can_combine_nested_power(const PowerNode &inner, const std::shared_ptr< const NumberNode > &outer_exponent) const

引用了 can_combine_nested_power(), context_, domain_, LMCAS::exponent, facts_ , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 visit().

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

◆ collect_sum()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::collect_sum ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands)
private

在文件 normalization_arithmetic.cpp 第 145 行定义.

146 {
147 auto constant = detail::make_node<NumberNode>(BigInt(0));
148 struct TermAccum {
149 std::shared_ptr<const NumberNode> coefficient;
150 std::vector<std::shared_ptr<const SymbolicNode>> originals;
151 std::size_t nodes;
152 };
153 std::map<std::shared_ptr<const SymbolicNode>, TermAccum, NodeCompare> terms;
154 for (const auto& operand : operands) {
155 if (const auto number = std::dynamic_pointer_cast<const NumberNode>(operand)) {
156 constant = add_numbers(constant, number);
157 continue;
158 }
159 auto term = operand;
160 auto coefficient = extract_term_coefficient(term);
161 auto found = terms.find(term);
162 if (found == terms.end()) {
163 const auto nodes = rewrite_budget() ? rewrite_budget()->measure(operand) : 0;
164 terms.emplace(term, TermAccum{coefficient, {operand}, nodes});
165 } else {
166 found->second.coefficient = add_numbers(found->second.coefficient, coefficient);
167 normalization_append(rewrite_budget(), found->second.nodes, found->second.originals, operand);
168 }
169 }
170 std::vector<std::shared_ptr<const SymbolicNode>> collected;
171 std::size_t nodes = 0;
172 if (!constant->is_zero()) {
173 normalization_append(rewrite_budget(), nodes, collected, constant);
174 }
175 for (const auto& [term, accumulated] : terms) {
176 if (!accumulated.coefficient->is_zero()) {
177 normalization_append(rewrite_budget(), nodes, collected,
178 weighted_term(term, accumulated.coefficient, rewrite_budget()));
179 } else if (!normalization_can_discard(term, facts_, domain_, context_)) {
180 for (const auto& original : accumulated.originals) {
181 normalization_append(rewrite_budget(), nodes, collected, original);
182 }
183 }
184 }
185 if (collected.empty()) {
186 return detail::make_node<NumberNode>(BigInt(0));
187 }
188 if (collected.size() == 1) {
189 return collected.front();
190 }
192 std::sort(collected.begin(), collected.end(), sum_term_less);
193 return detail::make_node<AddNode>(collected);
194}
std::shared_ptr< const NumberNode > extract_term_coefficient(std::shared_ptr< const SymbolicNode > &term)
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr< const SymbolicNode > weighted_term(const std::shared_ptr< const SymbolicNode > &term, const std::shared_ptr< const NumberNode > &coefficient, detail::RewriteBudget *budget)
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)
两个数值节点相加
bool normalization_can_discard(const std::shared_ptr< const SymbolicNode > &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
void normalization_append(detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)

引用了 LMCAS::add_numbers(), context_, domain_, extract_term_coefficient(), facts_, LMCAS::detail::make_node(), LMCAS::detail::RewriteBudget::measure(), LMCAS::normalization_append(), LMCAS::normalization_can_discard(), LMCAS::normalization_check_arithmetic() , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 visit().

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

◆ distribute_power()

void LMCAS::NormalizationVisitor::distribute_power ( const MultiplyNode & base,
const std::shared_ptr< const SymbolicNode > & exponent )
private

在文件 normalization_powers.cpp 第 70 行定义.

71 {
72 std::vector<std::shared_ptr<const SymbolicNode>> operands;
73 std::size_t nodes = 0;
74 normalization_check_count(rewrite_budget(), base.operands().size(), 1, false);
75 for (const auto& operand : base.operands()) {
77 detail::make_node<PowerNode>(operand, exponent)->accept(*this);
78 if (const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(result)) {
79 for (const auto& child : multiply->operands()) {
80 normalization_append(rewrite_budget(), nodes, operands, child);
81 }
82 } else {
83 normalization_append(rewrite_budget(), nodes, operands, result);
84 }
85 }
86 make_normalized_multiply_node(operands, rewrite_budget())->accept(*this);
87}
std::shared_ptr< const SymbolicNode > result
std::size_t normalization_check_count(detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)

引用了 LMCAS::exponent, LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_append(), LMCAS::normalization_check_children(), LMCAS::normalization_check_count(), LMCAS::MultiplyNode::operands(), result , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 normalize_product_power().

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

◆ distribute_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::distribute_product ( const std::shared_ptr< const SymbolicNode > & lhs,
const std::shared_ptr< const SymbolicNode > & rhs )
private

在文件 normalization_products.cpp 第 221 行定义.

223 {
224 const auto left = std::dynamic_pointer_cast<const AddNode>(lhs);
225 const auto right = std::dynamic_pointer_cast<const AddNode>(rhs);
226 std::size_t left_count = 1, right_count = 1;
227 if (left) {
228 left_count = left->operands().size();
229 }
230 if (right) {
231 right_count = right->operands().size();
232 }
233 normalization_check_count(rewrite_budget(), left_count, right_count, false);
234 std::vector<std::shared_ptr<const SymbolicNode>> terms;
235 std::size_t nodes = 0;
236 for (std::size_t i = 0; i < left_count; ++i) {
237 const auto& a = left ? left->operands()[i] : lhs;
238 for (std::size_t j = 0; j < right_count; ++j) {
239 const auto& b = right ? right->operands()[j] : rhs;
241 }
242 }
244 return detail::make_node<AddNode>(terms);
245}
std::shared_ptr< const SymbolicNode > expand_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
const MultiPoly & b
__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
const ExprPtr & right

引用了 LMCAS::a, LMCAS::b, expand_product(), LMCAS::detail::make_node(), LMCAS::normalization_append(), LMCAS::normalization_check_arithmetic(), LMCAS::normalization_check_count(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::rhs , 以及 LMCAS::right.

被这些函数引用 expand_product().

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

◆ expand_complex_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::expand_complex_product ( const std::shared_ptr< const SymbolicNode > & lhs,
const std::shared_ptr< const SymbolicNode > & rhs )
private

在文件 normalization_products.cpp 第 173 行定义.

175 {
176 const auto left = std::dynamic_pointer_cast<const ComplexNode>(lhs);
177 const auto right = std::dynamic_pointer_cast<const ComplexNode>(rhs);
178 if (!left && !right) {
179 return nullptr;
180 }
181 std::shared_ptr<const SymbolicNode> real;
182 std::shared_ptr<const SymbolicNode> imag;
183 if (left && right) {
184 auto ac = expand_product(left->real(), right->real());
185 auto bd = expand_product(left->imag(), right->imag());
186 auto ad = expand_product(left->real(), right->imag());
187 auto bc = expand_product(left->imag(), right->real());
188 auto negative_bd = expand_product(detail::make_node<NumberNode>(BigInt(-1)), bd);
189 real = SymbolicFactory::create_add({ac, negative_bd}, rewrite_budget());
191 } else if (left) {
192 real = expand_product(left->real(), rhs);
193 imag = expand_product(left->imag(), rhs);
194 } else {
195 real = expand_product(lhs, right->real());
196 imag = expand_product(lhs, right->imag());
197 }
199 real->accept(visitor);
200 auto normalized_real = visitor.get_result();
201 imag->accept(visitor);
202 normalization_check_children(rewrite_budget(), 1, normalized_real, visitor.get_result());
203 return SymbolicFactory::create_complex(normalized_real, visitor.get_result());
204}
NormalizationVisitor(detail::RewriteBudget &budget, const FactsQuery &facts, Domain domain)
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,则返回实部).
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprPtr imag

引用了 NormalizationVisitor(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_complex(), domain_, expand_product(), facts_, get_result(), LMCAS::imag, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), LMCAS::real(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::rhs , 以及 LMCAS::right.

被这些函数引用 expand_product().

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

◆ expand_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::expand_product ( const std::shared_ptr< const SymbolicNode > & lhs,
const std::shared_ptr< const SymbolicNode > & rhs )

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

208 {
209 detail::RewriteScope scope(rewrite_budget());
210 if (auto complex = expand_complex_product(lhs, rhs)) {
211 return complex;
212 }
213 const auto left = std::dynamic_pointer_cast<const AddNode>(lhs);
214 const auto right = std::dynamic_pointer_cast<const AddNode>(rhs);
215 if (left || right) {
216 return distribute_product(lhs, rhs);
217 }
218 return collect_expanded_product(lhs, rhs);
219}
std::shared_ptr< const SymbolicNode > distribute_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > expand_complex_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
std::shared_ptr< const SymbolicNode > collect_expanded_product(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs)
ExprResult complex(ExprPtr real, ExprPtr imag)

引用了 collect_expanded_product(), LMCAS::complex(), distribute_product(), expand_complex_product(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::rhs , 以及 LMCAS::right.

被这些函数引用 NormalizationVisitor(), distribute_product(), expand_complex_product(), LMCAS::ExpandVisitor::visit() , 以及 LMCAS::ExpandVisitor::visit().

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

◆ extract_term_coefficient()

std::shared_ptr< const NumberNode > LMCAS::NormalizationVisitor::extract_term_coefficient ( std::shared_ptr< const SymbolicNode > & term)
private

在文件 normalization_arithmetic.cpp 第 107 行定义.

108 {
109 auto coefficient = detail::make_node<NumberNode>(BigInt(1));
110 const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(term);
111 if (!multiply || multiply->operands().empty()) {
112 return coefficient;
113 }
114 const auto& operands = multiply->operands();
115 auto number = std::dynamic_pointer_cast<const NumberNode>(operands.front());
116 std::size_t index = 0;
117 if (!number) {
118 number = std::dynamic_pointer_cast<const NumberNode>(operands.back());
119 index = operands.size() - 1;
120 }
121 if (!number) {
122 return coefficient;
123 }
124 coefficient = number;
125 if (operands.size() == 2) {
126 term = operands[index == 0 ? 1 : 0];
127 return coefficient;
128 }
129 std::vector<std::shared_ptr<const SymbolicNode>> rest;
130 std::size_t nodes = 0;
131 normalization_check_count(rewrite_budget(), operands.size() - 1, 1, false);
132 rest.reserve(operands.size() - 1);
133 for (std::size_t k = 0; k < operands.size(); ++k) {
134 if (k != index) {
135 normalization_append(rewrite_budget(), nodes, rest, operands[k]);
136 }
137 }
138 auto rest_product = make_normalized_multiply_node(rest, rewrite_budget());
140 rest_product->accept(visitor);
141 term = visitor.get_result();
142 return coefficient;
143}

引用了 NormalizationVisitor(), domain_, facts_, get_result(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_append(), LMCAS::normalization_check_count() , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 collect_sum().

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

◆ finish_squared_norm()

bool LMCAS::NormalizationVisitor::finish_squared_norm ( const SymbolicNode & node,
std::shared_ptr< const SymbolicNode > & argument,
bool normalize_argument )
private

在文件 normalization_norms.cpp 第 85 行定义.

86 {
87 if (normalize_argument) {
88 argument->accept(*this);
89 argument = result;
90 return false;
91 }
92 if (const auto* power = dynamic_cast<const PowerNode*>(&node)) {
93 normalization_check_children(rewrite_budget(), 1, argument, power->exponent());
94 set_result(detail::make_node<PowerNode>(argument, power->exponent()));
95 } else {
98 std::vector<std::shared_ptr<const SymbolicNode>>{argument});
99 auto simplified = try_assumption_simplify(norm);
100 set_result(simplified ? simplified : norm);
101 }
102 return true;
103}
@ Sqrt
对数、绝对值、平方根。
std::shared_ptr< const SymbolicNode > try_assumption_simplify(const std::shared_ptr< const SymbolicNode > &node)
void set_result(std::shared_ptr< const SymbolicNode > candidate)

引用了 LMCAS::detail::make_node(), LMCAS::normalization_check_children(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result(), LMCAS::FunctionNode::Sqrt , 以及 try_assumption_simplify().

被这些函数引用 try_normalize_squared_norm().

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

◆ fuse_matrix_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::fuse_matrix_product ( const std::shared_ptr< const SymbolicNode > & left,
const std::shared_ptr< const SymbolicNode > & right )
private

在文件 normalization_matrices.cpp 第 88 行定义.

90 {
91 const auto a = std::dynamic_pointer_cast<const MatrixNode>(left);
92 const auto b = std::dynamic_pointer_cast<const MatrixNode>(right);
93 if (!a || !b) {
94 return nullptr;
95 }
96 if (a->cols() != b->rows()) {
97 return nullptr;
98 }
100 const auto count = normalization_check_count(rewrite_budget(), a->rows(), b->cols());
101 std::size_t nodes = 1;
102 elements.reserve(count);
103 for (std::size_t row = 0; row < a->rows(); ++row) {
104 for (std::size_t col = 0; col < b->cols(); ++col) {
105 normalization_append(rewrite_budget(), nodes, elements,
106 matrix_product_element(*a, *b, row, col));
107 }
108 }
109 return detail::make_node<MatrixNode>(a->rows(), b->cols(), elements);
110}
std::vector< std::shared_ptr< const SymbolicNode > > DenseStorage
稠密存储,按行优先展开。
std::shared_ptr< const SymbolicNode > matrix_product_element(const MatrixNode &left, const MatrixNode &right, std::size_t row, std::size_t col)

引用了 LMCAS::a, LMCAS::b, LMCAS::detail::make_node(), matrix_product_element(), LMCAS::normalization_append(), LMCAS::normalization_check_count(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 LMCAS::right.

被这些函数引用 normalize_matrix_product().

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

◆ get_result()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::get_result ( ) const
nodiscard

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

41 {
42 return result;
43}

引用了 result.

被这些函数引用 NormalizationVisitor(), expand_complex_product(), extract_term_coefficient(), LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point(), matrix_product_element(), merge_complex_terms(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalize(), normalize_bound_body(), LMCAS::detail::normalize_node(), visit() , 以及 visit().

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

◆ is_positive_integer_number()

bool LMCAS::NormalizationVisitor::is_positive_integer_number ( const std::shared_ptr< const NumberNode > & node)
staticprivate

在文件 normalization_powers.cpp 第 163 行定义.

163 {
164 BigInt value;
165 return try_get_integer_value(node, value) && value > BigInt(0);
166 }
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
const std::string const ExprPtr & value

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

被这些函数引用 can_combine_nested_power().

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

◆ matrix_product_element()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::matrix_product_element ( const MatrixNode & left,
const MatrixNode & right,
std::size_t row,
std::size_t col )
private

在文件 normalization_matrices.cpp 第 68 行定义.

69 {
70 const auto* a = std::get_if<MatrixNode::DenseStorage>(&left.storage());
71 const auto* b = std::get_if<MatrixNode::DenseStorage>(&right.storage());
72 std::vector<std::shared_ptr<const SymbolicNode>> terms;
73 std::size_t nodes = 0;
74 normalization_check_count(rewrite_budget(), left.cols(), 1, false);
75 terms.reserve(left.cols());
76 for (std::size_t k = 0; k < left.cols(); ++k) {
77 auto first = a ? (*a)[row * left.cols() + k] : matrix_element(left, row * left.cols() + k);
78 auto second = b ? (*b)[k * right.cols() + col] : matrix_element(right, k * right.cols() + col);
81 }
84 detail::make_node<AddNode>(terms)->accept(visitor);
85 return visitor.get_result();
86}
std::shared_ptr< const SymbolicNode > matrix_element(const MatrixNode &matrix, std::size_t index)

引用了 NormalizationVisitor(), LMCAS::a, LMCAS::b, LMCAS::MatrixNode::cols(), domain_, facts_, get_result(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_append(), LMCAS::normalization_check_arithmetic(), LMCAS::normalization_check_count(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::right , 以及 LMCAS::MatrixNode::storage().

被这些函数引用 fuse_matrix_product().

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

◆ merge_complex_terms()

void LMCAS::NormalizationVisitor::merge_complex_terms ( std::vector< std::shared_ptr< const SymbolicNode > > & operands)
private

在文件 normalization_arithmetic.cpp 第 70 行定义.

71 {
72 std::vector<std::shared_ptr<const SymbolicNode>> real;
73 std::vector<std::shared_ptr<const SymbolicNode>> imag;
74 std::vector<std::shared_ptr<const SymbolicNode>> remaining;
75 std::size_t real_nodes = 0, imag_nodes = 0, remaining_nodes = 0;
76 bool has_complex = false;
77 for (const auto& operand : operands) {
78 if (const auto complex = std::dynamic_pointer_cast<const ComplexNode>(operand)) {
79 has_complex = true;
80 normalization_append(rewrite_budget(), real_nodes, real, complex->real());
81 normalization_append(rewrite_budget(), imag_nodes, imag, complex->imag());
82 } else if (std::dynamic_pointer_cast<const NumberNode>(operand)) {
83 normalization_append(rewrite_budget(), real_nodes, real, operand);
86 } else {
87 normalization_append(rewrite_budget(), remaining_nodes, remaining, operand);
88 }
89 }
90 if (!has_complex) {
91 return;
92 }
96 real_sum->accept(visitor);
97 auto normalized_real = visitor.get_result();
98 imag_sum->accept(visitor);
99 normalization_check_children(rewrite_budget(), 1, normalized_real, visitor.get_result());
100 auto merged = SymbolicFactory::create_complex(normalized_real, visitor.get_result());
101 if (!merged->is_zero()) {
102 normalization_append(rewrite_budget(), remaining_nodes, remaining, merged);
103 }
104 operands = std::move(remaining);
105}
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)

引用了 NormalizationVisitor(), LMCAS::complex(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_complex(), LMCAS::SymbolicFactory::create_number(), domain_, facts_, get_result(), LMCAS::imag, LMCAS::normalization_append(), LMCAS::normalization_check_children(), LMCAS::real() , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 visit().

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

◆ normalize_bound_body()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::normalize_bound_body ( const SymbolicNode & node)
private

在文件 normalization_structural.cpp 第 9 行定义.

10 {
11 const auto binder = detail::binder_view(node);
12 if (&facts_ == &detail::no_facts()) {
13 binder->scoped_body->accept(*this);
14 return result;
15 }
16 const detail::ScopedFacts scoped(facts_, binder->bound_name);
18 binder->scoped_body->accept(inner);
19 return inner.get_result();
20}
std::optional< BinderView > binder_view(const SymbolicNode &node)
const FactsQuery & no_facts() noexcept

引用了 NormalizationVisitor(), LMCAS::detail::binder_view(), domain_, facts_, get_result(), LMCAS::detail::no_facts(), result , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

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

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

◆ normalize_function_parity()

bool LMCAS::NormalizationVisitor::normalize_function_parity ( FunctionNode::FuncType type,
const std::shared_ptr< const SymbolicNode > & argument )
private

在文件 normalization_functions.cpp 第 70 行定义.

71 {
72 std::shared_ptr<const SymbolicNode> positive;
73 if (!check_negative_arg(argument, positive, rewrite_budget())) {
74 return false;
75 }
76 switch (type) {
83 std::vector<std::shared_ptr<const SymbolicNode>>{positive});
86 return true;
87 }
91 std::vector<std::shared_ptr<const SymbolicNode>>{positive}));
92 return true;
93 default:
94 return false;
95 }
96}
bool check_negative_arg(const std::shared_ptr< const SymbolicNode > &argument, std::shared_ptr< const SymbolicNode > &positive, detail::RewriteBudget *budget=nullptr)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::FunctionNode::ArcSin, LMCAS::FunctionNode::ArcTan, LMCAS::check_negative_arg(), LMCAS::FunctionNode::Cos, LMCAS::function(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_check_children(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result(), LMCAS::FunctionNode::Sin , 以及 LMCAS::FunctionNode::Tan.

被这些函数引用 normalize_unary_function().

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

◆ normalize_logarithm()

bool LMCAS::NormalizationVisitor::normalize_logarithm ( FunctionNode::FuncType type,
const std::vector< std::shared_ptr< const SymbolicNode > > & arguments )
private

在文件 normalization_functions.cpp 第 6 行定义.

8 {
9 if (type == FunctionNode::FuncType::Ln && arguments.size() == 1) {
10 return normalize_natural_logarithm(arguments.front());
11 }
12 if (type != FunctionNode::FuncType::Log || arguments.size() != 2) {
13 return false;
14 }
15 if (const auto power = std::dynamic_pointer_cast<const PowerNode>(arguments.front())) {
18 std::vector<std::shared_ptr<const SymbolicNode>>{arguments[1]});
19 if (power->base()->compare(*arguments[1]) == 0 &&
23 set_result(power->exponent());
24 return true;
25 }
26 }
29 std::vector<std::shared_ptr<const SymbolicNode>>{arguments[0]});
32 std::vector<std::shared_ptr<const SymbolicNode>>{arguments[1]});
35 auto quotient = make_normalized_multiply_node({numerator, reciprocal}, rewrite_budget());
37 quotient->accept(visitor);
38 set_result(visitor.get_result());
39 return true;
40}
bool normalize_natural_logarithm(const std::shared_ptr< const SymbolicNode > &argument)
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
@ Real
Real numbers
const ExprPtr & denominator

引用了 NormalizationVisitor(), context_, LMCAS::denominator, domain_, facts_, LMCAS::FunctionNode::Ln, LMCAS::FunctionNode::Log, LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_check_children(), LMCAS::normalization_proved(), normalize_natural_logarithm(), LMCAS::detail::query_nonzero_value(), LMCAS::detail::query_positive_value(), LMCAS::detail::query_real_value(), LMCAS::Real, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

被这些函数引用 visit().

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

◆ normalize_matrix_product()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::normalize_matrix_product ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands)
private

在文件 normalization_matrices.cpp 第 128 行定义.

129 {
130 std::vector<std::shared_ptr<const SymbolicNode>> nonscalar;
131 std::size_t nonscalar_nodes = 0;
132 auto scalar = detail::make_node<NumberNode>(BigInt(1));
133 for (const auto& operand : operands) {
134 if (const auto number = std::dynamic_pointer_cast<const NumberNode>(operand)) {
135 scalar = multiply_numbers(scalar, number);
136 } else {
137 normalization_append(rewrite_budget(), nonscalar_nodes, nonscalar, operand);
138 }
139 }
140 std::vector<std::shared_ptr<const SymbolicNode>> fused;
141 std::size_t fused_nodes = 0;
142 std::size_t last_nodes = 0;
143 if (!nonscalar.empty()) {
144 normalization_append(rewrite_budget(), fused_nodes, fused, nonscalar.front());
145 last_nodes = fused_nodes;
146 }
147 for (std::size_t i = 1; i < nonscalar.size(); ++i) {
148 if (auto product = fuse_matrix_product(fused.back(), nonscalar[i])) {
149 if (rewrite_budget()) {
150 const auto replacement_nodes = rewrite_budget()->measure(product);
151 fused_nodes = rewrite_budget()->append_size(fused_nodes - last_nodes, replacement_nodes);
152 last_nodes = replacement_nodes;
153 }
154 fused.back() = std::move(product);
155 } else {
156 const auto previous_nodes = fused_nodes;
157 normalization_append(rewrite_budget(), fused_nodes, fused, nonscalar[i]);
158 last_nodes = fused_nodes - previous_nodes;
159 }
160 }
161 if (fused.size() == 1 && !scalar->is_one()) {
162 if (const auto matrix = std::dynamic_pointer_cast<const MatrixNode>(fused.front())) {
163 return scale_matrix(*matrix, scalar);
164 }
165 }
166 if (!scalar->is_one()) {
167 if (rewrite_budget()) { (void)rewrite_budget()->append_size(fused_nodes, 1); }
168 fused.insert(fused.begin(), scalar);
169 }
171}
std::shared_ptr< const SymbolicNode > scale_matrix(const MatrixNode &matrix, const std::shared_ptr< const NumberNode > &scalar)
std::shared_ptr< const SymbolicNode > fuse_matrix_product(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::size_t append_size(std::size_t current, std::size_t child)
std::shared_ptr< const NumberNode > multiply_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相乘

引用了 LMCAS::detail::RewriteBudget::append_size(), fuse_matrix_product(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::detail::RewriteBudget::measure(), LMCAS::multiply_numbers(), LMCAS::normalization_append(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 scale_matrix().

被这些函数引用 visit().

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

◆ normalize_matrix_sum()

bool LMCAS::NormalizationVisitor::normalize_matrix_sum ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands)
private

在文件 normalization_matrices.cpp 第 34 行定义.

35 {
36 if (operands.empty()) {
37 return false;
38 }
39 const auto first = std::dynamic_pointer_cast<const MatrixNode>(operands.front());
40 if (!first) {
41 return false;
42 }
43 const auto rows = first->rows();
44 const auto cols = first->cols();
45 if (!matching_matrix_shapes(operands, rows, cols)) {
46 return false;
47 }
49 const auto count = normalization_check_count(rewrite_budget(), rows, cols);
50 std::size_t nodes = 1;
51 elements.reserve(count);
52 for (std::size_t i = 0; i < count; ++i) {
53 std::vector<std::shared_ptr<const SymbolicNode>> terms;
54 std::size_t term_nodes = 0;
55 normalization_check_count(rewrite_budget(), operands.size(), 1, false);
56 for (const auto& operand : operands) {
57 const auto matrix = std::dynamic_pointer_cast<const MatrixNode>(operand);
58 normalization_append(rewrite_budget(), term_nodes, terms, matrix_element(*matrix, i));
59 }
61 detail::make_node<AddNode>(terms)->accept(*this);
62 normalization_append(rewrite_budget(), nodes, elements, result);
63 }
64 set_result(detail::make_node<MatrixNode>(rows, cols, elements));
65 return true;
66}
bool matching_matrix_shapes(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, std::size_t rows, std::size_t cols)

引用了 LMCAS::detail::make_node(), LMCAS::normalization_append(), LMCAS::normalization_check_arithmetic(), LMCAS::normalization_check_count(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

被这些函数引用 visit().

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

◆ normalize_natural_logarithm()

bool LMCAS::NormalizationVisitor::normalize_natural_logarithm ( const std::shared_ptr< const SymbolicNode > & argument)
private

在文件 normalization_functions.cpp 第 42 行定义.

43 {
44 if (const auto power = std::dynamic_pointer_cast<const PowerNode>(argument)) {
47 return false;
48 }
51 std::vector<std::shared_ptr<const SymbolicNode>>{power->base()});
52 auto product = make_normalized_multiply_node({power->exponent(), logarithm}, rewrite_budget());
54 product->accept(visitor);
55 set_result(visitor.get_result());
56 return true;
57 }
58 const auto function = std::dynamic_pointer_cast<const FunctionNode>(argument);
60 return false;
61 }
62 if (function->arguments().size() != 1 ||
64 return false;
65 }
66 set_result(function->arguments().front());
67 return true;
68}

引用了 NormalizationVisitor(), context_, domain_, LMCAS::FunctionNode::Exp, facts_, LMCAS::function(), LMCAS::FunctionNode::Ln, LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_check_children(), LMCAS::normalization_proved(), LMCAS::detail::query_positive_value(), LMCAS::detail::query_real_value(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

被这些函数引用 normalize_logarithm().

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

◆ normalize_nested_imaginary_power()

bool LMCAS::NormalizationVisitor::normalize_nested_imaginary_power ( const PowerNode & base,
const std::shared_ptr< const NumberNode > & exponent )
private

在文件 normalization_powers.cpp 第 89 行定义.

90 {
91 BigInt integer;
93 return false;
94 }
95 const auto inner_base = std::dynamic_pointer_cast<const NumberNode>(base.base());
96 if (!inner_base || !inner_base->is_negative_one()) {
97 return false;
98 }
99 const auto inner_exponent = std::dynamic_pointer_cast<const NumberNode>(base.exponent());
100 if (!inner_exponent) {
101 return false;
102 }
103 const auto* rational = std::get_if<Rational>(&inner_exponent->value());
104 if (!rational || *rational != Rational(1, 2)) {
105 return false;
106 }
108 return true;
109}
ExprResult integer(Integer)=delete
@ Rational
Rational numbers
std::shared_ptr< const SymbolicNode > normalization_imaginary_power(const BigInt &exponent, detail::RewriteBudget *budget=nullptr)

引用了 LMCAS::PowerNode::base(), LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::integer, LMCAS::normalization_imaginary_power(), LMCAS::rational(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 LMCAS::try_get_integer_value().

被这些函数引用 normalize_nested_power().

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

◆ normalize_nested_power()

bool LMCAS::NormalizationVisitor::normalize_nested_power ( const PowerNode & base,
const std::shared_ptr< const SymbolicNode > & exponent )
private

在文件 normalization_powers.cpp 第 111 行定义.

112 {
113 const auto numeric = std::dynamic_pointer_cast<const NumberNode>(exponent);
114 if (normalize_nested_imaginary_power(base, numeric)) {
115 return true;
116 }
117 if (!can_combine_nested_power(base, numeric)) {
118 return false;
119 }
120 make_normalized_multiply_node({base.exponent(), exponent}, rewrite_budget())->accept(*this);
122 detail::make_node<PowerNode>(base.base(), result)->accept(*this);
123 return true;
124}
bool normalize_nested_imaginary_power(const PowerNode &base, const std::shared_ptr< const NumberNode > &exponent)

引用了 LMCAS::PowerNode::base(), can_combine_nested_power(), LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_check_children(), normalize_nested_imaginary_power(), result , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 visit().

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

◆ normalize_power_identity()

bool LMCAS::NormalizationVisitor::normalize_power_identity ( const std::shared_ptr< const SymbolicNode > & base,
const std::shared_ptr< const SymbolicNode > & exponent )
private

在文件 normalization_powers.cpp 第 6 行定义.

8 {
9 if (exponent->is_zero()) {
14 } else {
17 }
18 return true;
19 }
20 if (exponent->is_one()) {
21 set_result(base);
22 return true;
23 }
24 if (base->is_zero()) {
28 } else {
31 }
32 return true;
33 }
34 if (!base->is_one() || !normalization_can_discard(exponent, facts_, domain_, context_)) {
35 return false;
36 }
38 return true;
39}
@ Complex
Complex numbers (default, least specific)

引用了 LMCAS::Complex, context_, domain_, LMCAS::exponent, facts_, LMCAS::detail::make_node(), LMCAS::normalization_can_discard(), LMCAS::normalization_check_children(), LMCAS::normalization_proved(), LMCAS::detail::query_nonzero_value(), LMCAS::detail::query_positive_value(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

被这些函数引用 visit().

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

◆ normalize_product_power()

bool LMCAS::NormalizationVisitor::normalize_product_power ( const MultiplyNode & base,
const std::shared_ptr< const SymbolicNode > & exponent )
private

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

42 {
43 for (const auto& operand : base.operands()) {
44 const auto* power = dynamic_cast<const PowerNode*>(operand.get());
45 if (dynamic_cast<const MatrixNode*>(operand.get()) ||
46 (power && dynamic_cast<const MatrixNode*>(power->base().get()))) {
47 return false;
48 }
49 }
50 BigInt integer;
51 if (!try_get_integer_value(std::dynamic_pointer_cast<const NumberNode>(exponent), integer)) {
53 return false;
54 }
56 for (const auto& operand : base.operands()) {
57 if (!normalization_proved(positive
60 return false;
61 }
62 }
63 } else if (integer.is_zero()) {
64 return false;
65 }
67 return true;
68}
void distribute_power(const MultiplyNode &base, const std::shared_ptr< const SymbolicNode > &exponent)

引用了 context_, distribute_power(), LMCAS::exponent, facts_, LMCAS::integer, LMCAS::normalization_proved(), LMCAS::MultiplyNode::operands(), LMCAS::detail::query_nonnegative_value(), LMCAS::detail::query_positive_value(), LMCAS::detail::query_real_value() , 以及 LMCAS::try_get_integer_value().

被这些函数引用 visit().

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

◆ normalize_unary_function()

bool LMCAS::NormalizationVisitor::normalize_unary_function ( FunctionNode::FuncType type,
const std::shared_ptr< const SymbolicNode > & argument )
private

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

99 {
100 Rational coefficient;
101 if (get_pi_coeff(argument, coefficient)) {
102 if (auto value = normalization_pi_function(type, coefficient, rewrite_budget())) {
103 set_result(std::move(value));
104 return true;
105 }
106 }
107 return normalize_function_parity(type, argument);
108}
bool normalize_function_parity(FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > normalization_pi_function(FunctionNode::FuncType type, const Rational &coefficient, detail::RewriteBudget *budget=nullptr)
bool get_pi_coeff(const std::shared_ptr< const SymbolicNode > &node, Rational &coefficient)

引用了 LMCAS::get_pi_coeff(), LMCAS::normalization_pi_function(), normalize_function_parity(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 LMCAS::value.

被这些函数引用 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().

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

◆ scale_matrix()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::scale_matrix ( const MatrixNode & matrix,
const std::shared_ptr< const NumberNode > & scalar )
private

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

113 {
115 const auto count = normalization_check_count(rewrite_budget(), matrix.rows(), matrix.cols());
116 std::size_t nodes = 1;
117 elements.reserve(count);
118 for (std::size_t i = 0; i < count; ++i) {
119 auto element = matrix_element(matrix, i);
122 std::vector<std::shared_ptr<const SymbolicNode>>{scalar, element})->accept(*this);
123 normalization_append(rewrite_budget(), nodes, elements, result);
124 }
125 return detail::make_node<MatrixNode>(matrix.rows(), matrix.cols(), std::move(elements));
126}
const ExprPtr & element

引用了 LMCAS::MatrixNode::cols(), LMCAS::element, LMCAS::detail::make_node(), LMCAS::normalization_append(), LMCAS::normalization_check_arithmetic(), LMCAS::normalization_check_count(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 LMCAS::MatrixNode::rows().

被这些函数引用 normalize_matrix_product().

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

◆ set_result()

void LMCAS::NormalizationVisitor::set_result ( std::shared_ptr< const SymbolicNode > candidate)
private

在文件 normalization_arithmetic.cpp 第 45 行定义.

45 {
46 if (auto* budget = rewrite_budget()) {
47 budget->measure_result(candidate);
48 }
49 result.swap(candidate);
50}
std::size_t measure_result(const std::shared_ptr< const SymbolicNode > &node)

引用了 LMCAS::detail::RewriteBudget::measure_result(), result , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 finish_squared_norm(), normalize_function_parity(), normalize_logarithm(), normalize_matrix_sum(), normalize_natural_logarithm(), normalize_nested_imaginary_power(), normalize_power_identity(), normalize_unary_function(), try_normalize_squared_norm(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit(), visit() , 以及 visit().

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

◆ simplify_assumed_absolute()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::simplify_assumed_absolute ( const std::shared_ptr< const SymbolicNode > & argument) const
private

在文件 normalization_functions.cpp 第 190 行定义.

191 {
192 auto positive = detail::query_nonnegative_value(argument, facts_, context_);
193 if (normalization_proved(positive)) {
194 return argument;
195 }
198 return nullptr;
199 }
201 detail::make_node<NumberNode>(BigInt(-1)), argument}, rewrite_budget());
202}
virtual Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0

引用了 context_, facts_, LMCAS::FactsQuery::is_negative(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::normalization_proved(), LMCAS::detail::query_nonnegative_value(), LMCAS::detail::query_real_value() , 以及 LMCAS::detail::SymbolicVisitor::rewrite_budget().

被这些函数引用 try_assumption_simplify().

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

◆ simplify_assumed_square_root()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::simplify_assumed_square_root ( const std::shared_ptr< const SymbolicNode > & argument) const
private

在文件 normalization_functions.cpp 第 160 行定义.

161 {
162 const auto power = std::dynamic_pointer_cast<const PowerNode>(argument);
163 if (!power) {
164 return nullptr;
165 }
166 const auto exponent = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
167 BigInt value;
169 return nullptr;
170 }
171 if (value != BigInt(2)) {
172 return nullptr;
173 }
174 auto nonnegative = detail::query_nonnegative_value(power->base(), facts_, context_);
175 if (normalization_proved(nonnegative)) {
176 return power->base();
177 }
178 auto real = detail::query_real_value(power->base(), facts_, context_);
179 if (!real) {
180 throw real.error();
181 }
182 if (real.value() != Tribool::True) {
183 return nullptr;
184 }
185 normalization_check_children(rewrite_budget(), 1, power->base());
187 std::vector<std::shared_ptr<const SymbolicNode>>{power->base()});
188}
CasError & error()
@ True
Property definitely holds

引用了 LMCAS::FunctionNode::Abs, context_, LMCAS::Result< T >::error(), LMCAS::exponent, facts_, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), LMCAS::normalization_proved(), LMCAS::detail::query_nonnegative_value(), LMCAS::detail::query_real_value(), LMCAS::real(), LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::True, LMCAS::try_get_integer_value(), LMCAS::Result< T >::value() , 以及 LMCAS::value.

被这些函数引用 try_assumption_simplify().

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

◆ try_assumption_simplify()

std::shared_ptr< const SymbolicNode > LMCAS::NormalizationVisitor::try_assumption_simplify ( const std::shared_ptr< const SymbolicNode > & node)
private

在文件 normalization_functions.cpp 第 204 行定义.

205 {
206 const auto function = std::dynamic_pointer_cast<const FunctionNode>(node);
207 if (!function) {
208 return nullptr;
209 }
210 if (function->arguments().size() != 1) {
211 return nullptr;
212 }
213 const auto& argument = function->arguments().front();
214 switch (function->type()) {
216 return simplify_assumed_square_root(argument);
218 return simplify_assumed_absolute(argument);
219 default:
220 return nullptr;
221 }
222}
std::shared_ptr< const SymbolicNode > simplify_assumed_square_root(const std::shared_ptr< const SymbolicNode > &argument) const
std::shared_ptr< const SymbolicNode > simplify_assumed_absolute(const std::shared_ptr< const SymbolicNode > &argument) const

引用了 LMCAS::FunctionNode::Abs, LMCAS::function(), simplify_assumed_absolute(), simplify_assumed_square_root() , 以及 LMCAS::FunctionNode::Sqrt.

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

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

◆ try_normalize_squared_norm()

bool LMCAS::NormalizationVisitor::try_normalize_squared_norm ( const SymbolicNode & node,
std::shared_ptr< const SymbolicNode > & argument )
private

在文件 normalization_norms.cpp 第 54 行定义.

55 {
56 const auto squares = detail::squared_norm_terms(node);
57 if (!squares[0]) {
58 return false;
59 }
60 squares[0]->base()->accept(*this);
61 auto first = result;
62 std::shared_ptr<const SymbolicNode> second;
63 if (squares[1]) {
64 squares[1]->base()->accept(*this);
65 second = result;
66 }
67 const auto* a = dynamic_cast<const NumberNode*>(first.get());
68 const auto* b = dynamic_cast<const NumberNode*>(second.get());
69 const bool numeric = numeric_norm_operands(a, b, second);
70 argument = normalized_norm_argument(first, second, squares, rewrite_budget());
71 if (numeric) {
72 argument->accept(*this);
73 const auto* number = dynamic_cast<const NumberNode*>(result.get());
74 if (number) {
75 if (auto root = normalization_exact_square_root(*number)) {
76 set_result(std::move(root));
77 return true;
78 }
79 }
80 return finish_squared_norm(node, argument, false);
81 }
82 return finish_squared_norm(node, argument, complex_norm_operand(first, second));
83}
bool finish_squared_norm(const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument, bool normalize_argument)
std::shared_ptr< const SymbolicNode > normalized_norm_argument(const std::shared_ptr< const SymbolicNode > &first, const std::shared_ptr< const SymbolicNode > &second, const std::array< const PowerNode *, 2 > &squares, detail::RewriteBudget *budget)
bool numeric_norm_operands(const NumberNode *first, const NumberNode *second, const std::shared_ptr< const SymbolicNode > &second_node)
bool complex_norm_operand(const std::shared_ptr< const SymbolicNode > &first, const std::shared_ptr< const SymbolicNode > &second)
std::array< const PowerNode *, 2 > squared_norm_terms(const SymbolicNode &root)
Recognize real-numeric norm forms without evaluating their squares.
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)

引用了 LMCAS::a, LMCAS::b, finish_squared_norm(), LMCAS::normalization_exact_square_root(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 LMCAS::detail::squared_norm_terms().

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

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

◆ visit() [1/24]

void LMCAS::NormalizationVisitor::visit ( const AddNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_arithmetic.cpp 第 196 行定义.

196 {
197 std::vector<std::shared_ptr<const SymbolicNode>> operands;
198 std::size_t nodes = 0;
199 for (const auto& operand : node.operands()) {
200 operand->accept(*this);
201 if (const auto add = std::dynamic_pointer_cast<const AddNode>(result)) {
202 for (const auto& child : add->operands()) {
203 normalization_append(rewrite_budget(), nodes, operands, child);
204 }
205 } else {
206 normalization_append(rewrite_budget(), nodes, operands, result);
207 }
208 }
209 merge_complex_terms(operands);
210 if (normalize_matrix_sum(operands)) {
211 return;
212 }
213 set_result(collect_sum(operands));
214}
std::shared_ptr< const SymbolicNode > collect_sum(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
bool normalize_matrix_sum(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
void merge_complex_terms(std::vector< std::shared_ptr< const SymbolicNode > > &operands)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::add(), collect_sum(), merge_complex_terms(), LMCAS::normalization_append(), normalize_matrix_sum(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [2/24]

void LMCAS::NormalizationVisitor::visit ( const ComplexNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_arithmetic.cpp 第 62 行定义.

62 {
63 node.real()->accept(*this);
64 auto real = result;
65 node.imag()->accept(*this);
68}

引用了 LMCAS::SymbolicFactory::create_complex(), LMCAS::normalization_check_children(), LMCAS::real(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [3/24]

void LMCAS::NormalizationVisitor::visit ( const FiniteSetNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 313 行定义.

313 {
314 std::vector<std::shared_ptr<const SymbolicNode>> elements;
315 std::size_t nodes = 1;
316 normalization_check_count(rewrite_budget(), node.elements().size());
317 elements.reserve(node.elements().size());
318 for (const auto& element : node.elements()) {
319 element->accept(*this);
320 normalization_append(rewrite_budget(), nodes, elements, result);
321 }
323}

引用了 LMCAS::element, LMCAS::detail::make_node(), LMCAS::normalization_append(), LMCAS::normalization_check_count(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [4/24]

void LMCAS::NormalizationVisitor::visit ( const FunctionNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_functions.cpp 第 110 行定义.

110 {
111 std::shared_ptr<const SymbolicNode> argument;
112 if (try_normalize_squared_norm(node, argument)) {
113 return;
114 }
115 std::vector<std::shared_ptr<const SymbolicNode>> arguments;
116 std::size_t nodes = 0;
117 if (argument) {
118 normalization_append(rewrite_budget(), nodes, arguments, argument);
119 } else {
120 for (const auto& operand : node.arguments()) {
121 operand->accept(*this);
122 normalization_append(rewrite_budget(), nodes, arguments, result);
123 }
124 }
125 if (arguments.size() == 1) {
126 if (const auto number = std::dynamic_pointer_cast<const NumberNode>(arguments.front())) {
127 if (auto value = normalization_numeric_function(node.type(), number, rewrite_budget())) {
128 set_result(std::move(value));
129 return;
130 }
131 }
132 }
133 if (normalize_logarithm(node.type(), arguments)) {
134 return;
135 }
136 if (arguments.size() == 1 && normalize_unary_function(node.type(), arguments.front())) {
137 return;
138 }
139 if (rewrite_budget()) { rewrite_budget()->append_size(1, nodes); }
140 auto function = detail::make_node<FunctionNode>(node.type(), arguments);
141 if (auto simplified = try_assumption_simplify(function)) {
142 simplified->accept(*this);
143 return;
144 }
146}
bool try_normalize_squared_norm(const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument)
bool normalize_unary_function(FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
bool normalize_logarithm(FunctionNode::FuncType type, const std::vector< std::shared_ptr< const SymbolicNode > > &arguments)
std::shared_ptr< const SymbolicNode > normalization_numeric_function(FunctionNode::FuncType type, const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget=nullptr)

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::function(), LMCAS::detail::make_node(), LMCAS::normalization_append(), LMCAS::normalization_numeric_function(), normalize_logarithm(), normalize_unary_function(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result(), try_assumption_simplify(), try_normalize_squared_norm() , 以及 LMCAS::value.

函数调用图:

◆ visit() [5/24]

void LMCAS::NormalizationVisitor::visit ( const IntegralNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 355 行定义.

355 {
356 auto body = normalize_bound_body(node);
357 std::shared_ptr<const SymbolicNode> lower;
358 std::shared_ptr<const SymbolicNode> upper;
359 if (node.lower()) {
360 node.lower()->accept(*this);
361 lower = result;
362 node.upper()->accept(*this);
363 upper = result;
364 }
367 std::move(body), node.variable(), std::move(lower), std::move(upper)));
368}
std::shared_ptr< const SymbolicNode > normalize_bound_body(const SymbolicNode &node)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const ExprPtr & lower

引用了 LMCAS::lower, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 LMCAS::upper.

函数调用图:

◆ visit() [6/24]

void LMCAS::NormalizationVisitor::visit ( const IntervalNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 325 行定义.

325 {
326 node.lower()->accept(*this);
327 auto lower = result;
328 node.upper()->accept(*this);
331 lower, result, node.lower_closed(), node.upper_closed()));
332}

引用了 LMCAS::lower, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [7/24]

void LMCAS::NormalizationVisitor::visit ( const LimitNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 370 行定义.

370 {
371 auto body = normalize_bound_body(node);
372 node.point()->accept(*this);
375 body, node.variable(), result, node.direction()));
376}

引用了 LMCAS::detail::make_node(), LMCAS::normalization_check_children(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [8/24]

void LMCAS::NormalizationVisitor::visit ( const LogicalNode & node)
overridevirtual

Implication: A ⇒ B = ¬A ∨ B

NOT handling: De Morgan's laws and double negation

Normalize the operand first

Double negation: ¬(¬A) = A

De Morgan's law: ¬(A∧B) = ¬A∨¬B

De Morgan's law: ¬(A∨B) = ¬A∧¬B

And / Or: normalize operands

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 72 行定义.

72 {
73 /// Implication: A ⇒ B = ¬A ∨ B
74 if (node.op() == LogicalNode::Op::Implies) {
76 auto not_left = LMCAS::detail::make_node<LogicalNode>(node.left(), nullptr, LogicalNode::Op::Not);
77 normalization_check_children(rewrite_budget(), 1, not_left, node.right());
78 auto or_node = LMCAS::detail::make_node<LogicalNode>(not_left, node.right(), LogicalNode::Op::Or);
79 or_node->accept(*this);
80 return;
81 }
82
83 /// NOT handling: De Morgan's laws and double negation
84 if (node.op() == LogicalNode::Op::Not) {
85 /// Normalize the operand first
86 std::shared_ptr<const SymbolicNode> new_left = nullptr;
87 if (node.left()) {
88 node.left()->accept(*this);
89 new_left = result;
90 }
91 if (!new_left) new_left = node.left();
92
93 /// Double negation: ¬(¬A) = A
94 if (auto inner_logical = std::dynamic_pointer_cast<const LogicalNode>(new_left)) {
95 if (inner_logical->op() == LogicalNode::Op::Not) {
96 set_result(inner_logical->left());
97 return;
98 }
99 /// De Morgan's law: ¬(A∧B) = ¬A∨¬B
100 if (inner_logical->op() == LogicalNode::Op::And) {
101 normalization_check_children(rewrite_budget(), 1, inner_logical->left());
102 auto not_a = LMCAS::detail::make_node<LogicalNode>(inner_logical->left(), nullptr, LogicalNode::Op::Not);
103 normalization_check_children(rewrite_budget(), 1, inner_logical->right());
104 auto not_b = LMCAS::detail::make_node<LogicalNode>(inner_logical->right(), nullptr, LogicalNode::Op::Not);
107 or_node->accept(*this);
108 return;
109 }
110 /// De Morgan's law: ¬(A∨B) = ¬A∧¬B
111 if (inner_logical->op() == LogicalNode::Op::Or) {
112 normalization_check_children(rewrite_budget(), 1, inner_logical->left());
113 auto not_a = LMCAS::detail::make_node<LogicalNode>(inner_logical->left(), nullptr, LogicalNode::Op::Not);
114 normalization_check_children(rewrite_budget(), 1, inner_logical->right());
115 auto not_b = LMCAS::detail::make_node<LogicalNode>(inner_logical->right(), nullptr, LogicalNode::Op::Not);
117 auto and_node = LMCAS::detail::make_node<LogicalNode>(not_a, not_b, LogicalNode::Op::And);
118 and_node->accept(*this);
119 return;
120 }
121 }
122
125 return;
126 }
127
128 /// And / Or: normalize operands
129 std::shared_ptr<const SymbolicNode> new_left = nullptr;
130 std::shared_ptr<const SymbolicNode> new_right = nullptr;
131
132 if (node.left()) {
133 node.left()->accept(*this);
134 new_left = result;
135 }
136 if (node.right()) {
137 node.right()->accept(*this);
138 new_right = result;
139 }
140
141 if (!new_left) new_left = node.left();
142 if (!new_right) new_right = node.right();
143
144 normalization_check_children(rewrite_budget(), 1, new_left, new_right);
145 set_result(LMCAS::detail::make_node<LogicalNode>(new_left, new_right, node.op()));
146 }
@ Not
一元逻辑非,right 为 nullptr。
@ Implies
逻辑蕴含 A ⇒ B。

引用了 LMCAS::LogicalNode::And, LMCAS::LogicalNode::Implies, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), LMCAS::LogicalNode::Not, LMCAS::LogicalNode::Or, result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [9/24]

void LMCAS::NormalizationVisitor::visit ( const MatrixNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 22 行定义.

22 {
23 std::size_t nodes = 1;
24 if (std::holds_alternative<MatrixNode::DenseStorage>(node.storage())) {
25 auto& dense = std::get<MatrixNode::DenseStorage>(node.storage());
27 for(auto& item : dense) {
28 if(item) {
29 item->accept(*this);
30 normalization_append(rewrite_budget(), nodes, new_dense, result);
31 } else {
32 normalization_append(rewrite_budget(), nodes, new_dense, nullptr);
33 }
34 }
35 set_result(LMCAS::detail::make_node<MatrixNode>(node.rows(), node.cols(), new_dense));
36 } else {
37 auto& sparse = std::get<MatrixNode::SparseStorage>(node.storage());
39 for(auto& [idx, item] : sparse) {
40 item->accept(*this);
41 if (!result->is_zero()) {
42 if (rewrite_budget()) {
43 nodes = rewrite_budget()->append_size(nodes, rewrite_budget()->measure(result));
44 }
45 new_sparse[idx] = result;
46 }
47 }
48 set_result(LMCAS::detail::make_node<MatrixNode>(node.rows(), node.cols(), new_sparse));
49 }
50 }
std::map< size_t, std::shared_ptr< const SymbolicNode > > SparseStorage
稀疏存储,索引映射到节点。

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::make_node(), LMCAS::normalization_append(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [10/24]

void LMCAS::NormalizationVisitor::visit ( const MembershipNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 334 行定义.

334 {
335 node.element()->accept(*this);
336 auto element = result;
337 node.set()->accept(*this);
338 auto set = result;
339 if (auto finite = std::dynamic_pointer_cast<const FiniteSetNode>(set)) {
341 BigInt(finite->contains(*element) ? 1 : 0)));
342 return;
343 }
346}
const ExprPtr & set

引用了 LMCAS::element, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), LMCAS::set , 以及 set_result().

函数调用图:

◆ visit() [11/24]

void LMCAS::NormalizationVisitor::visit ( const MultiplyNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_products.cpp 第 153 行定义.

153 {
154 std::vector<std::shared_ptr<const SymbolicNode>> operands;
155 std::size_t nodes = 0;
156 for (const auto& operand : node.operands()) {
157 operand->accept(*this);
158 if (const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(result)) {
159 for (const auto& child : multiply->operands()) {
160 normalization_append(rewrite_budget(), nodes, operands, child);
161 }
162 } else {
163 normalization_append(rewrite_budget(), nodes, operands, result);
164 }
165 }
166 if (has_matrix_factor(operands)) {
168 return;
169 }
170 set_result(collect_product(operands));
171}
std::shared_ptr< const SymbolicNode > collect_product(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
std::shared_ptr< const SymbolicNode > normalize_matrix_product(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
bool has_matrix_factor(const std::vector< std::shared_ptr< const SymbolicNode > > &operands)

引用了 collect_product(), LMCAS::normalization_append(), normalize_matrix_product(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [12/24]

void LMCAS::NormalizationVisitor::visit ( const NumberNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_arithmetic.cpp 第 52 行定义.

52 {
54 set_result(node.clone());
55}
void require_nodes(std::size_t nodes) const

引用了 LMCAS::detail::RewriteBudget::require_nodes(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

被这些函数引用 NormalizationVisitor().

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

◆ visit() [13/24]

void LMCAS::NormalizationVisitor::visit ( const PiecewiseNode & node)
overridevirtual

Normalize expression

Normalize condition

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 147 行定义.

147 {
148 std::vector<PiecewiseNode::Branch> new_branches;
149 std::size_t nodes = 1;
150 normalization_check_count(rewrite_budget(), node.branches().size(), 2);
151 new_branches.reserve(node.branches().size());
152
153 for (const auto& b : node.branches()) {
154 /// Normalize expression
155 b.expression->accept(*this);
156 auto new_expr = result;
157
158 /// Normalize condition
159 b.condition->accept(*this);
160 auto new_cond = result;
161
162 if (rewrite_budget()) {
163 nodes = rewrite_budget()->append_size(nodes, rewrite_budget()->measure(new_expr));
164 nodes = rewrite_budget()->append_size(nodes, rewrite_budget()->measure(new_cond));
165 }
166 new_branches.push_back({new_expr, new_cond});
167 }
168
169 std::shared_ptr<const SymbolicNode> new_default = nullptr;
170 if (node.default_expr()) {
171 node.default_expr()->accept(*this);
172 new_default = result;
173 if (rewrite_budget()) {
174 (void)rewrite_budget()->append_size(nodes, rewrite_budget()->measure(new_default));
175 }
176 }
177
178 set_result(LMCAS::detail::make_node<PiecewiseNode>(std::move(new_branches), new_default));
179 }

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::b, LMCAS::detail::make_node(), LMCAS::normalization_check_count(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [14/24]

void LMCAS::NormalizationVisitor::visit ( const PowerNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_powers.cpp 第 126 行定义.

126 {
127 std::shared_ptr<const SymbolicNode> base;
128 if (try_normalize_squared_norm(node, base)) {
129 return;
130 }
131 if (!base) {
132 node.base()->accept(*this);
133 base = result;
134 }
135 node.exponent()->accept(*this);
136 auto exponent = result;
138 return;
139 }
140 const auto base_number = std::dynamic_pointer_cast<const NumberNode>(base);
141 const auto exponent_number = std::dynamic_pointer_cast<const NumberNode>(exponent);
142 if (base_number && exponent_number &&
144 if (auto folded = normalization_numeric_power(base_number, exponent_number, rewrite_budget())) {
145 set_result(std::move(folded));
146 return;
147 }
148 }
149 if (const auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(base)) {
150 if (normalize_product_power(*multiply, exponent)) {
151 return;
152 }
153 }
154 if (const auto power = std::dynamic_pointer_cast<const PowerNode>(base)) {
155 if (normalize_nested_power(*power, exponent)) {
156 return;
157 }
158 }
161}
bool normalize_nested_power(const PowerNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
bool normalize_product_power(const MultiplyNode &base, const std::shared_ptr< const SymbolicNode > &exponent)
bool normalize_power_identity(const std::shared_ptr< const SymbolicNode > &base, const std::shared_ptr< const SymbolicNode > &exponent)
std::shared_ptr< const SymbolicNode > normalization_numeric_power(const std::shared_ptr< const NumberNode > &base, const std::shared_ptr< const NumberNode > &exponent, detail::RewriteBudget *budget=nullptr)

引用了 context_, domain_, LMCAS::exponent, facts_, LMCAS::detail::make_node(), LMCAS::normalization_can_discard(), LMCAS::normalization_check_children(), LMCAS::normalization_numeric_power(), normalize_nested_power(), normalize_power_identity(), normalize_product_power(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 try_normalize_squared_norm().

函数调用图:

◆ visit() [15/24]

void LMCAS::NormalizationVisitor::visit ( const ProductNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 226 行定义.

226 {
227 auto new_body = normalize_bound_body(node);
228
229 node.lower_bound()->accept(*this);
230 auto new_lower = result;
231
232 node.upper_bound()->accept(*this);
233 auto new_upper = result;
234
235 auto lo_n = std::dynamic_pointer_cast<const NumberNode>(new_lower);
236 auto hi_n = std::dynamic_pointer_cast<const NumberNode>(new_upper);
237 BigInt lo;
238 BigInt hi;
239 if (try_get_integer_value(lo_n, lo) && try_get_integer_value(hi_n, hi)) {
240 if (hi < lo) {
242 return;
243 }
244 const BigInt span = hi - lo;
245 if (span < BigInt(1000)) {
246 const auto count = span.try_to_uint64();
247 std::vector<std::shared_ptr<const SymbolicNode>> factors;
248 std::size_t nodes = 0;
249 normalization_check_count(rewrite_budget(), static_cast<std::size_t>(*count) + 1, 1, false);
250 factors.reserve(static_cast<std::size_t>(*count) + 1);
251 BigInt index = lo;
252 for (std::uint64_t offset = 0; offset <= *count; ++offset, index += BigInt(1)) {
253 auto kval = LMCAS::detail::make_node<NumberNode>(index);
254 auto term = norm_subst_index(new_body, node.index_var(), kval, rewrite_budget());
257 term->accept(inner);
258 normalization_append(rewrite_budget(), nodes, factors, inner.get_result());
259 }
260 if (factors.empty()) { set_result(LMCAS::detail::make_node<NumberNode>(BigInt(1))); return; }
261 auto prod_node = make_normalized_multiply_node(factors, rewrite_budget());
262 prod_node->accept(*this);
263 return;
264 }
265 }
266
267 normalization_check_children(rewrite_budget(), 1, new_body, new_lower, new_upper);
268 set_result(LMCAS::detail::make_node<ProductNode>(new_body, node.index_var(), new_lower, new_upper));
269 }
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)

引用了 NormalizationVisitor(), domain_, facts_, get_result(), LMCAS::detail::make_node(), LMCAS::make_normalized_multiply_node(), LMCAS::norm_subst_index(), LMCAS::normalization_append(), LMCAS::normalization_check_children(), LMCAS::normalization_check_count(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 LMCAS::try_get_integer_value().

函数调用图:

◆ visit() [16/24]

void LMCAS::NormalizationVisitor::visit ( const QuantifierNode & node)
overridevirtual

Simplify ∀x∈S: true → true

Simplify ∃x∈S: false → false

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 278 行定义.

278 {
279 node.domain()->accept(*this);
280 auto new_domain = result;
281
282 auto new_predicate = normalize_bound_body(node);
283
284 /// Simplify ∀x∈S: true → true
285 if (node.quantifier_type() == QuantifierNode::Type::ForAll) {
286 if (new_predicate->is_one()) {
288 return;
289 }
290 }
291
292 /// Simplify ∃x∈S: false → false
293 if (node.quantifier_type() == QuantifierNode::Type::Exists) {
294 if (new_predicate->is_zero()) {
296 return;
297 }
298 }
299
300 normalization_check_children(rewrite_budget(), 1, new_domain, new_predicate);
301 set_result(LMCAS::detail::make_node<QuantifierNode>(node.quantifier_type(), node.bound_var(), new_domain, new_predicate));
302 }
@ Exists
存在量词 exists。
定义 sets.hpp:9
@ ForAll
全称量词 forall。
定义 sets.hpp:8

引用了 LMCAS::QuantifierNode::Exists, LMCAS::QuantifierNode::ForAll, LMCAS::detail::make_node(), LMCAS::normalization_check_children(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [17/24]

void LMCAS::NormalizationVisitor::visit ( const QuantityNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 348 行定义.

348 {
349 node.value()->accept(*this);
352 result, node.dimension(), node.scale_to_base(), node.display_unit()));
353}

引用了 LMCAS::detail::make_node(), LMCAS::normalization_check_children(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [18/24]

void LMCAS::NormalizationVisitor::visit ( const RelationalNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

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

51 {
52
53 std::shared_ptr<const SymbolicNode> new_left = nullptr;
54 std::shared_ptr<const SymbolicNode> new_right = nullptr;
55
56 if (node.left()) {
57 node.left()->accept(*this);
58 new_left = result;
59 }
60 if (node.right()) {
61
62 node.right()->accept(*this);
63 new_right = result;
64 }
65
66 if (!new_left) new_left = node.left();
67 if (!new_right) new_right = node.right();
68
69 normalization_check_children(rewrite_budget(), 1, new_left, new_right);
71 }

引用了 LMCAS::detail::make_node(), LMCAS::normalization_check_children(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [19/24]

void LMCAS::NormalizationVisitor::visit ( const RootOfNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 378 行定义.

378 {
380 set_result(node.clone());
381}

引用了 LMCAS::detail::RewriteBudget::require_nodes(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [20/24]

void LMCAS::NormalizationVisitor::visit ( const SetBuilderNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 303 行定义.

303 {
304 node.domain()->accept(*this);
305 auto new_domain = result;
306
307 auto new_predicate = normalize_bound_body(node);
308
309 normalization_check_children(rewrite_budget(), 1, new_domain, new_predicate);
310 set_result(LMCAS::detail::make_node<SetBuilderNode>(node.element_var(), new_domain, new_predicate));
311 }

引用了 LMCAS::detail::make_node(), LMCAS::normalization_check_children(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [21/24]

void LMCAS::NormalizationVisitor::visit ( const SummationNode & node)
overridevirtual

当上下界均为具体整数且范围较小时,展开求和为显式和。

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 180 行定义.

180 {
181 auto new_body = normalize_bound_body(node);
182
183 node.lower_bound()->accept(*this);
184 auto new_lower = result;
185
186 node.upper_bound()->accept(*this);
187 auto new_upper = result;
188
189 /// 当上下界均为具体整数且范围较小时,展开求和为显式和。
190 auto lo_n = std::dynamic_pointer_cast<const NumberNode>(new_lower);
191 auto hi_n = std::dynamic_pointer_cast<const NumberNode>(new_upper);
192 BigInt lo;
193 BigInt hi;
194 if (try_get_integer_value(lo_n, lo) && try_get_integer_value(hi_n, hi)) {
195 if (hi < lo) {
197 return;
198 }
199 const BigInt span = hi - lo;
200 if (span < BigInt(1000)) {
201 const auto count = span.try_to_uint64();
202 std::vector<std::shared_ptr<const SymbolicNode>> terms;
203 std::size_t nodes = 0;
204 normalization_check_count(rewrite_budget(), static_cast<std::size_t>(*count) + 1, 1, false);
205 terms.reserve(static_cast<std::size_t>(*count) + 1);
206 BigInt index = lo;
207 for (std::uint64_t offset = 0; offset <= *count; ++offset, index += BigInt(1)) {
208 auto kval = LMCAS::detail::make_node<NumberNode>(index);
209 auto term = norm_subst_index(new_body, node.index_var(), kval, rewrite_budget());
212 term->accept(inner);
213 normalization_append(rewrite_budget(), nodes, terms, inner.get_result());
214 }
215 if (terms.empty()) { set_result(LMCAS::detail::make_node<NumberNode>(BigInt(0))); return; }
217 auto sum_node = LMCAS::detail::make_node<AddNode>(terms);
218 sum_node->accept(*this);
219 return;
220 }
221 }
222
223 normalization_check_children(rewrite_budget(), 1, new_body, new_lower, new_upper);
224 set_result(LMCAS::detail::make_node<SummationNode>(new_body, node.index_var(), new_lower, new_upper));
225 }

引用了 NormalizationVisitor(), domain_, facts_, get_result(), LMCAS::detail::make_node(), LMCAS::norm_subst_index(), LMCAS::normalization_append(), LMCAS::normalization_check_arithmetic(), LMCAS::normalization_check_children(), LMCAS::normalization_check_count(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget(), set_result() , 以及 LMCAS::try_get_integer_value().

函数调用图:

◆ visit() [22/24]

void LMCAS::NormalizationVisitor::visit ( const TransformNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_structural.cpp 第 270 行定义.

270 {
271 auto new_body = normalize_bound_body(node);
272 node.target()->accept(*this);
273 auto new_target = result;
274 normalization_check_children(rewrite_budget(), 1, new_body, new_target);
276 node.transform_type(), new_body, node.source_var(), new_target));
277 }

引用了 LMCAS::detail::make_node(), LMCAS::normalization_check_children(), normalize_bound_body(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [23/24]

void LMCAS::NormalizationVisitor::visit ( const UninterpretedFunctionNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

在文件 normalization_functions.cpp 第 148 行定义.

148 {
149 std::vector<std::shared_ptr<const SymbolicNode>> arguments;
150 std::size_t nodes = 1;
151 normalization_check_count(rewrite_budget(), node.arguments().size());
152 arguments.reserve(node.arguments().size());
153 for (const auto& argument : node.arguments()) {
154 argument->accept(*this);
155 normalization_append(rewrite_budget(), nodes, arguments, result);
156 }
158 node.name(), std::move(arguments)));
159}

引用了 LMCAS::detail::make_node(), LMCAS::normalization_append(), LMCAS::normalization_check_count(), result, LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

◆ visit() [24/24]

void LMCAS::NormalizationVisitor::visit ( const VariableNode & node)
overridevirtual

实现了 LMCAS::detail::SymbolicVisitor.

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

57 {
59 set_result(node.clone());
60}

引用了 LMCAS::detail::RewriteBudget::require_nodes(), LMCAS::detail::SymbolicVisitor::rewrite_budget() , 以及 set_result().

函数调用图:

类成员变量说明

◆ context_

◆ current_depth

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

◆ domain_

◆ facts_

◆ MAX_DEPTH

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

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

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

◆ result

◆ rewrite_budget_

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

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