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

类型定义

using PiecewiseResult = Result<PiecewiseIntervalResult>

函数

Result< void > check_arguments (const std::shared_ptr< SymbolicExpr > &expr, const std::string &variable, const std::vector< std::string > &parameters)
PiecewiseResult checked_piecewise (PiecewiseResult result, detail::RewriteBudget &budget)
PiecewiseResult constant_solution (const std::shared_ptr< SymbolicExpr > &coefficient, InequalityType type)
template<typename Node>
Result< void > exact_operands (const Node &node, const std::string &variable, const std::vector< std::string > &parameters, ComputationContext &context, std::size_t depth)
Result< void > exact_polynomial_nodes (const detail::SymbolicNodePtr &node, const std::string &variable, const std::vector< std::string > &parameters, ComputationContext &context, std::size_t depth)
PiecewiseResult inconclusive ()
Result< Interval > linear_interval (const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, InequalityType type, detail::RewriteBudget &budget)
PiecewiseResult nonlinear_solution (const std::vector< std::shared_ptr< SymbolicExpr > > &coeffs, int degree, InequalityType type, ComputationContext &context)
PiecewiseResult quadratic_solution (const std::shared_ptr< SymbolicExpr > &coefficient, InequalityType type, ComputationContext &context)
bool satisfies (int sign, InequalityType type)
std::shared_ptr< SymbolicExpr > sign_condition (const std::shared_ptr< SymbolicExpr > &coefficient, int sign)
Result< std::vector< std::shared_ptr< SymbolicExpr > > > simplify_coefficients (const Polynomial< SymbolicPolyCoeff > &poly, bool &symbolic, detail::RewriteBudget &budget)
PiecewiseResult solved_inequality (const std::shared_ptr< SymbolicExpr > &expr, InequalityType type, const std::string &variable, ComputationContext &context)
IntervalUnion zero_polynomial_solution (InequalityType type)

变量

constexpr const char * kParametricOperation = "solve_parametric_inequality_checked"

类型定义说明

◆ PiecewiseResult

using LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::PiecewiseResult = Result<PiecewiseIntervalResult>

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

函数说明

◆ check_arguments()

Result< void > LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::check_arguments ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & variable,
const std::vector< std::string > & parameters )

在文件 inequality_solver_parametric.cpp 第 181 行定义.

183 {
184 if (parameters.empty()) return Result<void>::success();
185 if (!expr || !detail::node(expr) || variable.empty()) {
187 CasErrc::InvalidArgument, "inequality expression and variable must not be empty",
189 }
190 if (std::find(parameters.begin(), parameters.end(), variable) != parameters.end()) {
192 CasErrc::InvalidArgument, "inequality variable cannot also be a parameter",
194 }
195 return Result<void>::success();
196}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
const std::string & variable

引用了 check_arguments(), LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, kParametricOperation, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 check_arguments().

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

◆ checked_piecewise()

PiecewiseResult LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::checked_piecewise ( PiecewiseResult result,
detail::RewriteBudget & budget )

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

18 {
19 if (!result) { return result; }
20 budget.consume();
21 std::size_t nodes = 0;
22 for (const auto& branch : result.value().cases) {
23 nodes = budget.append_size(nodes, budget.measure(detail::node(branch.condition)));
24 for (const auto& interval : branch.solution.intervals()) {
25 nodes = budget.append_size(nodes, budget.measure(detail::node(interval.lower.value)));
26 nodes = budget.append_size(nodes, budget.measure(detail::node(interval.upper.value)));
27 }
28 }
29 return result;
30}
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
std::size_t append_size(std::size_t current, std::size_t child)
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)

