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

类

struct  DefiniteInterval
struct  RationalIntegrand

函数

Result< SymbolicExpr > accumulate_segments (Integrator &integrator, const SymbolicExpr &expr, const SymbolicExpr &value_expression, const std::string &var_name, const std::vector< SymbolicExpr > &partition, const std::optional< SymbolicExpr > &primitive, bool reversed, ComputationContext &context)
Result< Tribool > certify_partition (const SymbolicExpr &expr, const std::string &var_name, const std::vector< SymbolicExpr > &partition, ComputationContext &context)
Result< SymbolicExpr > equal_endpoint_integral (const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper, const DefiniteInterval &interval, ComputationContext &context)
Result< SymbolicExpr > integrate_interval_checked (Integrator &integrator, const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
Result< SymbolicExpr > integrate_ordered_interval (Integrator &integrator, const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper, const DefiniteInterval &interval, ComputationContext &context)
Result< SymbolicExpr > integrate_segment_primitive (Integrator &integrator, const SymbolicExpr &value_expression, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
Result< RationalIntegrand > reduced_integrand_checked (const SymbolicExpr &expr, const std::string &var_name, const DefiniteInterval &interval, ComputationContext &context)
Result< SymbolicExpr > unresolved_integral (const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper)

类说明

◆ LMCAS::anonymous_namespace{integration_definite.cpp}::RationalIntegrand

struct LMCAS::anonymous_namespace{integration_definite.cpp}::RationalIntegrand

在文件 integration_definite.cpp 第 62 行定义.

LMCAS::anonymous_namespace{integration_definite.cpp}::RationalIntegrand 的协作图:
类成员
int divergence = 0
SymbolicExpr expression

函数说明

◆ accumulate_segments()

Result< SymbolicExpr > LMCAS::anonymous_namespace{integration_definite.cpp}::accumulate_segments ( Integrator & integrator,
const SymbolicExpr & expr,
const SymbolicExpr & value_expression,
const std::string & var_name,
const std::vector< SymbolicExpr > & partition,
const std::optional< SymbolicExpr > & primitive,
bool reversed,
ComputationContext & context )

在文件 integration_definite.cpp 第 95 行定义.

98 {
99 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
100 (context).limits().max_ast_nodes, "transform");
101 SymbolicExpr sum = *SymbolicExpr::number(0);
102 int infinity = 0;
103 for (std::size_t i = 1; i < partition.size(); ++i) {
104 std::optional<SymbolicExpr> local_primitive;
105 if (!primitive) {
106 auto integrated = integrate_segment_primitive(integrator, value_expression, var_name,
107 partition[i - 1], partition[i], context);
108 if (!integrated) { return integrated; }
109 local_primitive = std::move(integrated.value());
110 }
111 auto segment = definite_segment_checked(expr, primitive ? *primitive : *local_primitive, var_name,
112 partition[i - 1], partition[i], context);
113 if (!segment) { return segment; }
114 int contribution = infinity_sign(detail::node(segment.value()));
115 if (contribution) {
116 if (infinity && infinity != contribution) { return divergent<SymbolicExpr>(); }
117 infinity = contribution;
118 } else { sum = *SymbolicExpr::add(detail::make_expression_ptr(sum), detail::make_expression_ptr(segment.value())); }
119 }
120 if (infinity) { return *SymbolicExpr::infinity(infinity * (reversed ? -1 : 1)); }
121 if (reversed) { sum = *SymbolicExpr::multiply(SymbolicExpr::number(-1), detail::make_expression_ptr(sum)); }
122 return *detail::make_expression_ptr(detail::normalize_node(detail::node(sum), transform_budget));
123} catch (const CasError& error) {
124 return Result<SymbolicExpr>::failure(error);
125} catch (const std::bad_alloc&) {
126 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, "allocation failed", "accumulate_segments");
127} catch (const std::length_error& error) {
128 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, error.what(), "accumulate_segments");
129} catch (const std::exception& error) {
130 return Result<SymbolicExpr>::failure(CasErrc::InternalInvariant, error.what(), "accumulate_segments");
131}
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< SymbolicExpr > integrate_segment_primitive(Integrator &integrator, const SymbolicExpr &value_expression, const std::string &var_name, 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)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::vector< IntegrationStep > Integrator & integrator

