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 
16 using namespace boost::numeric::ublas;
17 
18 
19 template <class Vector, class StorageCategory>
guardSparsePreserveResize(Vector & vec,typename Vector::size_type new_size,StorageCategory)20 void 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 
26 template <class Vector>
guardSparsePreserveResize(Vector & vec,typename Vector::size_type new_size,sparse_tag)27 void 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 
32 template <class Matrix>
test_matrix_row_facade()33 bool 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 
188 template <class Matrix>
test_matrix_column_facade()189 bool 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 
BOOST_UBLAS_TEST_DEF(test_matrix_row_facade)342 BOOST_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 
BOOST_UBLAS_TEST_DEF(test_matrix_column_facade)398 BOOST_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 
main()449 int 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