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

函数

std::optional< ComparableEndpoint > combine_surd_product (const ComparableEndpoint &left, const ComparableEndpoint &right)
std::optional< ComparableEndpoint > combine_surd_sum (const ComparableEndpoint &left, const ComparableEndpoint &right)
Result< ComparableEndpoint > comparable_finite_endpoint (const Endpoint &endpoint, ComputationContext &context, const std::string &operation)
Result< ComparableEndpoint > comparable_number (const NumberNode &number, ComputationContext &, const std::string &)
Result< ComparableEndpoint > comparable_root (const RootOfNode &root, ComputationContext &context, const std::string &operation)
Result< ComparableEndpoint > comparable_surd (ComparableEndpoint surd, ComputationContext &context)
bool outside_real_function_domain (const FunctionNode &function)
std::optional< ComparableEndpoint > parse_quadratic_surd (const std::shared_ptr< const SymbolicNode > &node)
std::optional< ComparableEndpoint > parse_surd_power (const PowerNode &power)
std::optional< ComparableEndpoint > parse_surd_product (const MultiplyNode &multiply)
std::optional< ComparableEndpoint > parse_surd_sum (const AddNode &add)
Result< ComparableEndpoint > unsupported_endpoint (const std::shared_ptr< const SymbolicNode > &node, const std::string &operation)

函数说明

◆ combine_surd_product()

std::optional< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::combine_surd_product ( const ComparableEndpoint & left,
const ComparableEndpoint & right )

在文件 interval_endpoint.cpp 第 63 行定义.

64 {
65 if (left.infinity != 0 || right.infinity != 0) {
66 return std::nullopt;
67 }
68 const bool left_radical = left.radical_coefficient != Rational(0);
69 const bool right_radical = right.radical_coefficient != Rational(0);
70 if (left_radical && right_radical && left.radicand != right.radicand) {
71 return std::nullopt;
72 }
73 const Rational radicand = left_radical ? left.radicand : right.radicand;
74 const Rational rational = left.rational * right.rational +
75 left.radical_coefficient * right.radical_coefficient * radicand;
76 const Rational coefficient =
77 left.rational * right.radical_coefficient +
78 left.radical_coefficient * right.rational;
79 return ComparableEndpoint{0, rational, coefficient, radicand};
80}
const ExprPtr & right
ExprResult rational(const Rational &value)

引用了 combine_surd_product(), LMCAS::detail::ComparableEndpoint::infinity, LMCAS::detail::ComparableEndpoint::radical_coefficient, LMCAS::detail::ComparableEndpoint::radicand, LMCAS::detail::ComparableEndpoint::rational, LMCAS::rational() , 以及 LMCAS::right.

被这些函数引用 combine_surd_product() , 以及 parse_surd_product().

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

◆ combine_surd_sum()

std::optional< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::combine_surd_sum ( const ComparableEndpoint & left,
const ComparableEndpoint & right )

在文件 interval_endpoint.cpp 第 44 行定义.

45 {
46 if (left.infinity != 0 || right.infinity != 0) {
47 return std::nullopt;
48 }
49 if (left.radical_coefficient != Rational(0) &&
50 right.radical_coefficient != Rational(0) &&
51 left.radicand != right.radicand) {
52 return std::nullopt;
53 }
54 const Rational radicand = left.radical_coefficient != Rational(0)
55 ? left.radicand : right.radicand;
56 return ComparableEndpoint{
57 0,
58 left.rational + right.rational,
59 left.radical_coefficient + right.radical_coefficient,
60 radicand};
61}

引用了 combine_surd_sum(), LMCAS::detail::ComparableEndpoint::infinity, LMCAS::detail::ComparableEndpoint::radical_coefficient, LMCAS::detail::ComparableEndpoint::radicand, LMCAS::detail::ComparableEndpoint::rational , 以及 LMCAS::right.

被这些函数引用 combine_surd_sum() , 以及 parse_surd_sum().

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

◆ comparable_finite_endpoint()

Result< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_finite_endpoint ( const Endpoint & endpoint,
ComputationContext & context,
const std::string & operation )

在文件 interval_endpoint.cpp 第 267 行定义.

