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

函数

std::optional< int > integer_value_from_node (const std::shared_ptr< const SymbolicNode > &node)
static std::optional< int > laurent_power_of_power (const PowerNode &power, const std::string &var)
double series_get_double (const std::shared_ptr< SymbolicExpr > &expression)
bool series_is_infinity (const std::shared_ptr< SymbolicExpr > &expression)
bool series_is_number (const std::shared_ptr< SymbolicExpr > &expression)
double series_number_value (const NumberNode &number)
std::optional< int > supported_laurent_integer_power (const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
Result< void > validate_power_series_coefficients (const std::vector< std::shared_ptr< SymbolicExpr > > &coefficients, const std::string &operation, const std::string &name)
Result< void > validate_series_variable (const std::string &variable, ComputationContext &context, const std::string &operation)

函数说明

◆ integer_value_from_node()

std::optional< int > LMCAS::detail::series_support::integer_value_from_node ( const std::shared_ptr< const SymbolicNode > & node)

在文件 series_engine.cpp 第 69 行定义.

70{
71 BigInt integer;
72 if (!try_get_integer_value(std::dynamic_pointer_cast<const NumberNode>(node), integer)) {
73 return std::nullopt;
74 }
75 auto value = integer.try_to_int64();
76 if (!value || *value < std::numeric_limits<int>::min() ||
77 *value > std::numeric_limits<int>::max()) {
78 return std::nullopt;
79 }
80 return static_cast<int>(*value);
81}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult integer(Integer)=delete
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
const std::string const ExprPtr & value

引用了 LMCAS::integer, integer_value_from_node(), LMCAS::detail::node(), LMCAS::try_get_integer_value() , 以及 LMCAS::value.

被这些函数引用 integer_value_from_node() , 以及 laurent_power_of_power().

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

◆ laurent_power_of_power()

std::optional< int > LMCAS::detail::series_support::laurent_power_of_power ( const PowerNode & power,
const std::string & var )
static

在文件 series_engine.cpp 第 83 行定义.

84 {
86 if (!exponent) {
87 return std::nullopt;
88 }
89 auto base = std::dynamic_pointer_cast<const VariableNode>(power.base());
90 if (base && !base->is_constant() && base->name() == var) {
91 return *exponent;
92 }
93 auto nested = supported_laurent_integer_power(power.base(), var);
94 if (!nested) {
95 return std::nullopt;
96 }
97 const BigInt product = BigInt(*nested) * BigInt(*exponent);
98 if (product < BigInt(std::numeric_limits<int>::min()) ||
99 product > BigInt(std::numeric_limits<int>::max())) {
100 return std::nullopt;
101 }
102 return static_cast<int>(*product.try_to_int64());
103}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
std::optional< int > integer_value_from_node(const std::shared_ptr< const SymbolicNode > &node)
const ExprPtr & exponent
std::optional< int > supported_laurent_integer_power(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)

引用了 LMCAS::PowerNode::base(), LMCAS::exponent, LMCAS::PowerNode::exponent(), integer_value_from_node(), laurent_power_of_power() , 以及 supported_laurent_integer_power().

被这些函数引用 laurent_power_of_power() , 以及 supported_laurent_integer_power().

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

◆ series_get_double()

double LMCAS::detail::series_support::series_get_double ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 33 行定义.

33 {
34 if (!expr || !LMCAS::detail::node(expr)) {
35 return 0.0;
36 }
37 auto num = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(expr));
38 if (!num) {
39 return 0.0;
40 }
41 return series_number_value(*num);
42}
std::shared_ptr< SymbolicExpr > num(int value)
double series_number_value(const NumberNode &number)

引用了 LMCAS::detail::node(), LMCAS::polynomial_solver_detail::num(), series_get_double() , 以及 series_number_value().

被这些函数引用 series_get_double() , 以及 series_is_infinity().

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

◆ series_is_infinity()

bool LMCAS::detail::series_support::series_is_infinity ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 44 行定义.

44 {
45 if (!expr || !LMCAS::detail::node(expr)) {
46 return false;
47 }
48 auto func = std::dynamic_pointer_cast<const FunctionNode>(LMCAS::detail::node(expr));
49 if (func && func->type() == FunctionNode::FuncType::Infinity) {
50 return true;
51 }
52 if (series_is_number(expr)) {
53 return std::isinf(series_get_double(expr));
54 }
55 return false;
56}
bool series_is_number(const std::shared_ptr< SymbolicExpr > &expression)
double series_get_double(const std::shared_ptr< SymbolicExpr > &expression)

