CMR  1.3.0
vector_three_connectivity.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 
5 namespace tu
6 {
7 
8  template <typename MatrixType>
10  {
11  public:
12  typedef MatrixType matrix_type;
13  typedef std::pair <unsigned char, size_t> vector_data;
14 
15  const unsigned char ZERO_VECTOR = 0;
16  const unsigned char UNIT_VECTOR = 1;
17  const unsigned char PARALLEL = 2;
18  const unsigned char OTHER = 3;
19 
20  vector_three_connectivity(const matrix_type& matrix, size_t dimension, size_t base) :
21  matrix_(matrix), data_(matrix.size2())
22  {
24  }
25 
27  matrix_(other.matrix_)
28  {
29  dimension_ = other.dimension_;
30  base_ = other.base_;
31  data_ = other.data_;
32  }
33 
34  void reset(size_t dimension, size_t base)
35  {
36  dimension_ = dimension;
37  base_ = base;
38 
39  for (size_t column = 0; column < base_; ++column)
40  {
41  data_[column] = std::make_pair(PARALLEL, column);
42  }
43  for (size_t column = base_; column < matrix_.size2(); ++column)
44  {
45  size_t count = 0;
46  size_t last_one = 0;
47  for (size_t r = 0; r < dimension_; ++r)
48  {
49  if (matrix_(r, column) != 0)
50  {
51  last_one = r;
52  ++count;
53  }
54  }
55  if (count == 0)
56  data_[column] = std::make_pair(ZERO_VECTOR, 0);
57  else if (count == 1)
58  data_[column] = std::make_pair(UNIT_VECTOR, last_one);
59  else
60  {
61  data_[column] = std::make_pair(OTHER, 0);
62  for (size_t b = 0; b < base_; ++b)
63  {
64  if (are_equal(0, dimension_, column, b))
65  {
66  data_[column] = std::make_pair(PARALLEL, b);
67  }
68  }
69  }
70  }
71  }
72 
74  {
75 
76  }
77 
78  inline size_t base() const
79  {
80  return base_;
81  }
82 
83  inline size_t dimension() const
84  {
85  return dimension_;
86  }
87 
88  bool is_parallel(size_t index) const
89  {
90  return data_[index].first == PARALLEL;
91  }
92 
93  bool is_zero(size_t index) const
94  {
95  return data_[index].first == ZERO_VECTOR;
96  }
97 
98  bool is_unit(size_t index) const
99  {
100  return data_[index].first == UNIT_VECTOR;
101  }
102 
103  bool is_other(size_t index) const
104  {
105  return data_[index].first == OTHER;
106  }
107 
108  size_t get_referred(size_t index) const
109  {
110  return data_[index].second;
111  }
112 
113  void swap_cross(size_t index1, size_t index2)
114  {
115  assert(index1 < dimension_);
116  assert(index2 < dimension_);
117 
118  for (size_t column = base_; column < data_.size(); ++column)
119  {
120  if (is_unit(column))
121  {
122  if (get_referred(column) == index1)
123  data_[column].second = index2;
124  else if (get_referred(column) == index2)
125  data_[column].second = index1;
126  }
127  }
128  }
129 
130  void swap_vectors(size_t index1, size_t index2)
131  {
132  assert(index1 >= base_);
133  assert(index2 >= base_);
134 
135  std::swap(data_[index1], data_[index2]);
136  }
137 
138  void enlarge_base(size_t amount = 1)
139  {
140  while (amount--)
141  {
142  data_[base_] = std::make_pair(PARALLEL, base_);
143  for (size_t column = base_ + 1; column < matrix_.size2(); ++column)
144  {
145  if (are_equal(0, dimension_, column, base_))
146  {
147  data_[column] = std::make_pair(PARALLEL, base_);
148  }
149  }
150  ++base_;
151  }
152  }
153 
154  void enlarge_dimension(size_t amount = 1)
155  {
156  for (size_t column = base_; column < matrix_.size2(); ++column)
157  {
158  if (data_[column].first == OTHER)
159  continue;
160 
161  size_t count = 0;
162  size_t last_row = 0;
163  for (size_t row = 0; row < amount; ++row)
164  {
165  if (matrix_(dimension_ + row, column) != 0)
166  {
167  ++count;
168  last_row = dimension_ + row;
169  }
170  }
171 
172  if (data_[column].first == ZERO_VECTOR && count == 1)
173  {
174  data_[column] = std::make_pair(UNIT_VECTOR, last_row);
175  }
176  else if ((data_[column].first == ZERO_VECTOR && count > 1) || (data_[column].first == UNIT_VECTOR && count > 0))
177  {
178  data_[column].first = OTHER;
179  for (size_t b = 0; b < base_; ++b)
180  {
181  if (are_equal(0, dimension_ + amount, column, b))
182  {
183  data_[column] = std::make_pair(PARALLEL, b);
184  }
185  }
186  }
187  else if (data_[column].first == PARALLEL)
188  {
189  if (!are_equal(dimension_, dimension_ + amount, column, data_[column].second))
190  {
191  data_[column].first = OTHER;
192  }
193  }
194  }
195 
196  dimension_ += amount;
197  }
198 
200  {
201  if (other.base_ != base_)
202  return false;
203  if (other.dimension_ != dimension_)
204  return false;
205  for (size_t i = 0; i < data_.size(); ++i)
206  {
207  if (data_[i] != other.data_[i])
208  return false;
209  }
210  return true;
211  }
212 
213  std::ostream& print(std::ostream& stream)
214  {
215  stream << "base = " << base_ << ", dim = " << dimension_ << "\n";
216  for (size_t i = 0; i < data_.size(); ++i)
217  {
218  stream << "data[" << i << "] = " << ((int) data_[i].first) << ", " << data_[i].second << std::endl;
219  }
220  return stream;
221  }
222 
223  private:
224 
225  bool are_equal(size_t row_first, size_t row_beyond, size_t column1, size_t column2)
226  {
227  for (size_t row = row_first; row < row_beyond; ++row)
228  {
229  if (matrix_(row, column1) != matrix_(row, column2))
230  return false;
231  }
232  return true;
233  }
234 
235  const matrix_type& matrix_;
236  size_t dimension_;
237  size_t base_;
238  std::vector <vector_data> data_;
239  };
240 
241 } /* namespace tu */
Definition: vector_three_connectivity.hpp:10
const unsigned char ZERO_VECTOR
Definition: vector_three_connectivity.hpp:15
const unsigned char OTHER
Definition: vector_three_connectivity.hpp:18
std::pair< unsigned char, size_t > vector_data
Definition: vector_three_connectivity.hpp:13
bool operator==(const vector_three_connectivity< MatrixType > &other)
Definition: vector_three_connectivity.hpp:199
void swap_cross(size_t index1, size_t index2)
Definition: vector_three_connectivity.hpp:113
size_t get_referred(size_t index) const
Definition: vector_three_connectivity.hpp:108
void reset(size_t dimension, size_t base)
Definition: vector_three_connectivity.hpp:34
bool is_parallel(size_t index) const
Definition: vector_three_connectivity.hpp:88
void enlarge_base(size_t amount=1)
Definition: vector_three_connectivity.hpp:138
bool is_zero(size_t index) const
Definition: vector_three_connectivity.hpp:93
vector_three_connectivity(const vector_three_connectivity< MatrixType > &other)
Definition: vector_three_connectivity.hpp:26
~vector_three_connectivity()
Definition: vector_three_connectivity.hpp:73
bool is_unit(size_t index) const
Definition: vector_three_connectivity.hpp:98
const unsigned char PARALLEL
Definition: vector_three_connectivity.hpp:17
vector_three_connectivity(const matrix_type &matrix, size_t dimension, size_t base)
Definition: vector_three_connectivity.hpp:20
void swap_vectors(size_t index1, size_t index2)
Definition: vector_three_connectivity.hpp:130
size_t base() const
Definition: vector_three_connectivity.hpp:78
void enlarge_dimension(size_t amount=1)
Definition: vector_three_connectivity.hpp:154
std::ostream & print(std::ostream &stream)
Definition: vector_three_connectivity.hpp:213
const unsigned char UNIT_VECTOR
Definition: vector_three_connectivity.hpp:16
bool is_other(size_t index) const
Definition: vector_three_connectivity.hpp:103
MatrixType matrix_type
Definition: vector_three_connectivity.hpp:12
size_t dimension() const
Definition: vector_three_connectivity.hpp:83
Definition: algorithm.hpp:14