LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
assumption_parse_values.cpp
浏览该文件的文档.
2
4
5namespace {
6
7template <typename T, std::size_t N>
8T parse_named_value(const std::string& text, int line_num, const char* kind,
9 const std::pair<const char*, T> (&values)[N]) {
10 for (const auto& value : values) {
11 if (text == value.first) return value.second;
12 }
13 throw std::invalid_argument(
14 "Line " + std::to_string(line_num) + ": unknown " + kind + " '" + text + "'");
15}
16
17}
18
19Domain parse_domain(const std::string& s, int line_num) {
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}
31
32Sign parse_sign(const std::string& s, int line_num) {
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}
43
44Parity parse_parity(const std::string& s, int line_num) {
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}
51
52Boundedness parse_boundedness(const std::string& s, int line_num) {
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}
59
60Finiteness parse_finiteness(const std::string& s, int line_num) {
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}
67
68Definiteness parse_definiteness(const std::string& s, int line_num) {
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}
78
79Monotonicity parse_monotonicity(const std::string& s, int line_num) {
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}
88
89RelationOp parse_relop(const std::string& s, int line_num) {
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}
106
107
108}
T parse_named_value(const std::string &text, int line_num, const char *kind, const std::pair< const char *, T >(&values)[N])
Domain parse_domain(const std::string &s, int line_num)
RelationOp parse_relop(const std::string &s, int line_num)
Monotonicity parse_monotonicity(const std::string &s, int line_num)
Definiteness parse_definiteness(const std::string &s, int line_num)
Sign parse_sign(const std::string &s, int line_num)
Boundedness parse_boundedness(const std::string &s, int line_num)
Finiteness parse_finiteness(const std::string &s, int line_num)
Parity parse_parity(const std::string &s, int line_num)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ 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, ...)
Boundedness
Boundedness classification for symbols.
@ Unbounded
Symbol is unbounded
@ Bounded
Symbol has finite bounds
Monotonicity
Monotonicity classification for functions over intervals.
@ NonDecreasing
Non-decreasing (weakly increasing)
@ Decreasing
Strictly decreasing
@ NonIncreasing
Non-increasing (weakly decreasing)
@ Increasing
Strictly increasing
Definiteness
Matrix definiteness classification.
@ NegativeSemiDefinite
All eigenvalues non-positive
@ NegativeDefinite
All eigenvalues negative
@ PositiveSemiDefinite
All eigenvalues non-negative
@ PositiveDefinite
All eigenvalues positive
@ Indefinite
Mixed eigenvalue signs
RelationOp
Stable relational operator used by public APIs.
Finiteness
Finiteness classification for limits and sequences.
@ Finite
Has a finite value or limit
@ Divergent
Diverges to infinity or oscillates
const std::string const ExprPtr & value
Parity
Integer parity classification.
@ Even
Even integer
Sign
Sign classification for symbols and expressions.