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

命名空间

namespace  anonymous_namespace{inequality_solver_ordering.cpp}

类型定义

using RootMultiplicityList = std::vector<std::pair<std::shared_ptr<SymbolicExpr>, int>>

函数

static void append_affine_root (RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, ComputationContext &context)
static void append_factor_roots (RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, const std::string &variable, ComputationContext &context)
static void append_quadratic_roots (RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, ComputationContext &context)
static void append_verified_roots (RootMultiplicityList &result, const Polynomial< Rational > &polynomial, const std::vector< std::shared_ptr< SymbolicExpr > > &roots, int multiplicity, ComputationContext &context)
IntervalUnion build_parametric_intervals (const std::vector< std::shared_ptr< SymbolicExpr > > &symbolic_roots, const std::vector< int > &multiplicities, int leading_sign, InequalityType type, ComputationContext &context)
static bool close_symbolic_endpoint (Endpoint &endpoint, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
bool depends_on_any_param (const std::shared_ptr< SymbolicExpr > &expr, const std::vector< std::string > &parameters)
int determine_leading_sign (const Polynomial< SymbolicPolyCoeff > &poly, ComputationContext &context)
int exact_numeric_sign (const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context)
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)
void include_numeric_root (std::vector< Interval > &intervals, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
static void include_symbolic_root (std::vector< Interval > &intervals, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
bool root_less_than (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
bool roots_equal (const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
static std::vector< Interval > select_open_intervals (const std::vector< std::shared_ptr< SymbolicExpr > > &roots, const std::vector< int > &signs, int target_sign)
static std::shared_ptr< SymbolicExpr > snap_verified_integer_root (const Polynomial< Rational > &poly, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
Result< IntervalUnion > solve_exact_affine_inequality (const Polynomial< Rational > &polynomial, InequalityType type, ComputationContext &context)
Result< IntervalUnion > solve_exact_polynomial_inequality (const Polynomial< Rational > &polynomial, InequalityType type, ComputationContext &context)
std::vector< std::shared_ptr< SymbolicExpr > > solve_symbolic_poly (const Polynomial< SymbolicPolyCoeff > &poly, const std::string &variable, ComputationContext &context)
std::optional< double > try_checked_numeric_constant (const SymbolicExpr &expr, ComputationContext &context)

类型定义说明

◆ RootMultiplicityList

using LMCAS::detail::inequality_support::RootMultiplicityList = std::vector<std::pair<std::shared_ptr<SymbolicExpr>, int>>

在文件 inequality_solver_numeric.cpp 第 112 行定义.

函数说明

◆ append_affine_root()

void LMCAS::detail::inequality_support::append_affine_root ( RootMultiplicityList & result,
const Polynomial< Rational > & factor,
int mult,
ComputationContext & context )
static

在文件 inequality_solver_numeric.cpp 第 130 行定义.

132 {
133 Rational a = factor.coeffs[1];
134 Rational b = factor.coeffs[0];
135 if (a != Rational(0)) {
136 Rational root_val = Rational(0) - b / a;
137 auto root_expr = SymbolicExpr::number(root_val);
138 if (try_checked_numeric_constant(*root_expr, context)) {
139 result.push_back({root_expr, mult});
140 }
141 }
142}
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
std::optional< double > try_checked_numeric_constant(const SymbolicExpr &expr, ComputationContext &context)
std::size_t std::size_t 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

引用了 LMCAS::a, append_affine_root(), LMCAS::b, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::detail::context , 以及 try_checked_numeric_constant().

被这些函数引用 append_affine_root() , 以及 find_roots_with_multiplicity().

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

◆ append_factor_roots()

void LMCAS::detail::inequality_support::append_factor_roots ( RootMultiplicityList & result,
const Polynomial< Rational > & factor,
int mult,
const std::string & variable,
ComputationContext & context )
static

在文件 inequality_solver_numeric.cpp 第 183 行定义.

185 {
186 std::vector<SymbolicPolyCoeff> spc_coeffs;
187 for (int i = 0; i <= factor.degree(); ++i) {
188 spc_coeffs.push_back(SymbolicPolyCoeff(SymbolicExpr::number(factor.coeffs[i])));
189 }
190 Polynomial<SymbolicPolyCoeff> factor_spc(spc_coeffs, variable);
191
193 factor_spc, variable, context);
194 append_verified_roots(result, factor, factor_roots, mult, context);
195}
一元多项式模板类
int degree() const
获取多项式的次数
static void append_verified_roots(RootMultiplicityList &result, const Polynomial< Rational > &polynomial, const std::vector< std::shared_ptr< SymbolicExpr > > &roots, int multiplicity, ComputationContext &context)
const std::string & variable
std::vector< std::shared_ptr< SymbolicExpr > > solve_by_factoring_impl(const Polynomial< SymbolicPolyCoeff > &polynomial, const std::string &variable, ComputationContext &context)

引用了 LMCAS::SymbolicPolyCoeff::SymbolicPolyCoeff(), append_factor_roots(), append_verified_roots(), LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::detail::context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl() , 以及 LMCAS::detail::variable.

被这些函数引用 append_factor_roots() , 以及 find_roots_with_multiplicity().

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

◆ append_quadratic_roots()

void LMCAS::detail::inequality_support::append_quadratic_roots ( RootMultiplicityList & result,
const Polynomial< Rational > & factor,
int mult,
ComputationContext & context )
static

在文件 inequality_solver_numeric.cpp 第 144 行定义.

146 {
147 Rational a = factor.coeffs[2];
148 Rational b = factor.coeffs[1];
149 Rational c = factor.coeffs[0];
150
151 Rational disc = b * b - Rational(4) * a * c;
152 if (disc < Rational(0)) {
153 return;
154 }
155 double disc_val = disc.to_double();
156
157 double a_val = a.to_double();
158 double b_val = b.to_double();
159 double sqrt_disc = std::sqrt(disc_val);
160
161 double r1;
162 double r2;
163 if (sqrt_disc == 0.0) {
164 r1 = -b_val / (2.0 * a_val);
165 r2 = r1;
166 } else {
167 const double q =
168 -0.5 * b_val - 0.5 * std::copysign(sqrt_disc, b_val);
169 r1 = q / a_val;
170 r2 = c.to_double() / q;
171 }
172
173 if (std::isfinite(r1)) {
174 auto root = snap_verified_integer_root(factor, SymbolicExpr::number(r1), context);
175 result.push_back({root, mult});
176 }
177 if (std::isfinite(r2) && r2 != r1) {
178 auto root = snap_verified_integer_root(factor, SymbolicExpr::number(r2), context);
179 result.push_back({root, mult});
180 }
181}
static std::shared_ptr< SymbolicExpr > snap_verified_integer_root(const Polynomial< Rational > &poly, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
const VectorField const VectorField & c

引用了 LMCAS::a, append_quadratic_roots(), LMCAS::b, LMCAS::c, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::detail::context , 以及 snap_verified_integer_root().

被这些函数引用 append_quadratic_roots() , 以及 find_roots_with_multiplicity().

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

◆ append_verified_roots()

void LMCAS::detail::inequality_support::append_verified_roots ( RootMultiplicityList & result,
const Polynomial< Rational > & polynomial,
const std::vector< std::shared_ptr< SymbolicExpr > > & roots,
int multiplicity,
ComputationContext & context )
static

在文件 inequality_solver_numeric.cpp 第 114 行定义.

118 {
119 for (const auto& root : roots) {
120 if (!root) {
121 continue;
122 }
123 auto verified = snap_verified_integer_root(polynomial, root, context);
124 if (try_checked_numeric_constant(*verified, context)) {
125 result.push_back({verified, multiplicity});
126 }
127 }
128}
std::size_t std::size_t multiplicity
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)

引用了 append_verified_roots(), LMCAS::detail::context, LMCAS::detail::multiplicity, LMCAS::roots(), snap_verified_integer_root() , 以及 try_checked_numeric_constant().

被这些函数引用 append_factor_roots(), append_verified_roots() , 以及 find_roots_with_multiplicity().

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

◆ build_parametric_intervals()

IntervalUnion LMCAS::detail::inequality_support::build_parametric_intervals ( const std::vector< std::shared_ptr< SymbolicExpr > > & symbolic_roots,
const std::vector< int > & multiplicities,
int leading_sign,
InequalityType type,
ComputationContext & context )

在文件 inequality_solver_chart.cpp 第 86 行定义.

90 {
91
92 if (symbolic_roots.empty()) {
93
94 bool want_positive = (type == InequalityType::GreaterThan || type == InequalityType::GreaterEqual);
95 int target_sign = want_positive ? 1 : -1;
96 if (leading_sign == target_sign) {
97 return IntervalUnion::entire_line();
98 }
99 return IntervalUnion::empty();
100 }
101
102 size_t n = symbolic_roots.size();
103 std::vector<int> interval_signs(n + 1);
104
105 interval_signs[n] = leading_sign;
106
107 for (int i = (int)n - 1; i >= 0; --i) {
108 interval_signs[i] = interval_signs[i + 1];
109 if (multiplicities[i] % 2 != 0) {
110 interval_signs[i] = -interval_signs[i];
111 }
112 }
113
114 bool want_positive = (type == InequalityType::GreaterThan || type == InequalityType::GreaterEqual);
115 bool is_strict = (type == InequalityType::GreaterThan || type == InequalityType::LessThan);
116 int target_sign = want_positive ? 1 : -1;
117
118 auto result_intervals = select_open_intervals(symbolic_roots, interval_signs, target_sign);
119
120 if (!is_strict) {
121 for (const auto& root : symbolic_roots) include_symbolic_root(result_intervals, root, context);
122 }
123 return IntervalUnion(result_intervals);
124}
static std::vector< Interval > select_open_intervals(const std::vector< std::shared_ptr< SymbolicExpr > > &roots, const std::vector< int > &signs, int target_sign)
static void include_symbolic_root(std::vector< Interval > &intervals, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)

引用了 build_parametric_intervals(), LMCAS::detail::context, LMCAS::GreaterEqual, LMCAS::GreaterThan, include_symbolic_root(), LMCAS::LessThan , 以及 select_open_intervals().

被这些函数引用 build_parametric_intervals() , 以及 LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::quadratic_solution().

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

◆ close_symbolic_endpoint()

bool LMCAS::detail::inequality_support::close_symbolic_endpoint ( Endpoint & endpoint,
const std::shared_ptr< SymbolicExpr > & root,
ComputationContext & context )
static

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

33 {
34
35 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
36 (context).limits().max_ast_nodes, "transform");
37 if (detail::node(endpoint.value)->equals(*detail::node(root))) {
38 endpoint.is_open = false;
39 return true;
40 }
41 auto diff = SymbolicExpr::add(endpoint.value,
42 SymbolicExpr::multiply(root, SymbolicExpr::number(-1)));
43 if (!detail::make_expression_ptr(detail::normalize_node(detail::node(diff), transform_budget))->is_zero()) {
44 return false;
45 }
46 endpoint.is_open = false;
47 return true;
48}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

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

被这些函数引用 close_symbolic_endpoint() , 以及 include_symbolic_root().

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

◆ depends_on_any_param()

bool LMCAS::detail::inequality_support::depends_on_any_param ( const std::shared_ptr< SymbolicExpr > & expr,
const std::vector< std::string > & parameters )

在文件 inequality_solver_numeric.cpp 第 237 行定义.

238 {
239 if (!expr || !LMCAS::detail::node(expr)) {
240 return false;
241 }
242 for (const auto& param : parameters) {
244 return true;
245 }
246 }
247 return false;
248}
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)

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

被这些函数引用 depends_on_any_param().

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

◆ determine_leading_sign()

int LMCAS::detail::inequality_support::determine_leading_sign ( const Polynomial< SymbolicPolyCoeff > & poly,
ComputationContext & context )

在文件 inequality_solver_numeric.cpp 第 55 行定义.

56 {
57 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
58 (context).limits().max_ast_nodes, "transform");
59 if (poly.is_zero()) {
60 return 0;
61 }
62 auto lc = poly.lead_coeff().val;
63 if (!lc) {
64 return 1;
65 }
66 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(lc), transform_budget));
67 if (!simplified) {
68 return 1;
69 }
70
71 if (auto val = try_checked_numeric_constant(*simplified, context)) {
72 if (*val > 0) {
73 return 1;
74 }
75 if (*val < 0) {
76 return -1;
77 }
78 }
79
80 if (auto num = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(simplified))) {
81 if (std::holds_alternative<BigInt>(num->value())) {
82 return std::get<BigInt>(num->value()).is_negative() ? -1 : 1;
83 }
84 if (std::holds_alternative<Rational>(num->value())) {
85 return std::get<Rational>(num->value()).get_numerator().is_negative() ? -1 : 1;
86 }
87 }
88 return 1;
89}
bool is_zero() const
判断是否为零多项式
CoeffType lead_coeff() const
获取首项系数
std::shared_ptr< SymbolicExpr > num(int value)

