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

命名空间

namespace  anonymous_namespace{assumption_parse_atoms.cpp}
namespace  anonymous_namespace{assumption_parse_relations.cpp}
namespace  anonymous_namespace{assumption_parse_values.cpp}

类

class  AssumptionParser

函数

bool is_closing_delimiter (char value) noexcept
bool is_serialized_numeric_atom (std::string_view expression) noexcept
char matching_closer (char opener) noexcept
Boundedness parse_boundedness (const std::string &s, int line_num)
Definiteness parse_definiteness (const std::string &s, int line_num)
Domain parse_domain (const std::string &s, int line_num)
std::shared_ptr< const SymbolicNode > parse_finite_number_node (const std::string &token, int line_num)
Finiteness parse_finiteness (const std::string &s, int line_num)
Interval parse_interval (const std::string &text, int line_num, ComputationContext &context)
Monotonicity parse_monotonicity (const std::string &s, int line_num)
Parity parse_parity (const std::string &s, int line_num)
Relation parse_relation (const std::string &text, int line_num, bool conditional, ComputationContext &context)
RelationOp parse_relop (const std::string &s, int line_num)
SymbolicExpr parse_serialized_expression (const std::string &text, int line_num, ComputationContext &context)
Sign parse_sign (const std::string &s, int line_num)
void require_deserialization_update (const Result< void > &result, int line, const std::string &keyword)
void require_line_end (std::istringstream &input, int line_num, const std::string &keyword)
std::string_view trim_ascii_whitespace (std::string_view text) noexcept

函数说明

◆ is_closing_delimiter()

bool LMCAS::assumption_detail::is_closing_delimiter ( char value)
noexcept

在文件 assumption_parse_atoms.cpp 第 47 行定义.

47 {
48 return value == ')' || value == ']' || value == '}';
49}
const std::string const ExprPtr & value

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

