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

命名空间

namespace  anonymous_namespace{transform_support.cpp}

类

struct  GaussianMatch

函数

std::shared_ptr< SymbolicExpr > laplace_transform_core (const std::shared_ptr< SymbolicExpr > &expression, const std::string &input_var, const std::string &output_var, ComputationContext &context)
bool te_contains_transform (const std::shared_ptr< const SymbolicNode > &node)
bool te_depends_on (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
BigInt te_factorial (const BigInt &n, ComputationContext &context)
std::shared_ptr< SymbolicExpr > te_gt_condition (const std::shared_ptr< SymbolicExpr > &lhs, const std::shared_ptr< SymbolicExpr > &rhs)
bool te_is_trig (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable, bool &is_sin, std::shared_ptr< SymbolicExpr > &frequency)
bool te_is_zero (const std::shared_ptr< SymbolicExpr > &expression)
std::shared_ptr< SymbolicExpr > te_linear_coefficient (const std::shared_ptr< const SymbolicNode > &argument, const std::string &variable)
std::optional< Rational > te_match_pure_gaussian (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
std::optional< GaussianMatch > te_match_scaled_gaussian (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
std::optional< Rational > te_number_value (const std::shared_ptr< const SymbolicNode > &node)
std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > te_split_coeff (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
Result< void > te_validate_expr_vars (const std::shared_ptr< SymbolicExpr > &expression, const std::string &input_var, const std::string &output_var, ComputationContext &context, const std::string &operation)
TransformEngineResult te_wrap_transform_result (std::shared_ptr< SymbolicExpr > expression, const std::string &operation)

类说明

◆ LMCAS::transform_detail::GaussianMatch

struct LMCAS::transform_detail::GaussianMatch

在文件 transform_support.hpp 第 36 行定义.

LMCAS::transform_detail::GaussianMatch 的协作图:
类成员
shared_ptr< SymbolicExpr > coefficient
Rational rate

函数说明

◆ laplace_transform_core()

std::shared_ptr< SymbolicExpr > LMCAS::transform_detail::laplace_transform_core ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & input_var,
const std::string & output_var,
ComputationContext & context )

在文件 transform_laplace.cpp 第 153 行定义.

155 {
156 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
157 (context).limits().max_ast_nodes, "transform");
158 auto step = context.consume_steps(1, "laplace_transform.recursive");
159 if (!step) {
160 return nullptr;
161 }
162 if (!f || !LMCAS::detail::node(f)) {
163 return nullptr;
164 }
165 if (te_is_zero(f)) {
166 return SymbolicExpr::number(0);
167 }
168 if (!te_depends_on(f, t)) {
169 return SymbolicExpr::divide(f, SymbolicExpr::variable(s));
170 }
171 auto add = std::dynamic_pointer_cast<const AddNode>(LMCAS::detail::node(f));
172 if (add) {
173 return te_laplace_sum(f, *add, t, s, context);
174 }
175 auto [coeff, body] = te_split_coeff(f, t);
176 if (!coeff->is_one()) {
177 auto lt_body = laplace_transform_core(body, t, s, context);
178 if (lt_body) {
179 return SymbolicExpr::multiply(coeff, lt_body);
180 }
181 }
182 std::shared_ptr<SymbolicExpr> a_shift, remainder;
183 if (te_extract_exp(f, t, a_shift, remainder)) {
184 if (te_depends_on(remainder, t)) {
185 auto lt_rem = laplace_transform_core(remainder, t, s, context);
186 if (lt_rem) {
187 return detail::make_expression_ptr(detail::substitute_node(detail::node(lt_rem), s, detail::node(SymbolicExpr::add(SymbolicExpr::variable(s), SymbolicExpr::multiply(SymbolicExpr::number(-1), a_shift))), transform_budget));
188 }
189 } else {
190 return SymbolicExpr::divide(remainder, SymbolicExpr::add(SymbolicExpr::variable(s), SymbolicExpr::multiply(SymbolicExpr::number(-1), a_shift)));
191 }
192 }
193 auto lookup = te_laplace_lookup(f, t, s, context);
194 if (lookup) {
195 return lookup;
196 }
197 return te_unevaluated_laplace(f, t, s);
198}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr< SymbolicExpr > laplace_transform_core(const std::shared_ptr< SymbolicExpr > &expression, const std::string &input_var, const std::string &output_var, ComputationContext &context)
std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > te_split_coeff(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
bool te_is_zero(const std::shared_ptr< SymbolicExpr > &expression)
bool te_depends_on(const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
static std::shared_ptr< SymbolicExpr > te_unevaluated_laplace(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
static bool te_extract_exp(const std::shared_ptr< SymbolicExpr > &e, const std::string &t, std::shared_ptr< SymbolicExpr > &a_out, std::shared_ptr< SymbolicExpr > &rem_out)
static std::shared_ptr< SymbolicExpr > te_laplace_sum(const std::shared_ptr< SymbolicExpr > &f, const AddNode &addition, const std::string &t, const std::string &s, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_laplace_lookup(const std::shared_ptr< SymbolicExpr > &f, const std::string &t, const std::string &s, ComputationContext &context)
__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 & t

引用了 LMCAS::add(), LMCAS::context, laplace_transform_core(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::substitute_node(), LMCAS::t, te_depends_on(), LMCAS::te_extract_exp(), te_is_zero(), LMCAS::te_laplace_lookup(), LMCAS::te_laplace_sum(), te_split_coeff() , 以及 LMCAS::te_unevaluated_laplace().

被这些函数引用 LMCAS::inverse_laplace_checked(), LMCAS::laplace_transform_checked(), laplace_transform_core() , 以及 LMCAS::te_laplace_sum().

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

◆ te_contains_transform()

bool LMCAS::transform_detail::te_contains_transform ( const std::shared_ptr< const SymbolicNode > & node)

在文件 transform_support.cpp 第 37 行定义.

38 {
40}
bool contains_node_type(const SymbolicNodePtr &root)

引用了 LMCAS::detail::contains_node_type() , 以及 te_contains_transform().

被这些函数引用 LMCAS::inverse_fourier_transform_checked(), LMCAS::inverse_laplace_checked(), te_contains_transform() , 以及 te_wrap_transform_result().

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

◆ te_depends_on()

bool LMCAS::transform_detail::te_depends_on ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable )

在文件 transform_support.cpp 第 6 行定义.

7 {
8 return expression &&
10 LMCAS::detail::node(expression), variable);
11}
const std::string & variable
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)

引用了 LMCAS::expression_depends_on_variable(), LMCAS::detail::node(), te_depends_on() , 以及 LMCAS::variable.

被这些函数引用 LMCAS::fourier_transform_core(), LMCAS::inverse_fourier_transform_core(), laplace_transform_core(), LMCAS::te_convolve_core(), te_depends_on(), LMCAS::te_inv_product(), LMCAS::te_laplace_lookup(), LMCAS::te_laplace_roc(), te_split_coeff(), LMCAS::z_transform_core(), LMCAS::zt_is_exp_seq() , 以及 LMCAS::zt_roc().

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

◆ te_factorial()

BigInt LMCAS::transform_detail::te_factorial ( const BigInt & n,
ComputationContext & context )

在文件 transform_support.cpp 第 85 行定义.

85 {
86 auto result = BigInt::factorial_checked(n, context);
87 if (!result) throw result.error();
88 return std::move(result.value());
89}

引用了 LMCAS::context , 以及 te_factorial().

被这些函数引用 te_factorial(), LMCAS::te_inv_power() , 以及 LMCAS::te_laplace_lookup().

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

◆ te_gt_condition()

std::shared_ptr< SymbolicExpr > LMCAS::transform_detail::te_gt_condition ( const std::shared_ptr< SymbolicExpr > & lhs,
const std::shared_ptr< SymbolicExpr > & rhs )

在文件 transform_support.cpp 第 65 行定义.

67 {
68 if (!lhs || !LMCAS::detail::node(lhs) || !rhs || !LMCAS::detail::node(rhs)) return nullptr;
71}
std::shared_ptr< const Node > make_node(Args &&... args)
const ExprPtr & rhs

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::rhs , 以及 te_gt_condition().

被这些函数引用 LMCAS::te_decay_condition(), te_gt_condition(), LMCAS::te_laplace_roc(), LMCAS::zt_base_roc() , 以及 LMCAS::zt_unit_roc().

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

◆ te_is_trig()

bool LMCAS::transform_detail::te_is_trig ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable,
bool & is_sin,
std::shared_ptr< SymbolicExpr > & frequency )

在文件 transform_support.cpp 第 222 行定义.

224 {
225 if (!expression || !detail::node(expression)) {
226 return false;
227 }
228 auto function = std::dynamic_pointer_cast<const FunctionNode>(detail::node(expression));
229 if (!function || function->arguments().empty()) {
230 return false;
231 }
232 if (function->type() != FunctionNode::FuncType::Sin &&
234 return false;
235 }
236 is_sin = function->type() == FunctionNode::FuncType::Sin;
237 frequency = te_linear_coefficient(function->arguments()[0], variable);
238 return frequency != nullptr;
239}
std::shared_ptr< SymbolicExpr > te_linear_coefficient(const std::shared_ptr< const SymbolicNode > &argument, const std::string &variable)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::FunctionNode::Cos, LMCAS::function(), LMCAS::detail::node(), LMCAS::FunctionNode::Sin, te_is_trig(), te_linear_coefficient() , 以及 LMCAS::variable.

被这些函数引用 te_is_trig(), LMCAS::te_laplace_lookup(), LMCAS::te_laplace_roc(), LMCAS::zt_lookup_roc() , 以及 LMCAS::zt_trigonometric().

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

◆ te_is_zero()

bool LMCAS::transform_detail::te_is_zero ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 transform_support.cpp 第 73 行定义.

73 {
74 return e && LMCAS::detail::node(e) && e->is_zero();
75}
ExprResult e()

引用了 LMCAS::e(), LMCAS::detail::node() , 以及 te_is_zero().

被这些函数引用 LMCAS::inverse_laplace_core(), laplace_transform_core(), LMCAS::te_convolve_core(), LMCAS::te_inv_power() , 以及 te_is_zero().

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

◆ te_linear_coefficient()

std::shared_ptr< SymbolicExpr > LMCAS::transform_detail::te_linear_coefficient ( const std::shared_ptr< const SymbolicNode > & argument,
const std::string & variable )

在文件 transform_support.cpp 第 108 行定义.

109 {
110 auto symbol = std::dynamic_pointer_cast<const VariableNode>(argument);
111 if (symbol && !symbol->is_constant() && symbol->name() == variable) {
113 }
114 auto product = std::dynamic_pointer_cast<const MultiplyNode>(argument);
115 if (!product || product->operands().size() != 2) {
116 return nullptr;
117 }
118 for (std::size_t i = 0; i < 2; ++i) {
119 symbol = std::dynamic_pointer_cast<const VariableNode>(product->operands()[i]);
120 const auto& other = product->operands()[1 - i];
121 if (!symbol || symbol->is_constant() || symbol->name() != variable) continue;
122 if (expression_depends_on_variable(other, variable)) continue;
123 return detail::make_expression_ptr(other);
124 }
125 return nullptr;
126}
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)

引用了 LMCAS::SymbolicFactory::create_number(), LMCAS::expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), te_linear_coefficient() , 以及 LMCAS::variable.

被这些函数引用 LMCAS::te_extract_exp(), LMCAS::te_is_hyp(), te_is_trig() , 以及 te_linear_coefficient().

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

◆ te_match_pure_gaussian()

std::optional< Rational > LMCAS::transform_detail::te_match_pure_gaussian ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable )

