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

函数

Result< bool > bool_failure (CasErrc code, std::string message, const char *operation)
Result< bool > domain_contains_complex (NumberDomain domain, const ComplexNode &node)
Result< bool > domain_contains_fractional_power (NumberDomain domain, const PowerNode &power, const Rational &exponent)
Result< bool > domain_contains_function (NumberDomain domain, const FunctionNode &function)
Result< bool > domain_contains_negative_integer_power (NumberDomain domain, const std::shared_ptr< const NumberNode > &base_number, const std::optional< Rational > &exact_base)
Result< bool > domain_contains_node (NumberDomain domain, const std::shared_ptr< const SymbolicNode > &node)
Result< bool > domain_contains_number (NumberDomain domain, const NumberNode &number)
Result< bool > domain_contains_operands (NumberDomain domain, const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
Result< bool > domain_contains_positive_integer_power (NumberDomain domain, const PowerNode &power)
Result< bool > domain_contains_power (NumberDomain domain, const PowerNode &power)
Result< bool > domain_contains_root (NumberDomain domain, const std::shared_ptr< const SymbolicNode > &node)
int domain_rank (NumberDomain domain) noexcept
bool exact_sqrt_contains (NumberDomain domain, const Rational &value)
bool function_preserves_domain (FunctionNode::FuncType type)
Result< bool > inconclusive_domain ()
bool is_undefined_zero_power (const Rational &exponent, const std::shared_ptr< const NumberNode > &base)

变量

constexpr const char * kNumberDomainOperation = "LMCAS.number_domain"

函数说明

◆ bool_failure()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::bool_failure ( CasErrc code,
std::string message,
const char * operation )

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

19 {
20 return Result<bool>::failure(code, std::move(message), operation);
21}
static Result failure(CasErrc code, std::string message, std::string operation={})

引用了 bool_failure() , 以及 LMCAS::Result< T >::failure().

被这些函数引用 bool_failure(), domain_contains_fractional_power(), domain_contains_node(), domain_contains_power() , 以及 inconclusive_domain().

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

◆ domain_contains_complex()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_complex ( NumberDomain domain,
const ComplexNode & node )

在文件 expr_number_domains.cpp 第 71 行定义.

71 {
74 if (!real) {
75 return real;
76 }
78 if (!imag) {
79 return imag;
80 }
81 return Result<bool>::success(real.value() && imag.value());
82 }
83 if (!node.imag()->is_zero()) {
84 return Result<bool>::success(false);
85 }
86 return domain_contains_node(domain, node.real());
87}
static Result success(T value)
Result< bool > domain_contains_node(NumberDomain domain, const std::shared_ptr< const SymbolicNode > &node)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult real(const ExprPtr &expression, ComputationContext &context)
const NumberDomainSet & domain
ExprPtr imag

引用了 LMCAS::Complexes, LMCAS::domain, domain_contains_complex(), domain_contains_node(), LMCAS::imag, LMCAS::SymbolicNode::is_zero(), LMCAS::real(), LMCAS::Reals, LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 domain_contains_complex() , 以及 domain_contains_node().

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

◆ domain_contains_fractional_power()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_fractional_power ( NumberDomain domain,
const PowerNode & power,
const Rational & exponent )

在文件 expr_number_domains.cpp 第 121 行定义.

122 {
123 auto base = detail::exact_rational_value(power.base());
124 if (exponent == Rational(1, 2) && base) {
126 }
127 return bool_failure(
129 "non-integer power membership requires a branch/domain proof",
131}
const std::shared_ptr< const SymbolicNode > & base() const noexcept
bool exact_sqrt_contains(NumberDomain domain, const Rational &value)
Result< bool > bool_failure(CasErrc code, std::string message, const char *operation)
std::optional< Rational > exact_rational_value(const NumberNode &number)
const ExprPtr & exponent

引用了 LMCAS::PowerNode::base(), bool_failure(), LMCAS::domain, domain_contains_fractional_power(), LMCAS::detail::exact_rational_value(), exact_sqrt_contains(), LMCAS::exponent, LMCAS::Inconclusive, kNumberDomainOperation , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_contains_fractional_power() , 以及 domain_contains_power().

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

◆ domain_contains_function()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_function ( NumberDomain domain,
const FunctionNode & function )

在文件 expr_number_domains.cpp 第 249 行定义.

249 {
250 if (function.arguments().size() != 1) {
251 return inconclusive_domain();
252 }
254 auto exact = detail::exact_rational_value(function.arguments()[0]);
255 if (exact) {
256 if (domain_rank(domain) >= 0) {
258 }
259 if (*exact < Rational(0)) {
260 return Result<bool>::success(false);
261 }
262 }
263 }
267 return inconclusive_domain();
268 }
272 function.arguments()[0]);
273 }
274 return inconclusive_domain();
275}
@ Sqrt
对数、绝对值、平方根。
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::Complexes, LMCAS::domain, domain_contains_function(), domain_contains_node(), domain_rank(), LMCAS::detail::exact_rational_value(), exact_sqrt_contains(), LMCAS::function(), function_preserves_domain(), inconclusive_domain(), LMCAS::Integers, LMCAS::Rationals, LMCAS::Reals, LMCAS::FunctionNode::Sqrt , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_contains_function() , 以及 domain_contains_node().

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

