LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
normalization_utils.hpp
浏览该文件的文档.
1/** @file internal/normalization_utils.hpp */
2#pragma once
6#include <vector>
7#include <map>
8#include <algorithm>
9
10namespace LMCAS {
11
12inline bool normalization_proved(const Result<Tribool>& result) {
13 if (!result) { throw result.error(); }
14 return result.value() == Tribool::True;
15}
17 const std::shared_ptr<const SymbolicNode>& node, const FactsQuery& facts,
19 return (domain == Domain::Complex ||
22}
23void normalization_append(detail::RewriteBudget* budget, std::size_t& nodes,
24 std::vector<std::shared_ptr<const SymbolicNode>>& children,
25 std::shared_ptr<const SymbolicNode> child);
26template <class... Nodes>
28 std::size_t roots, const std::shared_ptr<const Nodes>&... children) {
29 if (!budget) {
30 return;
31 }
32 budget->require_nodes(roots);
33 ((roots = budget->append_size(roots, budget->measure(children))), ...);
34}
35
37 std::size_t roots,
38 const std::vector<std::shared_ptr<const SymbolicNode>>& children) {
39 if (!budget) {
40 return;
41 }
42 budget->require_nodes(roots);
43 for (const auto& child : children) {
44 roots = budget->append_size(roots, budget->measure(child));
45 }
46}
47template <class Parent, class... Nodes>
49 std::size_t extra_nodes, const std::shared_ptr<const Nodes>&... children) {
50 if (!budget) {
51 return 0;
52 }
53 std::size_t nodes = extra_nodes, flattened = 0;
54 const auto append = [&](const auto& child) {
55 nodes = budget->append_size(nodes, budget->measure(child));
56 if (dynamic_cast<const Parent*>(child.get())) {
57 ++flattened;
58 }
59 };
60 (append(children), ...);
61 return budget->append_size(1, nodes - flattened);
62}
63
64template <class Parent>
66 const std::vector<std::shared_ptr<const SymbolicNode>>& children,
67 std::size_t nodes, bool wrapped = true) {
68 if (!budget) {
69 return 0;
70 }
71 budget->require_nodes(nodes);
72 if (!wrapped) {
73 return nodes;
74 }
75 for (const auto& child : children) {
76 if (dynamic_cast<const Parent*>(child.get())) {
77 --nodes;
78 }
79 }
80 return budget->append_size(1, nodes);
81}
82std::size_t normalization_check_count(detail::RewriteBudget* budget,
83 std::size_t rows, std::size_t cols = 1, bool wrapped = true);
84
85
86bool try_get_integer_value(const std::shared_ptr<const NumberNode>& node, BigInt& value);
87BigInt get_node_degree_helper(const std::shared_ptr<const SymbolicNode>& node);
88std::shared_ptr<const SymbolicNode> make_normalized_multiply_node(
89 const std::vector<std::shared_ptr<const SymbolicNode>>& operands,
90 detail::RewriteBudget* budget = nullptr);
91std::shared_ptr<const SymbolicNode> norm_subst_index(
92 const std::shared_ptr<const SymbolicNode>& node, const std::string& index_var,
93 const std::shared_ptr<const SymbolicNode>& value, detail::RewriteBudget* budget = nullptr);
95 bool operator()(const std::shared_ptr<const SymbolicNode>& left,
96 const std::shared_ptr<const SymbolicNode>& right) const;
97};
98bool normalization_factor_less(const std::shared_ptr<const SymbolicNode>& left,
99 const std::shared_ptr<const SymbolicNode>& right);
100Rational exact_number_as_rational(const NumberNode& node);
101std::shared_ptr<const NumberNode> add_numbers(
102 const std::shared_ptr<const NumberNode>& left, const std::shared_ptr<const NumberNode>& right);
103std::shared_ptr<const NumberNode> multiply_numbers(
104 const std::shared_ptr<const NumberNode>& left, const std::shared_ptr<const NumberNode>& right);
105bool check_negative_arg(const std::shared_ptr<const SymbolicNode>& argument,
106 std::shared_ptr<const SymbolicNode>& positive,
107 detail::RewriteBudget* budget = nullptr);
108bool get_pi_coeff(const std::shared_ptr<const SymbolicNode>& node, Rational& coefficient);
109std::shared_ptr<const SymbolicNode> normalization_imaginary_power(
110 const BigInt& exponent, detail::RewriteBudget* budget = nullptr);
111std::shared_ptr<const NumberNode> normalization_exact_square_root(const NumberNode& number);
112std::shared_ptr<const SymbolicNode> normalization_numeric_power(
113 const std::shared_ptr<const NumberNode>& base,
114 const std::shared_ptr<const NumberNode>& exponent, detail::RewriteBudget* budget = nullptr);
115std::shared_ptr<const SymbolicNode> normalization_numeric_function(
116 FunctionNode::FuncType type, const std::shared_ptr<const NumberNode>& number,
117 detail::RewriteBudget* budget = nullptr);
118std::shared_ptr<const SymbolicNode> normalization_pi_function(
119 FunctionNode::FuncType type, const Rational& coefficient,
120 detail::RewriteBudget* budget = nullptr);
121
122}
CasError & error()
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
void require_nodes(std::size_t nodes) const
std::size_t append_size(std::size_t current, std::size_t child)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
std::shared_ptr< const NumberNode > add_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相加
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
bool normalization_can_discard(const std::shared_ptr< const SymbolicNode > &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Complex
Complex numbers (default, least specific)
@ Real
Real numbers
std::shared_ptr< const SymbolicNode > normalization_imaginary_power(const BigInt &exponent, detail::RewriteBudget *budget=nullptr)
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
@ True
Property definitely holds
std::size_t normalization_check_count(detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)
std::shared_ptr< const SymbolicNode > norm_subst_index(const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var, const std::shared_ptr< const SymbolicNode > &value, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const NumberNode > multiply_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相乘
std::shared_ptr< const SymbolicNode > normalization_numeric_function(FunctionNode::FuncType type, const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)
const ExprPtr & exponent
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
const NumberDomainSet & domain
bool check_negative_arg(const std::shared_ptr< const SymbolicNode > &argument, std::shared_ptr< const SymbolicNode > &positive, detail::RewriteBudget *budget=nullptr)
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)
std::shared_ptr< const SymbolicNode > normalization_pi_function(FunctionNode::FuncType type, const Rational &coefficient, detail::RewriteBudget *budget=nullptr)
const ExprPtr & right
BigInt get_node_degree_helper(const std::shared_ptr< const SymbolicNode > &node)
计算 AST 节点的多项式次数
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
const std::string const ExprPtr & value
bool normalization_proved(const Result< Tribool > &result)
bool normalization_factor_less(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)
Rational exact_number_as_rational(const NumberNode &node)
bool get_pi_coeff(const std::shared_ptr< const SymbolicNode > &node, Rational &coefficient)
void normalization_append(detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)
bool operator()(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right) const
内部 AST 定义。