被这些函数引用 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::consume_delimiter(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::find_interval_comma() , 以及 is_closing_delimiter().

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

◆ is_serialized_numeric_atom()

bool LMCAS::assumption_detail::is_serialized_numeric_atom ( std::string_view expression)
noexcept

在文件 assumption_parse_atoms.cpp 第 17 行定义.

17 {
18 bool saw_digit = false;
19 for (std::size_t i = 0; i < expression.size(); ++i) {
20 const char c = expression[i];
21 if (std::isdigit(static_cast<unsigned char>(c))) {
22 saw_digit = true;
23 continue;
24 }
25 if (c == '.' || c == '/' || c == 'e' || c == 'E') {
26 continue;
27 }
28 if ((c == '+' || c == '-') &&
29 (i == 0 || expression[i - 1] == 'e' ||
30 expression[i - 1] == 'E')) {
31 continue;
32 }
33 return false;
34 }
35 return saw_digit;
36}
const VectorField const VectorField & c

引用了 LMCAS::c , 以及 is_serialized_numeric_atom().

被这些函数引用 is_serialized_numeric_atom() , 以及 parse_serialized_expression().

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

◆ matching_closer()

char LMCAS::assumption_detail::matching_closer ( char opener)
noexcept

在文件 assumption_parse_atoms.cpp 第 38 行定义.

38 {
39 switch (opener) {
40 case '(': return ')';
41 case '[': return ']';
42 case '{': return '}';
43 default: return '\0';
44 }
45}

引用了 matching_closer().

被这些函数引用 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::consume_delimiter(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::find_interval_comma() , 以及 matching_closer().

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

◆ parse_boundedness()

Boundedness LMCAS::assumption_detail::parse_boundedness ( const std::string & s,
int line_num )

在文件 assumption_parse_values.cpp 第 52 行定义.

52 {
53 static const std::pair<const char*, Boundedness> values[] = {
54 {"Bounded", Boundedness::Bounded},
55 {"Unbounded", Boundedness::Unbounded},
56 };
57 return parse_named_value(s, line_num, "boundedness", values);
58}
T parse_named_value(const std::string &text, int line_num, const char *kind, const std::pair< const char *, T >(&values)[N])
@ Unbounded
Symbol is unbounded
@ Bounded
Symbol has finite bounds

引用了 LMCAS::Bounded, parse_boundedness() , 以及 LMCAS::Unbounded.

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_bounded() , 以及 parse_boundedness().

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

◆ parse_definiteness()

Definiteness LMCAS::assumption_detail::parse_definiteness ( const std::string & s,
int line_num )

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

68 {
69 static const std::pair<const char*, Definiteness> values[] = {
70 {"PositiveDefinite", Definiteness::PositiveDefinite},
71 {"PositiveSemiDefinite", Definiteness::PositiveSemiDefinite},
72 {"NegativeDefinite", Definiteness::NegativeDefinite},
73 {"NegativeSemiDefinite", Definiteness::NegativeSemiDefinite},
74 {"Indefinite", Definiteness::Indefinite},
75 };
76 return parse_named_value(s, line_num, "definiteness", values);
77}
@ NegativeSemiDefinite
All eigenvalues non-positive
@ NegativeDefinite
All eigenvalues negative
@ PositiveSemiDefinite
All eigenvalues non-negative
@ PositiveDefinite
All eigenvalues positive
@ Indefinite
Mixed eigenvalue signs

引用了 LMCAS::Indefinite, LMCAS::NegativeDefinite, LMCAS::NegativeSemiDefinite, parse_definiteness(), LMCAS::PositiveDefinite , 以及 LMCAS::PositiveSemiDefinite.

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_definiteness() , 以及 parse_definiteness().

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

◆ parse_domain()

Domain LMCAS::assumption_detail::parse_domain ( const std::string & s,
int line_num )

在文件 assumption_parse_values.cpp 第 19 行定义.

19 {
20 static const std::pair<const char*, Domain> values[] = {
21 {"Complex", Domain::Complex},
22 {"Real", Domain::Real},
23 {"Algebraic", Domain::Algebraic},
24 {"Rational", Domain::Rational},
25 {"Integer", Domain::Integer},
26 {"Natural", Domain::Natural},
27 {"PositiveInt", Domain::PositiveInt},
28 };
29 return parse_named_value(s, line_num, "domain", values);
30}
@ Complex
Complex numbers (default, least specific)
@ Rational
Rational numbers
@ Natural
Non-negative integers (0, 1, 2, ...)
@ Real
Real numbers
@ Algebraic
Algebraic numbers (roots of polynomials with rational coefficients)
@ PositiveInt
Positive integers (1, 2, 3, ...)

引用了 LMCAS::Algebraic, LMCAS::Complex, LMCAS::Integer, LMCAS::Natural, parse_domain(), LMCAS::PositiveInt, LMCAS::Rational , 以及 LMCAS::Real.

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_domain() , 以及 parse_domain().

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

◆ parse_finite_number_node()

std::shared_ptr< const SymbolicNode > LMCAS::assumption_detail::parse_finite_number_node ( const std::string & token,
int line_num )

在文件 assumption_parse_atoms.cpp 第 75 行定义.

77 {
78 const auto invalid = [&]() {
79 return std::invalid_argument(
80 "Line " + std::to_string(line_num) +
81 ": invalid finite number '" + token + "'");
82 };
83 if (token.empty()) {
84 throw invalid();
85 }
86 if (token.compare(0, 7, "approx(") == 0 && token.back() == ')') {
87 std::string_view decimal(token.data() + 7, token.size() - 8);
88 decimal = trim_ascii_whitespace(decimal);
90 if (!value) { throw invalid(); }
92 }
93
94 const auto slash = token.find('/');
95 if (slash != std::string::npos) {
96 if (slash == 0 || slash + 1 == token.size() ||
97 token.find('/', slash + 1) != std::string::npos) {
98 throw invalid();
99 }
101 Rational(
102 BigInt(token.substr(0, slash)),
103 BigInt(token.substr(slash + 1))));
104 }
105 if (token.find_first_of(".eE") == std::string::npos) {
106 return LMCAS::detail::make_node<NumberNode>(BigInt(token));
107 }
108
110}
std::string_view trim_ascii_whitespace(std::string_view text) noexcept
Result< double > parse_finite_decimal(std::string_view token)
std::shared_ptr< const Node > make_node(Args &&... args)

引用了 LMCAS::detail::make_node(), LMCAS::detail::parse_finite_decimal(), parse_finite_number_node(), trim_ascii_whitespace() , 以及 LMCAS::value.

被这些函数引用 parse_finite_number_node() , 以及 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_serialized_numeric_atom().

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

◆ parse_finiteness()

Finiteness LMCAS::assumption_detail::parse_finiteness ( const std::string & s,
int line_num )

在文件 assumption_parse_values.cpp 第 60 行定义.

60 {
61 static const std::pair<const char*, Finiteness> values[] = {
62 {"Finite", Finiteness::Finite},
63 {"Divergent", Finiteness::Divergent},
64 };
65 return parse_named_value(s, line_num, "finiteness", values);
66}
@ Finite
Has a finite value or limit
@ Divergent
Diverges to infinity or oscillates

引用了 LMCAS::Divergent, LMCAS::Finite , 以及 parse_finiteness().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_finiteness() , 以及 parse_finiteness().

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

◆ parse_interval()

Interval LMCAS::assumption_detail::parse_interval ( const std::string & text,
int line_num,
ComputationContext & context )

在文件 assumption_parse_atoms.cpp 第 266 行定义.

267 {
268 if (!interval_delimiters_valid(text)) {
269 throw malformed_interval(text, line_num);
270 }
271
272 const bool lower_open = text.front() == '(';
273 const bool upper_open = text.back() == ')';
274 const std::string inner = text.substr(1, text.size() - 2);
275 const std::size_t comma_pos =
276 find_interval_comma(inner, text, line_num);
277 const std::string lower_text = trim_interval_endpoint(
278 inner.substr(0, comma_pos), text, line_num);
279 const std::string upper_text = trim_interval_endpoint(
280 inner.substr(comma_pos + 1), text, line_num);
281 validate_interval_endpoints(
282 lower_text, upper_text, lower_open, upper_open, text, line_num);
283
284 Interval interval;
285 interval.lower = lower_text == "-inf"
286 ? Endpoint::neg_inf()
287 : parse_interval_endpoint(
288 lower_text, lower_open, line_num, text, context);
289 interval.upper = upper_text == "+inf"
290 ? Endpoint::pos_inf()
291 : parse_interval_endpoint(
292 upper_text, upper_open, line_num, text, context);
293 return interval;
294}
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)