引用了 LMCAS::detail::context, determine_leading_sign(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::Polynomial< CoeffType >::lead_coeff(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::polynomial_solver_detail::num() , 以及 try_checked_numeric_constant().

被这些函数引用 determine_leading_sign().

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

◆ exact_numeric_sign()

int LMCAS::detail::inequality_support::exact_numeric_sign ( const std::shared_ptr< SymbolicExpr > & expr,
ComputationContext & context )

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

27 {
28 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
29 (context).limits().max_ast_nodes, "transform");
30 if (!expr || !LMCAS::detail::node(expr)) {
31 return 0;
32 }
33 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(expr), transform_budget));
34 if (!simplified || !LMCAS::detail::node(simplified)) {
35 return 0;
36 }
37 auto num = std::dynamic_pointer_cast<const NumberNode>(LMCAS::detail::node(simplified));
38 if (!num) {
39 return 0;
40 }
41 if (std::holds_alternative<BigInt>(num->value())) {
42 const auto& value = std::get<BigInt>(num->value());
43 if (value.is_zero()) {
44 return 0;
45 }
46 return value.is_negative() ? -1 : 1;
47 }
48 const auto& value = std::get<Rational>(num->value());
49 if (value.get_numerator().is_zero()) {
50 return 0;
51 }
52 return value.get_numerator().is_negative() ? -1 : 1;
53}
const std::string const ExprPtr & value

