23 const std::string& var_name,
const SymbolicExpr&
lower,
const SymbolicExpr&
upper) {
29 const std::string& var_name,
const SymbolicExpr&
lower,
const SymbolicExpr&
upper,
32 (
context).limits().max_ast_nodes,
"transform");
44}
catch (
const std::bad_alloc&) {
46}
catch (
const std::length_error& error) {
48}
catch (
const std::exception& error) {
54 for (std::size_t i = 1; i < partition.size(); ++i) {
56 partition[i - 1], partition[i],
context);
57 if (!continuous || continuous.value() !=
Tribool::True) {
return continuous; }
85 const SymbolicExpr& value_expression,
const std::string& var_name,
88 if (!selected) {
return selected; }
89 auto integrated =
integrator.integrate_checked(selected.value(), var_name,
context);
90 if (!integrated) {
return integrated; }
96 const SymbolicExpr& value_expression,
const std::string& var_name,
97 const std::vector<SymbolicExpr>& partition,
const std::optional<SymbolicExpr>& primitive,
100 (
context).limits().max_ast_nodes,
"transform");
101 SymbolicExpr sum = *SymbolicExpr::number(0);
103 for (std::size_t i = 1; i < partition.size(); ++i) {
104 std::optional<SymbolicExpr> local_primitive;
107 partition[i - 1], partition[i],
context);
108 if (!integrated) {
return integrated; }
109 local_primitive = std::move(integrated.value());
112 partition[i - 1], partition[i],
context);
113 if (!segment) {
return segment; }
117 infinity = contribution;
120 if (infinity) {
return *SymbolicExpr::infinity(infinity * (reversed ? -1 : 1)); }
125}
catch (
const std::bad_alloc&) {
127}
catch (
const std::length_error& error) {
129}
catch (
const std::exception& error) {
134 const std::string& var_name,
135 const SymbolicExpr&
lower,
const SymbolicExpr&
upper,
143 if (continuous.value() !=
Tribool::True) {
return unresolved(); }
146 if (reduced.value().divergence) {
147 return *SymbolicExpr::infinity(reduced.value().divergence * (
interval.reversed ? -1 : 1));
149 const auto& value_expression = reduced.value().expression;
150 std::optional<SymbolicExpr> primitive;
152 auto integrated =
integrator.integrate_checked(value_expression, var_name,
context);
153 if (!integrated) {
return is_undecided(integrated.error()) ? unresolved() : integrated; }
155 primitive = std::move(integrated.value());
159 if (!sum &&
is_undecided(sum.error())) {
return unresolved(); }
164 const std::string& var_name,
172 if (!
order.value()) {
175 if (
order.value() > 0) {
185Result<SymbolicExpr> Integrator::integrate_def_checked(
const SymbolicExpr& expr,
186 const std::string& var_name,
const SymbolicExpr&
lower,
const SymbolicExpr&
upper,
188 auto access =
context.consume_steps(1, operation);
193 "integration endpoints must be independent of the integration variable", operation); }
196 context.limits().max_ast_nodes, operation);
199 if (!result) {
return result; }
204 }
catch (
const std::bad_alloc&) {
206 "definite integration allocation failed", operation);
207 }
catch (
const std::length_error& error) {
209 }
catch (
const std::exception& error) {
Result(T value)
Allow direct return of a success value from a Result-returning function.
static Result failure(CasErrc code, std::string message, std::string operation={})
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
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< Tribool > certify_partition(const SymbolicExpr &expr, const std::string &var_name, const std::vector< SymbolicExpr > &partition, 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< RationalIntegrand > reduced_integrand_checked(const SymbolicExpr &expr, const std::string &var_name, 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< SymbolicExpr > unresolved_integral(const SymbolicExpr &expr, const std::string &var_name, const SymbolicExpr &lower, const SymbolicExpr &upper)
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< 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 > segment_expression_checked(const SymbolicExpr &expression, 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)
Result< int > rational_divergence_checked(RationalFunction &rational, const Boundary &a, const Boundary &b, ComputationContext &context)
Result< Tribool > certify_continuity_checked(const SymbolicExpr &expression, const std::string &var, const SymbolicExpr &lower, const SymbolicExpr &upper, 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< int > compare_boundaries(const Boundary &a, const Boundary &b, ComputationContext &context)
bool is_undecided(const CasError &error)
int infinity_sign(const Node &node)
Result< Boundary > boundary_checked(const SymbolicExpr &expression, ComputationContext &context)
RationalResult rational_checked(const Node &node, const std::string &var, ComputationContext &context)
bool needs_segment_expression(const Node &node)
Result< AssumptionContext > real_assumptions(const std::string &var, ComputationContext &context)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
std::shared_ptr< const Node > make_node(Args &&... args)
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)
__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
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
const std::vector< FGLMPoly > const MonomialOrder & order
bool contains_unevaluated_integral(const std::shared_ptr< const SymbolicNode > &node)
@ True
Property definitely holds
@ False
Property definitely does not hold
bool depends_on_integration_variable(const SymbolicExpr &expression, const std::string &variable)
std::shared_ptr< SymbolicExpr > divergence(const VectorField &F, const std::vector< std::string > &vars)
const std::string const ExprPtr & value
ExprResult rational(const Rational &value)
const std::vector< IntegrationStep > Integrator & integrator
DefiniteInterval(const SymbolicExpr &lower, const SymbolicExpr &upper, ComputationContext &context)