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

类

struct  CriticalPoint

函数

bool has_unrecognized_variable_polynomial (const std::shared_ptr< SymbolicExpr > &expression, const std::string &variable)
void include_rational_zeros (std::vector< Interval > &intervals, const std::vector< CriticalPoint > &points, ComputationContext &context)
std::vector< CriticalPoint > rational_critical_points (const std::shared_ptr< SymbolicExpr > &numerator, const std::shared_ptr< SymbolicExpr > &denominator, const std::string &variable, ComputationContext &context)
std::vector< Interval > rational_sign_intervals (const std::vector< CriticalPoint > &critical_points, int combined_leading_sign, int target_sign)
IntervalUnion zero_numerator_domain (const std::shared_ptr< SymbolicExpr > &denominator, InequalityType type, const std::string &variable, ComputationContext &context)

类说明

◆ LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::CriticalPoint

struct LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::CriticalPoint

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

LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::CriticalPoint 的协作图:
类成员
int den_multiplicity
int num_multiplicity
shared_ptr< SymbolicExpr > value

函数说明

◆ has_unrecognized_variable_polynomial()

bool LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::has_unrecognized_variable_polynomial ( const std::shared_ptr< SymbolicExpr > & expression,
const std::string & variable )

在文件 inequality_solver_rational.cpp 第 123 行定义.

124 {
125 auto polynomial = symbolic_to_poly<Rational>(expression, variable);
126 return !polynomial;
127}
const std::string & variable

引用了 has_unrecognized_variable_polynomial() , 以及 LMCAS::variable.

被这些函数引用 has_unrecognized_variable_polynomial().

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

◆ include_rational_zeros()

void LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::include_rational_zeros ( std::vector< Interval > & intervals,
const std::vector< CriticalPoint > & points,
ComputationContext & context )

在文件 inequality_solver_rational.cpp 第 129 行定义.

131 {
132 for (const auto& point : points) {
133 if (point.num_multiplicity > 0 && point.den_multiplicity == 0) {
134 include_numeric_root(intervals, point.value, context);
135 }
136 }
137}
void include_numeric_root(std::vector< Interval > &intervals, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
const std::string const LimitExprPtr & point
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 LMCAS::context, LMCAS::detail::inequality_support::include_numeric_root(), include_rational_zeros() , 以及 LMCAS::point.

被这些函数引用 include_rational_zeros().

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

◆ rational_critical_points()

std::vector< CriticalPoint > LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points ( const std::shared_ptr< SymbolicExpr > & numerator,
const std::shared_ptr< SymbolicExpr > & denominator,
const std::string & variable,
ComputationContext & context )

在文件 inequality_solver_rational.cpp 第 61 行定义.

64 {
65 auto num_roots_with_mult = find_roots_with_multiplicity(numerator, variable, context);
66
67 auto den_roots_with_mult = find_roots_with_multiplicity(denominator, variable, context);
68 std::vector<CriticalPoint> critical_points;
69
70 for (const auto& [root, mult] : num_roots_with_mult) {
71 critical_points.push_back({root, mult, 0});
72 }
73 for (const auto& [root, mult] : den_roots_with_mult) {
74
75 bool found = false;
76 for (auto& cp : critical_points) {
77 if (roots_equal(cp.value, root, context)) {
78 cp.den_multiplicity = mult;
79 found = true;
80 break;
81 }
82 }
83 if (!found) {
84 critical_points.push_back({root, 0, mult});
85 }
86 }
87
88 std::sort(critical_points.begin(), critical_points.end(),
89 [&context](const CriticalPoint& a, const CriticalPoint& b) {
90 return root_less_than(a.value, b.value, context);
91 });
92 return critical_points;
93}
std::vector< std::pair< std::shared_ptr< SymbolicExpr >, int > > find_roots_with_multiplicity(const std::shared_ptr< SymbolicExpr > &expr, const std::string &variable, ComputationContext &context)
bool roots_equal(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
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 & denominator

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::denominator, LMCAS::detail::inequality_support::find_roots_with_multiplicity(), rational_critical_points(), LMCAS::detail::inequality_support::roots_equal() , 以及 LMCAS::variable.

被这些函数引用 rational_critical_points().

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

◆ rational_sign_intervals()

std::vector< Interval > LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_sign_intervals ( const std::vector< CriticalPoint > & critical_points,
int combined_leading_sign,
int target_sign )

在文件 inequality_solver_rational.cpp 第 95 行定义.

97 {
98 size_t n_cp = critical_points.size();
99 std::vector<int> interval_signs(n_cp + 1);
100
101 interval_signs[n_cp] = combined_leading_sign;
102
103 for (int i = (int)n_cp - 1; i >= 0; --i) {
104 int total_mult = critical_points[i].num_multiplicity + critical_points[i].den_multiplicity;
105 interval_signs[i] = interval_signs[i + 1];
106 if (total_mult % 2 != 0) {
107 interval_signs[i] = -interval_signs[i];
108 }
109 }
110 std::vector<Interval> result_intervals;
111 for (size_t i = 0; i <= n_cp; ++i) {
112 if (interval_signs[i] != target_sign) {
113 continue;
114 }
115 Interval interval;
116 interval.lower = i == 0 ? Endpoint::neg_inf() : Endpoint::open(critical_points[i - 1].value);
117 interval.upper = i == n_cp ? Endpoint::pos_inf() : Endpoint::open(critical_points[i].value);
118 result_intervals.push_back(interval);
119 }
120 return result_intervals;
121}
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
const std::string const ExprPtr & value

引用了 LMCAS::interval(), rational_sign_intervals() , 以及 LMCAS::value.

被这些函数引用 rational_sign_intervals().

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

◆ zero_numerator_domain()

IntervalUnion LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::zero_numerator_domain ( const std::shared_ptr< SymbolicExpr > & denominator,
InequalityType type,
const std::string & variable,
ComputationContext & context )

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

18 {
20 return IntervalUnion::empty();
21 }
22
23 auto den_roots_with_mult = find_roots_with_multiplicity(denominator, variable, context);
24 if (den_roots_with_mult.empty()) {
25 return IntervalUnion::entire_line();
26 }
27
28 std::vector<std::shared_ptr<SymbolicExpr>> den_roots;
29 for (const auto& [root, mult] : den_roots_with_mult) {
30 den_roots.push_back(root);
31 }
32 std::sort(den_roots.begin(), den_roots.end(),
33 [&context](const auto& lhs, const auto& rhs) {
34 return root_less_than(lhs, rhs, context);
35 });
36
37 std::vector<Interval> intervals;
38
39 {
40 Interval iv;
41 iv.lower = Endpoint::neg_inf();
42 iv.upper = Endpoint::open(den_roots[0]);
43 intervals.push_back(iv);
44 }
45 for (size_t i = 0; i + 1 < den_roots.size(); ++i) {
46 Interval iv;
47 iv.lower = Endpoint::open(den_roots[i]);
48 iv.upper = Endpoint::open(den_roots[i + 1]);
49 intervals.push_back(iv);
50 }
51
52 {
53 Interval iv;
54 iv.lower = Endpoint::open(den_roots.back());
55 iv.upper = Endpoint::pos_inf();
56 intervals.push_back(iv);
57 }
58 return IntervalUnion(intervals);
59}
const ExprPtr & rhs

引用了 LMCAS::context, LMCAS::denominator, LMCAS::detail::inequality_support::find_roots_with_multiplicity(), LMCAS::GreaterThan, LMCAS::LessThan, LMCAS::rhs, LMCAS::variable , 以及 zero_numerator_domain().

被这些函数引用 zero_numerator_domain().

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