269 {
270 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
271 (context).limits().max_ast_nodes, "transform");
272 if (!endpoint.value || !LMCAS::detail::node(endpoint.value)) {
275 "finite interval endpoint must contain an expression",
276 operation);
277 }
278
279 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(endpoint.value), transform_budget));
280 if (!simplified || !LMCAS::detail::node(simplified)) {
283 "interval endpoint simplification produced a null expression",
284 operation);
285 }
286
287 const auto& node = LMCAS::detail::node(simplified);
288 if (auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
289 return comparable_number(*number, context, operation);
290 }
291 if (auto surd = parse_quadratic_surd(node)) {
292 return comparable_surd(std::move(*surd), context);
293 }
294 if (auto root = std::dynamic_pointer_cast<const RootOfNode>(node)) {
295 return comparable_root(*root, context, operation);
296 }
298} catch (const CasError& error) {
300} catch (const std::bad_alloc&) {
302} catch (const std::length_error& error) {
304} catch (const std::exception& error) {
306}
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< ComparableEndpoint > unsupported_endpoint(const std::shared_ptr< const SymbolicNode > &node, const std::string &operation)
Result< ComparableEndpoint > comparable_number(const NumberNode &number, ComputationContext &, const std::string &)
Result< ComparableEndpoint > comparable_surd(ComparableEndpoint surd, ComputationContext &context)
Result< ComparableEndpoint > comparable_root(const RootOfNode &root, ComputationContext &context, const std::string &operation)
std::optional< ComparableEndpoint > parse_quadratic_surd(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ComputationContext const std::string & operation
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::size_t std::size_t ComputationContext & context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 comparable_finite_endpoint(), comparable_number(), comparable_root(), comparable_surd(), LMCAS::detail::context, LMCAS::Result< T >::failure(), LMCAS::InternalInvariant, LMCAS::InvalidArgument, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::operation, parse_quadratic_surd() , 以及 unsupported_endpoint().

被这些函数引用 comparable_finite_endpoint().

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

◆ comparable_number()

Result< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_number ( const NumberNode & number,
ComputationContext & ,
const std::string &  )

在文件 interval_endpoint.cpp 第 175 行定义.

177 {
178 if (std::holds_alternative<BigInt>(number.value())) {
180 0, Rational(std::get<BigInt>(number.value())),
181 Rational(0), Rational(0)});
182 }
184 0, std::get<Rational>(number.value()), Rational(0), Rational(0)});
185}
const std::variant< BigInt, Rational > & value() const noexcept
static Result success(T value)

引用了 comparable_number(), LMCAS::Result< T >::success() , 以及 LMCAS::NumberNode::value().

被这些函数引用 comparable_finite_endpoint() , 以及 comparable_number().

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

◆ comparable_root()

Result< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_root ( const RootOfNode & root,
ComputationContext & context,
const std::string & operation )

在文件 interval_endpoint.cpp 第 208 行定义.

210 {
211 auto isolated = LMCAS::detail::isolate_exact_root(
212 root.exact_id(), context, operation);
213 if (!isolated) {
214 return Result<ComparableEndpoint>::failure(isolated.error());
215 }
216 auto* real = std::get_if<LMCAS::detail::RealIsolation>(
217 &isolated.value());
218 if (!real) {
221 "interval endpoint RootOf is not real",
222 operation);
223 }
224 ComparableEndpoint endpoint_value;
225 endpoint_value.algebraic = std::move(real->value);
226 return Result<ComparableEndpoint>::success(std::move(endpoint_value));
227}
const LMCAS::detail::ExactRootId & exact_id() const noexcept
Result< RootIsolation > isolate_exact_root(const ExactRootId &root, ComputationContext &context, const std::string &operation)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
std::optional< LMCAS::detail::ExactRealAlgebraic > algebraic

