LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::equivalence_detail 命名空间参考

命名空间

namespace  anonymous_namespace{equivalence_complex.cpp}
namespace  anonymous_namespace{equivalence_exp_log.cpp}
namespace  anonymous_namespace{equivalence_proof.cpp}
namespace  anonymous_namespace{equivalence_trig.cpp}

函数

ExprPtr canonicalize_complex_product (const SymbolicExpr &expression, detail::RewriteBudget &budget)
bool exact_integer_node (const detail::SymbolicNodePtr &node, int expected)
bool exact_integer_node (const std::shared_ptr< const SymbolicNode > &node, int expected)
ExprPtr expand_equivalence (const ExprPtr &expression, detail::RewriteBudget &budget)
ExprPtr normalize_equivalence (const ExprPtr &expression, detail::RewriteBudget &budget)
Result< std::optional< bool > > prove_rational_polynomial_equivalence (const ExprPtr &difference, ComputationContext &context, const EqvOptions &options, detail::RewriteBudget &budget)
ExprPtr rewrite_exp_log_basic_identity (const detail::SymbolicNodePtr &node, const AssumptionContext *assumptions, detail::RewriteBudget &budget)
ExprPtr rewrite_trig_basic_identity (const detail::SymbolicNodePtr &node, detail::RewriteBudget &budget)
ExprPtr rewritten_complex (const ExprPtr &real, const ExprPtr &imag, const detail::SymbolicNodePtr &original, detail::RewriteBudget &budget)
Result< void > validate_eqv_options (const EqvOptions &options)

函数说明

◆ canonicalize_complex_product()

ExprPtr LMCAS::equivalence_detail::canonicalize_complex_product ( const SymbolicExpr & expression,
detail::RewriteBudget & budget )

在文件 equivalence_complex.cpp 第 157 行定义.

158 {
159 detail::RewriteScope scope(&budget);
160 const auto& node = detail::node(expression);
161 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
162 return canonicalize_sum(*add, node, budget);
163 }
164 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
165 return canonicalize_power(*power, node, budget);
166 }
167 if (auto complex = std::dynamic_pointer_cast<const ComplexNode>(node)) {
169 *detail::make_expression_ptr(complex->real()), budget);
171 *detail::make_expression_ptr(complex->imag()), budget);
172 return rewritten_complex(real, imag, node, budget);
173 }
174 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
175 return canonicalize_product(*multiply, node, budget);
176 }
177 budget.measure(node);
178 return detail::make_expression_ptr(node);
179}
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprPtr canonicalize_product(const MultiplyNode &multiply, const detail::SymbolicNodePtr &original, detail::RewriteBudget &budget)
ExprPtr canonicalize_complex_product(const SymbolicExpr &expression, detail::RewriteBudget &budget)
ExprPtr rewritten_complex(const ExprPtr &real, const ExprPtr &imag, const detail::SymbolicNodePtr &original, detail::RewriteBudget &budget)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult complex(ExprPtr real, ExprPtr imag)
ExprPtr imag

引用了 LMCAS::add(), canonicalize_complex_product(), LMCAS::complex(), LMCAS::imag, LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::real() , 以及 rewritten_complex().

