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

类

struct  LinearWrapper

枚举

enum class  LinearWrapperKind { None , Function , PowerOfFunction , PowerOfLinear }

函数

LinearWrapper classify_linear_wrapper (const SymbolicExpr &expr, const std::string &var)
std::shared_ptr< SymbolicExpr > linear_reduced_expression (const LinearWrapper &wrapper, const std::shared_ptr< SymbolicExpr > &variable)
bool linear_substitutable_function (const FunctionNode &function)
Result< std::shared_ptr< SymbolicExpr > > substitute_candidate (const SymbolicExpr &expr, const SymbolicExpr &candidate_term, const std::string &var, ComputationContext &computation)
std::optional< SymbolicExpr > substitution_argument (const SymbolicExpr &term)
Result< std::shared_ptr< SymbolicExpr > > substitution_primitive (const SymbolicExpr &candidate_term, const SymbolicExpr &u, const std::string &var, ComputationContext &context)

类说明

◆ LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper

struct LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper

在文件 integration_substitution.cpp 第 102 行定义.

LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper 的协作图:
类成员
optional< SymbolicExpr > argument
shared_ptr< const FunctionNode > function
LinearWrapperKind kind = LinearWrapperKind::None
shared_ptr< const PowerNode > power

枚举类型说明

◆ LinearWrapperKind

函数说明

◆ classify_linear_wrapper()

LinearWrapper LMCAS::anonymous_namespace{integration_substitution.cpp}::classify_linear_wrapper ( const SymbolicExpr & expr,
const std::string & var )

在文件 integration_substitution.cpp 第 119 行定义.

119 {
120 LinearWrapper wrapper;
121 wrapper.function = std::dynamic_pointer_cast<const FunctionNode>(detail::node(expr));
122 if (wrapper.function) {
123 if (!linear_substitutable_function(*wrapper.function)) { return wrapper; }
124 wrapper.argument = detail::expression_from_node(wrapper.function->arguments()[0]);
126 return wrapper;
127 }
128 wrapper.power = std::dynamic_pointer_cast<const PowerNode>(detail::node(expr));
129 if (!wrapper.power) { return wrapper; }
130 if (expression_depends_on_variable(wrapper.power->exponent(), var)) { return wrapper; }
131 wrapper.function = std::dynamic_pointer_cast<const FunctionNode>(wrapper.power->base());
132 if (wrapper.function) {
133 if (!linear_substitutable_function(*wrapper.function)) { return wrapper; }
134 wrapper.argument = detail::expression_from_node(wrapper.function->arguments()[0]);
136 } else {
137 wrapper.argument = detail::expression_from_node(wrapper.power->base());
139 }
140 return wrapper;
141}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)

引用了 LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::argument, classify_linear_wrapper(), LMCAS::expression_depends_on_variable(), LMCAS::detail::expression_from_node(), Function, LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::function, LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::kind, linear_substitutable_function(), LMCAS::detail::node(), LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::power, PowerOfFunction , 以及 PowerOfLinear.

被这些函数引用 classify_linear_wrapper().

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

◆ linear_reduced_expression()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{integration_substitution.cpp}::linear_reduced_expression ( const LinearWrapper & wrapper,
const std::shared_ptr< SymbolicExpr > & variable )

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