引用了 LMCAS::context, LMCAS::interval() , 以及 parse_interval().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_bounded(), LMCAS::assumption_detail::AssumptionParser::parse_continuity(), parse_interval() , 以及 LMCAS::assumption_detail::AssumptionParser::parse_monotonicity().

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

◆ parse_monotonicity()

Monotonicity LMCAS::assumption_detail::parse_monotonicity ( const std::string & s,
int line_num )

在文件 assumption_parse_values.cpp 第 79 行定义.

79 {
80 static const std::pair<const char*, Monotonicity> values[] = {
81 {"Increasing", Monotonicity::Increasing},
82 {"Decreasing", Monotonicity::Decreasing},
83 {"NonDecreasing", Monotonicity::NonDecreasing},
84 {"NonIncreasing", Monotonicity::NonIncreasing},
85 };
86 return parse_named_value(s, line_num, "monotonicity", values);
87}
@ NonDecreasing
Non-decreasing (weakly increasing)
@ Decreasing
Strictly decreasing
@ NonIncreasing
Non-increasing (weakly decreasing)
@ Increasing
Strictly increasing

引用了 LMCAS::Decreasing, LMCAS::Increasing, LMCAS::NonDecreasing, LMCAS::NonIncreasing , 以及 parse_monotonicity().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_monotonicity() , 以及 parse_monotonicity().

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

◆ parse_parity()

Parity LMCAS::assumption_detail::parse_parity ( const std::string & s,
int line_num )

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

44 {
45 static const std::pair<const char*, Parity> values[] = {
46 {"Even", Parity::Even},
47 {"Odd", Parity::Odd},
48 };
49 return parse_named_value(s, line_num, "parity", values);
50}
@ Even
Even integer

引用了 LMCAS::Even, LMCAS::Odd , 以及 parse_parity().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_parity() , 以及 parse_parity().

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

◆ parse_relation()

