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

命名空间

namespace  anonymous_namespace{transcendental_inversion.cpp}
namespace  anonymous_namespace{transcendental_patterns.cpp}

类

struct  ExpBasePattern
struct  InversePattern
struct  LambertWPattern

函数

SolutionSet conditional_preimage (const ExprPtr &original, const std::string &var)
std::optional< ExpBasePattern > decompose_exp_base_pattern (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)
std::optional< LambertWPattern > decompose_lambert_w_pattern (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context)
std::optional< InversePattern > decompose_trig_exp_pattern (const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
std::vector< std::shared_ptr< SymbolicExpr > > invert_exp_base (const std::shared_ptr< SymbolicExpr > &base, const std::shared_ptr< SymbolicExpr > &c, ComputationContext &context)
SolveResult invert_function (const InversePattern &pattern, const ExprPtr &original, const std::string &var, ComputationContext &context, const SolveOptions &options)
std::vector< std::shared_ptr< SymbolicExpr > > invert_lambert_w (const std::shared_ptr< SymbolicExpr > &c, ComputationContext &context)
bool try_evaluate_numeric (const std::shared_ptr< SymbolicExpr > &expr, lmmc_real_t &out, ComputationContext &context)

类说明

◆ LMCAS::detail::transcendental::ExpBasePattern

struct LMCAS::detail::transcendental::ExpBasePattern

在文件 transcendental_solver_support.hpp 第 31 行定义.

LMCAS::detail::transcendental::ExpBasePattern 的协作图:
类成员
shared_ptr< SymbolicExpr > base
shared_ptr< SymbolicExpr > inner
shared_ptr< SymbolicExpr > rhs

◆ LMCAS::detail::transcendental::InversePattern

struct LMCAS::detail::transcendental::InversePattern

在文件 transcendental_solver_support.hpp 第 19 行定义.

LMCAS::detail::transcendental::InversePattern 的协作图:
类成员
shared_ptr< SymbolicExpr > coefficient
FuncType func_type
shared_ptr< SymbolicExpr > inner
shared_ptr< SymbolicExpr > rhs

◆ LMCAS::detail::transcendental::LambertWPattern

struct LMCAS::detail::transcendental::LambertWPattern

在文件 transcendental_solver_support.hpp 第 26 行定义.

LMCAS::detail::transcendental::LambertWPattern 的协作图:
类成员
shared_ptr< SymbolicExpr > inner
shared_ptr< SymbolicExpr > rhs

函数说明

◆ conditional_preimage()

SolutionSet LMCAS::detail::transcendental::conditional_preimage ( const ExprPtr & original,
const std::string & var )

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

65 {
66 auto relation = std::dynamic_pointer_cast<const RelationalNode>(detail::node(original));
67 auto predicate = relation ? original : SymbolicExpr::eq(original, SymbolicExpr::number(0));
68 return SolutionSet{ConditionalSolutions{ConditionSet{var, std::move(predicate), {}}}};
69}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
std::variant< EmptySolutions, UniversalSolutions, FiniteSolutions, IntervalSolutions, ConditionalSolutions, ParametricSolutions > SolutionSet
成功的 SolveResult 表示操作定义域内的完整解集。 完备性未决时返回外层 Inconclusive 错误;EmptySolutions 表示已证明的空解集。

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

被这些函数引用 LMCAS::anonymous_namespace{solve_transcendental.cpp}::append_solutions(), conditional_preimage(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::constant_trigonometric_preimage(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_exponential(), invert_function(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_logarithm(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::invert_trigonometric(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_function_pattern(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_substitution(), LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_constant() , 以及 LMCAS::detail::transcendental::anonymous_namespace{transcendental_inversion.cpp}::trigonometric_target_range().

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

◆ decompose_exp_base_pattern()

std::optional< ExpBasePattern > LMCAS::detail::transcendental::decompose_exp_base_pattern ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context )

在文件 transcendental_patterns.cpp 第 287 行定义.

289 {
290 if (!expr || !node(expr)) {
291 return std::nullopt;
292 }
293 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node(expr))) {
294 auto pattern = power_pattern(*power, var, context);
295 if (pattern) {
296 pattern->rhs = SymbolicExpr::number(0);
297 return pattern;
298 }
299 }
300 if (auto sum = std::dynamic_pointer_cast<const AddNode>(node(expr))) {
301 return additive_power_pattern(*sum, var, context);
302 }
303 return std::nullopt;
304}
std::size_t std::size_t ComputationContext & context

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

被这些函数引用 decompose_exp_base_pattern() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl().

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

◆ decompose_lambert_w_pattern()

std::optional< LambertWPattern > LMCAS::detail::transcendental::decompose_lambert_w_pattern ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var,
ComputationContext & context )

在文件 transcendental_patterns.cpp 第 270 行定义.

271 {
272 if (!expr || !node(expr)) {
273 return std::nullopt;
274 }
275 if (auto product = std::dynamic_pointer_cast<const MultiplyNode>(node(expr))) {
276 auto inner = lambert_inner(*product, var);
277 if (inner) {
278 return LambertWPattern{*inner, SymbolicExpr::number(0)};
279 }
280 }
281 if (auto sum = std::dynamic_pointer_cast<const AddNode>(node(expr))) {
282 return additive_lambert_pattern(*sum, var, context);
283 }
284 return std::nullopt;
285}
std::optional< LambertWPattern > additive_lambert_pattern(const AddNode &sum, const std::string &var, ComputationContext &context)

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

被这些函数引用 decompose_lambert_w_pattern() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl().

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

◆ decompose_trig_exp_pattern()

std::optional< InversePattern > LMCAS::detail::transcendental::decompose_trig_exp_pattern ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & var )

在文件 transcendental_patterns.cpp 第 253 行定义.

254 {
255 if (!expr || !node(expr)) {
256 return std::nullopt;
257 }
258 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node(expr))) {
259 if (invertible_function(*function, var)) {
260 return InversePattern{function->type(),
261 make_expression_ptr(function->arguments()[0]), SymbolicExpr::number(0), nullptr};
262 }
263 }
264 if (auto sum = std::dynamic_pointer_cast<const AddNode>(node(expr))) {
265 return additive_function_pattern(*sum, var);
266 }
267 return std::nullopt;
268}
std::optional< InversePattern > additive_function_pattern(const AddNode &sum, const std::string &var)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 decompose_trig_exp_pattern(), LMCAS::function(), LMCAS::detail::make_expression_ptr() , 以及 LMCAS::detail::node().