引用了 accumulate_segments(), LMCAS::context, LMCAS::detail::definite::definite_segment_checked(), LMCAS::detail::definite::divergent(), LMCAS::detail::definite::infinity_sign(), integrate_segment_primitive(), LMCAS::integrator, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 accumulate_segments() , 以及 integrate_ordered_interval().

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

◆ certify_partition()

Result< Tribool > LMCAS::anonymous_namespace{integration_definite.cpp}::certify_partition ( const SymbolicExpr & expr,
const std::string & var_name,
const std::vector< SymbolicExpr > & partition,
ComputationContext & context )

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

53 {
54 for (std::size_t i = 1; i < partition.size(); ++i) {
55 auto continuous = certify_continuity_checked(expr, var_name,
56 partition[i - 1], partition[i], context);
57 if (!continuous || continuous.value() != Tribool::True) { return continuous; }
58 }
59 return Tribool::True;
60}
Result< Tribool > certify_continuity_checked(const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
@ True
Property definitely holds

引用了 LMCAS::detail::definite::certify_continuity_checked(), certify_partition(), LMCAS::context , 以及 LMCAS::True.

被这些函数引用 certify_partition() , 以及 integrate_ordered_interval().

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

◆ equal_endpoint_integral()

Result< SymbolicExpr > LMCAS::anonymous_namespace{integration_definite.cpp}::equal_endpoint_integral ( const SymbolicExpr & expr,
const std::string & var_name,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
const DefiniteInterval & interval,
ComputationContext & context )

在文件 integration_definite.cpp 第 28 行定义.

30 {
31 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
32 (context).limits().max_ast_nodes, "transform");
33 if (interval.a.value().infinity) { return unresolved_integral(expr, var_name, lower, upper); }
34 auto assumptions = real_assumptions(var_name, context);
35 if (!assumptions) { return Result<SymbolicExpr>::failure(assumptions.error()); }
36 detail::AssumptionFacts facts(assumptions.value());
37 auto value = detail::make_expression_ptr(detail::substitute_node(detail::node(expr), var_name, detail::node(interval.lo), transform_budget));
39 if (!defined) { return Result<SymbolicExpr>::failure(defined.error()); }
40 if (defined.value() == Tribool::False) { return divergent<SymbolicExpr>(); }
41 return defined.value() == Tribool::True ? Result<SymbolicExpr>(*SymbolicExpr::number(0)) : unresolved_integral(expr, var_name, lower, upper);
42} catch (const CasError& error) {
44} catch (const std::bad_alloc&) {
45 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, "allocation failed", "equal_endpoint_integral");
46} catch (const std::length_error& error) {
47 return Result<SymbolicExpr>::failure(CasErrc::ResourceLimit, error.what(), "equal_endpoint_integral");
48} catch (const std::exception& error) {
49 return Result<SymbolicExpr>::failure(CasErrc::InternalInvariant, error.what(), "equal_endpoint_integral");
50}
Result(T value)
Allow direct return of a success value from a Result-returning function.
Result< SymbolicExpr > unresolved_integral(const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper)
Result< AssumptionContext > real_assumptions(const std::string &var, ComputationContext &context)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
const ExprPtr & lower
@ Real
Real numbers
@ False
Property definitely does not hold
const std::string const ExprPtr & value

引用了 LMCAS::Result< T >::Result(), LMCAS::context, LMCAS::detail::definite::divergent(), equal_endpoint_integral(), LMCAS::Result< T >::failure(), LMCAS::False, LMCAS::interval(), LMCAS::lower, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::query_definedness(), LMCAS::Real, LMCAS::detail::definite::real_assumptions(), LMCAS::detail::substitute_node(), LMCAS::True, unresolved_integral(), LMCAS::upper, LMCAS::Result< T >::value() , 以及 LMCAS::value.

被这些函数引用 equal_endpoint_integral() , 以及 integrate_interval_checked().

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

◆ integrate_interval_checked()

Result< SymbolicExpr > LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_interval_checked ( Integrator & integrator,
const SymbolicExpr & expr,
const std::string & var_name,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
ComputationContext & context )

在文件 integration_definite.cpp 第 163 行定义.