引用了 LMCAS::detail::ComparableEndpoint::algebraic, comparable_root(), LMCAS::detail::context, LMCAS::DomainError, LMCAS::RootOfNode::exact_id(), LMCAS::Result< T >::failure(), LMCAS::detail::isolate_exact_root(), LMCAS::detail::operation, LMCAS::real(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 comparable_finite_endpoint() , 以及 comparable_root().

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

◆ comparable_surd()

Result< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::comparable_surd ( ComparableEndpoint surd,
ComputationContext & context )

在文件 interval_endpoint.cpp 第 187 行定义.

188 {
189 if (surd.radical_coefficient != Rational(0)) {
190 const Rational a = surd.rational;
191 const Rational b = surd.radical_coefficient;
192 const Rational d = surd.radicand;
195 a * a - b * b * d,
196 Rational(-2) * a,
197 Rational(1)
198 }),
199 b > Rational(0) ? 1 : 0, 1, context);
200 if (!algebraic) {
201 return Result<ComparableEndpoint>::failure(algebraic.error());
202 }
203 surd.algebraic = std::move(algebraic.value());
204 }
205 return Result<ComparableEndpoint>::success(std::move(surd));
206}
一元多项式模板类
ExactRealAlgebraicResult make_exact_real_algebraic(Polynomial< Rational > polynomial, std::size_t root_index, std::size_t multiplicity, 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, LMCAS::detail::ComparableEndpoint::algebraic, LMCAS::b, comparable_surd(), LMCAS::detail::context, LMCAS::Result< T >::failure(), LMCAS::detail::make_exact_real_algebraic(), LMCAS::detail::ComparableEndpoint::radical_coefficient, LMCAS::detail::ComparableEndpoint::radicand, LMCAS::detail::ComparableEndpoint::rational , 以及 LMCAS::Result< T >::success().

被这些函数引用 comparable_finite_endpoint() , 以及 comparable_surd().

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

◆ outside_real_function_domain()

bool LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::outside_real_function_domain ( const FunctionNode & function)

在文件 interval_endpoint.cpp 第 229 行定义.

229 {
230 if (function.arguments().size() != 1) {
231 return false;
232 }
233 auto argument = exact_rational_value(function.arguments()[0]);
234 if (!argument) {
235 return false;
236 }
237 if (function.type() == FunctionNode::FuncType::Ln) {
238 return *argument <= Rational(0);
239 }
240 return function.type() == FunctionNode::FuncType::Sqrt &&
241 *argument < Rational(0);
242}
@ Sqrt
对数、绝对值、平方根。
std::optional< Rational > exact_rational_value(const NumberNode &number)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::detail::exact_rational_value(), LMCAS::function(), LMCAS::FunctionNode::Ln, outside_real_function_domain() , 以及 LMCAS::FunctionNode::Sqrt.

被这些函数引用 outside_real_function_domain() , 以及 unsupported_endpoint().

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

◆ parse_quadratic_surd()

std::optional< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_quadratic_surd ( const std::shared_ptr< const SymbolicNode > & node)

在文件 interval_endpoint.cpp 第 142 行定义.

143 {
144 if (!node) {
145 return std::nullopt;
146 }
147 if (auto number = exact_rational_value(node)) {
148 return ComparableEndpoint{0, *number, Rational(0), Rational(0)};
149 }
150
151 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
152 if (function->type() != FunctionNode::FuncType::Sqrt ||
153 function->arguments().size() != 1) {
154 return std::nullopt;
155 }
156 auto radicand = exact_rational_value(function->arguments()[0]);
157 if (!radicand || *radicand <= Rational(0)) {
158 return std::nullopt;
159 }
160 return ComparableEndpoint{0, Rational(0), Rational(1), *radicand};
161 }
162
163 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
164 return parse_surd_sum(*add);
165 }
166 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
167 return parse_surd_product(*multiply);
168 }
169 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
170 return parse_surd_power(*power);
171 }
172 return std::nullopt;
173}
std::optional< ComparableEndpoint > parse_surd_product(const MultiplyNode &multiply)
std::optional< ComparableEndpoint > parse_surd_power(const PowerNode &power)
std::optional< ComparableEndpoint > parse_surd_sum(const AddNode &add)
@ Rational
Rational numbers
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::add(), LMCAS::detail::exact_rational_value(), LMCAS::function(), LMCAS::detail::node(), parse_quadratic_surd(), parse_surd_power(), parse_surd_product(), parse_surd_sum() , 以及 LMCAS::FunctionNode::Sqrt.

被这些函数引用 comparable_finite_endpoint(), parse_quadratic_surd(), parse_surd_power(), parse_surd_product() , 以及 parse_surd_sum().

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

◆ parse_surd_power()

std::optional< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_surd_power ( const PowerNode & power)

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