被这些函数引用 decompose_trig_exp_pattern(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl().

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

◆ invert_exp_base()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::detail::transcendental::invert_exp_base ( const std::shared_ptr< SymbolicExpr > & base,
const std::shared_ptr< SymbolicExpr > & c,
ComputationContext & context )

在文件 transcendental_inversion.cpp 第 45 行定义.

47 {
48 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
49 (context).limits().max_ast_nodes, "transform");
50
51 lmmc_real_t c_val;
52 if (try_evaluate_numeric(c, c_val, context)) {
53 if (c_val <= 0.0) {
54 return {};
55 }
56 }
57
58 auto ln_c = SymbolicExpr::ln(c);
59 auto ln_a = SymbolicExpr::ln(base);
60 auto sol = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(ln_c, ln_a)), transform_budget));
61 return {sol};
62}
bool try_evaluate_numeric(const std::shared_ptr< SymbolicExpr > &expr, lmmc_real_t &out, ComputationContext &context)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const VectorField const VectorField & c

引用了 LMCAS::c, LMCAS::detail::context, invert_exp_base(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 try_evaluate_numeric().

被这些函数引用 invert_exp_base() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl().

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

◆ invert_function()

SolveResult LMCAS::detail::transcendental::invert_function ( const InversePattern & pattern,
const ExprPtr & original,
const std::string & var,
ComputationContext & context,
const SolveOptions & options )

在文件 transcendental_inversion.cpp 第 316 行定义.

318 {
319 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
320 (context).limits().max_ast_nodes, "transform");
321 auto step = context.consume_steps(1, "solve.inverse");
322 if (!step) { return SolveResult::failure(step.error()); }
323 std::optional<detail::AssumptionFacts> assumption_facts;
324 if (context.assumptions()) { assumption_facts.emplace(*context.assumptions()); }
325 const FactsQuery& facts = assumption_facts ? static_cast<const FactsQuery&>(*assumption_facts) :
327 auto rhs = pattern.rhs;
328 if (pattern.coefficient) {
330 if (!nonzero) { return SolveResult::failure(nonzero.error()); }
331 if (nonzero.value() != Tribool::True) { return conditional_preimage(original, var); }
332 rhs = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(rhs, pattern.coefficient)), transform_budget));
333 }
334 switch (pattern.func_type) {
338 return invert_trigonometric(pattern, rhs, original, var, facts, context);
340 return invert_exponential(rhs, original, var, facts, context);
342 return invert_logarithm(rhs, original, var, facts, context);
343 default:
345 "Inverse requires a complete solution-set representation", "solve.inverse");
346 }
347} catch (const CasError& error) {
348 return SolveResult::failure(error);
349} catch (const std::bad_alloc&) {
350 return SolveResult::failure(CasErrc::ResourceLimit, "allocation failed", "invert_function");
351} catch (const std::length_error& error) {
352 return SolveResult::failure(CasErrc::ResourceLimit, error.what(), "invert_function");
353} catch (const std::exception& error) {
354 return SolveResult::failure(CasErrc::InternalInvariant, error.what(), "invert_function");
355}
static Result failure(CasErrc code, std::string message, std::string operation={})
SolveResult invert_trigonometric(const InversePattern &pattern, const ExprPtr &rhs, const ExprPtr &original, const std::string &var, const FactsQuery &facts, ComputationContext &context)
SolveResult invert_exponential(const ExprPtr &rhs, const ExprPtr &original, const std::string &var, const FactsQuery &facts, ComputationContext &context)
SolveResult invert_logarithm(const ExprPtr &rhs, const ExprPtr &original, const std::string &var, const FactsQuery &facts, ComputationContext &context)
SolutionSet conditional_preimage(const ExprPtr &original, const std::string &var)
ExactRealAlgebraic rhs
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const FactsQuery & no_facts() noexcept
RewriteBudget const FactsQuery & facts
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Real
Real numbers
@ True
Property definitely holds
const ExprPtr & rhs

