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

函数

ContinuityResult classify_continuity_point_value (const ExprPtr &limit, const ExprPtr &value, const FactsQuery &facts, ComputationContext &context)
ContinuityResult continuity_from_limits (const ExprPtr &f, const std::string &var, const ExprPtr &point, const LimitOutcome &left, const LimitOutcome &right, ComputationContext &context)
Result< ExprPtr > continuity_point_value (ExprPtr value, const FactsQuery &facts, ComputationContext &context)
ContinuityResult continuity_with_limit (const ExprPtr &f, const std::string &var, const ExprPtr &point, const ExprPtr &limit, ComputationContext &context)
Result< detail::SymbolicNodePtr > select_continuity_branch (const PiecewiseNode &piecewise, const FactsQuery &facts, const AssumptionContext &assumptions, ComputationContext &context)

函数说明

◆ classify_continuity_point_value()

ContinuityResult LMCAS::anonymous_namespace{calculus_continuity.cpp}::classify_continuity_point_value ( const ExprPtr & limit,
const ExprPtr & value,
const FactsQuery & facts,
ComputationContext & context )

在文件 calculus_continuity.cpp 第 48 行定义.

50 {
52 if (!defined) { return ContinuityResult::failure(defined.error()); }
53 if (defined.value() == Tribool::False) {
55 }
56 if (defined.value() != Tribool::True) {
58 "point-value definedness is unknown", "continuity_at");
59 }
61 if (!same) { return ContinuityResult::failure(same.error()); }
62 if (same.value() == Tribool::True) {
64 }
65 if (same.value() == Tribool::False) {
67 }
69 "point value could not be compared with the limit", "continuity_at");
70}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ContinuityType value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
Result< Tribool > compare_pointwise_values(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, Domain domain)
在给定假设的 Real 或 Complex 域内比较逐点值,并保留错误。 True/False 分别证明值处处有定义且相等/不等;定义性未证实也归为 Unknown, 仅有非恒等残差不足以判定 Fals...
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Real
Real numbers
@ Continuous
连续:左极限 = 右极限 = 函数值
@ Removable
可去间断点:左极限 = 右极限 != 函数值(或函数无定义)
@ True
Property definitely holds
@ False
Property definitely does not hold
const std::string const ExprPtr & value

引用了 classify_continuity_point_value(), LMCAS::detail::compare_pointwise_values(), LMCAS::context, LMCAS::Continuous, LMCAS::Result< ContinuityType >::failure(), LMCAS::False, LMCAS::Inconclusive, LMCAS::detail::node(), LMCAS::detail::query_definedness(), LMCAS::Real, LMCAS::Removable, LMCAS::Result< ContinuityType >::success(), LMCAS::True , 以及 LMCAS::value.

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

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

◆ continuity_from_limits()

ContinuityResult LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_from_limits ( const ExprPtr & f,
const std::string & var,
const ExprPtr & point,
const LimitOutcome & left,
const LimitOutcome & right,
ComputationContext & context )

在文件 calculus_continuity.cpp 第 99 行定义.

101 {
102 const auto* left_finite = std::get_if<FiniteLimit>(&left);
103 const auto* right_finite = std::get_if<FiniteLimit>(&right);
104 if (!left_finite || !right_finite) {
106 }
108 left_finite->value, right_finite->value, context, Domain::Real);
109 if (!sides) { return ContinuityResult::failure(sides.error()); }
110 if (sides.value() == Tribool::False) {
112 }
113 if (sides.value() != Tribool::True) {
115 "one-sided values could not be compared", "continuity_at");
116 }
117 return continuity_with_limit(f, var, point, left_finite->value, context);
118}
ContinuityResult continuity_with_limit(const ExprPtr &f, const std::string &var, const ExprPtr &point, const ExprPtr &limit, ComputationContext &context)
const std::string const LimitExprPtr & point
@ Jump
跳跃间断点:左极限 != 右极限,但两侧极限均存在
@ Essential
本性间断点:至少一侧极限不存在或为无穷
const ExprPtr & right

引用了 LMCAS::detail::compare_pointwise_values(), LMCAS::context, continuity_from_limits(), continuity_with_limit(), LMCAS::Essential, LMCAS::Result< ContinuityType >::failure(), LMCAS::False, LMCAS::Inconclusive, LMCAS::Jump, LMCAS::point, LMCAS::Real, LMCAS::right, LMCAS::Result< ContinuityType >::success() , 以及 LMCAS::True.

被这些函数引用 continuity_from_limits().

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

◆ continuity_point_value()

Result< ExprPtr > LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_point_value ( ExprPtr value,
const FactsQuery & facts,
ComputationContext & context )

在文件 calculus_continuity.cpp 第 35 行定义.