◆ domain_contains_negative_integer_power()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_negative_integer_power ( NumberDomain domain,
const std::shared_ptr< const NumberNode > & base_number,
const std::optional< Rational > & exact_base )

在文件 expr_number_domains.cpp 第 139 行定义.

142 {
143 if (exact_base) {
146 exact_base->get_numerator().abs() == BigInt(1));
147 }
152 }
153 if (base_number) {
154 return domain_contains_number(domain, *base_number);
155 }
156 return inconclusive_domain();
157}
Result< bool > domain_contains_number(NumberDomain domain, const NumberNode &number)

引用了 LMCAS::Complexes, LMCAS::domain, domain_contains_negative_integer_power(), domain_contains_number(), inconclusive_domain(), LMCAS::Integers, LMCAS::Rationals, LMCAS::Reals , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_contains_negative_integer_power() , 以及 domain_contains_power().

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

◆ domain_contains_node()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_node ( NumberDomain domain,
const std::shared_ptr< const SymbolicNode > & node )

在文件 expr_number_domains.cpp 第 277 行定义.

278 {
279 if (!node) {
281 "domain membership element must not be null",
283 }
285 return Result<bool>::success(true);
286 }
287 if (auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
288 return domain_contains_number(domain, *number);
289 }
290 if (auto complex = std::dynamic_pointer_cast<const ComplexNode>(node)) {
292 }
293 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
294 return domain_contains_operands(domain, add->operands());
295 }
296 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
297 return domain_contains_operands(domain, multiply->operands());
298 }
299 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
300 return domain_contains_power(domain, *power);
301 }
302 if (std::dynamic_pointer_cast<const RootOfNode>(node)) {
303 return domain_contains_root(domain, node);
304 }
305 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
307 }
308 return inconclusive_domain();
309}
Result< bool > domain_contains_operands(NumberDomain domain, const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
Result< bool > domain_contains_power(NumberDomain domain, const PowerNode &power)
Result< bool > domain_contains_root(NumberDomain domain, const std::shared_ptr< const SymbolicNode > &node)
Result< bool > domain_contains_function(NumberDomain domain, const FunctionNode &function)
Result< bool > domain_contains_complex(NumberDomain domain, const ComplexNode &node)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult complex(ExprPtr real, ExprPtr imag)

引用了 LMCAS::add(), bool_failure(), LMCAS::complex(), LMCAS::domain, domain_contains_complex(), domain_contains_function(), domain_contains_node(), domain_contains_number(), domain_contains_operands(), domain_contains_power(), domain_contains_root(), LMCAS::Expressions, LMCAS::function(), inconclusive_domain(), LMCAS::InvalidArgument, kNumberDomainOperation , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_contains_complex(), domain_contains_function(), domain_contains_node(), domain_contains_operands() , 以及 domain_contains_positive_integer_power().

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

◆ domain_contains_number()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_number ( NumberDomain domain,
const NumberNode & number )

在文件 expr_number_domains.cpp 第 54 行定义.

54 {
55 const auto& value = number.value();
56 if (std::holds_alternative<BigInt>(value)) {
57 return Result<bool>::success(true);
58 }
59 if (std::holds_alternative<Rational>(value)) {
60 const auto& rational = std::get<Rational>(value);
62 return Result<bool>::success(rational.is_integer());
63 }
64 if (domain_rank(domain) >= 0) {
65 return Result<bool>::success(true);
66 }
67 }
68 return inconclusive_domain();
69}
const std::variant< BigInt, Rational > & value() const noexcept
const std::string const ExprPtr & value
ExprResult rational(const Rational &value)

引用了 LMCAS::domain, domain_contains_number(), domain_rank(), inconclusive_domain(), LMCAS::Integers, LMCAS::rational(), LMCAS::Result< T >::success(), LMCAS::NumberNode::value() , 以及 LMCAS::value.

