1//
2// Copyright (c) 2013 Joaquim Duran
3//
4// Distributed under the Boost Software License, Version 1.0. (See
5// accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7//
8
9#include <boost/numeric/ublas/assignment.hpp>
10#include <boost/numeric/ublas/matrix_sparse.hpp>
11#include <boost/numeric/ublas/matrix.hpp>
12#include <boost/numeric/ublas/matrix_vector.hpp>
13#include "common/testhelper.hpp"
14#include "utils.hpp"
15
16using namespace boost::numeric::ublas;
17
18
19template <class Vector, class StorageCategory>
20void guardSparsePreserveResize( Vector &vec, typename Vector::size_type new_size, StorageCategory) // Because sparse matrices don't have preserve data implemented
21{
22 vec.resize( new_size );
23}
24
25
26template <class Vector>
27void guardSparsePreserveResize( Vector &vec, typename Vector::size_type new_size, sparse_tag) // Because sparse matrices don't have preserve data implemented
28{
29 vec.resize( new_size, false );
30}
31
32template <class Matrix>
33bool test_matrix_row_facade() {
34 bool pass = true;
35
36 typedef matrix_row_vector<Matrix> RowVector;
37
38 { // Testing resize
39 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: resize" );
40
41 typename Matrix::size_type num_rows = 3;
42 typename Matrix::size_type num_cols = 5;
43
44 Matrix matrix(num_rows, num_cols);
45 RowVector rows(matrix);
46 pass &= (matrix.size1() == num_rows);
47 pass &= (rows.size() == num_rows);
48 pass &= (matrix.size2() == num_cols);
49
50 typename Matrix::size_type new_num_rows = 6;
51 guardSparsePreserveResize( rows, new_num_rows, typename Matrix::storage_category());
52 //rows.resize(new_num_rows);
53
54 pass &= (matrix.size1() == new_num_rows);
55 pass &= (rows.size() == new_num_rows);
56 pass &= (matrix.size2() == num_cols);
57 }
58
59 { // Testing operator()
60 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator()" );
61
62 Matrix A(3,3), RA(3,3);
63 RowVector rows(A);
64
65 RA <<= 1, 2, 3,
66 4, 5, 6,
67 7, 8, 9;
68
69 for(typename Matrix::size_type i = 0; i < A.size1(); i++) {
70 rows(i) = matrix_row<Matrix>(RA, i);
71 }
72
73 pass &= compare_distance(A, RA);
74 }
75
76 { // Testing operator[]
77 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[]" );
78
79 Matrix A(3,3), RA(3,3);
80 RowVector rows(A);
81
82 RA <<= 1, 2, 3,
83 4, 5, 6,
84 7, 8, 9;
85
86 for(typename Matrix::size_type i = 0; i < A.size1(); i++) {
87 rows[i] = matrix_row<Matrix>(RA, i);
88 }
89
90 pass &= compare_distance(A, RA);
91 }
92
93 { // Testing operator[] const
94 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[] const" );
95
96 Matrix RA(3,3);
97 RowVector rows(RA);
98
99 RA <<= 1, 2, 3,
100 4, 5, 6,
101 7, 8, 9;
102
103 for(typename Matrix::size_type i = 0; i < RA.size1(); i++) {
104 pass &= compare_distance(rows[i], matrix_row<Matrix>(RA, i));
105 }
106 }
107
108 { // Testing const iterator
109 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const iterator" );
110
111 Matrix RA(3,3);
112 RowVector rows(RA);
113
114 RA <<= 1, 2, 3,
115 4, 5, 6,
116 7, 8, 9;
117
118 typename RowVector::size_type i = 0;
119 for(typename RowVector::const_iterator iter = rows.begin();
120 iter != rows.end();
121 iter++) {
122 pass &= compare_distance(*iter, matrix_row<Matrix>(RA, i++));
123 }
124 }
125
126 { // Testing iterator
127 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: iterator" );
128
129 Matrix A(3,3), RA(3,3);
130 RowVector rows(A);
131
132 RA <<= 1, 2, 3,
133 4, 5, 6,
134 7, 8, 9;
135
136 typename RowVector::size_type i = 0;
137 for(typename RowVector::iterator iter = rows.begin();
138 iter != rows.end();
139 iter++) {
140 *iter = matrix_row<Matrix>(RA, i++);
141 }
142
143 pass &= compare_distance(A, RA);
144 }
145
146 { // Testing reserse iterator
147 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: reverse iterator" );
148
149 Matrix A(3,3), RA(3,3);
150 RowVector rows(A);
151
152 RA <<= 1, 2, 3,
153 4, 5, 6,
154 7, 8, 9;
155
156 typename RowVector::size_type i = rows.size();
157 for(typename RowVector::reverse_iterator iter = rows.rbegin();
158 iter != rows.rend();
159 iter++) {
160 *iter = matrix_row<Matrix>(RA, --i);
161 }
162
163 pass &= compare_distance(A, RA);
164 }
165
166 { // Testing const reverse iterator
167 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const reverse iterator" );
168
169 Matrix RA(3,3);
170 RowVector rows(RA);
171
172 RA <<= 1, 2, 3,
173 4, 5, 6,
174 7, 8, 9;
175
176 typename RowVector::size_type i = rows.size();
177 for(typename RowVector::const_reverse_iterator iter = rows.rbegin();
178 iter != rows.rend();
179 iter++) {
180 pass &= compare_distance(*iter, matrix_row<Matrix>(RA, --i));
181 }
182 }
183
184 return pass;
185}
186
187
188template <class Matrix>
189bool test_matrix_column_facade() {
190 bool pass = true;
191
192 typedef matrix_column_vector<Matrix> ColumnVector;
193
194 { // Testing resize
195 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: resize" );
196 typename Matrix::size_type num_rows = 5;
197 typename Matrix::size_type num_cols = 3;
198
199 Matrix matrix(num_rows, num_cols);
200 ColumnVector columns(matrix);
201 pass &= (matrix.size2() == num_cols);
202 pass &= (columns.size() == num_cols);
203 pass &= (matrix.size1() == num_rows);
204
205 typename Matrix::size_type new_num_cols = 6;
206 guardSparsePreserveResize( columns, new_num_cols, typename Matrix::storage_category());
207 //columns.resize(new_num_cols);
208 pass &= (matrix.size2() == new_num_cols);
209 pass &= (columns.size() == new_num_cols);
210 pass &= (matrix.size1() == num_rows);
211 }
212
213 { // Testing operator ()
214 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator()" );
215
216 Matrix A(3,3), RA(3,3);
217 ColumnVector columns(A);
218
219 RA <<= 1, 2, 3,
220 4, 5, 6,
221 7, 8, 9;
222
223 for(typename Matrix::size_type i = 0; i < A.size2(); i++) {
224 columns(i) = matrix_column<Matrix>(RA, i);
225 }
226
227 pass &= compare_distance(A, RA);
228 }
229
230 { // Testing operator[]
231 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[]" );
232
233 Matrix A(3,3), RA(3,3);
234 ColumnVector columns(A);
235
236 RA <<= 1, 2, 3,
237 4, 5, 6,
238 7, 8, 9;
239
240 for(typename Matrix::size_type i = 0; i < A.size2(); i++) {
241 columns[i] = matrix_column<Matrix>(RA, i);
242 }
243
244 pass &= compare_distance(A, RA);
245 }
246
247 { // Testing operator[] const
248 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[] const" );
249
250 Matrix RA(3,3);
251 ColumnVector columns(RA);
252
253 RA <<= 1, 2, 3,
254 4, 5, 6,
255 7, 8, 9;
256
257 for(typename Matrix::size_type i = 0; i < RA.size2(); i++) {
258 pass &= compare_distance(columns[i], matrix_column<Matrix>(RA, i));
259 }
260 }
261
262 { // Testing iterator
263 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: iterator" );
264
265 Matrix A(3,3), RA(3,3);
266 ColumnVector columns(A);
267
268 RA <<= 1, 2, 3,
269 4, 5, 6,
270 7, 8, 9;
271
272 typename ColumnVector::size_type i = 0;
273 for(typename ColumnVector::iterator iter = columns.begin();
274 iter != columns.end();
275 iter++) {
276 *iter = matrix_column<Matrix>(RA, i++);
277 }
278
279 pass &= compare_distance(A, RA);
280 }
281
282 { // Testing const iterator
283 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const iterator" );
284
285 Matrix RA(3,3);
286 ColumnVector columns(RA);
287
288 RA <<= 1, 2, 3,
289 4, 5, 6,
290 7, 8, 9;
291
292 typename ColumnVector::size_type i = 0;
293 for(typename ColumnVector::const_iterator iter = columns.begin();
294 iter != columns.end();
295 iter++) {
296 pass &= compare_distance(*iter, matrix_column<Matrix>(RA, i++));
297 }
298 }
299
300 { // Testing reserse iterator
301 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: reverese iterator" );
302
303 Matrix A(3,3), RA(3,3);
304 ColumnVector columns(A);
305
306 RA <<= 1, 2, 3,
307 4, 5, 6,
308 7, 8, 9;
309
310 typename ColumnVector::size_type i = columns.size();
311 for(typename ColumnVector::reverse_iterator iter = columns.rbegin();
312 iter != columns.rend();
313 iter++) {
314 *iter = matrix_column<Matrix>(RA, --i);
315 }
316
317 pass &= compare_distance(A, RA);
318 }
319
320 { // Testing const reverse iterator
321 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const reverese iterator" );
322
323 Matrix RA(3,3);
324 ColumnVector columns(RA);
325
326 RA <<= 1, 2, 3,
327 4, 5, 6,
328 7, 8, 9;
329
330 typename ColumnVector::size_type i = columns.size();
331 for(typename ColumnVector::const_reverse_iterator iter = columns.rbegin();
332 iter != columns.rend();
333 iter++) {
334 pass &= compare_distance(*iter, matrix_column<Matrix>(RA, --i));
335 }
336 }
337
338 return pass;
339}
340
341
342BOOST_UBLAS_TEST_DEF (test_matrix_row_facade) {
343
344 BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row vector facade" );
345
346 BOOST_UBLAS_DEBUG_TRACE( "Testing matrix..." );
347 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<double> >());
348 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<float> >());
349 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<long> >());
350 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<unsigned long> >());
351 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<int> >());
352 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<unsigned int> >());
353 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<std::size_t> >());
354 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<char> >());
355
356 BOOST_UBLAS_DEBUG_TRACE( "Testing bounded_matrix..." );
357 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<double,7, 7> >()));
358 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<float,7, 7> >()));
359 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<long,7, 7> >()));
360 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<unsigned long,7, 7> >()));
361 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<int,7,7 > >()));
362 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<unsigned int,7, 7> >()));
363 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<char,7, 7> >()));
364 BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<std::size_t,7, 7> >()));
365
366 BOOST_UBLAS_DEBUG_TRACE( "Testing mapped_matrix..." );
367 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<double> >());
368 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<float> >());
369 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<long> >());
370 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<unsigned long> >());
371 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<int> >());
372 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<unsigned int> >())
373 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<std::size_t> >())
374 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<char> >());
375
376 BOOST_UBLAS_DEBUG_TRACE( "Testing compressed_matrix..." );
377 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<double> >());
378 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<float> >());
379 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<long> >());
380 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<unsigned long> >());
381 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<int> >());
382 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<unsigned int> >());
383 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<std::size_t> >());
384 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<char> >());
385
386 BOOST_UBLAS_DEBUG_TRACE( "Testing coordinate_matrix..." );
387 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<double> >());
388 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<float> >());
389 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<long> >())
390 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<unsigned long> >())
391 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<int> >());
392 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<unsigned int> >());
393 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<std::size_t> >());
394 BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<char> >());
395}
396
397
398BOOST_UBLAS_TEST_DEF (test_matrix_column_facade) {
399
400 BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row column facade" );
401
402 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<double> >());
403 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<float> >());
404 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<long> >());
405 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<unsigned long> >());
406 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<int> >());
407 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<unsigned int> >());
408 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<std::size_t> >());
409 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<char> >());
410
411 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<double,7, 7> >()));
412 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<float,7, 7> >()));
413 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<long,7, 7> >()));
414 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<unsigned long,7, 7> >()));
415 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<int,7,7 > >()));
416 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<unsigned int,7, 7> >()));
417 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<char,7, 7> >()));
418 BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<std::size_t,7, 7> >()));
419
420 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<double> >());
421 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<float> >());
422 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<long> >());
423 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<unsigned long> >());
424 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<int> >());
425 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<unsigned int> >())
426 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<std::size_t> >())
427 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<char> >());
428
429 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<double> >());
430 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<float> >());
431 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<long> >());
432 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<unsigned long> >());
433 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<int> >());
434 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<unsigned int> >());
435 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<std::size_t> >());
436 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<char> >());
437
438 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<double> >());
439 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<float> >());
440 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<long> >())
441 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<unsigned long> >())
442 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<int> >());
443 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<unsigned int> >());
444 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<std::size_t> >());
445 BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<char> >());
446}
447
448
449int main () {
450 BOOST_UBLAS_TEST_BEGIN();
451
452 BOOST_UBLAS_TEST_DO( test_matrix_row_facade );
453 BOOST_UBLAS_TEST_DO( test_matrix_column_facade );
454
455 BOOST_UBLAS_TEST_END();
456}
457

source code of boost/libs/numeric/ublas/test/test_matrix_vector.cpp