引用了 LMCAS::detail::context, exact_numeric_sign(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::polynomial_solver_detail::num() , 以及 LMCAS::value.

被这些函数引用 exact_numeric_sign() , 以及 LMCAS::solve_constant_inequality().

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

◆ find_roots_with_multiplicity()

std::vector< std::pair< std::shared_ptr< SymbolicExpr >, int > > LMCAS::detail::inequality_support::find_roots_with_multiplicity ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & variable,
ComputationContext & context )

在文件 inequality_solver_numeric.cpp 第 197 行定义.

199 {
200
201 std::vector<std::pair<std::shared_ptr<SymbolicExpr>, int>> result;
202
203 auto converted = symbolic_to_poly<Rational>(expr, variable);
204 if (!converted) throw std::invalid_argument(converted.error().message);
205 const auto& poly_rat = converted.value();
206 if (poly_rat.is_zero() || poly_rat.degree() <= 0) {
207 return result;
208 }
209
210 auto factors = square_free_factorization(poly_rat);
211 if (factors.empty()) {
212 auto symbolic = symbolic_to_poly<SymbolicPolyCoeff>(expr, variable);
213 if (!symbolic) throw std::invalid_argument(symbolic.error().message);
214 const auto& poly_spc = symbolic.value();
215 if (!poly_spc.is_zero() && poly_spc.degree() >= 1) {
217 poly_spc, variable, context);
218 append_verified_roots(result, poly_rat, roots, 1, context);
219 }
220 return result;
221 }
222 for (const auto& [factor, mult] : factors) {
223 if (factor.degree() <= 0) {
224 continue;
225 }
226 if (factor.degree() == 1) {
227 append_affine_root(result, factor, mult, context);
228 } else if (factor.degree() == 2) {
229 append_quadratic_roots(result, factor, mult, context);
230 } else {
231 append_factor_roots(result, factor, mult, variable, context);
232 }
233 }
234 return result;
235}
static void append_affine_root(RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, ComputationContext &context)
static void append_quadratic_roots(RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, ComputationContext &context)
static void append_factor_roots(RootMultiplicityList &result, const Polynomial< Rational > &factor, int mult, const std::string &variable, ComputationContext &context)
std::vector< std::pair< Polynomial< Rational >, int > > square_free_factorization(const Polynomial< Rational > &poly)