引用了 LMCAS::detail::RewriteBudget::append_size(), checked_piecewise(), LMCAS::detail::RewriteBudget::consume(), LMCAS::interval(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node() , 以及 LMCAS::Result< T >::value().

被这些函数引用 checked_piecewise().

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

◆ constant_solution()

PiecewiseResult LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::constant_solution ( const std::shared_ptr< SymbolicExpr > & coefficient,
InequalityType type )

在文件 inequality_solver_parametric.cpp 第 150 行定义.

151 {
152 PiecewiseIntervalResult result;
153 for (int sign : {1, 0, -1}) {
154 result.cases.push_back({
155 sign_condition(coefficient, sign),
156 satisfies(sign, type) ? IntervalUnion::entire_line()
157 : IntervalUnion::empty()});
158 }
159 return result;
160}
std::shared_ptr< SymbolicExpr > sign_condition(const std::shared_ptr< SymbolicExpr > &coefficient, int sign)

引用了 constant_solution(), satisfies() , 以及 sign_condition().

被这些函数引用 constant_solution() , 以及 nonlinear_solution().

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

◆ exact_operands()

template<typename Node>
Result< void > LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_operands ( const Node & node,
const std::string & variable,
const std::vector< std::string > & parameters,
ComputationContext & context,
std::size_t depth )

在文件 inequality_solver_parametric.cpp 第 102 行定义.

104 {
105 for (const auto& operand : node.operands()) {
106 auto checked = exact_polynomial_nodes(
107 operand, variable, parameters, context, depth + 1);
108 if (!checked) return checked;
109 }
110 return Result<void>::success();
111}
Result< void > exact_polynomial_nodes(const detail::SymbolicNodePtr &node, const std::string &variable, const std::vector< std::string > &parameters, ComputationContext &context, std::size_t depth)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
std::size_t std::size_t depth

引用了 LMCAS::context, LMCAS::depth, exact_operands(), exact_polynomial_nodes(), LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 exact_operands() , 以及 exact_polynomial_nodes().

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

◆ exact_polynomial_nodes()

Result< void > LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::exact_polynomial_nodes ( const detail::SymbolicNodePtr & node,
const std::string & variable,
const std::vector< std::string > & parameters,
ComputationContext & context,
std::size_t depth )

在文件 inequality_solver_parametric.cpp 第 68 行定义.

71 {
72 if (depth >= context.limits().max_recursion_depth) {
74 "parameter expression recursion limit exceeded", kParametricOperation);
75 }
76 auto step = context.consume_steps(1, kParametricOperation);
77 if (!step) return step;
78 if (const auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
80 } else if (const auto symbol = std::dynamic_pointer_cast<const VariableNode>(node)) {
81 if (!symbol->is_constant() &&
82 (symbol->name() == variable ||
83 std::find(parameters.begin(), parameters.end(), symbol->name()) != parameters.end())) {
84 return Result<void>::success();
85 }
86 } else if (const auto sum = std::dynamic_pointer_cast<const AddNode>(node)) {
87 return exact_operands(*sum, variable, parameters, context, depth);
88 } else if (const auto product = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
89 return exact_operands(*product, variable, parameters, context, depth);
90 } else if (const auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
92 power->exponent(), 0, std::numeric_limits<int>::max())) {
94 power->base(), variable, parameters, context, depth + 1);
95 }
96 }
98 "parameter expression is not an exact polynomial", kParametricOperation);
99}
Result< void > exact_operands(const Node &node, const std::string &variable, const std::vector< std::string > &parameters, ComputationContext &context, std::size_t depth)
std::optional< Rational > exact_rational_value(const NumberNode &number)
std::optional< int > exact_small_integer_node(const detail::SymbolicNodePtr &node, int min_value, int max_value)