被这些函数引用 domain_contains_negative_integer_power(), domain_contains_node() , 以及 domain_contains_number().

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

◆ domain_contains_operands()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_operands ( NumberDomain domain,
const std::vector< std::shared_ptr< const SymbolicNode > > & operands )

在文件 expr_number_domains.cpp 第 89 行定义.

91 {
92 bool all_members = true;
93 for (const auto& operand : operands) {
94 auto member = domain_contains_node(domain, operand);
95 if (!member) {
97 return member;
98 }
99 all_members = false;
100 continue;
101 }
102 all_members = all_members && member.value();
103 }
104 return all_members ? Result<bool>::success(true) : inconclusive_domain();
105}
CasError & error()
ExprResult member(const ExprPtr &element, const ExprPtr &set, ComputationContext &context)

引用了 LMCAS::CasError::code, LMCAS::domain, domain_contains_node(), domain_contains_operands(), LMCAS::Result< T >::error(), LMCAS::Inconclusive, inconclusive_domain(), LMCAS::member(), LMCAS::Result< T >::success() , 以及 LMCAS::Result< T >::value().

被这些函数引用 domain_contains_node() , 以及 domain_contains_operands().

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

◆ domain_contains_positive_integer_power()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_positive_integer_power ( NumberDomain domain,
const PowerNode & power )

在文件 expr_number_domains.cpp 第 159 行定义.

160 {
161 auto base = domain_contains_node(domain, power.base());
162 if (!base) {
163 return base.error().code == CasErrc::Inconclusive
165 : Result<bool>::failure(base.error());
166 }
167 return base.value() ? Result<bool>::success(true) : inconclusive_domain();
168}

引用了 LMCAS::PowerNode::base(), LMCAS::domain, domain_contains_node(), domain_contains_positive_integer_power(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, inconclusive_domain() , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_contains_positive_integer_power() , 以及 domain_contains_power().

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

◆ domain_contains_power()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_power ( NumberDomain domain,
const PowerNode & power )

在文件 expr_number_domains.cpp 第 170 行定义.

170 {
171 const auto exponent = detail::exact_rational_value(power.exponent());
172 if (!exponent) {
173 return bool_failure(
175 "domain membership for powers requires an exact exponent",
177 }
178 if (!exponent->is_integer()) {
180 }
181
182 const auto base_number =
183 std::dynamic_pointer_cast<const NumberNode>(power.base());
184 const auto exact_base = detail::exact_rational_value(power.base());
185 if (is_undefined_zero_power(*exponent, base_number)) {
186 return bool_failure(
188 "zero to a nonpositive integer power is undefined",
190 }
191 if (exponent->is_zero()) {
192 return base_number ? Result<bool>::success(true)
194 }
195 if (*exponent < Rational(0)) {
197 domain, base_number, exact_base);
198 }
200}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
Result< bool > domain_contains_positive_integer_power(NumberDomain domain, const PowerNode &power)
bool is_undefined_zero_power(const Rational &exponent, const std::shared_ptr< const NumberNode > &base)
Result< bool > domain_contains_fractional_power(NumberDomain domain, const PowerNode &power, const Rational &exponent)
Result< bool > domain_contains_negative_integer_power(NumberDomain domain, const std::shared_ptr< const NumberNode > &base_number, const std::optional< Rational > &exact_base)
@ Rational
Rational numbers

引用了 LMCAS::PowerNode::base(), bool_failure(), LMCAS::domain, domain_contains_fractional_power(), domain_contains_negative_integer_power(), domain_contains_positive_integer_power(), domain_contains_power(), LMCAS::DomainError, LMCAS::detail::exact_rational_value(), LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::Inconclusive, inconclusive_domain(), is_undefined_zero_power(), kNumberDomainOperation , 以及 LMCAS::Result< T >::success().

被这些函数引用 domain_contains_node() , 以及 domain_contains_power().

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

◆ domain_contains_root()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_contains_root ( NumberDomain domain,
const std::shared_ptr< const SymbolicNode > & node )

在文件 expr_number_domains.cpp 第 202 行定义.

203 {
204 auto expression = detail::make_expression_ptr(node);
206 auto value = rootof_evaluate_complex_checked(expression);
207 return value ? Result<bool>::success(true)
208 : Result<bool>::failure(value.error());
209 }
211 auto value = rootof_evaluate_checked(expression, context);
212 if (value) {
214 }
215 if (value.error().code == CasErrc::DomainError) {
216 return Result<bool>::success(false);
217 }
218 return Result<bool>::failure(value.error());
219}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
RootOfComplexEvaluationResult rootof_evaluate_complex_checked(const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
RootOfEvaluationResult rootof_evaluate_checked(const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)

引用了 LMCAS::Complexes, LMCAS::context, LMCAS::domain, domain_contains_root(), LMCAS::DomainError, LMCAS::Result< T >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::Reals, LMCAS::rootof_evaluate_checked(), LMCAS::rootof_evaluate_complex_checked(), LMCAS::Result< T >::success() , 以及 LMCAS::value.

被这些函数引用 domain_contains_node() , 以及 domain_contains_root().

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

◆ domain_rank()

int LMCAS::anonymous_namespace{expr_number_domains.cpp}::domain_rank ( NumberDomain domain)
noexcept

在文件 expr_number_domains.cpp 第 30 行定义.

30 {
31 switch (domain) {
33 return 0;
34 }
36 return 1;
37 }
39 return 2;
40 }
42 return 3;
43 }
45 return 4;
46 }
47 }
48 return -1;
49}

