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

类

class  SolutionFinalizer

函数

void append_condition (std::vector< ExprPtr > &conditions, const ExprPtr &condition)
Result< void > apply_root_representation_policy (ExprPtr &root, const SolveOptions &options)
Result< Tribool > equality_condition_truth (const ExprPtr &difference, Tribool nonzero, RelationOp op, ComputationContext &context)
ExprPtr equation_predicate (const ExprPtr &expression)
ExprPtr equation_residual (const ExprPtr &expression)
Result< Tribool > logical_condition_truth (const LogicalNode &logic, const FactsQuery &facts, ComputationContext &context)
Tribool negate_truth (Tribool value)
Result< Tribool > relational_condition_truth (const ExprPtr &expression, const RelationalNode &relation, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > solve_condition_truth (const ExprPtr &expression, const FactsQuery &facts, ComputationContext &context)
ExprPtr substitute_raw (const ExprPtr &expression, const std::string &variable, const ExprPtr &value)

函数说明

◆ append_condition()

void LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::append_condition ( std::vector< ExprPtr > & conditions,
const ExprPtr & condition )

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

52 {
53 for (const auto& existing : conditions) {
54 if (detail::node(existing)->equals(*detail::node(condition))) { return; }
55 }
56 conditions.push_back(condition);
57}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept

引用了 append_condition() , 以及 LMCAS::detail::node().

被这些函数引用 append_condition(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finalize_value(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finish() , 以及 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finish_conditions().

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

◆ apply_root_representation_policy()

Result< void > LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::apply_root_representation_policy ( ExprPtr & root,
const SolveOptions & options )

在文件 solve_solution_finalization.cpp 第 30 行定义.

30 {
31 if (!options.return_rootof) {
32 if (std::dynamic_pointer_cast<const RootOfNode>(detail::node(root))) {
33 root = rootof_simplify(root);
34 }
37 "complete roots require RootOf representation", "solve.representation");
38 }
39 }
40 return Result<void>::success();
41}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
bool contains_node_type(const SymbolicNodePtr &root)
std::shared_ptr< SymbolicExpr > rootof_simplify(const std::shared_ptr< SymbolicExpr > &rootof_expr)
const std::string ComputationContext const SolveOptions & options

引用了 apply_root_representation_policy(), LMCAS::detail::contains_node_type(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::detail::node(), LMCAS::options, LMCAS::rootof_simplify() , 以及 LMCAS::Result< T >::success().

被这些函数引用 apply_root_representation_policy() , 以及 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::filter_values().

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

◆ equality_condition_truth()

Result< Tribool > LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::equality_condition_truth ( const ExprPtr & difference,
Tribool nonzero,
RelationOp op,
ComputationContext & context )

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

86 {
87 if (nonzero == Tribool::Unknown) {
88 auto residual = check_zero_residual(difference, context);
89 if (!residual) { return Result<Tribool>::failure(residual.error()); }
90 if (std::holds_alternative<ProvedZeroResidual>(residual.value())) { nonzero = Tribool::False; }
91 }
92 if (op == RelationOp::NEQ) { return nonzero; }
93 return negate_truth(nonzero);
94}
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Unknown
Property cannot be determined
@ False
Property definitely does not hold
const ExprPtr RelationOp op
ResidualCheckResult check_zero_residual(const ExprPtr &residual, ComputationContext &context, const LMCAS::EqvOptions &options)

引用了 LMCAS::check_zero_residual(), LMCAS::context, equality_condition_truth(), LMCAS::Result< T >::failure(), LMCAS::False, negate_truth(), LMCAS::NEQ, LMCAS::op , 以及 LMCAS::Unknown.

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

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

◆ equation_predicate()

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

12 {
13 if (std::dynamic_pointer_cast<const RelationalNode>(detail::node(expression))) {
14 return expression;
15 }
17 detail::node(expression), detail::node(SymbolicExpr::number(0)), RelationOp::EQ));
18}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)