165 {
169 if (interval.a && interval.b) {
171 if (!order) { return Result<SymbolicExpr>::failure(order.error()); }
172 if (!order.value()) {
173 return equal_endpoint_integral(expr, var_name, lower, upper, interval, context);
174 }
175 if (order.value() > 0) {
176 std::swap(interval.lo, interval.hi);
177 std::swap(interval.a.value(), interval.b.value());
178 interval.reversed = true;
179 }
180 }
182}
CasError & error()
Result< SymbolicExpr > integrate_ordered_interval(Integrator &integrator, const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper, const DefiniteInterval &interval, ComputationContext &context)
Result< SymbolicExpr > equal_endpoint_integral(const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper, const DefiniteInterval &interval, ComputationContext &context)
Result< int > compare_boundaries(const Boundary &a, const Boundary &b, ComputationContext &context)
const std::vector< FGLMPoly > const MonomialOrder & order

引用了 LMCAS::detail::definite::compare_boundaries(), LMCAS::context, equal_endpoint_integral(), LMCAS::Result< T >::error(), LMCAS::Result< T >::failure(), integrate_interval_checked(), integrate_ordered_interval(), LMCAS::integrator, LMCAS::interval(), LMCAS::detail::definite::is_undecided(), LMCAS::lower, LMCAS::order, LMCAS::upper , 以及 LMCAS::Result< T >::value().

被这些函数引用 integrate_interval_checked().

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

◆ integrate_ordered_interval()

Result< SymbolicExpr > LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_ordered_interval ( Integrator & integrator,
const SymbolicExpr & expr,
const std::string & var_name,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
const DefiniteInterval & interval,
ComputationContext & context )

在文件 integration_definite.cpp 第 133 行定义.

136 {
137 const auto unresolved = [&]() { return unresolved_integral(expr, var_name, lower, upper); };
138 auto partition = definite_partition_checked(expr, var_name, interval.lo, interval.hi, context);
139 if (!partition) { return is_undecided(partition.error()) ? unresolved() : Result<SymbolicExpr>::failure(partition.error()); }
140 auto continuous = certify_partition(expr, var_name, partition.value(), context);
141 if (!continuous) { return Result<SymbolicExpr>::failure(continuous.error()); }
142 if (continuous.value() == Tribool::False) { return divergent<SymbolicExpr>(); }
143 if (continuous.value() != Tribool::True) { return unresolved(); }
144 auto reduced = reduced_integrand_checked(expr, var_name, interval, context);
145 if (!reduced) { return Result<SymbolicExpr>::failure(reduced.error()); }
146 if (reduced.value().divergence) {
147 return *SymbolicExpr::infinity(reduced.value().divergence * (interval.reversed ? -1 : 1));
148 }
149 const auto& value_expression = reduced.value().expression;
150 std::optional<SymbolicExpr> primitive;
151 if (!needs_segment_expression(detail::node(value_expression))) {
152 auto integrated = integrator.integrate_checked(value_expression, var_name, context);
153 if (!integrated) { return is_undecided(integrated.error()) ? unresolved() : integrated; }
154 if (contains_unevaluated_integral(detail::node(integrated.value()))) { return unresolved(); }
155 primitive = std::move(integrated.value());
156 }
157 auto sum = accumulate_segments(integrator, expr, value_expression, var_name,
158 partition.value(), primitive, interval.reversed, context);
159 if (!sum && is_undecided(sum.error())) { return unresolved(); }
160 return sum;
161}
Result< Tribool > certify_partition(const SymbolicExpr &expr, const std::string &var_name, const std::vector< SymbolicExpr > &partition, ComputationContext &context)
Result< RationalIntegrand > reduced_integrand_checked(const SymbolicExpr &expr, const std::string &var_name, const DefiniteInterval &interval, ComputationContext &context)
Result< SymbolicExpr > accumulate_segments(Integrator &integrator, const SymbolicExpr &expr, const SymbolicExpr &value_expression, const std::string &var_name, const std::vector< SymbolicExpr > &partition, const std::optional< SymbolicExpr > &primitive, bool reversed, ComputationContext &context)
Result< std::vector< SymbolicExpr > > definite_partition_checked(const SymbolicExpr &original, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)
bool contains_unevaluated_integral(const std::shared_ptr< const SymbolicNode > &node)