引用了 append_affine_root(), append_factor_roots(), append_quadratic_roots(), append_verified_roots(), LMCAS::detail::context, find_roots_with_multiplicity(), LMCAS::roots(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl(), LMCAS::square_free_factorization() , 以及 LMCAS::detail::variable.

被这些函数引用 find_roots_with_multiplicity(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points() , 以及 LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::zero_numerator_domain().

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

◆ include_numeric_root()

void LMCAS::detail::inequality_support::include_numeric_root ( std::vector< Interval > & intervals,
const std::shared_ptr< SymbolicExpr > & root,
ComputationContext & context )

在文件 inequality_solver_chart.cpp 第 11 行定义.

13 {
14 bool merged = false;
15 for (auto& interval : intervals) {
16 if (!interval.upper.is_pos_infinity && interval.upper.value &&
17 roots_equal(interval.upper.value, root, context)) {
18 interval.upper.is_open = false;
19 merged = true;
20 }
21 if (!interval.lower.is_neg_infinity && interval.lower.value &&
22 roots_equal(interval.lower.value, root, context)) {
23 interval.lower.is_open = false;
24 merged = true;
25 }
26 }
27 if (!merged) {
28 intervals.push_back(Interval::point(root));
29 }
30}
bool roots_equal(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)

引用了 LMCAS::detail::context, include_numeric_root(), LMCAS::interval(), roots_equal() , 以及 LMCAS::Result< T >::value().

被这些函数引用 include_numeric_root() , 以及 LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::include_rational_zeros().

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

◆ include_symbolic_root()

void LMCAS::detail::inequality_support::include_symbolic_root ( std::vector< Interval > & intervals,
const std::shared_ptr< SymbolicExpr > & root,
ComputationContext & context )
static

在文件 inequality_solver_chart.cpp 第 50 行定义.

51 {
52 bool merged = false;
53 for (auto& interval : intervals) {
54 if (!interval.upper.is_pos_infinity && interval.upper.value) {
55 if (close_symbolic_endpoint(interval.upper, root, context)) {
56 merged = true;
57 }
58 }
59 if (!interval.lower.is_neg_infinity && interval.lower.value) {
60 if (close_symbolic_endpoint(interval.lower, root, context)) {
61 merged = true;
62 }
63 }
64 }
65 if (!merged) {
66 intervals.push_back(Interval::point(root));
67 }
68}
static bool close_symbolic_endpoint(Endpoint &endpoint, const std::shared_ptr< SymbolicExpr > &root, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 close_symbolic_endpoint(), LMCAS::detail::context, include_symbolic_root(), LMCAS::interval() , 以及 LMCAS::Result< T >::value().

被这些函数引用 build_parametric_intervals() , 以及 include_symbolic_root().

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

◆ root_less_than()

bool LMCAS::detail::inequality_support::root_less_than ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 inequality_solver_ordering.cpp 第 99 行定义.

100 {
101 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
102 (context).limits().max_ast_nodes, "transform");
103 if (!a || !b) {
104 return false;
105 }
108 if (va && vb) {
109 return *va < *vb;
110 }
111 auto diff = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(a, SymbolicExpr::multiply(b, SymbolicExpr::number(-1)))), transform_budget));
112 if (auto vd = try_checked_numeric_constant(*diff, context)) {
113 return *vd < 0;
114 }
115 return root_expression_sign(diff, context) < 0;
116}