在文件 transform_support.cpp 第 185 行定义.

187 {
188 if (!expression || !detail::node(expression)) return std::nullopt;
189 const auto function = std::dynamic_pointer_cast<const FunctionNode>(
190 detail::node(expression));
191 if (!function || function->type() != FunctionNode::FuncType::Exp ||
192 function->arguments().empty()) {
193 return std::nullopt;
194 }
195 const auto product = std::dynamic_pointer_cast<const MultiplyNode>(
196 function->arguments()[0]);
197 if (!product) return std::nullopt;
198
199 return te_gaussian_product_rate(*product, variable);
200}

引用了 LMCAS::FunctionNode::Exp, LMCAS::function(), LMCAS::detail::node(), te_match_pure_gaussian() , 以及 LMCAS::variable.

被这些函数引用 LMCAS::fourier_transform_core(), LMCAS::inverse_fourier_transform_core() , 以及 te_match_pure_gaussian().

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

◆ te_match_scaled_gaussian()

std::optional< GaussianMatch > LMCAS::transform_detail::te_match_scaled_gaussian ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable )

在文件 transform_support.cpp 第 202 行定义.

204 {
205 auto parts = te_split_coeff(expression, variable);
206 const auto coefficient = te_number_value(detail::node(parts.first));
207 if (!coefficient) {
208 return std::nullopt;
209 }
210 const auto function = std::dynamic_pointer_cast<const FunctionNode>(
211 detail::node(parts.second));
212 if (!function || function->type() != FunctionNode::FuncType::Exp ||
213 function->arguments().size() != 1) {
214 return std::nullopt;
215 }
216 const auto rate =
217 te_atomic_gaussian_rate(function->arguments()[0], variable);
218 if (!rate) return std::nullopt;
219 return GaussianMatch{std::move(parts.first), *rate};
220}
std::optional< Rational > te_number_value(const std::shared_ptr< const SymbolicNode > &node)