被这些函数引用 canonicalize_complex_product(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_power(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_product(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_sum(), exact_integer_node() , 以及 LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands().

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

◆ exact_integer_node() [1/2]

bool LMCAS::equivalence_detail::exact_integer_node ( const detail::SymbolicNodePtr & node,
int expected )

◆ exact_integer_node() [2/2]

bool LMCAS::equivalence_detail::exact_integer_node ( const std::shared_ptr< const SymbolicNode > & node,
int expected )

在文件 equivalence_options.cpp 第 20 行定义.

21 {
22 auto number = std::dynamic_pointer_cast<const NumberNode>(node);
23 if (!number) return false;
24 if (std::holds_alternative<BigInt>(number->value())) {
25 return std::get<BigInt>(number->value()) == BigInt(expected);
26 }
27 return std::get<Rational>(number->value()) == Rational(expected);
28}

引用了 exact_integer_node().

被这些函数引用 exact_integer_node(), exact_integer_node(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_exp_log.cpp}::rewrite_exp_log_function(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_exp_log.cpp}::rewrite_negative_lambert_exponential(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::trig_square() , 以及 LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::unwrap_trig_negated_argument().

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

◆ expand_equivalence()

ExprPtr LMCAS::equivalence_detail::expand_equivalence ( const ExprPtr & expression,
detail::RewriteBudget & budget )

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

26 {
27 if (!expression || !detail::node(expression)) {
29 "equivalence expansion returned null", kEquivalentOperation};
30 }
31 auto result = detail::make_expression_ptr(
32 detail::expand_node(detail::node(expression), budget));
33 return result;
34}
SymbolicNodePtr expand_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
constexpr const char * kEquivalentOperation

引用了 expand_equivalence(), LMCAS::detail::expand_node(), LMCAS::InternalInvariant, LMCAS::kEquivalentOperation, LMCAS::detail::make_expression_ptr() , 以及 LMCAS::detail::node().

被这些函数引用 exact_integer_node(), expand_equivalence() , 以及 prove_rational_polynomial_equivalence().

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

◆ normalize_equivalence()

ExprPtr LMCAS::equivalence_detail::normalize_equivalence ( const ExprPtr & expression,
detail::RewriteBudget & budget )

在文件 equivalence_engine.cpp 第 16 行定义.

16 {
17 if (!expression || !detail::node(expression)) {
19 "equivalence normalization returned null", kEquivalentOperation};
20 }
21 auto result = detail::make_expression_ptr(
22 detail::normalize_node(detail::node(expression), budget));
23 return result;
24}
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 LMCAS::InternalInvariant, LMCAS::kEquivalentOperation, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), normalize_equivalence() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::ComplexProduct::accumulate(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::apply_profile(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_power(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_product(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_sum(), exact_integer_node(), normalize_equivalence(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_exp_log.cpp}::rewrite_negative_lambert_exponential() , 以及 rewritten_complex().

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

◆ prove_rational_polynomial_equivalence()

Result< std::optional< bool > > LMCAS::equivalence_detail::prove_rational_polynomial_equivalence ( const ExprPtr & difference,
ComputationContext & context,
const EqvOptions & options,
detail::RewriteBudget & budget )

在文件 equivalence_proof.cpp 第 53 行定义.

56 {
57 if (!difference) {
58 return Result<std::optional<bool>>::failure(
60 "equivalence difference is null",
62 }
63
64 if (options.budget.max_rewrite_steps < 4) {
65 return Result<std::optional<bool>>::failure(
67 "equivalence rewrite budget exhausted before polynomial normalization",
69 }
70
71 auto step = context.consume_steps(4, kEquivalentOperation);
72 if (!step) { return Result<std::optional<bool>>::failure(step.error()); }
73
74 std::set<std::string> variables;
76 LMCAS::detail::node(difference), variables, budget)) {
77 return Result<std::optional<bool>>::success(std::nullopt);
78 }
79 if (variables.size() > 1) {
80 auto expanded = expand_equivalence(difference, budget);
81 const auto value = detail::exact_rational_value(detail::node(expanded));
82 return Result<std::optional<bool>>::success(
83 value && value->is_zero() ? std::optional<bool>{true} : std::nullopt);
84 }
85 const std::string variable = variables.empty() ? "x" : *variables.begin();
86 auto recognized = recognize_rational_polynomial(*difference, variable, context);
87 if (!recognized) {
88 return Result<std::optional<bool>>::failure(recognized.error());
89 }
90 if (!recognized.value()) {
91 return Result<std::optional<bool>>::success(std::nullopt);
92 }
93 return Result<std::optional<bool>>::success(recognized.value()->is_zero());
94}
std::optional< Rational > exact_rational_value(const NumberNode &number)
bool collect_polynomial_variable_names(const std::shared_ptr< const SymbolicNode > &node, std::set< std::string > &variables, detail::RewriteBudget &budget)
ExprPtr expand_equivalence(const ExprPtr &expression, detail::RewriteBudget &budget)
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::string ComputationContext const SolveOptions & options
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
const std::string const ExprPtr & value

引用了 LMCAS::context, LMCAS::detail::exact_rational_value(), expand_equivalence(), LMCAS::InternalInvariant, LMCAS::kEquivalentOperation, LMCAS::detail::node(), LMCAS::options, prove_rational_polynomial_equivalence(), LMCAS::recognize_rational_polynomial(), LMCAS::ResourceLimit, LMCAS::value , 以及 LMCAS::variable.

被这些函数引用 exact_integer_node(), LMCAS::anonymous_namespace{equivalence_engine.cpp}::prove_operands() , 以及 prove_rational_polynomial_equivalence().

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

◆ rewrite_exp_log_basic_identity()

ExprPtr LMCAS::equivalence_detail::rewrite_exp_log_basic_identity ( const detail::SymbolicNodePtr & node,
const AssumptionContext * assumptions,
detail::RewriteBudget & budget )

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

111 {
112 if (!node) { return nullptr; }
113 detail::RewriteScope scope(&budget);
114 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
116 rewrite_operands(add->operands(), assumptions, budget), &budget));
117 }
118 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
120 rewrite_operands(multiply->operands(), assumptions, budget), &budget));
121 }
122 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
123 auto base = rewrite_exp_log_basic_identity(power->base(), assumptions, budget);
124 auto exponent = rewrite_exp_log_basic_identity(power->exponent(), assumptions, budget);
127 return SymbolicExpr::power(base, exponent);
128 }
129 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
130 return rewrite_exp_log_function(*function, assumptions, budget);
131 }
132 if (auto complex_node = std::dynamic_pointer_cast<const ComplexNode>(node)) {
133 auto real = rewrite_exp_log_basic_identity(complex_node->real(), assumptions, budget);
134 auto imag = rewrite_exp_log_basic_identity(complex_node->imag(), assumptions, budget);
135 return rewritten_complex(real, imag, node, budget);
136 }
137 budget.measure(node);
138 return detail::make_expression_ptr(node);
139}
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_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
std::size_t append_size(std::size_t current, std::size_t child)
ExprPtr rewrite_exp_log_function(const FunctionNode &function, const AssumptionContext *assumptions, detail::RewriteBudget &budget)
ExprPtr rewrite_exp_log_basic_identity(const detail::SymbolicNodePtr &node, const AssumptionContext *assumptions, detail::RewriteBudget &budget)
const ExprPtr & exponent
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::add(), LMCAS::detail::RewriteBudget::append_size(), LMCAS::SymbolicFactory::create_add(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::exponent, LMCAS::function(), LMCAS::imag, LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::real(), rewrite_exp_log_basic_identity() , 以及 rewritten_complex().

被这些函数引用 LMCAS::anonymous_namespace{equivalence_engine.cpp}::apply_profile(), exact_integer_node(), rewrite_exp_log_basic_identity() , 以及 LMCAS::equivalence_detail::anonymous_namespace{equivalence_exp_log.cpp}::rewrite_operands().

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

◆ rewrite_trig_basic_identity()

ExprPtr LMCAS::equivalence_detail::rewrite_trig_basic_identity ( const detail::SymbolicNodePtr & node,
detail::RewriteBudget & budget )

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

168 {
169 if (!node) { return nullptr; }
170 detail::RewriteScope scope(&budget);
171 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
172 return rewrite_trig_sum(*add, budget);
173 }
174 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
176 rewrite_operands(multiply->operands(), budget), &budget));
177 }
178 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
179 auto base = rewrite_trig_basic_identity(power->base(), budget);
180 auto exponent = rewrite_trig_basic_identity(power->exponent(), budget);
183 return SymbolicExpr::power(base, exponent);
184 }
185 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
186 return rewrite_trig_function(*function, budget);
187 }
188 if (auto complex_node = std::dynamic_pointer_cast<const ComplexNode>(node)) {
189 auto real = rewrite_trig_basic_identity(complex_node->real(), budget);
190 auto imag = rewrite_trig_basic_identity(complex_node->imag(), budget);
191 return rewritten_complex(real, imag, node, budget);
192 }
193 budget.measure(node);
194 return detail::make_expression_ptr(node);
195}
ExprPtr rewrite_trig_function(const FunctionNode &function, detail::RewriteBudget &budget)
ExprPtr rewrite_trig_basic_identity(const detail::SymbolicNodePtr &node, detail::RewriteBudget &budget)