引用了 LMCAS::context, LMCAS::depth, exact_operands(), exact_polynomial_nodes(), LMCAS::detail::exact_rational_value(), LMCAS::exact_small_integer_node(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, kParametricOperation, LMCAS::ResourceLimit, LMCAS::Result< T >::success() , 以及 LMCAS::variable.

被这些函数引用 exact_operands() , 以及 exact_polynomial_nodes().

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

◆ inconclusive()

PiecewiseResult LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::inconclusive ( )

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

32 {
35 "parameter signs or quadratic roots cannot be certified",
37}

引用了 LMCAS::Result< PiecewiseIntervalResult >::failure(), LMCAS::Inconclusive, inconclusive() , 以及 kParametricOperation.

被这些函数引用 inconclusive(), linear_interval() , 以及 nonlinear_solution().

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

◆ linear_interval()

Result< Interval > LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::linear_interval ( const std::vector< std::shared_ptr< SymbolicExpr > > & coeffs,
InequalityType type,
detail::RewriteBudget & budget )

在文件 inequality_solver_parametric.cpp 第 113 行定义.

115 {
116 const auto slope = detail::exact_rational_value(detail::node(coeffs[1]));
117 if (!slope) {
118 return Result<Interval>::failure(inconclusive().error());
119 }
120 if (*slope == Rational(0)) {
121 return Result<Interval>::failure(inconclusive().error());
122 }
123 std::optional<detail::AssumptionFacts> facts;
124 if (budget.context().assumptions()) { facts.emplace(*budget.context().assumptions()); }
126 detail::node(SymbolicExpr::divide(
127 SymbolicExpr::multiply(SymbolicExpr::number(-1), coeffs[0]), coeffs[1])),
128 budget, facts ? *facts : detail::no_facts()));
129
130 const bool greater = satisfies(1, type);
131 const bool strict = type == InequalityType::GreaterThan ||
133 const bool above = greater != slope->get_numerator().is_negative();
134 const auto endpoint = strict ? Endpoint::open(root)
135 : Endpoint::closed(root);
136 return above ? Interval{endpoint, Endpoint::pos_inf()}
137 : Interval{Endpoint::neg_inf(), endpoint};
138}
const std::shared_ptr< const AssumptionContext > & assumptions() const noexcept
ComputationContext & context() const noexcept
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const FactsQuery & no_facts() noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)

引用了 LMCAS::ComputationContext::assumptions(), LMCAS::detail::RewriteBudget::context(), LMCAS::detail::exact_rational_value(), LMCAS::Result< T >::failure(), LMCAS::GreaterThan, inconclusive(), LMCAS::LessThan, linear_interval(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 satisfies().

被这些函数引用 linear_interval().

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

◆ nonlinear_solution()

PiecewiseResult LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::nonlinear_solution ( const std::vector< std::shared_ptr< SymbolicExpr > > & coeffs,
int degree,
InequalityType type,
ComputationContext & context )

在文件 inequality_solver_parametric.cpp 第 173 行定义.

175 {
176 if (degree == 0) return constant_solution(coeffs[0], type);
177 if (!coeffs[0]->is_zero() || !coeffs[1]->is_zero()) return inconclusive();
178 return quadratic_solution(coeffs[2], type, context);
179}
PiecewiseResult constant_solution(const std::shared_ptr< SymbolicExpr > &coefficient, InequalityType type)
PiecewiseResult quadratic_solution(const std::shared_ptr< SymbolicExpr > &coefficient, InequalityType type, ComputationContext &context)

引用了 constant_solution(), LMCAS::context, inconclusive(), nonlinear_solution() , 以及 quadratic_solution().

被这些函数引用 nonlinear_solution().

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

◆ quadratic_solution()

PiecewiseResult LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::quadratic_solution ( const std::shared_ptr< SymbolicExpr > & coefficient,
InequalityType type,
ComputationContext & context )

在文件 inequality_solver_parametric.cpp 第 162 行定义.

163 {
164 PiecewiseIntervalResult result;
165 for (int sign : {1, 0, -1}) {
166 auto solution = sign == 0 ? zero_polynomial_solution(type)
167 : detail::inequality_support::build_parametric_intervals(
168 {SymbolicExpr::number(0)}, {2}, sign, type, context);
169 result.cases.push_back({sign_condition(coefficient, sign), std::move(solution)});
170 }
171 return result;
172}
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)
多元 Hensel 提升(单变量步)

引用了 LMCAS::detail::inequality_support::build_parametric_intervals(), LMCAS::context, quadratic_solution(), sign_condition() , 以及 zero_polynomial_solution().

被这些函数引用 nonlinear_solution() , 以及 quadratic_solution().

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

◆ satisfies()

bool LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::satisfies ( int sign,
InequalityType type )

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

