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

函数

Result< ApproxComplex > add_complex (const ApproxComplex &lhs, const ApproxComplex &rhs)
ApproxComplex approx_complex (double real, double imag)
ApproxReal approx_part (double value, double error=0.0)
Result< ApproxComplex > checked_complex (double real, double imag, const char *operation)
Result< ApproxComplex > complex_failure (CasErrc code, std::string message, const char *operation)
Result< ApproxComplex > divide_complex (const ApproxComplex &lhs, const ApproxComplex &rhs)
Result< ApproxComplex > eval_complex_failure (const CasError &error)
Result< ApproxComplex > evaluate_complex_components (const ComplexNode &node, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxComplex > evaluate_complex_exponent (const std::shared_ptr< const SymbolicNode > &node, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxComplex > evaluate_complex_node (const std::shared_ptr< const SymbolicNode > &node, const NumericBindings &bindings, ComputationContext &context)
template<typename Combine>
Result< ApproxComplex > evaluate_complex_operands (const std::vector< std::shared_ptr< const SymbolicNode > > &operands, ApproxComplex identity, Combine combine, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxComplex > evaluate_complex_power (const PowerNode &power, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxComplex > integer_complex_power (Result< ApproxComplex > base, int integer)
Result< ApproxComplex > multiply_complex (const ApproxComplex &lhs, const ApproxComplex &rhs)
Result< ApproxComplex > real_to_complex (const Result< ApproxReal > &real)

变量

constexpr const char * kEvalfOperation = "LMCAS.evalf"

函数说明

◆ add_complex()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::add_complex ( const ApproxComplex & lhs,
const ApproxComplex & rhs )

在文件 expr_complex_evaluation.cpp 第 64 行定义.

65 {
66 return checked_complex(lhs.real.value + rhs.real.value,
67 lhs.imag.value + rhs.imag.value,
69}
Result< ApproxComplex > checked_complex(double real, double imag, const char *operation)
constexpr const char * kEvalComplexOperation
const ExprPtr & rhs

引用了 add_complex(), checked_complex(), LMCAS::ApproxComplex::imag, LMCAS::kEvalComplexOperation, LMCAS::ApproxComplex::real, LMCAS::rhs , 以及 LMCAS::ApproxReal::value.

被这些函数引用 add_complex() , 以及 evaluate_complex_node().

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

◆ approx_complex()

ApproxComplex LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::approx_complex ( double real,
double imag )

在文件 expr_complex_evaluation.cpp 第 35 行定义.

35 {
37}
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprPtr imag

引用了 approx_complex(), approx_part(), LMCAS::imag , 以及 LMCAS::real().

被这些函数引用 approx_complex(), evaluate_complex_node() , 以及 integer_complex_power().

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

◆ approx_part()

ApproxReal LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::approx_part ( double value,
double error = 0.0 )

在文件 expr_complex_evaluation.cpp 第 27 行定义.

27 {
28 ApproxReal part;
29 part.value = value;
30 part.absolute_error = error;
32 return part;
33}
const std::string const ExprPtr & value

引用了 LMCAS::ApproxReal::absolute_error, approx_part(), LMCAS::Finite, LMCAS::ApproxReal::status, LMCAS::ApproxReal::value , 以及 LMCAS::value.

被这些函数引用 approx_complex(), approx_part(), checked_complex() , 以及 real_to_complex().

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

◆ checked_complex()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::checked_complex ( double real,
double imag,
const char * operation )

在文件 expr_complex_evaluation.cpp 第 39 行定义.

40 {
41 if (!std::isfinite(real) || !std::isfinite(imag)) {
43 "complex evaluation produced a non-finite component",
44 operation);
45 }
46 const double unknown = std::numeric_limits<double>::infinity();
48 ApproxComplex{approx_part(real, unknown), approx_part(imag, unknown)});
49}
static Result success(T value)
Result< ApproxComplex > complex_failure(CasErrc code, std::string message, const char *operation)

引用了 approx_part(), checked_complex(), complex_failure(), LMCAS::imag, LMCAS::NumericFailure, LMCAS::real() , 以及 LMCAS::Result< T >::success().

被这些函数引用 add_complex(), checked_complex(), divide_complex(), evaluate_complex_power(), integer_complex_power() , 以及 multiply_complex().

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

◆ complex_failure()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::complex_failure ( CasErrc code,
std::string message,
const char * operation )

在文件 expr_complex_evaluation.cpp 第 18 行定义.

19 {
20 return Result<ApproxComplex>::failure(code, std::move(message), operation);
21}
static Result failure(CasErrc code, std::string message, std::string operation={})

引用了 complex_failure() , 以及 LMCAS::Result< T >::failure().

被这些函数引用 checked_complex(), complex_failure(), divide_complex(), eval_complex_failure(), evaluate_complex_components(), evaluate_complex_exponent(), evaluate_complex_node(), evaluate_complex_power(), multiply_complex() , 以及 real_to_complex().

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

◆ divide_complex()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::divide_complex ( const ApproxComplex & lhs,
const ApproxComplex & rhs )

在文件 expr_complex_evaluation.cpp 第 88 行定义.

89 {
90 const double a = lhs.real.value;
91 const double b = lhs.imag.value;
92 const double c = rhs.real.value;
93 const double d = rhs.imag.value;
94 if (c == 0.0 && d == 0.0) {
96 "complex division by zero",
98 }
99 const lmmc_complex_t left{a, b};
100 const lmmc_complex_t right{c, d};
101 lmmc_complex_t quotient;
102 if (lmmc_complex_div(&left, &right, &quotient) != LMMC_STATUS_OK) {
104 "complex division requires finite components and result",
106 }
107 return checked_complex(quotient.real, quotient.imag, kEvalComplexOperation);
108}
const VectorField const VectorField & c
const MultiPoly & b
__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 const std::shared_ptr< SymbolicExpr > & a
const ExprPtr & right

引用了 LMCAS::a, LMCAS::b, LMCAS::c, checked_complex(), complex_failure(), divide_complex(), LMCAS::DomainError, LMCAS::ApproxComplex::imag, LMCAS::kEvalComplexOperation, LMCAS::NumericFailure, LMCAS::ApproxComplex::real, LMCAS::rhs, LMCAS::right , 以及 LMCAS::ApproxReal::value.

被这些函数引用 divide_complex() , 以及 integer_complex_power().

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

◆ eval_complex_failure()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::eval_complex_failure ( const CasError & error)

在文件 expr_complex_evaluation.cpp 第 23 行定义.

23 {
25}
std::string message

引用了 LMCAS::CasError::code, complex_failure(), eval_complex_failure(), LMCAS::kEvalComplexOperation , 以及 LMCAS::CasError::message.

被这些函数引用 eval_complex_failure(), evaluate_complex_components() , 以及 real_to_complex().

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

◆ evaluate_complex_components()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_components ( const ComplexNode & node,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 115 行定义.

117 {
118 auto real = evaluate_numeric(
120 if (!real) {
122 }
123 auto imag = evaluate_numeric(
125 if (!imag) {
126 return eval_complex_failure(imag.error());
127 }
128 if (!real.value().is_finite() || !imag.value().is_finite() ||
129 !std::isfinite(real.value().value) ||
130 !std::isfinite(imag.value().value)) {
132 "complex components must be finite",
134 }
136 ApproxComplex{real.value(), imag.value()});
137}
CasError & error()
Result< ApproxComplex > eval_complex_failure(const CasError &error)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::vector< Binding > & bindings
Result< ApproxReal > evaluate_numeric(const SymbolicExpr &expression, const NumericBindings &bindings={})

引用了 LMCAS::bindings, complex_failure(), LMCAS::context, LMCAS::Result< T >::error(), eval_complex_failure(), evaluate_complex_components(), LMCAS::evaluate_numeric(), LMCAS::imag, LMCAS::kEvalComplexOperation, LMCAS::detail::make_expression_ptr(), LMCAS::NumericFailure, LMCAS::real(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 evaluate_complex_components() , 以及 evaluate_complex_node().

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

◆ evaluate_complex_exponent()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_exponent ( const std::shared_ptr< const SymbolicNode > & node,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 158 行定义.

160 {
161 auto expression = simplify(detail::make_expression_ptr(node), context);
162 if (!expression) {
163 return complex_failure(expression.error().code,
164 std::move(expression.error().message),
166 }
167 const auto* number = dynamic_cast<const NumberNode*>(
168 detail::node(expression.value()).get());
169 const auto* rational = number ? std::get_if<Rational>(&number->value()) : nullptr;
170 auto exponent = evaluate_complex_node(detail::node(expression.value()),
172 if (!exponent) return exponent;
173 if (rational && rational->get_denominator() != BigInt(1) &&
174 std::trunc(exponent.value().real.value) == exponent.value().real.value) {
176 "exact fractional exponent rounds to an integer",
178 }
179 return exponent;
180}
Result< ApproxComplex > evaluate_complex_node(const std::shared_ptr< const SymbolicNode > &node, const NumericBindings &bindings, ComputationContext &context)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult simplify(const ExprPtr &expression, ComputationContext &context)
const ExprPtr & exponent
ExprResult rational(const Rational &value)

引用了 LMCAS::bindings, complex_failure(), LMCAS::context, evaluate_complex_exponent(), evaluate_complex_node(), LMCAS::exponent, LMCAS::kEvalComplexOperation, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::rational(), LMCAS::simplify() , 以及 LMCAS::UnsupportedExpression.

被这些函数引用 evaluate_complex_exponent() , 以及 evaluate_complex_power().

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

◆ evaluate_complex_node()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_node ( const std::shared_ptr< const SymbolicNode > & node,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 250 行定义.

253 {
254 auto entered = context.enter_recursion(kEvalComplexOperation);
255 if (!entered) {
256 return Result<ApproxComplex>::failure(entered.error());
257 }
258 struct RecursionExit {
260 ~RecursionExit() { context.leave_recursion(); }
261 } recursion_exit{context};
262 if (!node) {
264 "expression contains a null node",
266 }
267
268 if (auto complex_node = std::dynamic_pointer_cast<const ComplexNode>(node)) {
269 return evaluate_complex_components(*complex_node, bindings, context);
270 }
271 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
273 add->operands(), approx_complex(0.0, 0.0), add_complex, bindings, context);
274 }
275 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
277 multiply->operands(), approx_complex(1.0, 0.0), multiply_complex,
279 }
280 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
281 return evaluate_complex_power(*power, bindings, context);
282 }
283
284 return real_to_complex(
286 bindings, context));
287}
Result< ApproxComplex > real_to_complex(const Result< ApproxReal > &real)
Result< ApproxComplex > evaluate_complex_power(const PowerNode &power, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxComplex > evaluate_complex_components(const ComplexNode &node, const NumericBindings &bindings, ComputationContext &context)
Result< ApproxComplex > multiply_complex(const ApproxComplex &lhs, const ApproxComplex &rhs)
Result< ApproxComplex > add_complex(const ApproxComplex &lhs, const ApproxComplex &rhs)
Result< ApproxComplex > evaluate_complex_operands(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, ApproxComplex identity, Combine combine, const NumericBindings &bindings, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::add(), add_complex(), approx_complex(), LMCAS::bindings, complex_failure(), LMCAS::context, evaluate_complex_components(), evaluate_complex_node(), evaluate_complex_operands(), evaluate_complex_power(), LMCAS::evaluate_numeric(), LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::kEvalComplexOperation, LMCAS::detail::make_expression_ptr(), multiply_complex() , 以及 real_to_complex().

被这些函数引用 evaluate_complex_exponent(), evaluate_complex_node(), evaluate_complex_operands() , 以及 evaluate_complex_power().

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

◆ evaluate_complex_operands()

template<typename Combine>
Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_operands ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands,
ApproxComplex identity,
Combine combine,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 140 行定义.

143 {
144 auto result = Result<ApproxComplex>::success(identity);
145 for (const auto& operand : operands) {
147 if (!value) {
148 return value;
149 }
150 result = combine(result.value(), value.value());
151 if (!result) {
152 return result;
153 }
154 }
155 return result;
156}

引用了 LMCAS::bindings, LMCAS::context, evaluate_complex_node(), evaluate_complex_operands(), LMCAS::Result< T >::success() , 以及 LMCAS::value.

被这些函数引用 evaluate_complex_node() , 以及 evaluate_complex_operands().

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

◆ evaluate_complex_power()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::evaluate_complex_power ( const PowerNode & power,
const NumericBindings & bindings,
ComputationContext & context )

在文件 expr_complex_evaluation.cpp 第 213 行定义.

215 {
216 auto base = evaluate_complex_node(power.base(), bindings, context);
217 if (!base) {
218 return base;
219 }
221 if (!exponent) {
222 return Result<ApproxComplex>::failure(std::move(exponent.error()));
223 }
224 if (exponent.value().imag.value != 0.0 ||
225 std::trunc(exponent.value().real.value) != exponent.value().real.value) {
226 const lmmc_complex_t value{base.value().real.value, base.value().imag.value};
227 const lmmc_complex_t power{exponent.value().real.value,
228 exponent.value().imag.value};
229 lmmc_complex_t result;
230 const auto status = lmmc_complex_pow(&value, &power, &result);
231 if (status == LMMC_STATUS_OUT_OF_RANGE) {
232 return complex_failure(CasErrc::DomainError, "complex power of zero",
234 }
235 if (status != LMMC_STATUS_OK) {
237 "complex power produced a non-finite result",
239 }
240 return checked_complex(result.real, result.imag, kEvalComplexOperation);
241 }
242 if (std::abs(exponent.value().real.value) > 64.0) {
244 "complex evaluation only supports integer powers with |n| <= 64",
246 }
247 return integer_complex_power(std::move(base), static_cast<int>(exponent.value().real.value));
248}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
Result< ApproxComplex > integer_complex_power(Result< ApproxComplex > base, int integer)
Result< ApproxComplex > evaluate_complex_exponent(const std::shared_ptr< const SymbolicNode > &node, const NumericBindings &bindings, ComputationContext &context)

引用了 LMCAS::PowerNode::base(), LMCAS::bindings, checked_complex(), complex_failure(), LMCAS::context, LMCAS::DomainError, evaluate_complex_exponent(), evaluate_complex_node(), evaluate_complex_power(), LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::Result< T >::failure(), integer_complex_power(), LMCAS::kEvalComplexOperation, LMCAS::NumericFailure, LMCAS::UnsupportedExpression , 以及 LMCAS::value.

被这些函数引用 evaluate_complex_node() , 以及 evaluate_complex_power().

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

◆ integer_complex_power()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::integer_complex_power ( Result< ApproxComplex > base,
int integer )

在文件 expr_complex_evaluation.cpp 第 182 行定义.

182 {
183 unsigned magnitude = static_cast<unsigned>(std::abs(integer));
184 auto factor = base;
185 if (integer < 0) {
186 factor = divide_complex(approx_complex(1.0, 0.0), base.value());
187 if (!factor) {
188 return factor;
189 }
190 }
191 auto result = Result<ApproxComplex>::success(approx_complex(1.0, 0.0));
192 if (magnitude == 0U) {
193 return checked_complex(1.0, 0.0, kEvalComplexOperation);
194 }
195 while (magnitude != 0U) {
196 if ((magnitude & 1U) != 0U) {
197 result = multiply_complex(result.value(), factor.value());
198 if (!result) {
199 return result;
200 }
201 }
202 magnitude >>= 1U;
203 if (magnitude != 0U) {
204 factor = multiply_complex(factor.value(), factor.value());
205 if (!factor) {
206 return factor;
207 }
208 }
209 }
210 return result;
211}
Result< ApproxComplex > divide_complex(const ApproxComplex &lhs, const ApproxComplex &rhs)
ExprResult integer(Integer)=delete

引用了 approx_complex(), checked_complex(), divide_complex(), LMCAS::integer, integer_complex_power(), LMCAS::kEvalComplexOperation, multiply_complex(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 evaluate_complex_power() , 以及 integer_complex_power().

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

◆ multiply_complex()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::multiply_complex ( const ApproxComplex & lhs,
const ApproxComplex & rhs )

在文件 expr_complex_evaluation.cpp 第 71 行定义.

72 {
73 const double a = lhs.real.value;
74 const double b = lhs.imag.value;
75 const double c = rhs.real.value;
76 const double d = rhs.imag.value;
77 const lmmc_complex_t left{a, b};
78 const lmmc_complex_t right{c, d};
79 lmmc_complex_t product;
80 if (lmmc_complex_mul(&left, &right, &product) != LMMC_STATUS_OK) {
82 "complex multiplication requires finite components and result",
84 }
85 return checked_complex(product.real, product.imag, kEvalComplexOperation);
86}

引用了 LMCAS::a, LMCAS::b, LMCAS::c, checked_complex(), complex_failure(), LMCAS::ApproxComplex::imag, LMCAS::kEvalComplexOperation, multiply_complex(), LMCAS::NumericFailure, LMCAS::ApproxComplex::real, LMCAS::rhs, LMCAS::right , 以及 LMCAS::ApproxReal::value.

被这些函数引用 evaluate_complex_node(), integer_complex_power() , 以及 multiply_complex().

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

◆ real_to_complex()

Result< ApproxComplex > LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::real_to_complex ( const Result< ApproxReal > & real)

在文件 expr_complex_evaluation.cpp 第 51 行定义.

51 {
52 if (!real) {
54 }
55 if (!real.value().is_finite() || !std::isfinite(real.value().value)) {
57 "complex evaluation requires finite real components",
59 }
61 ApproxComplex{real.value(), approx_part(0.0)});
62}

引用了 approx_part(), complex_failure(), LMCAS::Result< T >::error(), eval_complex_failure(), LMCAS::kEvalComplexOperation, LMCAS::NumericFailure, LMCAS::real(), real_to_complex(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 evaluate_complex_node() , 以及 real_to_complex().

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

变量说明

◆ kEvalfOperation

const char* LMCAS::anonymous_namespace{expr_complex_evaluation.cpp}::kEvalfOperation = "LMCAS.evalf"
constexpr

在文件 expr_complex_evaluation.cpp 第 16 行定义.