引用了 LMCAS::add(), LMCAS::detail::RewriteBudget::append_size(), LMCAS::SymbolicFactory::create_multiply(), LMCAS::exponent, LMCAS::function(), LMCAS::imag, LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::real(), rewrite_trig_basic_identity() , 以及 rewritten_complex().

被这些函数引用 LMCAS::anonymous_namespace{equivalence_engine.cpp}::apply_profile(), exact_integer_node(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_trig.cpp}::rewrite_operands() , 以及 rewrite_trig_basic_identity().

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

◆ rewritten_complex()

ExprPtr LMCAS::equivalence_detail::rewritten_complex ( const ExprPtr & real,
const ExprPtr & imag,
const detail::SymbolicNodePtr & original,
detail::RewriteBudget & budget )

在文件 equivalence_complex.cpp 第 11 行定义.

13 {
14 budget.append_size(budget.append_size(1, budget.measure(detail::node(real))),
15 budget.measure(detail::node(imag)));
17 try {
20 } catch (const std::invalid_argument&) {
21 return detail::make_expression_ptr(original);
22 }
23 return normalize_equivalence(value, budget);
24}
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
ExprPtr normalize_equivalence(const ExprPtr &expression, detail::RewriteBudget &budget)
std::shared_ptr< SymbolicExpr > ExprPtr

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::SymbolicFactory::create_complex(), LMCAS::imag, LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), normalize_equivalence(), LMCAS::real(), rewritten_complex() , 以及 LMCAS::value.

被这些函数引用 canonicalize_complex_product(), LMCAS::equivalence_detail::anonymous_namespace{equivalence_complex.cpp}::canonicalize_product(), exact_integer_node(), rewrite_exp_log_basic_identity(), rewrite_trig_basic_identity() , 以及 rewritten_complex().

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

◆ validate_eqv_options()

Result< void > LMCAS::equivalence_detail::validate_eqv_options ( const EqvOptions & options)

在文件 equivalence_options.cpp 第 8 行定义.

8 {
9 if (options.budget.max_rewrite_steps == 0 ||
10 options.budget.max_rewrite_depth == 0 ||
11 options.budget.max_node_growth_factor == 0) {
14 "equivalence rewrite budget exhausted before normalization",
16 }
17 return Result<void>::success();
18}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)

引用了 LMCAS::Result< T >::failure(), LMCAS::kEquivalentOperation, LMCAS::options, LMCAS::ResourceLimit, LMCAS::Result< T >::success() , 以及 validate_eqv_options().

被这些函数引用 LMCAS::anonymous_namespace{equivalence_engine.cpp}::equivalent_with_budget(), LMCAS::set_eqv_budget() , 以及 validate_eqv_options().

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