36 {
37 const AssumptionContext empty_assumptions;
38 const auto& assumptions = context.assumptions() ? *context.assumptions() : empty_assumptions;
39 while (const auto piecewise = std::dynamic_pointer_cast<const PiecewiseNode>(detail::node(value))) {
40 auto selected = select_continuity_branch(*piecewise, facts, assumptions, context);
41 if (!selected) { return Result<ExprPtr>::failure(selected.error()); }
42 if (!selected.value()) { return ExprPtr{}; }
43 value = detail::make_expression_ptr(selected.value());
44 }
45 return value;
46}
Result< detail::SymbolicNodePtr > select_continuity_branch(const PiecewiseNode &piecewise, const FactsQuery &facts, const AssumptionContext &assumptions, ComputationContext &context)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
std::shared_ptr< SymbolicExpr > ExprPtr

引用了 LMCAS::context, continuity_point_value(), LMCAS::Result< T >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), select_continuity_branch() , 以及 LMCAS::value.

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

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

◆ continuity_with_limit()

ContinuityResult LMCAS::anonymous_namespace{calculus_continuity.cpp}::continuity_with_limit ( const ExprPtr & f,
const std::string & var,
const ExprPtr & point,
const ExprPtr & limit,
ComputationContext & context )

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

74 {
75 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
76 (context).limits().max_ast_nodes, "transform");
78 if (!value) {
80 "substitution produced no value", "continuity_at");
81 }
82 std::optional<detail::AssumptionFacts> assumed;
83 if (context.assumptions()) { assumed.emplace(*context.assumptions()); }
84 const auto& facts = assumed ? static_cast<const FactsQuery&>(*assumed) : detail::no_facts();
85 auto selected = continuity_point_value(value, facts, context);
86 if (!selected) { return ContinuityResult::failure(selected.error()); }
87 if (!selected.value()) { return ContinuityResult::success(ContinuityType::Removable); }
88 return classify_continuity_point_value(limit, selected.value(), facts, context);
89} catch (const CasError& error) {
90 return ContinuityResult::failure(error);
91} catch (const std::bad_alloc&) {
92 return ContinuityResult::failure(CasErrc::ResourceLimit, "allocation failed", "continuity_with_limit");
93} catch (const std::length_error& error) {
94 return ContinuityResult::failure(CasErrc::ResourceLimit, error.what(), "continuity_with_limit");
95} catch (const std::exception& error) {
96 return ContinuityResult::failure(CasErrc::InternalInvariant, error.what(), "continuity_with_limit");
97}
ContinuityResult classify_continuity_point_value(const ExprPtr &limit, const ExprPtr &value, const FactsQuery &facts, ComputationContext &context)
Result< ExprPtr > continuity_point_value(ExprPtr value, const FactsQuery &facts, ComputationContext &context)
const FactsQuery & no_facts() noexcept
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 classify_continuity_point_value(), LMCAS::context, continuity_point_value(), continuity_with_limit(), LMCAS::Result< ContinuityType >::failure(), LMCAS::InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::point, LMCAS::Removable, LMCAS::detail::substitute_node(), LMCAS::Result< ContinuityType >::success() , 以及 LMCAS::value.

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

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

◆ select_continuity_branch()

Result< detail::SymbolicNodePtr > LMCAS::anonymous_namespace{calculus_continuity.cpp}::select_continuity_branch ( const PiecewiseNode & piecewise,
const FactsQuery & facts,
const AssumptionContext & assumptions,
ComputationContext & context )

在文件 calculus_continuity.cpp 第 15 行定义.

17 {
18 for (const auto& branch : piecewise.branches()) {
19 auto access = context.consume_steps(1, "continuity_at");
20 if (!access) { return Result<detail::SymbolicNodePtr>::failure(access.error()); }
21 auto defined = detail::query_definedness(branch.condition, facts, Domain::Real, context);
22 if (!defined) { return Result<detail::SymbolicNodePtr>::failure(defined.error()); }
23 const auto truth = defined.value() == Tribool::True
24 ? assumptions.evaluate_condition(detail::expression_from_node(branch.condition))
26 if (truth == Tribool::Unknown) {
28 "point-value branch is undecided", "continuity_at");
29 }
30 if (truth == Tribool::True) { return branch.expression; }
31 }
32 return piecewise.default_expr();
33}
const std::shared_ptr< const SymbolicNode > & default_expr() const noexcept
const std::vector< Branch > & branches() const noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
@ Unknown
Property cannot be determined

引用了 LMCAS::PiecewiseNode::branches(), LMCAS::context, LMCAS::PiecewiseNode::default_expr(), LMCAS::detail::expression_from_node(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::detail::query_definedness(), LMCAS::Real, select_continuity_branch(), LMCAS::True , 以及 LMCAS::Unknown.

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

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