144 {
145 if (wrapper.kind == LinearWrapperKind::PowerOfLinear) {
147 detail::node(variable), wrapper.power->exponent()));
148 }
149 std::vector<std::shared_ptr<const SymbolicNode>> args{detail::node(variable)};
150 auto function = detail::make_node<FunctionNode>(wrapper.function->type(), args);
151 if (wrapper.kind == LinearWrapperKind::Function) {
153 }
155 detail::make_node<PowerNode>(function, wrapper.power->exponent()));
156}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
const std::string & variable
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 Function, LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::function, LMCAS::function(), LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::kind, linear_reduced_expression(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::anonymous_namespace{integration_substitution.cpp}::LinearWrapper::power, PowerOfLinear , 以及 LMCAS::variable.

被这些函数引用 linear_reduced_expression().

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

◆ linear_substitutable_function()

bool LMCAS::anonymous_namespace{integration_substitution.cpp}::linear_substitutable_function ( const FunctionNode & function)

在文件 integration_substitution.cpp 第 109 行定义.

109 {
110 using FT = FunctionNode::FuncType;
111 switch (function.type()) {
112 case FT::Infinity:
113 case FT::Atan2:
114 case FT::Log: return false;
115 default: return function.arguments().size() == 1;
116 }
117}

引用了 LMCAS::function() , 以及 linear_substitutable_function().

被这些函数引用 classify_linear_wrapper() , 以及 linear_substitutable_function().

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

◆ substitute_candidate()

Result< std::shared_ptr< SymbolicExpr > > LMCAS::anonymous_namespace{integration_substitution.cpp}::substitute_candidate ( const SymbolicExpr & expr,
const SymbolicExpr & candidate_term,
const std::string & var,
ComputationContext & computation )

在文件 integration_substitution.cpp 第 47 行定义.

49 {
50 detail::RewriteBudget transform_budget(computation, (computation).limits().max_recursion_depth,
51 (computation).limits().max_ast_nodes, "transform");
52 auto u = substitution_argument(candidate_term);
53 if (!u || !depends_on_integration_variable(*u, var)) { return nullptr; }
54 auto d_ptr = detail::make_expression_ptr(detail::differentiate_node(detail::node(*u), var, transform_budget));
55 if (!d_ptr) { return nullptr; }
56 auto du = detail::make_expression_ptr(detail::normalize_node(detail::node(d_ptr), transform_budget));
57 if (du->is_zero()) { return nullptr; }
58
59 auto f_u = candidate_term;
60 auto term_times_du = SymbolicExpr::multiply(detail::make_expression_ptr(f_u), detail::make_expression_ptr(*du));
61 auto ratio = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(detail::make_expression_ptr(expr), term_times_du)), transform_budget));
62 if (depends_on_integration_variable(*ratio, var)) { return nullptr; }
63 auto primitive = substitution_primitive(candidate_term, *u, var, computation);
64 if (!primitive) { return primitive; }
65 if (!primitive.value()) { return nullptr; }
66 return SymbolicExpr::multiply(ratio, primitive.value());
67} catch (const CasError& error) {
68 return Result<std::shared_ptr<SymbolicExpr>>::failure(error);
69} catch (const std::bad_alloc&) {
70 return Result<std::shared_ptr<SymbolicExpr>>::failure(CasErrc::ResourceLimit, "allocation failed", "substitute_candidate");
71} catch (const std::length_error& error) {
72 return Result<std::shared_ptr<SymbolicExpr>>::failure(CasErrc::ResourceLimit, error.what(), "substitute_candidate");
73} catch (const std::exception& error) {
74 return Result<std::shared_ptr<SymbolicExpr>>::failure(CasErrc::InternalInvariant, error.what(), "substitute_candidate");
75}
Result< std::shared_ptr< SymbolicExpr > > substitution_primitive(const SymbolicExpr &candidate_term, const SymbolicExpr &u, const std::string &var, ComputationContext &context)
std::optional< SymbolicExpr > substitution_argument(const SymbolicExpr &term)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
bool depends_on_integration_variable(const SymbolicExpr &expression, const std::string &variable)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u

引用了 LMCAS::depends_on_integration_variable(), LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), substitute_candidate(), substitution_argument(), substitution_primitive() , 以及 LMCAS::u.

被这些函数引用 substitute_candidate().

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

◆ substitution_argument()

std::optional< SymbolicExpr > LMCAS::anonymous_namespace{integration_substitution.cpp}::substitution_argument ( const SymbolicExpr & term)

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

10 {
11 if (auto power = std::dynamic_pointer_cast<const PowerNode>(detail::node(term))) {
12 return detail::expression_from_node(power->base());
13 }
14 auto function = std::dynamic_pointer_cast<const FunctionNode>(detail::node(term));
15 if (function && !function->arguments().empty()) {
16 return detail::expression_from_node(function->arguments()[0]);
17 }
18 return std::nullopt;
19}

引用了 LMCAS::detail::expression_from_node(), LMCAS::function(), LMCAS::detail::node() , 以及 substitution_argument().

被这些函数引用 substitute_candidate() , 以及 substitution_argument().

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

◆ substitution_primitive()

Result< std::shared_ptr< SymbolicExpr > > LMCAS::anonymous_namespace{integration_substitution.cpp}::substitution_primitive ( const SymbolicExpr & candidate_term,
const SymbolicExpr & u,
const std::string & var,
ComputationContext & context )

在文件 integration_substitution.cpp 第 21 行定义.

23 {
24 if (auto power = std::dynamic_pointer_cast<const PowerNode>(detail::node(candidate_term))) {
25 auto primitive = detail::integrate_power_primitive(u,
26 detail::expression_from_node(power->exponent()), var, context);
27 if (!primitive) {
28 return Result<std::shared_ptr<SymbolicExpr>>::failure(primitive.error());
29 }
30 return primitive.value() ? detail::make_expression_ptr(*primitive.value()) : nullptr;
31 }
32 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(detail::node(candidate_term))) {
34 return SymbolicExpr::sin(detail::make_expression_ptr(u));
35 }
37 return SymbolicExpr::multiply(SymbolicExpr::number(-1),
38 SymbolicExpr::cos(detail::make_expression_ptr(u)));
39 }
41 return SymbolicExpr::exp(detail::make_expression_ptr(u));
42 }
43 }
44 return nullptr;
45}
Result< std::optional< SymbolicExpr > > integrate_power_primitive(const SymbolicExpr &base, const SymbolicExpr &exponent, const std::string &variable, ComputationContext &)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 LMCAS::context, LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Exp, LMCAS::detail::expression_from_node(), LMCAS::function(), LMCAS::detail::integrate_power_primitive(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::FunctionNode::Sin, substitution_primitive() , 以及 LMCAS::u.

被这些函数引用 substitute_candidate() , 以及 substitution_primitive().

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