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

命名空间

namespace  anonymous_namespace{integration_definite_segments.cpp}

类

struct  Boundary
struct  RationalFunction

类型定义

using Algebraic = ExactRealAlgebraic
using Node = std::shared_ptr<const SymbolicNode>
using Poly = Polynomial<Rational>
using RationalResult = Result<std::optional<RationalFunction>>

函数

Node absolute_argument (const SymbolicNode &node)
 识别绝对值节点及公共接口的平方开根表示。
Result< Boundary > boundary_checked (const SymbolicExpr &expression, ComputationContext &context)
static Result< SymbolicExpr > boundary_value_checked (const SymbolicExpr &primitive, const std::string &var, const SymbolicExpr &point, LimitDirection direction, ComputationContext &context)
Result< Tribool > certify_continuity_checked (const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
static Result< void > collect_predicate_roots (const Node &condition, const std::string &var, std::vector< Algebraic > &roots, ComputationContext &context)
Result< int > compare_boundaries (const Boundary &a, const Boundary &b, ComputationContext &context)
static Result< Tribool > continuous_children (const std::vector< Node > &children, const FactsQuery &facts, ComputationContext &context)
static bool continuous_function_family (FunctionNode::FuncType type)
static Result< Tribool > defined_on_interval (const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< std::vector< SymbolicExpr > > definite_partition_checked (const SymbolicExpr &original, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
Result< SymbolicExpr > definite_segment_checked (const SymbolicExpr &original, const SymbolicExpr &primitive, const std::string &var, const SymbolicExpr &a, const SymbolicExpr &b, ComputationContext &context)
template<class T>
Result< T > divergent ()
static Result< SymbolicExpr > evaluate_segment_endpoints (const SymbolicExpr &candidate, const std::string &var, const SymbolicExpr &a, const SymbolicExpr &b, bool concrete_endpoints, ComputationContext &context)
std::optional< Rational > exact_number (const Node &node)
static Result< Poly > gcd_checked (Poly a, Poly b, ComputationContext &context)
static bool include_divergence (int &divergence, int contribution)
int infinity_sign (const Node &node)
bool is_undecided (const CasError &error)
bool needs_segment_expression (const Node &node)
static Result< std::vector< Algebraic > > ordered_partition_roots (std::vector< Algebraic > &roots, const Boundary &a, const Boundary &b, ComputationContext &context)
static Result< void > original_conditions_checked (const Node &node, const FactsQuery &facts, std::vector< std::shared_ptr< SymbolicExpr > > &conditions, ComputationContext &context)
static Result< int > polynomial_at_root_sign (Poly polynomial, Algebraic root, ComputationContext &context)
static Result< void > polynomial_budget (const Poly &polynomial, ComputationContext &context)
Result< std::optional< int > > polynomial_sign_checked (const Poly &polynomial, const Boundary &a, const Boundary &b, ComputationContext &context)
static Result< void > prepare_segment_primitive (SymbolicExpr &candidate, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
Result< Poly > product_checked (const Poly &a, const Poly &b, ComputationContext &context)
RationalResult rational_checked (const Node &node, const std::string &var, ComputationContext &context)
Result< int > rational_divergence_checked (RationalFunction &rational, const Boundary &a, const Boundary &b, ComputationContext &context)
static RationalResult rational_operands_checked (const std::vector< Node > &operands, bool sum, const std::string &var, ComputationContext &context)
static Result< void > rational_pole_divergence (const RationalFunction &rational, const Algebraic &root, const Boundary &a, const Boundary &b, int &divergence, ComputationContext &context)
static RationalResult rational_power_checked (const PowerNode &power, const std::string &var, ComputationContext &context)
Result< AssumptionContext > real_assumptions (const std::string &var, ComputationContext &context)
static Result< void > recover_rational_cut (Algebraic &root, const BigInt &denominator_bound, ComputationContext &context)
Result< std::vector< Algebraic > > roots_checked (const Poly &polynomial, ComputationContext &context)
Result< SymbolicExpr > segment_expression_checked (const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
static int sign (const Rational &value)
static Result< Tribool > structurally_continuous (const Node &node, const FactsQuery &facts, ComputationContext &context)
template<class T>
Result< T > undecided ()

变量

constexpr const char * operation = "integrate.definite"

类说明

◆ LMCAS::detail::definite::Boundary

struct LMCAS::detail::definite::Boundary

在文件 integration_definite_support.hpp 第 12 行定义.

LMCAS::detail::definite::Boundary 的协作图:
类成员
Algebraic finite
int infinity = 0

◆ LMCAS::detail::definite::RationalFunction

struct LMCAS::detail::definite::RationalFunction

在文件 integration_definite_support.hpp 第 17 行定义.

LMCAS::detail::definite::RationalFunction 的协作图:
类成员
Poly denominator
Poly numerator

类型定义说明

◆ Algebraic

◆ Node

using LMCAS::detail::definite::Node = std::shared_ptr<const SymbolicNode>

在文件 integration_definite_support.hpp 第 7 行定义.

◆ Poly

在文件 integration_definite_support.hpp 第 8 行定义.

◆ RationalResult

函数说明

◆ absolute_argument()

Node LMCAS::detail::definite::absolute_argument ( const SymbolicNode & node)

识别绝对值节点及公共接口的平方开根表示。

前置条件
调用方须先证明参数为实数,再在开区间上使用 |u| = ±u。

在文件 integration_definite_algebraic.cpp 第 23 行定义.

23 {
24 Node radicand;
25 if (const auto* function = dynamic_cast<const FunctionNode*>(&node)) {
26 if (function->arguments().size() != 1) return nullptr;
27 if (function->type() == FunctionNode::FuncType::Abs) return function->arguments()[0];
28 if (function->type() != FunctionNode::FuncType::Sqrt) return nullptr;
29 radicand = function->arguments()[0];
30 } else if (const auto* power = dynamic_cast<const PowerNode*>(&node)) {
31 auto exponent = exact_number(power->exponent());
32 if (!exponent || *exponent != Rational(1, 2)) return nullptr;
33 radicand = power->base();
34 } else return nullptr;
35 const auto* square = dynamic_cast<const PowerNode*>(radicand.get());
36 if (!square) return nullptr;
37 auto exponent = exact_number(square->exponent());
38 return exponent && *exponent == Rational(2) ? square->base() : nullptr;
39}
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
@ Sqrt
对数、绝对值、平方根。
幂运算节点,表示 base^exponent。
std::optional< Rational > exact_number(const Node &node)
std::shared_ptr< const SymbolicNode > Node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
const ExprPtr & exponent
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::FunctionNode::Abs, absolute_argument(), exact_number(), LMCAS::exponent, LMCAS::function(), LMCAS::detail::node() , 以及 LMCAS::FunctionNode::Sqrt.

被这些函数引用 absolute_argument(), needs_segment_expression(), original_conditions_checked(), LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit() , 以及 LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentExpression::visit().

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

◆ boundary_checked()

Result< Boundary > LMCAS::detail::definite::boundary_checked ( const SymbolicExpr & expression,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 64 行定义.

65 {
66 if (int infinity = infinity_sign(detail::node(expression)))
67 return Boundary{infinity, {}};
68 if (auto rational = exact_number(detail::node(expression)))
69 return Boundary{0, {Poly({-*rational, Rational(1)}), *rational, *rational, 0, 1}};
70 if (dynamic_cast<const NumberNode*>(detail::node(expression).get()))
72 "nonfinite numeric endpoint requires a typed infinity", operation);
73 if (const auto* root = dynamic_cast<const RootOfNode*>(detail::node(expression).get())) {
75 root->exact_id().polynomial, root->index(), 1, context);
76 if (!value) return Result<Boundary>::failure(value.error());
77 return Boundary{0, std::move(value.value())};
78 }
79 return undecided<Boundary>();
80}
static Result failure(CasErrc code, std::string message, std::string operation={})
ExactRealAlgebraicResult make_exact_real_algebraic(Polynomial< Rational > polynomial, std::size_t root_index, std::size_t multiplicity, ComputationContext &context)
std::size_t std::size_t ComputationContext & context
const std::string const ExprPtr & value
ExprResult rational(const Rational &value)

引用了 boundary_checked(), LMCAS::detail::context, LMCAS::DomainError, exact_number(), LMCAS::Result< T >::failure(), infinity_sign(), LMCAS::detail::make_exact_real_algebraic(), LMCAS::detail::node(), operation, LMCAS::rational(), undecided() , 以及 LMCAS::value.

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::DefiniteInterval::DefiniteInterval(), boundary_checked(), certify_continuity_checked(), definite_partition_checked(), definite_segment_checked(), prepare_segment_primitive() , 以及 segment_expression_checked().

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

◆ boundary_value_checked()

Result< SymbolicExpr > LMCAS::detail::definite::boundary_value_checked ( const SymbolicExpr & primitive,
const std::string & var,
const SymbolicExpr & point,
LimitDirection direction,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 519 行定义.

521 {
523 if (!result) return Result<SymbolicExpr>::failure(result.error());
524 const auto& outcome = result.value().value;
525 if (const auto* finite = std::get_if<FiniteLimit>(&outcome)) return *finite->value;
526 if (std::holds_alternative<PositiveInfinityLimit>(outcome)) return *SymbolicExpr::infinity(1);
527 if (std::holds_alternative<NegativeInfinityLimit>(outcome)) return *SymbolicExpr::infinity(-1);
529}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const std::string const LimitExprPtr & point
LimitResult limit_checked(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)
const std::string const LimitExprPtr LimitDirection direction

引用了 boundary_value_checked(), LMCAS::detail::context, LMCAS::direction, divergent(), LMCAS::Result< T >::failure(), LMCAS::limit_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::point , 以及 LMCAS::Result< T >::value().

被这些函数引用 boundary_value_checked() , 以及 evaluate_segment_endpoints().

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

◆ certify_continuity_checked()

Result< Tribool > LMCAS::detail::definite::certify_continuity_checked ( const SymbolicExpr & expression,
const std::string & var,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
ComputationContext & context )

在文件 integration_definite_segments.cpp 第 463 行定义.

465 {
466 auto effective = segment_expression_checked(expression, var, lower, upper, context);
467 if (!effective) { return is_undecided(effective.error()) ? Result<Tribool>(Tribool::Unknown) :
468 Result<Tribool>::failure(effective.error()); }
469 auto assumptions = real_assumptions(var, context);
470 if (!assumptions) { return Result<Tribool>::failure(assumptions.error()); }
471 detail::AssumptionFacts global(assumptions.value());
472 auto everywhere = structurally_continuous(detail::node(effective.value()), global, context);
473 if (!everywhere || everywhere.value() != Tribool::Unknown) { return everywhere; }
476 if (!a) { return is_undecided(a.error()) ? Result<Tribool>(Tribool::Unknown) : Result<Tribool>::failure(a.error()); }
477 if (!b) { return is_undecided(b.error()) ? Result<Tribool>(Tribool::Unknown) : Result<Tribool>::failure(b.error()); }
478 SegmentFacts facts(assumptions.value(), var, a.value(), b.value());
479 return structurally_continuous(detail::node(effective.value()), facts, context);
480}
CasError & error()
QuantityResult failure(CasErrc code, std::string message)
Result< SymbolicExpr > segment_expression_checked(const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
static Result< Tribool > structurally_continuous(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Boundary > boundary_checked(const SymbolicExpr &expression, ComputationContext &context)
Result< AssumptionContext > real_assumptions(const std::string &var, ComputationContext &context)
RewriteBudget const FactsQuery & facts
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const ExprPtr & lower
Tribool
Tri-state logic value for property queries.
@ Unknown
Property cannot be determined
const MultiPoly & b
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a

引用了 LMCAS::a, LMCAS::b, boundary_checked(), certify_continuity_checked(), LMCAS::detail::context, LMCAS::Result< T >::error(), LMCAS::detail::facts, LMCAS::Result< T >::failure(), is_undecided(), LMCAS::lower, LMCAS::detail::node(), real_assumptions(), segment_expression_checked(), structurally_continuous(), LMCAS::Unknown, LMCAS::upper , 以及 LMCAS::Result< T >::value().

被这些函数引用 certify_continuity_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::certify_partition(), definite_segment_checked() , 以及 prepare_segment_primitive().

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

◆ collect_predicate_roots()

Result< void > LMCAS::detail::definite::collect_predicate_roots ( const Node & condition,
const std::string & var,
std::vector< Algebraic > & roots,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 225 行定义.

226 {
227 auto step = context.consume_steps(1, operation);
228 if (!step) { return step; }
229 if (const auto* logical = dynamic_cast<const LogicalNode*>(condition.get())) {
230 auto left = collect_predicate_roots(logical->left(), var, roots, context);
231 if (!left) { return left; }
232 if (logical->right()) { return collect_predicate_roots(logical->right(), var, roots, context); }
233 return Result<void>::success();
234 }
235 const auto* relation = dynamic_cast<const RelationalNode*>(condition.get());
236 if (!relation) { return undecided<void>(); }
237 auto difference = sym_sub(detail::expression_from_node(relation->left()),
239 auto rational = rational_checked(detail::node(difference), var, context);
240 if (!rational) { return Result<void>::failure(rational.error()); }
241 if (!rational.value()) { return undecided<void>(); }
242 for (const auto* polynomial : {&rational.value()->numerator, &rational.value()->denominator}) {
243 if (polynomial->degree() <= 0) { continue; }
244 auto isolated = roots_checked(*polynomial, context);
245 if (!isolated) { return Result<void>::failure(isolated.error()); }
246 roots.insert(roots.end(), isolated.value().begin(), isolated.value().end());
247 }
248 return Result<void>::success();
249}
static Result success(T value)
static Result< void > collect_predicate_roots(const Node &condition, const std::string &var, std::vector< Algebraic > &roots, ComputationContext &context)
RationalResult rational_checked(const Node &node, const std::string &var, ComputationContext &context)
Result< std::vector< Algebraic > > roots_checked(const Poly &polynomial, ComputationContext &context)
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
std::shared_ptr< SymbolicExpr > sym_sub(const SymbolicExpr &lhs, const SymbolicExpr &rhs)

引用了 collect_predicate_roots(), LMCAS::detail::context, LMCAS::Result< T >::error(), LMCAS::detail::expression_from_node(), LMCAS::Result< T >::failure(), LMCAS::detail::node(), operation, LMCAS::rational(), rational_checked(), LMCAS::relation(), LMCAS::roots(), roots_checked(), LMCAS::Result< T >::success(), LMCAS::sym_sub(), undecided() , 以及 LMCAS::Result< T >::value().

被这些函数引用 collect_predicate_roots() , 以及 definite_partition_checked().

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

◆ compare_boundaries()

Result< int > LMCAS::detail::definite::compare_boundaries ( const Boundary & a,
const Boundary & b,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 82 行定义.

83 {
84 if (a.infinity || b.infinity)
85 { return a.infinity < b.infinity ? -1 : a.infinity > b.infinity ? 1 : 0; }
86 auto left = a.finite;
87 auto right = b.finite;
88 right.polynomial.variable_name = left.polynomial.variable_name;
89 if (!(left.upper < right.lower) && !(right.upper < left.lower)) {
91 if (!equal) { return Result<int>::failure(equal.error()); }
92 if (equal.value()) { return 0; }
93 while (!(left.upper < right.lower) && !(right.upper < left.lower)) {
95 if (!refined) { return Result<int>::failure(refined.error()); }
97 if (!refined) { return Result<int>::failure(refined.error()); }
98 }
99 }
100 return detail::compare_exact_real_algebraic(std::move(left), std::move(right), context);
101}
Result< int > compare_exact_real_algebraic(ExactRealAlgebraic lhs, ExactRealAlgebraic rhs, ComputationContext &context)
Result< void > refine_exact_real_algebraic(ExactRealAlgebraic &value, ComputationContext &context, const std::string &operation)
Result< bool > equal_exact_real_algebraic(ExactRealAlgebraic lhs, ExactRealAlgebraic rhs, ComputationContext &context)
const ExprPtr & right

引用了 LMCAS::a, LMCAS::b, compare_boundaries(), LMCAS::detail::compare_exact_real_algebraic(), LMCAS::detail::context, LMCAS::detail::equal_exact_real_algebraic(), LMCAS::Result< T >::failure(), operation, LMCAS::detail::refine_exact_real_algebraic() , 以及 LMCAS::right.

被这些函数引用 compare_boundaries(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), ordered_partition_roots(), polynomial_sign_checked() , 以及 rational_pole_divergence().

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

◆ continuous_children()

Result< Tribool > LMCAS::detail::definite::continuous_children ( const std::vector< Node > & children,
const FactsQuery & facts,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 428 行定义.

429 {
430 for (const auto& child : children) {
431 auto continuous = structurally_continuous(child, facts, context);
432 if (!continuous || continuous.value() != Tribool::True) { return continuous; }
433 }
434 return Tribool::True;
435}
@ True
Property definitely holds

引用了 LMCAS::detail::context, continuous_children(), LMCAS::detail::facts, structurally_continuous() , 以及 LMCAS::True.

被这些函数引用 continuous_children() , 以及 structurally_continuous().

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

◆ continuous_function_family()

bool LMCAS::detail::definite::continuous_function_family ( FunctionNode::FuncType type)
static

在文件 integration_definite_segments.cpp 第 405 行定义.

405 {
406 using F = FunctionNode::FuncType;
407 switch (type) {
408 case F::Sin: { return true; }
409 case F::Cos: { return true; }
410 case F::Exp: { return true; }
411 case F::Abs: { return true; }
412 case F::ArcTan: { return true; }
413 case F::Ln: { return true; }
414 case F::Log: { return true; }
415 case F::Sqrt: { return true; }
416 case F::Sinh: { return true; }
417 case F::Cosh: { return true; }
418 case F::Tan: { return true; }
419 case F::ArcSin: { return true; }
420 case F::ArcCos: { return true; }
421 default: { return false; }
422 }
423}

引用了 continuous_function_family().

被这些函数引用 continuous_function_family() , 以及 structurally_continuous().

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

◆ defined_on_interval()

Result< Tribool > LMCAS::detail::definite::defined_on_interval ( const Node & node,
const FactsQuery & facts,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 386 行定义.

387 {
389 if (!defined || defined.value() != Tribool::Unknown) { return defined; }
390 const auto* interval = dynamic_cast<const SegmentFacts*>(&facts);
391 if (!interval) { return defined; }
393 if (!conditions) { return Result<Tribool>::failure(conditions.error()); }
394 if (!conditions.value()) { return Tribool::Unknown; }
395 bool unknown = false;
396 for (const auto& condition : *conditions.value()) {
397 auto truth = predicate_truth(detail::node(condition), *interval, context);
398 if (!truth) { return truth; }
399 if (truth.value() == Tribool::False) { return Tribool::False; }
400 unknown |= truth.value() == Tribool::Unknown;
401 }
403}
static Result< Tribool > predicate_truth(const Node &node, const SegmentFacts &facts, ComputationContext &context)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
Result< std::optional< std::vector< std::shared_ptr< SymbolicExpr > > > > domain_constraints(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
@ Real
Real numbers
@ False
Property definitely does not hold

引用了 LMCAS::detail::context, defined_on_interval(), LMCAS::detail::domain_constraints(), LMCAS::detail::facts, LMCAS::Result< T >::failure(), LMCAS::False, LMCAS::interval(), LMCAS::detail::node(), LMCAS::detail::query_definedness(), LMCAS::Real, LMCAS::True, LMCAS::Unknown , 以及 LMCAS::Result< T >::value().

被这些函数引用 defined_on_interval() , 以及 structurally_continuous().

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

◆ definite_partition_checked()

Result< std::vector< SymbolicExpr > > LMCAS::detail::definite::definite_partition_checked ( const SymbolicExpr & original,
const std::string & var,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
ComputationContext & context )

在文件 integration_definite_segments.cpp 第 352 行定义.

354 {
355 auto assumptions = real_assumptions(var, context);
356 if (!assumptions) { return Result<std::vector<SymbolicExpr>>::failure(assumptions.error()); }
357 detail::AssumptionFacts facts(assumptions.value());
358 std::vector<std::shared_ptr<SymbolicExpr>> conditions;
359 auto captured = original_conditions_checked(detail::node(original), facts, conditions, context);
360 if (!captured) { return Result<std::vector<SymbolicExpr>>::failure(captured.error()); }
361 if (conditions.empty()) { return std::vector<SymbolicExpr>{lower, upper}; }
364 if (!a) { return Result<std::vector<SymbolicExpr>>::failure(a.error()); }
365 if (!b) { return Result<std::vector<SymbolicExpr>>::failure(b.error()); }
366 std::vector<Algebraic> roots;
367 for (const auto& condition : conditions) {
368 auto collected = collect_predicate_roots(detail::node(condition), var, roots, context);
369 if (!collected) { return Result<std::vector<SymbolicExpr>>::failure(collected.error()); }
370 }
371 auto ordered = ordered_partition_roots(roots, a.value(), b.value(), context);
372 if (!ordered) { return Result<std::vector<SymbolicExpr>>::failure(ordered.error()); }
373 std::vector<SymbolicExpr> result{lower};
374 for (const auto& root : ordered.value()) {
375 if (root.is_rational()) { result.push_back(*SymbolicExpr::number(root.lower)); }
376 else {
377 auto expression = make_rootof_checked(poly_to_symbolic(root.polynomial), var, root.root_index, context);
378 if (!expression) { return Result<std::vector<SymbolicExpr>>::failure(expression.error()); }
379 result.push_back(*expression.value());
380 }
381 }
382 result.push_back(upper);
383 return result;
384}
static Result< std::vector< Algebraic > > ordered_partition_roots(std::vector< Algebraic > &roots, const Boundary &a, const Boundary &b, ComputationContext &context)
static Result< void > original_conditions_checked(const Node &node, const FactsQuery &facts, std::vector< std::shared_ptr< SymbolicExpr > > &conditions, ComputationContext &context)
RootOfConstructionResult make_rootof_checked(const std::shared_ptr< SymbolicExpr > &polynomial, const std::string &variable, std::size_t index, ComputationContext &context)

引用了 LMCAS::a, LMCAS::b, boundary_checked(), collect_predicate_roots(), LMCAS::detail::context, definite_partition_checked(), LMCAS::Result< T >::error(), LMCAS::detail::facts, LMCAS::lower, LMCAS::make_rootof_checked(), LMCAS::detail::node(), ordered_partition_roots(), original_conditions_checked(), real_assumptions(), LMCAS::roots(), LMCAS::upper , 以及 LMCAS::Result< T >::value().

被这些函数引用 definite_partition_checked() , 以及 LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval().

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

◆ definite_segment_checked()

Result< SymbolicExpr > LMCAS::detail::definite::definite_segment_checked ( const SymbolicExpr & original,
const SymbolicExpr & primitive,
const std::string & var,
const SymbolicExpr & a,
const SymbolicExpr & b,
ComputationContext & context )

在文件 integration_definite_segments.cpp 第 595 行定义.

597 {
598 auto continuous = certify_continuity_checked(original, var, a, b, context);
599 if (!continuous) { return Result<SymbolicExpr>::failure(continuous.error()); }
600 if (continuous.value() == Tribool::False) { return divergent<SymbolicExpr>(); }
601 if (continuous.value() != Tribool::True) { return undecided<SymbolicExpr>(); }
602 SymbolicExpr candidate = primitive;
603 auto prepared = prepare_segment_primitive(candidate, var, a, b, context);
604 if (!prepared) { return Result<SymbolicExpr>::failure(prepared.error()); }
607 return evaluate_segment_endpoints(candidate, var, a, b, lower && upper, context);
608}
Result< Tribool > certify_continuity_checked(const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
static Result< void > prepare_segment_primitive(SymbolicExpr &candidate, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
static Result< SymbolicExpr > evaluate_segment_endpoints(const SymbolicExpr &candidate, const std::string &var, const SymbolicExpr &a, const SymbolicExpr &b, bool concrete_endpoints, ComputationContext &context)

引用了 LMCAS::a, LMCAS::b, boundary_checked(), certify_continuity_checked(), LMCAS::detail::context, definite_segment_checked(), divergent(), evaluate_segment_endpoints(), LMCAS::Result< T >::failure(), LMCAS::False, LMCAS::lower, prepare_segment_primitive(), LMCAS::True, undecided() , 以及 LMCAS::upper.

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::accumulate_segments() , 以及 definite_segment_checked().

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

◆ divergent()

template<class T>
Result< T > LMCAS::detail::definite::divergent ( )

在文件 integration_definite_support.hpp 第 27 行定义.

27 {
29 "ordinary improper integral does not exist",
30 "integrate.definite.convergence");
31}

引用了 divergent(), LMCAS::DomainError , 以及 LMCAS::Result< T >::failure().

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::accumulate_segments(), boundary_value_checked(), definite_segment_checked(), divergent(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), evaluate_segment_endpoints(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), rational_divergence_checked() , 以及 rational_pole_divergence().

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

◆ evaluate_segment_endpoints()

Result< SymbolicExpr > LMCAS::detail::definite::evaluate_segment_endpoints ( const SymbolicExpr & candidate,
const std::string & var,
const SymbolicExpr & a,
const SymbolicExpr & b,
bool concrete_endpoints,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 564 行定义.

566 {
567 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
568 (context).limits().max_ast_nodes, "transform");
569 if (!concrete_endpoints) {
570 auto high = detail::make_expression_ptr(detail::substitute_node(detail::node(candidate), var, detail::node(b), transform_budget));
571 auto low = detail::make_expression_ptr(detail::substitute_node(detail::node(candidate), var, detail::node(a), transform_budget));
573 "primitive substitution returned no expression", operation); }
574 return *detail::make_expression_ptr(detail::normalize_node(detail::node(sym_sub(*high, *low)), transform_budget));
575 }
576 auto high = boundary_value_checked(candidate, var, b, LimitDirection::FromBelow, context);
577 auto low = boundary_value_checked(candidate, var, a, LimitDirection::FromAbove, context);
578 if (!high) { return high; }
579 if (!low) { return low; }
580 const int hs = infinity_sign(detail::node(high.value()));
581 const int ls = -infinity_sign(detail::node(low.value()));
582 if (hs && ls && hs != ls) { return divergent<SymbolicExpr>(); }
583 if (hs || ls) { return *SymbolicExpr::infinity(hs ? hs : ls); }
584 return *detail::make_expression_ptr(detail::normalize_node(detail::node(sym_sub(high.value(), low.value())), transform_budget));
585} catch (const CasError& error) {
586 return Result<SymbolicExpr>::failure(error);
587} catch (const std::bad_alloc&) {
588 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, "allocation failed", "evaluate_segment_endpoints");
589} catch (const std::length_error& error) {
590 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, error.what(), "evaluate_segment_endpoints");
591} catch (const std::exception& error) {
592 return Result<SymbolicExpr>::failure(CasErrc::InternalInvariant, error.what(), "evaluate_segment_endpoints");
593}
static Result< SymbolicExpr > boundary_value_checked(const SymbolicExpr &primitive, const std::string &var, const SymbolicExpr &point, LimitDirection direction, ComputationContext &context)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 LMCAS::a, LMCAS::b, boundary_value_checked(), LMCAS::detail::context, divergent(), evaluate_segment_endpoints(), LMCAS::Result< T >::failure(), LMCAS::FromAbove, LMCAS::FromBelow, infinity_sign(), LMCAS::InternalInvariant, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), operation, LMCAS::detail::substitute_node() , 以及 LMCAS::sym_sub().

被这些函数引用 definite_segment_checked() , 以及 evaluate_segment_endpoints().

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

◆ exact_number()

std::optional< Rational > LMCAS::detail::definite::exact_number ( const Node & node)

在文件 integration_definite_algebraic.cpp 第 13 行定义.

13 {
14 const auto* number = dynamic_cast<const NumberNode*>(node.get());
15 if (!number) return std::nullopt;
16 return exact_number_as_rational(*number);
17}
Rational exact_number_as_rational(const NumberNode &node)

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

被这些函数引用 absolute_argument(), boundary_checked(), exact_number(), infinity_sign() , 以及 rational_power_checked().

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

◆ gcd_checked()

Result< Poly > LMCAS::detail::definite::gcd_checked ( Poly a,
Poly b,
ComputationContext & context )
static

在文件 integration_definite_algebraic.cpp 第 130 行定义.

130 {
131 while (!b.is_zero()) {
132 auto step = context.consume_steps(a.coeffs.size() * b.coeffs.size() + 1, operation);
133 if (!step) return Result<Poly>::failure(step.error());
134 auto remainder = a.div_mod(b).second;
135 auto checked = polynomial_budget(remainder, context);
136 if (!checked) return Result<Poly>::failure(checked.error());
137 a = std::move(b);
138 b = std::move(remainder);
139 }
140 return a.make_monic();
141}
static Result< void > polynomial_budget(const Poly &polynomial, ComputationContext &context)

引用了 LMCAS::a, LMCAS::b, LMCAS::detail::context, LMCAS::Result< T >::failure(), gcd_checked(), operation , 以及 polynomial_budget().

被这些函数引用 gcd_checked(), polynomial_at_root_sign(), rational_divergence_checked() , 以及 roots_checked().

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

◆ include_divergence()

bool LMCAS::detail::definite::include_divergence ( int & divergence,
int contribution )
static

在文件 integration_definite_algebraic.cpp 第 327 行定义.

327 {
328 if (divergence && divergence != contribution) { return false; }
329 divergence = contribution;
330 return true;
331}
std::shared_ptr< SymbolicExpr > divergence(const VectorField &F, const std::vector< std::string > &vars)

引用了 LMCAS::divergence() , 以及 include_divergence().

被这些函数引用 include_divergence(), rational_divergence_checked() , 以及 rational_pole_divergence().

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

◆ infinity_sign()

int LMCAS::detail::definite::infinity_sign ( const Node & node)

在文件 integration_definite_algebraic.cpp 第 41 行定义.

41 {
42 if (const auto* f = dynamic_cast<const FunctionNode*>(node.get())) {
43 if (f->type() == FunctionNode::FuncType::Infinity) return 1;
44 }
45 if (const auto* m = dynamic_cast<const MultiplyNode*>(node.get())) {
46 int result = 1;
47 bool infinity = false;
48 for (const auto& factor : m->operands()) {
49 if (infinity_sign(factor)) {
50 if (infinity) return 0;
51 infinity = true;
52 result *= infinity_sign(factor);
53 } else {
54 auto value = exact_number(factor);
55 if (!value || sign(*value) == 0) return 0;
56 result *= sign(*value);
57 }
58 }
59 return infinity ? result : 0;
60 }
61 return 0;
62}
乘法节点,表示多个操作数的乘积。
static int sign(const Rational &value)
int infinity_sign(const SymbolicExpr &expression, ComputationContext &context)

引用了 exact_number(), LMCAS::FunctionNode::Infinity, infinity_sign(), LMCAS::detail::node(), sign() , 以及 LMCAS::value.

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::accumulate_segments(), boundary_checked(), evaluate_segment_endpoints() , 以及 infinity_sign().

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

◆ is_undecided()

bool LMCAS::detail::definite::is_undecided ( const CasError & error)
inline

在文件 integration_definite_support.hpp 第 33 行定义.

引用了 LMCAS::CasError::code, LMCAS::Inconclusive, is_undecided() , 以及 LMCAS::UnsupportedExpression.

被这些函数引用 certify_continuity_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), is_undecided() , 以及 prepare_segment_primitive().

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

◆ needs_segment_expression()

bool LMCAS::detail::definite::needs_segment_expression ( const Node & node)

在文件 integration_definite_segments.cpp 第 207 行定义.

207 {
208 class Detector final : public detail::RecursiveSymbolicVisitor {
209 public:
210 bool found = false;
211 void visit(const PiecewiseNode&) override { found = true; }
212 void visit(const FunctionNode& function) override {
213 if (absolute_argument(function)) found = true;
215 }
216 void visit(const PowerNode& power) override {
217 if (absolute_argument(power)) found = true;
219 }
220 } detector;
221 node->accept(detector);
222 return detector.found;
223}
分段函数节点,表示条件分支表达式.
void visit(const NumberNode &) override

引用了 absolute_argument(), LMCAS::function(), needs_segment_expression(), LMCAS::detail::node() , 以及 LMCAS::detail::RecursiveSymbolicVisitor::visit().

被这些函数引用 LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval(), needs_segment_expression() , 以及 segment_expression_checked().

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

◆ ordered_partition_roots()

Result< std::vector< Algebraic > > LMCAS::detail::definite::ordered_partition_roots ( std::vector< Algebraic > & roots,
const Boundary & a,
const Boundary & b,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 329 行定义.

331 {
332 std::vector<Algebraic> ordered;
333 for (auto& root : roots) {
334 auto left = compare_boundaries(a, Boundary{0, root}, context);
335 auto right = compare_boundaries(Boundary{0, root}, b, context);
336 if (!left) { return Result<std::vector<Algebraic>>::failure(left.error()); }
337 if (!right) { return Result<std::vector<Algebraic>>::failure(right.error()); }
338 if (left.value() >= 0 || right.value() >= 0) { continue; }
339 auto position = ordered.begin();
340 bool duplicate = false;
341 for (; position != ordered.end(); ++position) {
342 auto comparison = compare_boundaries(Boundary{0, root}, Boundary{0, *position}, context);
343 if (!comparison) { return Result<std::vector<Algebraic>>::failure(comparison.error()); }
344 if (comparison.value() == 0) { duplicate = true; break; }
345 if (comparison.value() < 0) { break; }
346 }
347 if (!duplicate) { ordered.insert(position, std::move(root)); }
348 }
349 return ordered;
350}
Result< int > compare_boundaries(const Boundary &a, const Boundary &b, ComputationContext &context)

引用了 LMCAS::a, LMCAS::b, compare_boundaries(), LMCAS::detail::context, ordered_partition_roots(), LMCAS::right , 以及 LMCAS::roots().

被这些函数引用 definite_partition_checked() , 以及 ordered_partition_roots().

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

◆ original_conditions_checked()

Result< void > LMCAS::detail::definite::original_conditions_checked ( const Node & node,
const FactsQuery & facts,
std::vector< std::shared_ptr< SymbolicExpr > > & conditions,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 259 行定义.

260 {
261 auto step = context.consume_steps(1, operation);
262 if (!step) return step;
263 if (const auto* piecewise = dynamic_cast<const PiecewiseNode*>(node.get())) {
264 for (const auto& branch : piecewise->branches()) {
265 conditions.push_back(detail::make_expression_ptr(branch.condition));
266 auto child = original_conditions_checked(branch.expression, facts, conditions, context);
267 if (!child) return child;
268 }
269 if (piecewise->default_expr())
270 return original_conditions_checked(piecewise->default_expr(), facts, conditions, context);
271 return Result<void>::success();
272 }
274 if (!domain) return Result<void>::failure(domain.error());
275 if (!domain.value()) return undecided<void>();
276 conditions.insert(conditions.end(), domain.value()->begin(), domain.value()->end());
277 class AbsoluteBoundaries final : public detail::RecursiveSymbolicVisitor {
278 public:
279 AbsoluteBoundaries(std::vector<std::shared_ptr<SymbolicExpr>>& out, const FactsQuery& facts,
281 : out_(out), facts_(facts), context_(context) {}
282 std::optional<CasError> error;
283 void visit(const FunctionNode& function) override {
284 collect(function);
286 }
287 void visit(const PowerNode& power) override {
288 collect(power);
290 }
291 private:
292 void collect(const SymbolicNode& node) {
293 if (auto argument = absolute_argument(node)) {
294 auto nonnegative = detail::query_nonnegative_value(argument, facts_, context_);
295 if (!nonnegative) { error = nonnegative.error(); return; }
296 auto nonzero = detail::query_nonzero_value(argument, facts_, Domain::Real, context_);
297 if (!nonzero) { error = nonzero.error(); return; }
298 if (nonnegative.value() == Tribool::Unknown && nonzero.value() == Tribool::Unknown)
300 argument, detail::node(SymbolicExpr::number(0)), RelationOp::EQ)));
301 }
302 }
303 std::vector<std::shared_ptr<SymbolicExpr>>& out_;
304 const FactsQuery& facts_;
305 ComputationContext& context_;
306 } boundaries(conditions, facts, context);
307 node->accept(boundaries);
308 if (boundaries.error) return Result<void>::failure(*boundaries.error);
309 return Result<void>::success();
310}
Node absolute_argument(const SymbolicNode &node)
识别绝对值节点及公共接口的平方开根表示。
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
std::shared_ptr< const Node > make_node(Args &&... args)
Result< Tribool > query_nonnegative_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const NumberDomainSet & domain

引用了 absolute_argument(), LMCAS::detail::context, LMCAS::detail::domain, LMCAS::detail::domain_constraints(), LMCAS::EQ, LMCAS::detail::facts, LMCAS::Result< T >::failure(), LMCAS::function(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), operation, original_conditions_checked(), LMCAS::detail::query_nonnegative_value(), LMCAS::detail::query_nonzero_value(), LMCAS::Real, LMCAS::Result< T >::success(), undecided(), LMCAS::Unknown , 以及 LMCAS::detail::RecursiveSymbolicVisitor::visit().

被这些函数引用 definite_partition_checked() , 以及 original_conditions_checked().

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

◆ polynomial_at_root_sign()

Result< int > LMCAS::detail::definite::polynomial_at_root_sign ( Poly polynomial,
Algebraic root,
ComputationContext & context )
static

在文件 integration_definite_algebraic.cpp 第 307 行定义.

308 {
309 if (polynomial.is_zero()) { return 0; }
310 if (root.is_rational()) { return sign(polynomial.eval(root.lower)); }
311 auto common = gcd_checked(polynomial, root.polynomial, context);
312 if (!common) { return Result<int>::failure(common.error()); }
313 if (common.value().degree() > 0) {
314 auto zeros = detail::count_real_roots_exact(common.value(), root.lower, root.upper, context, operation);
315 if (!zeros) { return Result<int>::failure(zeros.error()); }
316 if (zeros.value()) { return 0; }
317 }
318 for (;;) {
319 auto zeros = detail::count_real_roots_exact(polynomial, root.lower, root.upper, context, operation);
320 if (!zeros) { return Result<int>::failure(zeros.error()); }
321 if (!zeros.value()) { return sign(polynomial.eval(root.lower)); }
323 if (!refined) { return Result<int>::failure(refined.error()); }
324 }
325}
CoeffType eval(const CoeffType &val) const
对多项式求值(Horner 法)
bool is_zero() const
判断是否为零多项式
static Result< Poly > gcd_checked(Poly a, Poly b, ComputationContext &context)
Result< std::size_t > count_real_roots_exact(const Polynomial< Rational > &polynomial, const Rational &lower, const Rational &upper, ComputationContext &context, const std::string &operation)

引用了 LMCAS::detail::context, LMCAS::detail::count_real_roots_exact(), LMCAS::Polynomial< CoeffType >::eval(), LMCAS::Result< T >::failure(), gcd_checked(), LMCAS::detail::ExactRealAlgebraic::is_rational(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::detail::ExactRealAlgebraic::lower, operation, LMCAS::detail::ExactRealAlgebraic::polynomial, polynomial_at_root_sign(), LMCAS::detail::refine_exact_real_algebraic(), sign() , 以及 LMCAS::detail::ExactRealAlgebraic::upper.

被这些函数引用 polynomial_at_root_sign() , 以及 rational_pole_divergence().

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

◆ polynomial_budget()

Result< void > LMCAS::detail::definite::polynomial_budget ( const Poly & polynomial,
ComputationContext & context )
static

在文件 integration_definite_algebraic.cpp 第 103 行定义.

103 {
104 auto terms = context.require_expansion_terms(polynomial.coeffs.size(), operation);
105 if (!terms) return terms;
106 for (const auto& coefficient : polynomial.coeffs) {
107 auto checked = context.require_integer_bits(std::max(
108 coefficient.get_numerator().bit_length(),
109 coefficient.get_denominator().bit_length()), operation);
110 if (!checked) return checked;
111 }
112 return context.consume_steps(polynomial.coeffs.size() + 1, operation);
113}
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
ComputationContext const std::string & operation

引用了 LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::detail::context, operation , 以及 polynomial_budget().

被这些函数引用 gcd_checked(), polynomial_budget() , 以及 product_checked().

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

◆ polynomial_sign_checked()

Result< std::optional< int > > LMCAS::detail::definite::polynomial_sign_checked ( const Poly & polynomial,
const Boundary & a,
const Boundary & b,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 279 行定义.

280 {
281 if (polynomial.is_zero()) return std::optional<int>{0};
282 if (polynomial.degree() == 0) return std::optional<int>{sign(polynomial.lead_coeff())};
283 auto roots = roots_checked(polynomial, context);
284 if (!roots) return Result<std::optional<int>>::failure(roots.error());
285 for (const auto& root : roots.value()) {
286 auto left = compare_boundaries(a, Boundary{0, root}, context);
287 auto right = compare_boundaries(Boundary{0, root}, b, context);
288 if (!left) return Result<std::optional<int>>::failure(left.error());
289 if (!right) return Result<std::optional<int>>::failure(right.error());
290 if (left.value() < 0 && right.value() < 0) return std::optional<int>{};
291 }
292 if (a.infinity < 0)
293 return std::optional<int>{sign(polynomial.lead_coeff()) *
294 (polynomial.degree() % 2 ? -1 : 1)};
295 if (b.infinity > 0) return std::optional<int>{sign(polynomial.lead_coeff())};
296 auto left = a.finite;
297 auto right = b.finite;
298 while (!(left.upper < right.lower)) {
300 if (!l) return Result<std::optional<int>>::failure(l.error());
302 if (!r) return Result<std::optional<int>>::failure(r.error());
303 }
304 return std::optional<int>{sign(polynomial.eval((left.upper + right.lower) / Rational(2)))};
305}
CoeffType lead_coeff() const
获取首项系数
int degree() const
获取多项式的次数
__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
@ Rational
Rational numbers

引用了 LMCAS::a, LMCAS::b, compare_boundaries(), LMCAS::detail::context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Result< T >::error(), LMCAS::Polynomial< CoeffType >::eval(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::lead_coeff(), operation, polynomial_sign_checked(), LMCAS::r, LMCAS::detail::refine_exact_real_algebraic(), LMCAS::right, LMCAS::roots(), roots_checked(), sign() , 以及 LMCAS::Result< T >::value().

被这些函数引用 polynomial_sign_checked() , 以及 LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::value_sign_impl().

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

◆ prepare_segment_primitive()

Result< void > LMCAS::detail::definite::prepare_segment_primitive ( SymbolicExpr & candidate,
const std::string & var,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 531 行定义.

533 {
536 if (!a && !is_undecided(a.error())) {
537 return Result<void>::failure(a.error());
538 }
539 if (!b && !is_undecided(b.error())) {
540 return Result<void>::failure(b.error());
541 }
542 if (a && b) {
543 auto assumptions = real_assumptions(var, context);
544 if (!assumptions) { return Result<void>::failure(assumptions.error()); }
545 SegmentFacts facts(assumptions.value(), var, a.value(), b.value());
546 RealPrimitiveCandidate rewrite(facts, context);
547 candidate = detail::expression_from_node(rewrite.rewrite(detail::node(candidate)));
548 if (rewrite.error) { return Result<void>::failure(*rewrite.error); }
549 }
550 auto continuous = certify_continuity_checked(candidate, var, lower, upper, context);
551 if (!continuous) { return Result<void>::failure(continuous.error()); }
552 if (continuous.value() != Tribool::True) { return undecided<void>(); }
553 return Result<void>::success();
554} catch (const CasError& error) {
555 return Result<void>::failure(error);
556} catch (const std::bad_alloc&) {
557 return Result<void>::failure(CasErrc::ResourceLimit, "allocation failed", "prepare_segment_primitive");
558} catch (const std::length_error& error) {
559 return Result<void>::failure(CasErrc::ResourceLimit, error.what(), "prepare_segment_primitive");
560} catch (const std::exception& error) {
561 return Result<void>::failure(CasErrc::InternalInvariant, error.what(), "prepare_segment_primitive");
562}

引用了 LMCAS::a, LMCAS::b, boundary_checked(), certify_continuity_checked(), LMCAS::detail::context, LMCAS::Result< T >::error(), LMCAS::detail::expression_from_node(), LMCAS::detail::facts, LMCAS::Result< T >::failure(), is_undecided(), LMCAS::lower, LMCAS::detail::node(), prepare_segment_primitive(), real_assumptions(), LMCAS::Result< T >::success(), LMCAS::True, undecided(), LMCAS::upper , 以及 LMCAS::Result< T >::value().

被这些函数引用 definite_segment_checked() , 以及 prepare_segment_primitive().

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

◆ product_checked()

Result< Poly > LMCAS::detail::definite::product_checked ( const Poly & a,
const Poly & b,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 115 行定义.

115 {
116 const auto size = a.coeffs.size() + b.coeffs.size();
117 auto budget = context.require_expansion_terms(size, operation);
118 if (!budget) return Result<Poly>::failure(budget.error());
119 if (size > static_cast<std::size_t>(std::numeric_limits<int>::max()))
121 "polynomial degree exceeds representation", operation);
122 auto step = context.consume_steps(a.coeffs.size() * b.coeffs.size() + 1, operation);
123 if (!step) return Result<Poly>::failure(step.error());
124 auto value = a * b;
126 if (!budget) return Result<Poly>::failure(budget.error());
127 return value;
128}

引用了 LMCAS::a, LMCAS::b, LMCAS::detail::budget, LMCAS::detail::context, LMCAS::Result< T >::failure(), operation, polynomial_budget(), product_checked(), LMCAS::ResourceLimit , 以及 LMCAS::value.

被这些函数引用 product_checked(), rational_operands_checked() , 以及 rational_power_checked().

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

◆ rational_checked()

RationalResult LMCAS::detail::definite::rational_checked ( const Node & node,
const std::string & var,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 194 行定义.

195 {
196 auto entered = context.enter_recursion(operation);
197 if (!entered) { return RationalResult::failure(entered.error()); }
198 struct Leave { ComputationContext& context; ~Leave() { context.leave_recursion(); } } leave{context};
200 if (!polynomial) { return RationalResult::failure(polynomial.error()); }
201 if (polynomial.value()) { return std::optional<RationalFunction>{
202 RationalFunction{std::move(*polynomial.value()), Poly(Rational(1), var)}}; }
203 const auto* sum = dynamic_cast<const AddNode*>(node.get());
204 const auto* product = dynamic_cast<const MultiplyNode*>(node.get());
205 if (sum || product) {
207 sum ? sum->operands() : product->operands(), sum != nullptr, var, context);
208 }
209 if (const auto* power = dynamic_cast<const PowerNode*>(node.get())) {
210 return rational_power_checked(*power, var, context);
211 }
212 return std::optional<RationalFunction>{};
213}
static RationalResult rational_operands_checked(const std::vector< Node > &operands, bool sum, const std::string &var, ComputationContext &context)
static RationalResult rational_power_checked(const PowerNode &power, const std::string &var, ComputationContext &context)
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)

引用了 LMCAS::detail::context, LMCAS::detail::expression_from_node(), LMCAS::Result< std::optional< RationalFunction > >::failure(), LMCAS::detail::node(), operation, rational_checked(), rational_operands_checked(), rational_power_checked() , 以及 LMCAS::recognize_rational_polynomial().

被这些函数引用 collect_predicate_roots(), rational_checked(), rational_operands_checked(), rational_power_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked() , 以及 LMCAS::detail::definite::anonymous_namespace{integration_definite_segments.cpp}::SegmentFacts::value_sign_impl().

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

◆ rational_divergence_checked()

Result< int > LMCAS::detail::definite::rational_divergence_checked ( RationalFunction & rational,
const Boundary & a,
const Boundary & b,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 362 行定义.

363 {
364 if (rational.denominator.is_zero()) { return divergent<int>(); }
365 auto gcd = gcd_checked(rational.numerator, rational.denominator, context);
366 if (!gcd) { return Result<int>::failure(gcd.error()); }
367 rational.numerator = rational.numerator.div_mod(gcd.value()).first;
368 rational.denominator = rational.denominator.div_mod(gcd.value()).first;
369 if (rational.numerator.is_zero()) { return 0; }
370 auto roots = roots_checked(rational.denominator, context);
371 if (!roots) { return Result<int>::failure(roots.error()); }
372 int divergence = 0;
373 for (const auto& root : roots.value()) {
374 auto pole = rational_pole_divergence(rational, root, a, b, divergence, context);
375 if (!pole) { return Result<int>::failure(pole.error()); }
376 }
377 const int degree = rational.numerator.degree() - rational.denominator.degree();
378 if (degree >= -1) {
379 int coefficient = sign(rational.numerator.lead_coeff()) * sign(rational.denominator.lead_coeff());
380 if (a.infinity < 0 && !include_divergence(divergence, coefficient * (degree % 2 ? -1 : 1))) { return divergent<int>(); }
381 if (b.infinity > 0 && !include_divergence(divergence, coefficient)) { return divergent<int>(); }
382 }
383 return divergence;
384}
static bool include_divergence(int &divergence, int contribution)
static Result< void > rational_pole_divergence(const RationalFunction &rational, const Algebraic &root, const Boundary &a, const Boundary &b, int &divergence, ComputationContext &context)

引用了 LMCAS::a, LMCAS::b, LMCAS::detail::context, LMCAS::divergence(), divergent(), LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), gcd_checked(), include_divergence(), LMCAS::rational(), rational_divergence_checked(), rational_pole_divergence(), LMCAS::roots(), roots_checked(), sign() , 以及 LMCAS::Result< T >::value().

被这些函数引用 rational_divergence_checked() , 以及 LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked().

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

◆ rational_operands_checked()

RationalResult LMCAS::detail::definite::rational_operands_checked ( const std::vector< Node > & operands,
bool sum,
const std::string & var,
ComputationContext & context )
static

在文件 integration_definite_algebraic.cpp 第 143 行定义.

144 {
145 RationalFunction result{Poly(Rational(sum ? 0 : 1), var), Poly(Rational(1), var)};
146 for (const auto& operand : operands) {
147 auto child = rational_checked(operand, var, context);
148 if (!child || !child.value()) { return child; }
149 auto n = product_checked(result.numerator,
150 sum ? child.value()->denominator : child.value()->numerator, context);
151 if (!n) { return RationalResult::failure(n.error()); }
152 if (sum) {
153 auto other = product_checked(child.value()->numerator, result.denominator, context);
154 if (!other) { return RationalResult::failure(other.error()); }
155 n.value() = n.value() + other.value();
156 }
157 auto d = product_checked(result.denominator, child.value()->denominator, context);
158 if (!d) { return RationalResult::failure(d.error()); }
159 result = {std::move(n.value()), std::move(d.value())};
160 }
161 return std::optional<RationalFunction>{std::move(result)};
162}
Result< Poly > product_checked(const Poly &a, const Poly &b, ComputationContext &context)

引用了 LMCAS::detail::context, LMCAS::detail::definite::RationalFunction::denominator, LMCAS::Result< std::optional< RationalFunction > >::failure(), LMCAS::detail::definite::RationalFunction::numerator, product_checked(), rational_checked() , 以及 rational_operands_checked().

被这些函数引用 rational_checked() , 以及 rational_operands_checked().

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

◆ rational_pole_divergence()

Result< void > LMCAS::detail::definite::rational_pole_divergence ( const RationalFunction & rational,
const Algebraic & root,
const Boundary & a,
const Boundary & b,
int & divergence,
ComputationContext & context )
static

在文件 integration_definite_algebraic.cpp 第 333 行定义.

335 {
336 auto left = compare_boundaries(a, Boundary{0, root}, context);
337 auto right = compare_boundaries(Boundary{0, root}, b, context);
338 if (!left) { return Result<void>::failure(left.error()); }
339 if (!right) { return Result<void>::failure(right.error()); }
340 if (left.value() > 0 || right.value() > 0) { return Result<void>::success(); }
341 Poly derivative = rational.denominator;
342 std::size_t multiplicity = 0;
343 int denominator_sign = 0;
344 do {
345 derivative = derivative.differentiate();
346 ++multiplicity;
347 auto value = polynomial_at_root_sign(derivative, root, context);
348 if (!value) { return Result<void>::failure(value.error()); }
349 denominator_sign = value.value();
350 } while (!denominator_sign);
351 auto numerator_sign = polynomial_at_root_sign(rational.numerator, root, context);
352 if (!numerator_sign) { return Result<void>::failure(numerator_sign.error()); }
353 int coefficient_sign = numerator_sign.value() * denominator_sign;
354 if (!coefficient_sign) { return Result<void>::failure(CasErrc::InternalInvariant,
355 "reduced rational pole has a zero numerator", operation); }
356 if (left.value() < 0 && !include_divergence(divergence, coefficient_sign * (multiplicity % 2 ? -1 : 1)))
357 { return divergent<void>(); }
358 if (right.value() < 0 && !include_divergence(divergence, coefficient_sign)) { return divergent<void>(); }
359 return Result<void>::success();
360}
static Result< int > polynomial_at_root_sign(Poly polynomial, Algebraic root, ComputationContext &context)
std::size_t std::size_t multiplicity

引用了 LMCAS::a, LMCAS::b, compare_boundaries(), LMCAS::detail::context, LMCAS::Polynomial< CoeffType >::differentiate(), LMCAS::divergence(), divergent(), LMCAS::Result< T >::failure(), include_divergence(), LMCAS::InternalInvariant, LMCAS::detail::multiplicity, operation, polynomial_at_root_sign(), LMCAS::rational(), rational_pole_divergence(), LMCAS::right, LMCAS::Result< T >::success() , 以及 LMCAS::value.

被这些函数引用 rational_divergence_checked() , 以及 rational_pole_divergence().

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

◆ rational_power_checked()

RationalResult LMCAS::detail::definite::rational_power_checked ( const PowerNode & power,
const std::string & var,
ComputationContext & context )
static

在文件 integration_definite_algebraic.cpp 第 164 行定义.

165 {
166 auto exponent = exact_number(power.exponent());
167 if (!exponent || !exponent->is_integer()) { return std::optional<RationalFunction>{}; }
168 auto base = rational_checked(power.base(), var, context);
169 if (!base || !base.value()) { return base; }
170 BigInt count = exponent->to_bigint();
171 if (count < BigInt(0)) {
172 std::swap(base.value()->numerator, base.value()->denominator);
173 count = -count;
174 }
175 RationalFunction result{Poly(Rational(1), var), Poly(Rational(1), var)};
176 while (count != BigInt(0)) {
177 if (count % BigInt(2) != BigInt(0)) {
178 auto n = product_checked(result.numerator, base.value()->numerator, context);
179 auto d = product_checked(result.denominator, base.value()->denominator, context);
180 if (!n) { return RationalResult::failure(n.error()); }
181 if (!d) { return RationalResult::failure(d.error()); }
182 result = {std::move(n.value()), std::move(d.value())};
183 }
184 count = count / BigInt(2);
185 if (count == BigInt(0)) { break; }
186 auto n = product_checked(base.value()->numerator, base.value()->numerator, context);
187 auto d = product_checked(base.value()->denominator, base.value()->denominator, context);
188 if (!n) { return RationalResult::failure(n.error()); }
189 if (!d) { return RationalResult::failure(d.error()); }
190 base.value() = RationalFunction{std::move(n.value()), std::move(d.value())};
191 }
192 return std::optional<RationalFunction>{std::move(result)};
193}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept

引用了 LMCAS::PowerNode::base(), LMCAS::detail::context, LMCAS::detail::definite::RationalFunction::denominator, exact_number(), LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::Result< std::optional< RationalFunction > >::failure(), LMCAS::detail::definite::RationalFunction::numerator, product_checked(), rational_checked() , 以及 rational_power_checked().

被这些函数引用 rational_checked() , 以及 rational_power_checked().

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

◆ real_assumptions()

Result< AssumptionContext > LMCAS::detail::definite::real_assumptions ( const std::string & var,
ComputationContext & context )

在文件 integration_definite_segments.cpp 第 251 行定义.

251 {
252 AssumptionContext assumptions = context.assumptions() ? *context.assumptions() : AssumptionContext{};
253 assumptions.push();
254 auto real = assumptions.assume_domain_checked(var, Domain::Real);
256 return assumptions;
257}
ExprResult real(const ExprPtr &expression, ComputationContext &context)

引用了 LMCAS::detail::context, LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), LMCAS::Real, LMCAS::real() , 以及 real_assumptions().

被这些函数引用 certify_continuity_checked(), definite_partition_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral(), prepare_segment_primitive(), real_assumptions() , 以及 segment_expression_checked().

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

◆ recover_rational_cut()

Result< void > LMCAS::detail::definite::recover_rational_cut ( Algebraic & root,
const BigInt & denominator_bound,
ComputationContext & context )
static

有理根定理给出分母 q 的上界;当前包围宽度保证根 p/q 位于中点连分数的渐近分数中。 通过连分数恢复有理分割点,免去整数因子枚举。

在文件 integration_definite_algebraic.cpp 第 215 行定义.

216 {
217 if (root.is_rational()) { return Result<void>::success(); }
218 auto bits = context.require_integer_bits(2 * denominator_bound.bit_length() + 2, operation);
219 if (!bits) { return bits; }
220 const Rational separation(BigInt(1), BigInt(2) * denominator_bound * denominator_bound);
221 while (root.upper - root.lower >= separation) {
223 if (!refined) { return refined; }
224 if (root.is_rational()) { return Result<void>::success(); }
225 }
226 /**
227 * @brief 有理根定理给出分母 q 的上界;当前包围宽度保证根 p/q 位于中点连分数的渐近分数中。
228 * 通过连分数恢复有理分割点,免去整数因子枚举。
229 */
230 const Rational midpoint = (root.lower + root.upper) / Rational(2);
231 BigInt numerator = midpoint.get_numerator(), denominator = midpoint.get_denominator();
232 BigInt old_p(0), p(1), old_q(1), q(0);
233 while (denominator != BigInt(0)) {
234 auto step = context.consume_steps(1, operation);
235 if (!step) { return step; }
236 BigInt quotient = numerator / denominator;
237 BigInt remainder = numerator % denominator;
238 if (remainder < BigInt(0)) { quotient = quotient - BigInt(1); remainder = remainder + denominator; }
239 BigInt next_p = quotient * p + old_p;
240 BigInt next_q = quotient * q + old_q;
241 if (next_q > denominator_bound) { break; }
242 Rational candidate(next_p, next_q);
243 if (candidate >= root.lower && candidate <= root.upper &&
244 root.polynomial.eval(candidate) == Rational(0)) {
245 root.lower = root.upper = candidate;
246 break;
247 }
248 old_p = std::move(p); p = std::move(next_p);
249 old_q = std::move(q); q = std::move(next_q);
250 numerator = std::move(denominator); denominator = std::move(remainder);
251 }
252 return Result<void>::success();
253}
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
const ExprPtr & denominator

引用了 LMCAS::detail::context, LMCAS::denominator, LMCAS::Polynomial< CoeffType >::eval(), LMCAS::detail::ExactRealAlgebraic::is_rational(), LMCAS::detail::ExactRealAlgebraic::lower, operation, LMCAS::detail::ExactRealAlgebraic::polynomial, recover_rational_cut(), LMCAS::detail::refine_exact_real_algebraic(), LMCAS::Result< T >::success() , 以及 LMCAS::detail::ExactRealAlgebraic::upper.

被这些函数引用 recover_rational_cut() , 以及 roots_checked().

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

◆ roots_checked()

Result< std::vector< Algebraic > > LMCAS::detail::definite::roots_checked ( const Poly & polynomial,
ComputationContext & context )

在文件 integration_definite_algebraic.cpp 第 255 行定义.

255 {
256 if (polynomial.degree() <= 0) return std::vector<Algebraic>{};
257 auto repeated = gcd_checked(polynomial, polynomial.differentiate(), context);
258 if (!repeated) return Result<std::vector<Algebraic>>::failure(repeated.error());
259 auto square_free = polynomial.div_mod(repeated.value()).first.make_monic();
260 BigInt denominator_bound(1);
261 for (const auto& coefficient : square_free.coeffs) {
262 const auto& denominator = coefficient.get_denominator();
263 denominator_bound = denominator_bound / BigInt::gcd(denominator_bound, denominator) * denominator;
264 auto checked = context.require_integer_bits(denominator_bound.bit_length(), operation);
265 if (!checked) return Result<std::vector<Algebraic>>::failure(checked.error());
266 }
267 auto isolated = detail::isolate_real_roots_exact(square_free, context, operation);
268 if (!isolated) return Result<std::vector<Algebraic>>::failure(isolated.error());
269 std::vector<Algebraic> roots;
270 for (std::size_t i = 0; i < isolated.value().size(); ++i) {
271 Algebraic root{square_free, isolated.value()[i].first, isolated.value()[i].second, i, 1};
272 auto recovered = recover_rational_cut(root, denominator_bound, context);
273 if (!recovered) return Result<std::vector<Algebraic>>::failure(recovered.error());
274 roots.push_back(std::move(root));
275 }
276 return roots;
277}
Polynomial differentiate() const
求导
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
static Result< void > recover_rational_cut(Algebraic &root, const BigInt &denominator_bound, ComputationContext &context)
Result< std::vector< RationalInterval > > isolate_real_roots_exact(const Polynomial< Rational > &polynomial, ComputationContext &context, const std::string &operation)

引用了 LMCAS::detail::context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::denominator, LMCAS::Polynomial< CoeffType >::differentiate(), LMCAS::Polynomial< CoeffType >::div_mod(), gcd_checked(), LMCAS::detail::isolate_real_roots_exact(), operation, recover_rational_cut(), LMCAS::roots() , 以及 roots_checked().

被这些函数引用 collect_predicate_roots(), polynomial_sign_checked(), rational_divergence_checked() , 以及 roots_checked().

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

◆ segment_expression_checked()

Result< SymbolicExpr > LMCAS::detail::definite::segment_expression_checked ( const SymbolicExpr & expression,
const std::string & var,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
ComputationContext & context )

在文件 integration_definite_segments.cpp 第 312 行定义.

314 {
315 if (!needs_segment_expression(detail::node(expression))) return expression;
318 if (!a) return Result<SymbolicExpr>::failure(a.error());
319 if (!b) return Result<SymbolicExpr>::failure(b.error());
320 auto assumptions = real_assumptions(var, context);
321 if (!assumptions) return Result<SymbolicExpr>::failure(assumptions.error());
322 SegmentFacts facts(assumptions.value(), var, a.value(), b.value());
323 SegmentExpression rewrite(facts, context);
324 auto selected = rewrite.rewrite(detail::node(expression));
325 if (rewrite.error) return Result<SymbolicExpr>::failure(*rewrite.error);
326 return detail::expression_from_node(selected);
327}

引用了 LMCAS::a, LMCAS::b, boundary_checked(), LMCAS::detail::context, LMCAS::Result< T >::error(), LMCAS::detail::expression_from_node(), LMCAS::detail::facts, LMCAS::Result< T >::failure(), LMCAS::lower, needs_segment_expression(), LMCAS::detail::node(), real_assumptions(), segment_expression_checked(), LMCAS::upper , 以及 LMCAS::Result< T >::value().

被这些函数引用 certify_continuity_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_segment_primitive() , 以及 segment_expression_checked().

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

◆ sign()

int LMCAS::detail::definite::sign ( const Rational & value)
static

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

9 {
10 return value < Rational(0) ? -1 : value > Rational(0) ? 1 : 0;
11}

引用了 sign() , 以及 LMCAS::value.

被这些函数引用 infinity_sign(), polynomial_at_root_sign(), polynomial_sign_checked(), rational_divergence_checked() , 以及 sign().

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

◆ structurally_continuous()

Result< Tribool > LMCAS::detail::definite::structurally_continuous ( const Node & node,
const FactsQuery & facts,
ComputationContext & context )
static

在文件 integration_definite_segments.cpp 第 437 行定义.

438 {
439 auto step = context.consume_steps(1, operation);
440 if (!step) { return Result<Tribool>::failure(step.error()); }
441 auto defined = defined_on_interval(node, facts, context);
442 if (!defined || defined.value() != Tribool::True) { return defined; }
443 if (dynamic_cast<const NumberNode*>(node.get()) || dynamic_cast<const VariableNode*>(node.get()) ||
444 dynamic_cast<const RootOfNode*>(node.get())) { return Tribool::True; }
445 const auto* sum = dynamic_cast<const AddNode*>(node.get());
446 const auto* product = dynamic_cast<const MultiplyNode*>(node.get());
447 const auto* function = dynamic_cast<const FunctionNode*>(node.get());
448 const auto* power = dynamic_cast<const PowerNode*>(node.get());
449 if (power) {
450 auto base = structurally_continuous(power->base(), facts, context);
451 if (!base || base.value() != Tribool::True) { return base; }
452 return structurally_continuous(power->exponent(), facts, context);
453 }
454 if (sum) { return continuous_children(sum->operands(), facts, context); }
455 if (product) { return continuous_children(product->operands(), facts, context); }
456 if (function) {
457 if (!continuous_function_family(function->type())) { return Tribool::Unknown; }
458 return continuous_children(function->arguments(), facts, context);
459 }
460 return Tribool::Unknown;
461}
变量节点,表示一个符号变量。
static Result< Tribool > defined_on_interval(const Node &node, const FactsQuery &facts, ComputationContext &context)
static Result< Tribool > continuous_children(const std::vector< Node > &children, const FactsQuery &facts, ComputationContext &context)
static bool continuous_function_family(FunctionNode::FuncType type)

引用了 LMCAS::detail::context, continuous_children(), continuous_function_family(), defined_on_interval(), LMCAS::detail::facts, LMCAS::Result< T >::failure(), LMCAS::function(), LMCAS::detail::node(), operation, structurally_continuous(), LMCAS::True , 以及 LMCAS::Unknown.

被这些函数引用 certify_continuity_checked(), continuous_children() , 以及 structurally_continuous().

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

◆ undecided()

template<class T>
Result< T > LMCAS::detail::definite::undecided ( )

在文件 integration_definite_support.hpp 第 21 行定义.

21 {
23 "interval certificate is unavailable", operation);
24}

引用了 LMCAS::Result< T >::failure(), LMCAS::Inconclusive, operation , 以及 undecided().

被这些函数引用 boundary_checked(), collect_predicate_roots(), definite_segment_checked(), LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_segment_primitive(), original_conditions_checked(), prepare_segment_primitive() , 以及 undecided().

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

变量说明

◆ operation