引用了 LMCAS::FunctionNode::Infinity, LMCAS::detail::node(), series_get_double(), series_is_infinity() , 以及 series_is_number().

被这些函数引用 series_is_infinity().

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

◆ series_is_number()

bool LMCAS::detail::series_support::series_is_number ( const std::shared_ptr< SymbolicExpr > & expression)

在文件 series_convergence.cpp 第 26 行定义.

26 {
27 if (!expr || !LMCAS::detail::node(expr)) {
28 return false;
29 }
30 return expr->is_number();
31}

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

被这些函数引用 series_is_infinity() , 以及 series_is_number().

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

◆ series_number_value()

double LMCAS::detail::series_support::series_number_value ( const NumberNode & number)

在文件 series_convergence.cpp 第 19 行定义.

19 {
20 if (std::holds_alternative<BigInt>(number.value())) {
21 return std::get<BigInt>(number.value()).to_double();
22 }
23 return std::get<Rational>(number.value()).to_double();
24}
const std::variant< BigInt, Rational > & value() const noexcept

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

被这些函数引用 series_get_double() , 以及 series_number_value().

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

◆ supported_laurent_integer_power()

std::optional< int > LMCAS::detail::series_support::supported_laurent_integer_power ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & variable )

在文件 series_engine.cpp 第 105 行定义.

108{
109 if (!node) {
110 return std::nullopt;
111 }
112 if (std::dynamic_pointer_cast<const NumberNode>(node)) {
113 return 0;
114 }
115 if (auto variable = std::dynamic_pointer_cast<const VariableNode>(node)) {
116 return !variable->is_constant() && variable->name() == var
117 ? std::optional<int>(1) : std::nullopt;
118 }
119 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
120 return laurent_power_of_power(*power, var);
121 }
122 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
123 BigInt total_power(0);
124 for (const auto& operand : multiply->operands()) {
125 if (std::dynamic_pointer_cast<const NumberNode>(operand)) {
126 continue;
127 }
128 auto power = supported_laurent_integer_power(operand, var);
129 if (!power) {
130 return std::nullopt;
131 }
132 total_power += BigInt(*power);
133 }
134 if (total_power < BigInt(std::numeric_limits<int>::min()) ||
135 total_power > BigInt(std::numeric_limits<int>::max())) {
136 return std::nullopt;
137 }
138 return static_cast<int>(*total_power.try_to_int64());
139 }
140 return std::nullopt;
141
142
143}
static std::optional< int > laurent_power_of_power(const PowerNode &power, const std::string &var)
std::optional< int > supported_laurent_integer_power(const std::shared_ptr< const SymbolicNode > &node, const std::string &variable)
const std::string & variable

引用了 laurent_power_of_power(), LMCAS::detail::node(), supported_laurent_integer_power() , 以及 LMCAS::detail::variable.

被这些函数引用 laurent_power_of_power() , 以及 supported_laurent_integer_power().

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

◆ validate_power_series_coefficients()

Result< void > LMCAS::detail::series_support::validate_power_series_coefficients ( const std::vector< std::shared_ptr< SymbolicExpr > > & coefficients,
const std::string & operation,
const std::string & name )

在文件 series_engine.cpp 第 145 行定义.

149{
150 for (size_t i = 0; i < coeffs.size(); ++i) {
151 if (!coeffs[i] || !LMCAS::detail::node(coeffs[i])) {
154 name + " contains a null coefficient at index " + std::to_string(i),
155 operation);
156 }
157 }
158 return Result<void>::success();
159}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
ComputationContext const std::string & operation
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name

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

被这些函数引用 validate_power_series_coefficients().

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

◆ validate_series_variable()

Result< void > LMCAS::detail::series_support::validate_series_variable ( const std::string & variable,
ComputationContext & context,
const std::string & operation )

在文件 series_engine.cpp 第 53 行定义.

56{
57 auto step = context.consume_steps(1, operation);
58 if (!step) {
59 return step;
60 }
61 if (var.empty()) {
63 "series variable name cannot be empty",
64 operation);
65 }
66 return Result<void>::success();
67}
std::size_t std::size_t ComputationContext & context

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

被这些函数引用 validate_series_variable().

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