45 {
46 switch (type) {
47 case InequalityType::GreaterThan: return sign > 0;
48 case InequalityType::GreaterEqual: return sign >= 0;
49 case InequalityType::LessThan: return sign < 0;
50 case InequalityType::LessEqual: return sign <= 0;
51 }
52 return false;
53}

引用了 LMCAS::GreaterEqual, LMCAS::GreaterThan, LMCAS::LessEqual, LMCAS::LessThan , 以及 satisfies().

被这些函数引用 constant_solution(), linear_interval() , 以及 satisfies().

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

◆ sign_condition()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::sign_condition ( const std::shared_ptr< SymbolicExpr > & coefficient,
int sign )

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

56 {
57 const auto op = sign > 0 ? RelationalNode::Op::GT
58 : sign < 0 ? RelationalNode::Op::LT : RelationalNode::Op::EQ;
60 detail::node(coefficient), detail::node(SymbolicExpr::number(0)), op));
61}
std::shared_ptr< const Node > make_node(Args &&... args)
const ExprPtr RelationOp op

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::op , 以及 sign_condition().

被这些函数引用 constant_solution(), quadratic_solution() , 以及 sign_condition().

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

◆ simplify_coefficients()

Result< std::vector< std::shared_ptr< SymbolicExpr > > > LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::simplify_coefficients ( const Polynomial< SymbolicPolyCoeff > & poly,
bool & symbolic,
detail::RewriteBudget & budget )

在文件 inequality_solver_parametric.cpp 第 198 行定义.

200 {
201 std::vector<std::shared_ptr<SymbolicExpr>> coeffs;
202 coeffs.reserve(poly.coeffs.size());
203 std::optional<detail::AssumptionFacts> facts;
204 if (budget.context().assumptions()) { facts.emplace(*budget.context().assumptions()); }
205 std::size_t nodes = 0;
206 for (const auto& coefficient : poly.coeffs) {
208 detail::node(coefficient.val), budget, facts ? *facts : detail::no_facts()));
209 nodes = budget.append_size(nodes, budget.measure(detail::node(value)));
210 if (!detail::exact_rational_value(detail::node(value))) symbolic = true;
211 coeffs.push_back(std::move(value));
212 }
213 return coeffs;
214}
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
const std::string const ExprPtr & value

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::ComputationContext::assumptions(), LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::detail::RewriteBudget::context(), LMCAS::detail::exact_rational_value(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), simplify_coefficients() , 以及 LMCAS::value.

被这些函数引用 simplify_coefficients().

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

◆ solved_inequality()

PiecewiseResult LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::solved_inequality ( const std::shared_ptr< SymbolicExpr > & expr,
InequalityType type,
const std::string & variable,
ComputationContext & context )

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

142 {
143 auto solved = InequalitySolver::solve_inequality_checked(expr, type, variable, context);
144 if (!solved) return PiecewiseResult::failure(solved.error());
145 PiecewiseIntervalResult result;
146 result.cases.push_back({nullptr, std::move(solved.value())});
147 return result;
148}

引用了 LMCAS::context, LMCAS::Result< PiecewiseIntervalResult >::failure(), solved_inequality() , 以及 LMCAS::variable.

被这些函数引用 solved_inequality().

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

◆ zero_polynomial_solution()

IntervalUnion LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::zero_polynomial_solution ( InequalityType type)

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

39 {
41 ? IntervalUnion::entire_line()
42 : IntervalUnion::empty();
43}

引用了 LMCAS::GreaterEqual, LMCAS::LessEqual , 以及 zero_polynomial_solution().

被这些函数引用 quadratic_solution() , 以及 zero_polynomial_solution().

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

变量说明

◆ kParametricOperation

const char* LMCAS::anonymous_namespace{inequality_solver_parametric.cpp}::kParametricOperation = "solve_parametric_inequality_checked"
constexpr

在文件 inequality_solver_parametric.cpp 第 14 行定义.

被这些函数引用 check_arguments(), exact_polynomial_nodes() , 以及 inconclusive().