LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
symbolic_node_order.cpp
浏览该文件的文档.
2
3namespace LMCAS {
4namespace {
5
6int compare_matrix_elements(const std::shared_ptr<const SymbolicNode>& left,
7 const std::shared_ptr<const SymbolicNode>& right) {
8 const bool left_zero = !left || left->is_zero();
9 const bool right_zero = !right || right->is_zero();
10 if (left_zero && right_zero) {
11 return 0;
12 }
13 if (left_zero) {
14 return -1;
15 }
16 if (right_zero) {
17 return 1;
18 }
19 return left->compare(*right);
20}
21
22}
23
25 const auto& matrix = static_cast<const MatrixNode&>(other);
26 if (rows_ != matrix.rows_) {
27 return rows_ < matrix.rows_ ? -1 : 1;
28 }
29 if (cols_ != matrix.cols_) {
30 return cols_ < matrix.cols_ ? -1 : 1;
31 }
32 for (size_t row = 0; row < rows_; ++row) {
33 for (size_t column = 0; column < cols_; ++column) {
34 const int comparison = compare_matrix_elements(get(row, column), matrix.get(row, column));
35 if (comparison != 0) {
36 return comparison;
37 }
38 }
39 }
40 return 0;
41}
42
44 const auto& interval = static_cast<const IntervalNode&>(other);
45 int comparison = lower_->compare(*interval.lower_);
46 if (comparison != 0) {
47 return comparison;
48 }
49 comparison = upper_->compare(*interval.upper_);
50 if (comparison != 0) {
51 return comparison;
52 }
53 if (lower_closed_ != interval.lower_closed_) {
54 return lower_closed_ ? 1 : -1;
55 }
56 if (upper_closed_ != interval.upper_closed_) {
57 return upper_closed_ ? 1 : -1;
58 }
59 return 0;
60}
61
62}
int compare_same_type(const SymbolicNode &other) const override
const std::shared_ptr< const SymbolicNode > lower_
const bool lower_closed_
const bool upper_closed_
IntervalNode(std::shared_ptr< const SymbolicNode > lower, std::shared_ptr< const SymbolicNode > upper, bool lower_closed, bool upper_closed)
const std::shared_ptr< const SymbolicNode > upper_
const size_t rows_
MatrixNode(const std::vector< std::vector< std::shared_ptr< const SymbolicNode > > > &grid)
std::shared_ptr< const SymbolicNode > get(size_t r, size_t c) const
获取指定位置的矩阵元素。
int compare_same_type(const SymbolicNode &other) const override
SymbolicNode()=default
int compare_matrix_elements(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
const ExprPtr & right
内部 AST 定义。