引用了 LMCAS::FunctionNode::Exp, LMCAS::function(), LMCAS::detail::node(), te_match_scaled_gaussian(), te_number_value(), te_split_coeff() , 以及 LMCAS::variable.

被这些函数引用 LMCAS::te_convolve_core() , 以及 te_match_scaled_gaussian().

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

◆ te_number_value()

std::optional< Rational > LMCAS::transform_detail::te_number_value ( const std::shared_ptr< const SymbolicNode > & node)

在文件 transform_support.cpp 第 76 行定义.

77 {
78 const auto number = std::dynamic_pointer_cast<const NumberNode>(node);
79 if (!number) return std::nullopt;
80 if (std::holds_alternative<BigInt>(number->value())) {
81 return Rational(std::get<BigInt>(number->value()));
82 }
83 return std::get<Rational>(number->value());
84}

引用了 te_number_value().

被这些函数引用 LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_accumulate_gaussian_factor(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_atomic_gaussian_rate(), LMCAS::te_is_denominator_factor(), te_match_scaled_gaussian() , 以及 te_number_value().

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

◆ te_split_coeff()

std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > LMCAS::transform_detail::te_split_coeff ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable )

在文件 transform_support.cpp 第 91 行定义.

91 {
92 if (!e || !LMCAS::detail::node(e) || !te_depends_on(e, v)) return {e ? e : SymbolicExpr::number(1), SymbolicExpr::number(1)};
93 auto mul = std::dynamic_pointer_cast<const MultiplyNode>(LMCAS::detail::node(e));
94 if (!mul) return {SymbolicExpr::number(1), e};
95 std::vector<std::shared_ptr<const SymbolicNode>> cp, vp;
96 for (auto& op : mul->operands()) {
97 if (expression_depends_on_variable(op, v)) vp.push_back(op); else cp.push_back(op);
98 }
99 if (cp.empty()) return {SymbolicExpr::number(1), e};
100 if (vp.empty()) return {e, SymbolicExpr::number(1)};
101 auto c = (cp.size()==1) ? LMCAS::detail::make_expression_ptr(cp[0])
102 : LMCAS::detail::make_expression_ptr(LMCAS::detail::make_node<MultiplyNode>(cp));
103 auto b = (vp.size()==1) ? LMCAS::detail::make_expression_ptr(vp[0])
105 return {c, b};
106}
__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 const std::string & v
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const VectorField const VectorField & c
const MultiPoly & b
const ExprPtr RelationOp op