引用了 LMCAS::Complexes, LMCAS::domain, domain_rank(), LMCAS::Expressions, LMCAS::Integers, LMCAS::Rationals , 以及 LMCAS::Reals.

被这些函数引用 domain_contains_function(), domain_contains_number() , 以及 domain_rank().

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

◆ exact_sqrt_contains()

bool LMCAS::anonymous_namespace{expr_number_domains.cpp}::exact_sqrt_contains ( NumberDomain domain,
const Rational & value )

在文件 expr_number_domains.cpp 第 107 行定义.

107 {
108 if (value < Rational(0)) {
110 }
112 return true;
113 }
114 const bool rational_root = value.get_numerator().is_perfect_square() &&
115 value.get_denominator().is_perfect_square();
117 ? rational_root
118 : rational_root && value.get_denominator() == BigInt(1);
119}

引用了 LMCAS::Complexes, LMCAS::domain, exact_sqrt_contains(), LMCAS::Rationals, LMCAS::Reals , 以及 LMCAS::value.

被这些函数引用 domain_contains_fractional_power(), domain_contains_function() , 以及 exact_sqrt_contains().

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

◆ function_preserves_domain()

bool LMCAS::anonymous_namespace{expr_number_domains.cpp}::function_preserves_domain ( FunctionNode::FuncType type)

在文件 expr_number_domains.cpp 第 221 行定义.

221 {
222 switch (type) {
224 return true;
225 }
227 return true;
228 }
230 return true;
231 }
233 return true;
234 }
236 return true;
237 }
239 return true;
240 }
242 return true;
243 }
244 default:
245 return false;
246 }
247}

引用了 LMCAS::FunctionNode::Abs, LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Cosh, LMCAS::FunctionNode::Exp, function_preserves_domain(), LMCAS::FunctionNode::Sin, LMCAS::FunctionNode::Sinh , 以及 LMCAS::FunctionNode::Tanh.

被这些函数引用 domain_contains_function() , 以及 function_preserves_domain().

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

◆ inconclusive_domain()

Result< bool > LMCAS::anonymous_namespace{expr_number_domains.cpp}::inconclusive_domain ( )

在文件 expr_number_domains.cpp 第 23 行定义.

23 {
25 "domain membership is only decidable for numeric and explicit complex expressions",
27}

引用了 bool_failure(), LMCAS::Inconclusive, inconclusive_domain() , 以及 kNumberDomainOperation.

被这些函数引用 domain_contains_function(), domain_contains_negative_integer_power(), domain_contains_node(), domain_contains_number(), domain_contains_operands(), domain_contains_positive_integer_power(), domain_contains_power() , 以及 inconclusive_domain().

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

◆ is_undefined_zero_power()

bool LMCAS::anonymous_namespace{expr_number_domains.cpp}::is_undefined_zero_power ( const Rational & exponent,
const std::shared_ptr< const NumberNode > & base )

在文件 expr_number_domains.cpp 第 133 行定义.

135 {
136 return exponent <= Rational(0) && base && base->is_zero();
137}

引用了 LMCAS::exponent , 以及 is_undefined_zero_power().

被这些函数引用 domain_contains_power() , 以及 is_undefined_zero_power().

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

变量说明

◆ kNumberDomainOperation

const char* LMCAS::anonymous_namespace{expr_number_domains.cpp}::kNumberDomainOperation = "LMCAS.number_domain"
constexpr