引用了 LMCAS::a, LMCAS::b, LMCAS::detail::context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), root_less_than() , 以及 try_checked_numeric_constant().

被这些函数引用 root_less_than().

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

◆ roots_equal()

bool LMCAS::detail::inequality_support::roots_equal ( const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context )

在文件 inequality_solver_ordering.cpp 第 118 行定义.

119 {
120 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
121 (context).limits().max_ast_nodes, "transform");
122 if (!a || !b) {
123 return false;
124 }
125 auto numeric_a = try_checked_numeric_constant(*a, context);
126 auto numeric_b = try_checked_numeric_constant(*b, context);
127 if (numeric_a && numeric_b) {
128 return *numeric_a == *numeric_b;
129 }
130 auto difference = SymbolicExpr::add(
131 a,
132 SymbolicExpr::multiply(SymbolicExpr::number(-1), b));
133 auto simplified = difference ? detail::make_expression_ptr(detail::normalize_node(detail::node(difference), transform_budget)) : nullptr;
134 return simplified && simplified->is_zero();
135}

引用了 LMCAS::a, LMCAS::b, LMCAS::detail::context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), roots_equal() , 以及 try_checked_numeric_constant().

被这些函数引用 include_numeric_root(), LMCAS::anonymous_namespace{inequality_solver_rational.cpp}::rational_critical_points() , 以及 roots_equal().

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

