LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{residual_comparison.cpp} 命名空间参考

函数

Result< Tribool > compare_defined_values (const ExprPtr &left, const ExprPtr &right, const FactsQuery &facts, ComputationContext &context, Domain domain)
Result< bool > pointwise_values_defined (const ExprPtr &left, const ExprPtr &right, const FactsQuery &facts, Domain domain, ComputationContext &context)

函数说明

◆ compare_defined_values()

Result< Tribool > LMCAS::anonymous_namespace{residual_comparison.cpp}::compare_defined_values ( const ExprPtr & left,
const ExprPtr & right,
const FactsQuery & facts,
ComputationContext & context,
Domain domain )

在文件 residual_comparison.cpp 第 80 行定义.

82 {
83 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
84 (context).limits().max_ast_nodes, "transform");
85 if (detail::node(left)->equals(*detail::node(right))) {
86 return Tribool::True;
87 }
88 auto residual = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(
89 left,
90 SymbolicExpr::multiply(SymbolicExpr::number(-1), right))), transform_budget));
91 if (!residual) {
94 "value comparison produced no residual",
95 "residual.compare_values");
96 }
97 auto nonzero = detail::query_nonzero_value(
98 detail::node(residual), facts, domain, context);
99 if (!nonzero) {
100 return Result<Tribool>::failure(nonzero.error());
101 }
102 if (nonzero.value() == Tribool::True) {
103 return Tribool::False;
104 }
105 if (nonzero.value() == Tribool::False) {
106 return Tribool::True;
107 }
108 auto identity = check_equivalent(left, right, context);
109 if (!identity) {
110 return Result<Tribool>::failure(identity.error());
111 }
112 return std::holds_alternative<ProvedZeroResidual>(identity.value())
114} catch (const CasError& error) {
115 return Result<Tribool>::failure(error);
116} catch (const std::bad_alloc&) {
117 return Result<Tribool>::failure(CasErrc::ResourceLimit, "allocation failed", "compare_defined_values");
118} catch (const std::length_error& error) {
119 return Result<Tribool>::failure(CasErrc::ResourceLimit, error.what(), "compare_defined_values");
120} catch (const std::exception& error) {
121 return Result<Tribool>::failure(CasErrc::InternalInvariant, error.what(), "compare_defined_values");
122}
static Result failure(CasErrc code, std::string message, std::string operation={})
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ResidualCheckResult check_equivalent(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, const LMCAS::EqvOptions &options)
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
const NumberDomainSet & domain
const ExprPtr & right

引用了 LMCAS::check_equivalent(), compare_defined_values(), LMCAS::context, LMCAS::domain, LMCAS::Result< T >::failure(), LMCAS::False, LMCAS::InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_nonzero_value(), LMCAS::right, LMCAS::True , 以及 LMCAS::Unknown.

被这些函数引用 compare_defined_values().

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

◆ pointwise_values_defined()

Result< bool > LMCAS::anonymous_namespace{residual_comparison.cpp}::pointwise_values_defined ( const ExprPtr & left,
const ExprPtr & right,
const FactsQuery & facts,
Domain domain,
ComputationContext & context )

在文件 residual_comparison.cpp 第 63 行定义.

65 {
66 auto left_defined = detail::query_definedness(
67 detail::node(left), facts, domain, context);
68 if (!left_defined) {
69 return Result<bool>::failure(left_defined.error());
70 }
71 auto right_defined = detail::query_definedness(
73 if (!right_defined) {
74 return Result<bool>::failure(right_defined.error());
75 }
76 return left_defined.value() == Tribool::True &&
77 right_defined.value() == Tribool::True;
78}
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)

引用了 LMCAS::context, LMCAS::domain, LMCAS::Result< T >::failure(), LMCAS::detail::node(), pointwise_values_defined(), LMCAS::detail::query_definedness(), LMCAS::right , 以及 LMCAS::True.

被这些函数引用 pointwise_values_defined().

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