被这些函数引用 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finalize_value() , 以及 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finish().

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

◆ equation_residual()

ExprPtr LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::equation_residual ( const ExprPtr & expression)

在文件 solve_solution_finalization.cpp 第 43 行定义.

43 {
44 if (auto relation = std::dynamic_pointer_cast<const RelationalNode>(detail::node(expression))) {
45 return SymbolicExpr::add(detail::make_expression_ptr(relation->left()),
46 SymbolicExpr::multiply(SymbolicExpr::number(-1),
48 }
49 return expression;
50}
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)

引用了 equation_residual(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::relation().

被这些函数引用 equation_residual(), LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finalize_value() , 以及 relational_condition_truth().

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

◆ logical_condition_truth()

Result< Tribool > LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::logical_condition_truth ( const LogicalNode & logic,
const FactsQuery & facts,
ComputationContext & context )

在文件 solve_solution_finalization.cpp 第 67 行定义.

68 {
70 if (!left) { return left; }
71 if (logic.op() == LogicalNode::Op::Not) { return negate_truth(left.value()); }
73 if (!right) { return right; }
74 auto l = left.value();
75 auto r = right.value();
76 if (logic.op() == LogicalNode::Op::Implies) { l = negate_truth(l); }
77 if (logic.op() == LogicalNode::Op::And) {
78 if (l == Tribool::False || r == Tribool::False) { return Tribool::False; }
80 }
81 if (l == Tribool::True || r == Tribool::True) { return Tribool::True; }
83}
@ Not
一元逻辑非,right 为 nullptr。
@ Implies
逻辑蕴含 A ⇒ B。
Op op() const noexcept
const std::shared_ptr< const SymbolicNode > & right() const noexcept
const std::shared_ptr< const SymbolicNode > & left() const noexcept
Result< Tribool > solve_condition_truth(const ExprPtr &expression, const FactsQuery &facts, ComputationContext &context)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
@ True
Property definitely holds
const ExprPtr & right

引用了 LMCAS::LogicalNode::And, LMCAS::context, LMCAS::False, LMCAS::LogicalNode::Implies, LMCAS::LogicalNode::left(), logical_condition_truth(), LMCAS::detail::make_expression_ptr(), negate_truth(), LMCAS::LogicalNode::Not, LMCAS::LogicalNode::op(), LMCAS::r, LMCAS::LogicalNode::right(), LMCAS::right, solve_condition_truth(), LMCAS::True , 以及 LMCAS::Unknown.

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

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

◆ negate_truth()

Tribool LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::negate_truth ( Tribool value)

在文件 solve_solution_finalization.cpp 第 59 行定义.

59 {
62}
const std::string const ExprPtr & value

引用了 LMCAS::False, negate_truth(), LMCAS::True, LMCAS::Unknown , 以及 LMCAS::value.

被这些函数引用 equality_condition_truth(), logical_condition_truth() , 以及 negate_truth().

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

◆ relational_condition_truth()

Result< Tribool > LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::relational_condition_truth ( const ExprPtr & expression,
const RelationalNode & relation,
const FactsQuery & facts,
ComputationContext & context )

在文件 solve_solution_finalization.cpp 第 96 行定义.

97 {
98 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
99 (context).limits().max_ast_nodes, "transform");
100 auto defined = detail::query_definedness(detail::node(expression), facts, Domain::Complex, context);
101 if (!defined) { return Result<Tribool>::failure(defined.error()); }
102 if (defined.value() != Tribool::True) { return Tribool::Unknown; }
103 auto difference = detail::make_expression_ptr(detail::normalize_node(detail::node(equation_residual(expression)), transform_budget));
104 auto nz = detail::query_nonzero_value(detail::node(difference), facts, Domain::Complex, context);
105 if (!nz) { return nz; }
106 if (relation.op() == RelationOp::EQ || relation.op() == RelationOp::NEQ) {
107 return equality_condition_truth(difference, nz.value(), relation.op(), context);
108 }
109 if (relation.op() == RelationOp::LT || relation.op() == RelationOp::LEQ) {
110 difference = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(SymbolicExpr::number(-1), difference)), transform_budget));
111 }
112 if (relation.op() == RelationOp::GEQ || relation.op() == RelationOp::LEQ) {
113 return detail::query_nonnegative_value(detail::node(difference), facts, context);
114 }
115 return detail::query_positive_value(detail::node(difference), facts, context);
116} catch (const CasError& error) {
117 return Result<Tribool>::failure(error);
118} catch (const std::bad_alloc&) {
119 return Result<Tribool>::failure(CasErrc::ResourceLimit, "allocation failed", "relational_condition_truth");
120} catch (const std::length_error& error) {
121 return Result<Tribool>::failure(CasErrc::ResourceLimit, error.what(), "relational_condition_truth");
122} catch (const std::exception& error) {
123 return Result<Tribool>::failure(CasErrc::InternalInvariant, error.what(), "relational_condition_truth");
124}
Result< Tribool > equality_condition_truth(const ExprPtr &difference, Tribool nonzero, RelationOp op, ComputationContext &context)
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Result< Tribool > query_nonnegative_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
@ Complex
Complex numbers (default, least specific)