引用了 accumulate_segments(), certify_partition(), LMCAS::contains_unevaluated_integral(), LMCAS::context, LMCAS::detail::definite::definite_partition_checked(), LMCAS::detail::definite::divergent(), LMCAS::Result< T >::failure(), LMCAS::False, integrate_ordered_interval(), LMCAS::integrator, LMCAS::interval(), LMCAS::detail::definite::is_undecided(), LMCAS::lower, LMCAS::detail::definite::needs_segment_expression(), LMCAS::detail::node(), reduced_integrand_checked(), LMCAS::True, unresolved_integral() , 以及 LMCAS::upper.

被这些函数引用 integrate_interval_checked() , 以及 integrate_ordered_interval().

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

◆ integrate_segment_primitive()

Result< SymbolicExpr > LMCAS::anonymous_namespace{integration_definite.cpp}::integrate_segment_primitive ( Integrator & integrator,
const SymbolicExpr & value_expression,
const std::string & var_name,
const SymbolicExpr & lower,
const SymbolicExpr & upper,
ComputationContext & context )

在文件 integration_definite.cpp 第 84 行定义.

86 {
87 auto selected = segment_expression_checked(value_expression, var_name, lower, upper, context);
88 if (!selected) { return selected; }
89 auto integrated = integrator.integrate_checked(selected.value(), var_name, context);
90 if (!integrated) { return integrated; }
91 if (contains_unevaluated_integral(detail::node(integrated.value()))) { return undecided<SymbolicExpr>(); }
92 return integrated;
93}
Result< SymbolicExpr > segment_expression_checked(const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)

引用了 LMCAS::contains_unevaluated_integral(), LMCAS::context, integrate_segment_primitive(), LMCAS::integrator, LMCAS::lower, LMCAS::detail::node(), LMCAS::detail::definite::segment_expression_checked(), LMCAS::detail::definite::undecided() , 以及 LMCAS::upper.

被这些函数引用 accumulate_segments() , 以及 integrate_segment_primitive().

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

◆ reduced_integrand_checked()

Result< RationalIntegrand > LMCAS::anonymous_namespace{integration_definite.cpp}::reduced_integrand_checked ( const SymbolicExpr & expr,
const std::string & var_name,
const DefiniteInterval & interval,
ComputationContext & context )

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

68 {
69 auto rational = rational_checked(detail::node(expr), var_name, context);
71 RationalIntegrand result{expr};
72 if (rational.value() && interval.a && interval.b) {
76 result.divergence = divergence.value();
77 if (result.divergence) { return result; }
78 result.expression = *SymbolicExpr::divide(poly_to_symbolic(rational.value()->numerator),
79 poly_to_symbolic(rational.value()->denominator));
80 }
81 return result;
82}
Result< int > rational_divergence_checked(RationalFunction &rational, const Boundary &a, const Boundary &b, ComputationContext &context)
RationalResult rational_checked(const Node &node, const std::string &var, ComputationContext &context)
std::shared_ptr< SymbolicExpr > divergence(const VectorField &F, const std::vector< std::string > &vars)
ExprResult rational(const Rational &value)

引用了 LMCAS::context, LMCAS::anonymous_namespace{integration_definite.cpp}::RationalIntegrand::divergence, LMCAS::divergence(), LMCAS::Result< T >::error(), LMCAS::anonymous_namespace{integration_definite.cpp}::RationalIntegrand::expression, LMCAS::Result< T >::failure(), LMCAS::interval(), LMCAS::detail::node(), LMCAS::rational(), LMCAS::detail::definite::rational_checked(), LMCAS::detail::definite::rational_divergence_checked(), reduced_integrand_checked() , 以及 LMCAS::Result< T >::value().

被这些函数引用 integrate_ordered_interval() , 以及 reduced_integrand_checked().

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

◆ unresolved_integral()

Result< SymbolicExpr > LMCAS::anonymous_namespace{integration_definite.cpp}::unresolved_integral ( const SymbolicExpr & expr,
const std::string & var_name,
const SymbolicExpr & lower,
const SymbolicExpr & upper )

在文件 integration_definite.cpp 第 22 行定义.

23 {
25 var_name, detail::node(lower), detail::node(upper)));
26}
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)

引用了 LMCAS::detail::expression_from_node(), LMCAS::lower, LMCAS::detail::make_node(), LMCAS::detail::node(), unresolved_integral() , 以及 LMCAS::upper.

被这些函数引用 equal_endpoint_integral(), integrate_ordered_interval() , 以及 unresolved_integral().

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