引用了 LMCAS::b, LMCAS::c, LMCAS::e(), LMCAS::expression_depends_on_variable(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::mul(), LMCAS::detail::node(), LMCAS::op, te_depends_on(), te_split_coeff() , 以及 LMCAS::v.

被这些函数引用 LMCAS::fourier_transform_core(), LMCAS::inverse_laplace_core(), laplace_transform_core(), LMCAS::te_abs_decay(), LMCAS::transform_detail::anonymous_namespace{transform_support.cpp}::te_atomic_gaussian_rate(), LMCAS::te_convolve_core(), te_match_scaled_gaussian(), te_split_coeff(), LMCAS::z_transform_core() , 以及 LMCAS::zt_roc().

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

◆ te_validate_expr_vars()

Result< void > LMCAS::transform_detail::te_validate_expr_vars ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & input_var,
const std::string & output_var,
ComputationContext & context,
const std::string & operation )

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

17 {
18 auto step = context.consume_steps(1, operation);
19 if (!step) return step;
20 if (!expr || !LMCAS::detail::node(expr)) {
22 "transform expression cannot be null",
23 operation);
24 }
25 if (input_var.empty() || output_var.empty()) {
27 "transform variable names cannot be empty",
28 operation);
29 }
30 if (input_var == output_var) {
32 "input and output variables must be distinct",
33 operation);
34 }
35 return Result<void>::success();
36}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 te_validate_expr_vars().