引用了 LMCAS::detail::transcendental::InversePattern::coefficient, conditional_preimage(), LMCAS::detail::context, LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Exp, LMCAS::detail::facts, LMCAS::Result< SolutionSet >::failure(), LMCAS::detail::transcendental::InversePattern::func_type, LMCAS::Inconclusive, invert_function(), LMCAS::FunctionNode::Ln, LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_nonzero_value(), LMCAS::Real, LMCAS::detail::rhs, LMCAS::detail::transcendental::InversePattern::rhs, LMCAS::FunctionNode::Sin, LMCAS::FunctionNode::Tan , 以及 LMCAS::True.

被这些函数引用 invert_function(), LMCAS::anonymous_namespace{solve_mixed_transcendental.cpp}::MixedRootCollection::solve() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_function_pattern().

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

◆ invert_lambert_w()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::detail::transcendental::invert_lambert_w ( const std::shared_ptr< SymbolicExpr > & c,
ComputationContext & context )

在文件 transcendental_inversion.cpp 第 32 行定义.

33 {
34
35 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
36 (context).limits().max_ast_nodes, "transform");
37
38 auto sol = SymbolicExpr::lambertw(c);
39 if (!sol) {
40 return {};
41 }
42 return {detail::make_expression_ptr(detail::normalize_node(detail::node(sol), transform_budget))};
43}

引用了 LMCAS::c, LMCAS::detail::context, invert_lambert_w(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 LMCAS::detail::normalize_node().

被这些函数引用 invert_lambert_w() , 以及 LMCAS::anonymous_namespace{solve_transcendental.cpp}::solve_transcendental_impl().

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

◆ try_evaluate_numeric()

bool LMCAS::detail::transcendental::try_evaluate_numeric ( const std::shared_ptr< SymbolicExpr > & expr,
lmmc_real_t & out,
ComputationContext & context )

在文件 transcendental_inversion.cpp 第 20 行定义.

22 {
23 if (!expr) return false;
24 auto numeric = detail::try_finite_numeric(*expr, context);
25 if (!numeric) {
26 return false;
27 }
28 out = static_cast<lmmc_real_t>(*numeric);
29 return true;
30}
std::optional< double > try_finite_numeric(const SymbolicExpr &expression, ComputationContext &context)

引用了 LMCAS::detail::context, try_evaluate_numeric() , 以及 LMCAS::detail::try_finite_numeric().

被这些函数引用 invert_exp_base(), LMCAS::detail::transcendental::anonymous_namespace{transcendental_patterns.cpp}::power_pattern() , 以及 try_evaluate_numeric().

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