Relation LMCAS::assumption_detail::parse_relation ( const std::string & text,
int line_num,
bool conditional,
ComputationContext & context )

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

131 {
132 static const std::vector<std::string_view> operators = {
133 "GEQ", "LEQ", "NEQ", "GT", "LT", "EQ",
134 ">=", "<=", "!=", "==", ">", "<"};
135 const auto matches =
136 find_top_level_tokens(text, operators, line_num);
137 if (matches.size() != 1) {
138 const std::string message = conditional
139 ? "CONDITIONAL cannot parse expression '" + text + "'"
140 : "RELATION requires exactly one top-level operator";
141 throw std::invalid_argument(
142 "Line " + std::to_string(line_num) + ": " + message);
143 }
144
145 const auto match = matches.front();
146 const std::string lhs_text =
147 trim_copy(text.substr(0, match.position), line_num);
148 const std::string rhs_text = trim_copy(
149 text.substr(match.position + match.token.size()), line_num);
150 return {
151 parse_serialized_expression(lhs_text, line_num, context),
152 parse_serialized_expression(rhs_text, line_num, context),
153 parse_relop(std::string(match.token), line_num)};
154}
RelationOp parse_relop(const std::string &s, int line_num)
SymbolicExpr parse_serialized_expression(const std::string &text, int line_num, ComputationContext &context)

引用了 LMCAS::context, parse_relation(), parse_relop() , 以及 parse_serialized_expression().

被这些函数引用 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::parse_conditional_relation(), LMCAS::assumption_detail::AssumptionParser::parse_relation() , 以及 parse_relation().

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

◆ parse_relop()

RelationOp LMCAS::assumption_detail::parse_relop ( const std::string & s,
int line_num )

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

89 {
90 static const std::pair<const char*, RelationOp> values[] = {
91 {"GT", RelationOp::GT},
92 {"LT", RelationOp::LT},
93 {"GEQ", RelationOp::GEQ},
94 {"LEQ", RelationOp::LEQ},
95 {"NEQ", RelationOp::NEQ},
96 {"EQ", RelationOp::EQ},
97 {">", RelationOp::GT},
98 {"<", RelationOp::LT},
99 {">=", RelationOp::GEQ},
100 {"<=", RelationOp::LEQ},
101 {"!=", RelationOp::NEQ},
102 {"==", RelationOp::EQ},
103 };
104 return parse_named_value(s, line_num, "relational operator", values);
105}

引用了 LMCAS::EQ, LMCAS::GEQ, LMCAS::GT, LMCAS::LEQ, LMCAS::LT, LMCAS::NEQ , 以及 parse_relop().

被这些函数引用 parse_relation() , 以及 parse_relop().

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

◆ parse_serialized_expression()

SymbolicExpr LMCAS::assumption_detail::parse_serialized_expression ( const std::string & text,
int line_num,
ComputationContext & context )

在文件 assumption_parse_atoms.cpp 第 154 行定义.

155 {
156 const auto trimmed = trim_ascii_whitespace(text);
157 if (trimmed.empty()) {
158 throw std::invalid_argument(
159 "Line " + std::to_string(line_num) + ": empty expression");
160 }
161 const std::string expression(trimmed);
162 if (is_serialized_numeric_atom(trimmed)) {
163 return parse_serialized_numeric_atom(expression, line_num);
164 }
165 return parse_general_expression(expression, line_num, context);
166}
bool is_serialized_numeric_atom(std::string_view expression) noexcept

引用了 LMCAS::context, is_serialized_numeric_atom(), parse_serialized_expression() , 以及 trim_ascii_whitespace().

被这些函数引用 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::parse_interval_expression(), LMCAS::assumption_detail::AssumptionParser::parse_periodic(), parse_relation() , 以及 parse_serialized_expression().

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

◆ parse_sign()

Sign LMCAS::assumption_detail::parse_sign ( const std::string & s,
int line_num )

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

32 {
33 static const std::pair<const char*, Sign> values[] = {
34 {"Positive", Sign::Positive},
35 {"Negative", Sign::Negative},
36 {"NonNegative", Sign::NonNegative},
37 {"NonPositive", Sign::NonPositive},
38 {"Zero", Sign::Zero},
39 {"NonZero", Sign::NonZero},
40 };
41 return parse_named_value(s, line_num, "sign", values);
42}