◆ select_open_intervals()

std::vector< Interval > LMCAS::detail::inequality_support::select_open_intervals ( const std::vector< std::shared_ptr< SymbolicExpr > > & roots,
const std::vector< int > & signs,
int target_sign )
static

在文件 inequality_solver_chart.cpp 第 70 行定义.

72 {
73 std::vector<Interval> intervals;
74 for (size_t index = 0; index < signs.size(); ++index) {
75 if (signs[index] != target_sign) {
76 continue;
77 }
78 Interval interval;
79 interval.lower = index == 0 ? Endpoint::neg_inf() : Endpoint::open(roots[index - 1]);
80 interval.upper = index == roots.size() ? Endpoint::pos_inf() : Endpoint::open(roots[index]);
81 intervals.push_back(interval);
82 }
83 return intervals;
84}

引用了 LMCAS::interval(), LMCAS::roots() , 以及 select_open_intervals().

被这些函数引用 build_parametric_intervals() , 以及 select_open_intervals().

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

◆ snap_verified_integer_root()

std::shared_ptr< SymbolicExpr > LMCAS::detail::inequality_support::snap_verified_integer_root ( const Polynomial< Rational > & poly,
const std::shared_ptr< SymbolicExpr > & root,
ComputationContext & context )
static

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

93 {
94 if (!root || poly.is_zero()) {
95 return root;
96 }
97 auto numeric = try_checked_numeric_constant(*root, context);
98 if (!numeric) {
99 return root;
100 }
101
102 const Rational candidate = Rational::from_double(*numeric);
103 if (!candidate.is_integer()) {
104 return root;
105 }
106 if (poly.eval(candidate) == Rational(0)) {
107 return SymbolicExpr::number(candidate);
108 }
109 return root;
110}
CoeffType eval(const CoeffType &val) const
对多项式求值(Horner 法)