114 {
115 auto exponent = exact_rational_value(power.exponent());
116 if (!exponent) {
117 return std::nullopt;
118 }
119 if (*exponent == Rational(1, 2)) {
120 auto radicand = exact_rational_value(power.base());
121 if (!radicand || *radicand <= Rational(0)) {
122 return std::nullopt;
123 }
124 return ComparableEndpoint{0, Rational(0), Rational(1), *radicand};
125 }
126 auto base = parse_quadratic_surd(power.base());
127 if (!base || *exponent != Rational(-1)) {
128 return std::nullopt;
129 }
130 const Rational norm = base->rational * base->rational -
131 base->radical_coefficient * base->radical_coefficient * base->radicand;
132 if (norm == Rational(0)) {
133 return std::nullopt;
134 }
135 return ComparableEndpoint{
136 0,
137 base->rational / norm,
138 (Rational(0) - base->radical_coefficient) / norm,
139 base->radicand};
140}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
const ExprPtr & exponent

引用了 LMCAS::PowerNode::base(), LMCAS::detail::exact_rational_value(), LMCAS::exponent, LMCAS::PowerNode::exponent(), parse_quadratic_surd() , 以及 parse_surd_power().

被这些函数引用 parse_quadratic_surd() , 以及 parse_surd_power().

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

◆ parse_surd_product()

std::optional< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_surd_product ( const MultiplyNode & multiply)

在文件 interval_endpoint.cpp 第 98 行定义.

98 {
99 ComparableEndpoint result{0, Rational(1), Rational(0), Rational(0)};
100 for (const auto& operand : multiply.operands()) {
101 auto parsed = parse_quadratic_surd(operand);
102 if (!parsed) {
103 return std::nullopt;
104 }
105 auto combined = combine_surd_product(result, *parsed);
106 if (!combined) {
107 return std::nullopt;
108 }
109 result = std::move(*combined);
110 }
111 return result;
112}
std::optional< ComparableEndpoint > combine_surd_product(const ComparableEndpoint &left, const ComparableEndpoint &right)

引用了 combine_surd_product(), parse_quadratic_surd() , 以及 parse_surd_product().

被这些函数引用 parse_quadratic_surd() , 以及 parse_surd_product().

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

◆ parse_surd_sum()

std::optional< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::parse_surd_sum ( const AddNode & add)

在文件 interval_endpoint.cpp 第 82 行定义.

82 {
83 ComparableEndpoint result{0, Rational(0), Rational(0), Rational(0)};
84 for (const auto& operand : add.operands()) {
85 auto parsed = parse_quadratic_surd(operand);
86 if (!parsed) {
87 return std::nullopt;
88 }
89 auto combined = combine_surd_sum(result, *parsed);
90 if (!combined) {
91 return std::nullopt;
92 }
93 result = std::move(*combined);
94 }
95 return result;
96}
std::optional< ComparableEndpoint > combine_surd_sum(const ComparableEndpoint &left, const ComparableEndpoint &right)

引用了 LMCAS::add(), combine_surd_sum(), parse_quadratic_surd() , 以及 parse_surd_sum().

被这些函数引用 parse_quadratic_surd() , 以及 parse_surd_sum().

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

◆ unsupported_endpoint()

Result< ComparableEndpoint > LMCAS::detail::anonymous_namespace{interval_endpoint.cpp}::unsupported_endpoint ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & operation )

在文件 interval_endpoint.cpp 第 244 行定义.

245 {
246 if (auto variable = std::dynamic_pointer_cast<const VariableNode>(node);
247 variable && !variable->is_constant()) {
250 "interval endpoint contains unbound symbol '" + variable->name() + "'",
251 operation);
252 }
253 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
257 "interval endpoint is outside the real function domain",
258 operation);
259 }
260 }
263 "exact ordering of a symbolic interval endpoint is not proven",
264 operation);
265}
const std::string & variable

引用了 LMCAS::DomainError, LMCAS::Result< T >::failure(), LMCAS::function(), LMCAS::Inconclusive, LMCAS::detail::node(), LMCAS::detail::operation, outside_real_function_domain(), LMCAS::UnboundSymbol, unsupported_endpoint() , 以及 LMCAS::detail::variable.

被这些函数引用 comparable_finite_endpoint() , 以及 unsupported_endpoint().

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