2 // Copyright (c) 2013 Joaquim Duran
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)
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"
16 using namespace boost::numeric::ublas
;
19 template <class Vector
, class StorageCategory
>
20 void guardSparsePreserveResize( Vector
&vec
, typename
Vector::size_type new_size
, StorageCategory
) // Because sparse matrices don't have preserve data implemented
22 vec
.resize( new_size
);
26 template <class Vector
>
27 void guardSparsePreserveResize( Vector
&vec
, typename
Vector::size_type new_size
, sparse_tag
) // Because sparse matrices don't have preserve data implemented
29 vec
.resize( new_size
, false );
32 template <class Matrix
>
33 bool test_matrix_row_facade() {
36 typedef matrix_row_vector
<Matrix
> RowVector
;
39 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: resize" );
41 typename
Matrix::size_type num_rows
= 3;
42 typename
Matrix::size_type num_cols
= 5;
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
);
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);
54 pass
&= (matrix
.size1() == new_num_rows
);
55 pass
&= (rows
.size() == new_num_rows
);
56 pass
&= (matrix
.size2() == num_cols
);
59 { // Testing operator()
60 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator()" );
62 Matrix
A(3,3), RA(3,3);
69 for(typename
Matrix::size_type i
= 0; i
< A
.size1(); i
++) {
70 rows(i
) = matrix_row
<Matrix
>(RA
, i
);
73 pass
&= compare_to(A
, RA
);
76 { // Testing operator[]
77 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[]" );
79 Matrix
A(3,3), RA(3,3);
86 for(typename
Matrix::size_type i
= 0; i
< A
.size1(); i
++) {
87 rows
[i
] = matrix_row
<Matrix
>(RA
, i
);
90 pass
&= compare_to(A
, RA
);
93 { // Testing operator[] const
94 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[] const" );
103 for(typename
Matrix::size_type i
= 0; i
< RA
.size1(); i
++) {
104 pass
&= compare_to(rows
[i
], matrix_row
<Matrix
>(RA
, i
));
108 { // Testing const iterator
109 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const iterator" );
118 typename
RowVector::size_type i
= 0;
119 for(typename
RowVector::const_iterator iter
= rows
.begin();
122 pass
&= compare_to(*iter
, matrix_row
<Matrix
>(RA
, i
++));
126 { // Testing iterator
127 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: iterator" );
129 Matrix
A(3,3), RA(3,3);
136 typename
RowVector::size_type i
= 0;
137 for(typename
RowVector::iterator iter
= rows
.begin();
140 *iter
= matrix_row
<Matrix
>(RA
, i
++);
143 pass
&= compare_to(A
, RA
);
146 { // Testing reserse iterator
147 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: reverse iterator" );
149 Matrix
A(3,3), RA(3,3);
156 typename
RowVector::size_type i
= rows
.size();
157 for(typename
RowVector::reverse_iterator iter
= rows
.rbegin();
160 *iter
= matrix_row
<Matrix
>(RA
, --i
);
163 pass
&= compare_to(A
, RA
);
166 { // Testing const reverse iterator
167 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const reverse iterator" );
176 typename
RowVector::size_type i
= rows
.size();
177 for(typename
RowVector::const_reverse_iterator iter
= rows
.rbegin();
180 pass
&= compare_to(*iter
, matrix_row
<Matrix
>(RA
, --i
));
188 template <class Matrix
>
189 bool test_matrix_column_facade() {
192 typedef matrix_column_vector
<Matrix
> ColumnVector
;
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;
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
);
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
);
213 { // Testing operator ()
214 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator()" );
216 Matrix
A(3,3), RA(3,3);
217 ColumnVector
columns(A
);
223 for(typename
Matrix::size_type i
= 0; i
< A
.size2(); i
++) {
224 columns(i
) = matrix_column
<Matrix
>(RA
, i
);
227 pass
&= compare_to(A
, RA
);
230 { // Testing operator[]
231 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[]" );
233 Matrix
A(3,3), RA(3,3);
234 ColumnVector
columns(A
);
240 for(typename
Matrix::size_type i
= 0; i
< A
.size2(); i
++) {
241 columns
[i
] = matrix_column
<Matrix
>(RA
, i
);
244 pass
&= compare_to(A
, RA
);
247 { // Testing operator[] const
248 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[] const" );
251 ColumnVector
columns(RA
);
257 for(typename
Matrix::size_type i
= 0; i
< RA
.size2(); i
++) {
258 pass
&= compare_to(columns
[i
], matrix_column
<Matrix
>(RA
, i
));
262 { // Testing iterator
263 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: iterator" );
265 Matrix
A(3,3), RA(3,3);
266 ColumnVector
columns(A
);
272 typename
ColumnVector::size_type i
= 0;
273 for(typename
ColumnVector::iterator iter
= columns
.begin();
274 iter
!= columns
.end();
276 *iter
= matrix_column
<Matrix
>(RA
, i
++);
279 pass
&= compare_to(A
, RA
);
282 { // Testing const iterator
283 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const iterator" );
286 ColumnVector
columns(RA
);
292 typename
ColumnVector::size_type i
= 0;
293 for(typename
ColumnVector::const_iterator iter
= columns
.begin();
294 iter
!= columns
.end();
296 pass
&= compare_to(*iter
, matrix_column
<Matrix
>(RA
, i
++));
300 { // Testing reserse iterator
301 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: reverese iterator" );
303 Matrix
A(3,3), RA(3,3);
304 ColumnVector
columns(A
);
310 typename
ColumnVector::size_type i
= columns
.size();
311 for(typename
ColumnVector::reverse_iterator iter
= columns
.rbegin();
312 iter
!= columns
.rend();
314 *iter
= matrix_column
<Matrix
>(RA
, --i
);
317 pass
&= compare_to(A
, RA
);
320 { // Testing const reverse iterator
321 BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const reverese iterator" );
324 ColumnVector
columns(RA
);
330 typename
ColumnVector::size_type i
= columns
.size();
331 for(typename
ColumnVector::const_reverse_iterator iter
= columns
.rbegin();
332 iter
!= columns
.rend();
334 pass
&= compare_to(*iter
, matrix_column
<Matrix
>(RA
, --i
));
342 BOOST_UBLAS_TEST_DEF (test_matrix_row_facade
) {
344 BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row vector facade" );
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> >());
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> >()));
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> >());
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> >());
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> >());
398 BOOST_UBLAS_TEST_DEF (test_matrix_column_facade
) {
400 BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row column facade" );
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> >());
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> >()));
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> >());
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> >());
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> >());
450 BOOST_UBLAS_TEST_BEGIN();
452 BOOST_UBLAS_TEST_DO( test_matrix_row_facade
);
453 BOOST_UBLAS_TEST_DO( test_matrix_column_facade
);
455 BOOST_UBLAS_TEST_END();
457 return EXIT_SUCCESS
;;