引用了 LMCAS::detail::context, LMCAS::Polynomial< CoeffType >::eval(), LMCAS::Polynomial< CoeffType >::is_zero(), snap_verified_integer_root() , 以及 try_checked_numeric_constant().

被这些函数引用 append_quadratic_roots(), append_verified_roots() , 以及 snap_verified_integer_root().

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

◆ solve_exact_affine_inequality()

Result< IntervalUnion > LMCAS::detail::inequality_support::solve_exact_affine_inequality ( const Polynomial< Rational > & polynomial,
InequalityType type,
ComputationContext & context )

在文件 inequality_solver_polynomial.cpp 第 463 行定义.

466 {
467 return solve_exact_affine_inequality_impl(polynomial, type, context);
468}

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

被这些函数引用 solve_exact_affine_inequality().

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

◆ solve_exact_polynomial_inequality()

Result< IntervalUnion > LMCAS::detail::inequality_support::solve_exact_polynomial_inequality ( const Polynomial< Rational > & polynomial,
InequalityType type,
ComputationContext & context )

在文件 inequality_solver_polynomial.cpp 第 470 行定义.

473 {
474 return solve_exact_polynomial_inequality_impl(polynomial, type, context);
475}

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

被这些函数引用 solve_exact_polynomial_inequality().

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

◆ solve_symbolic_poly()

std::vector< std::shared_ptr< SymbolicExpr > > LMCAS::detail::inequality_support::solve_symbolic_poly ( const Polynomial< SymbolicPolyCoeff > & poly,
const std::string & variable,
ComputationContext & context )

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

252 {
253 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
254 (context).limits().max_ast_nodes, "transform");
255
256 if (poly.is_zero() || poly.degree() < 1) {
257 return {};
258 }
259
260 int deg = poly.degree();
261 auto get_coeff = [&](int d) -> std::shared_ptr<SymbolicExpr> {
262 if (d < 0 || d > deg) {
263 return SymbolicExpr::number(0);
264 }
265 return poly.coeffs[d].val ? poly.coeffs[d].val : SymbolicExpr::number(0);
266 };
267
268 if (deg == 1) {
269
270 auto a = get_coeff(1);
271 auto b = get_coeff(0);
272 auto neg_b = SymbolicExpr::multiply(b, SymbolicExpr::number(-1));
273 auto root = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::divide(neg_b, a)), transform_budget));
274 return { root };
275 }
276
278 return results;
279}
std::shared_ptr< SymbolicExpr > get_coeff(const Polynomial< SymbolicPolyCoeff > &p, int deg)

引用了 LMCAS::a, LMCAS::b, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::detail::context, LMCAS::Polynomial< CoeffType >::degree(), LMCAS::get_coeff(), LMCAS::Polynomial< CoeffType >::is_zero(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::polynomial_solver_detail::solve_by_factoring_impl(), solve_symbolic_poly() , 以及 LMCAS::detail::variable.

被这些函数引用 solve_symbolic_poly().

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

◆ try_checked_numeric_constant()

std::optional< double > LMCAS::detail::inequality_support::try_checked_numeric_constant ( const SymbolicExpr & expr,
ComputationContext & context )

在文件 inequality_solver_numeric.cpp 第 21 行定义.

22 {
24}
std::optional< double > try_finite_numeric(const SymbolicExpr &expression, ComputationContext &context)

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

被这些函数引用 append_affine_root(), append_verified_roots(), determine_leading_sign(), root_less_than(), LMCAS::detail::inequality_support::anonymous_namespace{inequality_solver_ordering.cpp}::root_power_sign(), roots_equal(), snap_verified_integer_root() , 以及 try_checked_numeric_constant().

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