被这些函数引用 LMCAS::fourier_transform_checked(), LMCAS::inverse_fourier_transform_checked(), LMCAS::inverse_laplace_checked(), LMCAS::laplace_transform_checked(), te_validate_expr_vars() , 以及 LMCAS::z_transform_checked().

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

◆ te_wrap_transform_result()

TransformEngineResult LMCAS::transform_detail::te_wrap_transform_result ( std::shared_ptr< SymbolicExpr > expression,
const std::string & operation )

在文件 transform_support.cpp 第 42 行定义.

44 {
45 if (!expr || !LMCAS::detail::node(expr)) {
48 "transform construction produced a null expression",
49 operation);
50 }
51
55 "transform is outside the current evaluated support domain",
56 operation);
57 }
58
60 Verified<EvaluatedTransform>{
61 EvaluatedTransform{std::move(expr), {}, {}},
62 ByConstructionProof{}});
63}
bool te_contains_transform(const std::shared_ptr< const SymbolicNode > &node)

引用了 LMCAS::Result< Verified< EvaluatedTransform > >::failure(), LMCAS::Inconclusive, LMCAS::InternalInvariant, LMCAS::detail::node(), LMCAS::Result< Verified< EvaluatedTransform > >::success(), te_contains_transform() , 以及 te_wrap_transform_result().

被这些函数引用 LMCAS::fourier_transform_checked(), LMCAS::inverse_fourier_transform_checked(), LMCAS::inverse_laplace_checked(), LMCAS::laplace_transform_checked(), LMCAS::te_convolve_core(), LMCAS::te_convolve_sum(), te_wrap_transform_result() , 以及 LMCAS::z_transform_checked().

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