引用了 LMCAS::Negative, LMCAS::NonNegative, LMCAS::NonPositive, LMCAS::NonZero, parse_sign(), LMCAS::Positive , 以及 LMCAS::Zero.

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_sign() , 以及 parse_sign().

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

◆ require_deserialization_update()

void LMCAS::assumption_detail::require_deserialization_update ( const Result< void > & result,
int line,
const std::string & keyword )

在文件 assumption_parse_atoms.cpp 第 51 行定义.

53 {
54 if (result) {
55 return;
56 }
57 if (result.error().code == CasErrc::InvalidArgument) {
58 throw std::invalid_argument(
59 "Line " + std::to_string(line) + ": " + keyword + ": " +
60 result.error().message);
61 }
62 throw result.error();
63}
const CasError & error() const
std::string message

引用了 LMCAS::CasError::code, LMCAS::Result< T >::error(), LMCAS::InvalidArgument, LMCAS::CasError::message , 以及 require_deserialization_update().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_bounded(), LMCAS::assumption_detail::AssumptionParser::parse_conditional(), LMCAS::assumption_detail::AssumptionParser::parse_continuity(), LMCAS::assumption_detail::AssumptionParser::parse_definiteness(), LMCAS::assumption_detail::AssumptionParser::parse_domain(), LMCAS::assumption_detail::AssumptionParser::parse_finiteness(), LMCAS::assumption_detail::AssumptionParser::parse_monotonicity(), LMCAS::assumption_detail::AssumptionParser::parse_parity(), LMCAS::assumption_detail::AssumptionParser::parse_periodic(), LMCAS::assumption_detail::AssumptionParser::parse_relation(), LMCAS::assumption_detail::AssumptionParser::parse_sign(), LMCAS::assumption_detail::AssumptionParser::parse_transcendental() , 以及 require_deserialization_update().

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

◆ require_line_end()

void LMCAS::assumption_detail::require_line_end ( std::istringstream & input,
int line_num,
const std::string & keyword )

在文件 assumption_parse_atoms.cpp 第 64 行定义.

66 {
67 std::string trailing;
68 if (input >> trailing) {
69 throw std::invalid_argument(
70 "Line " + std::to_string(line_num) + ": " + keyword +
71 " has unexpected trailing field '" + trailing + "'");
72 }
73}

引用了 require_line_end().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_definiteness(), LMCAS::assumption_detail::AssumptionParser::parse_domain(), LMCAS::assumption_detail::AssumptionParser::parse_finiteness(), LMCAS::assumption_detail::AssumptionParser::parse_parity(), LMCAS::assumption_detail::AssumptionParser::parse_scope(), LMCAS::assumption_detail::AssumptionParser::parse_sign(), LMCAS::assumption_detail::AssumptionParser::parse_transcendental() , 以及 require_line_end().

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

◆ trim_ascii_whitespace()

std::string_view LMCAS::assumption_detail::trim_ascii_whitespace ( std::string_view text)
noexcept

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

10 {
11 const auto first = text.find_first_not_of(" \t\r\n");
12 if (first == std::string_view::npos) return {};
13 const auto last = text.find_last_not_of(" \t\r\n");
14 return text.substr(first, last - first + 1);
15}

引用了 trim_ascii_whitespace().

被这些函数引用 LMCAS::assumption_detail::AssumptionParser::parse_bounded(), LMCAS::assumption_detail::AssumptionParser::parse_conditional(), LMCAS::assumption_detail::AssumptionParser::parse_continuity(), parse_finite_number_node(), LMCAS::assumption_detail::AssumptionParser::parse_monotonicity(), LMCAS::assumption_detail::AssumptionParser::parse_periodic(), LMCAS::assumption_detail::AssumptionParser::parse_relation(), parse_serialized_expression(), trim_ascii_whitespace(), LMCAS::assumption_detail::anonymous_namespace{assumption_parse_relations.cpp}::trim_copy() , 以及 LMCAS::assumption_detail::anonymous_namespace{assumption_parse_atoms.cpp}::trim_interval_endpoint().

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