引用了 LMCAS::Complex, LMCAS::context, LMCAS::EQ, equality_condition_truth(), equation_residual(), LMCAS::Result< T >::failure(), LMCAS::GEQ, LMCAS::LEQ, LMCAS::LT, LMCAS::detail::make_expression_ptr(), LMCAS::NEQ, LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_definedness(), LMCAS::detail::query_nonnegative_value(), LMCAS::detail::query_nonzero_value(), LMCAS::detail::query_positive_value(), LMCAS::relation(), relational_condition_truth(), LMCAS::True , 以及 LMCAS::Unknown.

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

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

◆ solve_condition_truth()

Result< Tribool > LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::solve_condition_truth ( const ExprPtr & expression,
const FactsQuery & facts,
ComputationContext & context )

在文件 solve_solution_finalization.cpp 第 125 行定义.

126 {
127 auto step = context.consume_steps(1, "solve.conditions");
128 if (!step) { return Result<Tribool>::failure(step.error()); }
129 const auto node = detail::node(expression);
130 if (auto logic = std::dynamic_pointer_cast<const LogicalNode>(node)) {
131 return logical_condition_truth(*logic, facts, context);
132 }
133 auto relation = std::dynamic_pointer_cast<const RelationalNode>(node);
134 if (!relation) { return Tribool::Unknown; }
135 return relational_condition_truth(expression, *relation, facts, context);
136}
Result< Tribool > relational_condition_truth(const ExprPtr &expression, const RelationalNode &relation, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > logical_condition_truth(const LogicalNode &logic, const FactsQuery &facts, ComputationContext &context)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), logical_condition_truth(), LMCAS::detail::node(), LMCAS::relation(), relational_condition_truth(), solve_condition_truth() , 以及 LMCAS::Unknown.

被这些函数引用 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finish_conditions(), logical_condition_truth() , 以及 solve_condition_truth().

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

◆ substitute_raw()

ExprPtr LMCAS::detail::substitute_raw ( const ExprPtr & expression,
const std::string & variable,
const ExprPtr & value )

在文件 solve_solution_finalization.cpp 第 10 行定义.

21 {
23 detail::node(expression), variable, detail::node(value)));
24}
const std::string & variable
detail::SymbolicNodePtr substitute_free(const detail::SymbolicNodePtr &expression, const std::string &variable, const detail::SymbolicNodePtr &replacement, detail::RewriteBudget *budget)

被这些函数引用 LMCAS::anonymous_namespace{solve_solution_finalization.cpp}::SolutionFinalizer::finalize_value().

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