1 //  Copyright (c) 2011 David Bellot
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See
4 //  accompanying file LICENSE_1_0.txt or copy at
5 //  http://www.boost.org/LICENSE_1_0.txt)
6 
7 #include <boost/numeric/ublas/fwd.hpp>
8 #include <boost/numeric/ublas/matrix.hpp>
9 #include <boost/numeric/ublas/matrix_expression.hpp>
10 #include <boost/numeric/ublas/operation/size.hpp>
11 #include <boost/numeric/ublas/tags.hpp>
12 #include <boost/numeric/ublas/vector.hpp>
13 #include <boost/numeric/ublas/vector_expression.hpp>
14 #include <iostream>
15 #include "utils.hpp"
16 
17 
BOOST_UBLAS_TEST_DEF(test_vector_container)18 BOOST_UBLAS_TEST_DEF( test_vector_container )
19 {
20     BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Container" );
21 
22     typedef double value_type;
23     typedef boost::numeric::ublas::vector<value_type> vector_type;
24 
25     vector_type v(5);
26 
27     v(0) = 0.555950;
28     v(1) = 0.108929;
29     v(2) = 0.948014;
30     v(3) = 0.023787;
31     v(4) = 1.023787;
32 
33 
34     // size(v)
35     BOOST_UBLAS_DEBUG_TRACE( "size(v) = " << boost::numeric::ublas::size(v) << " ==> " << v.size() );
36     BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(v) == v.size() );
37 
38     // size<1>(v)
39     BOOST_UBLAS_DEBUG_TRACE( "size<1>(v) = " << (boost::numeric::ublas::size<1>(v)) << " ==> " << v.size() );
40     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(v) == v.size()) );
41 
42     // [NOT_COMPILE]: this should *correctly* cause a compilation error
43     // size<2>(v)
44     //BOOST_UBLAS_DEBUG_TRACE( "size<2>(v) = " << (boost::numeric::ublas::size<vector_type,2>(v)) << " ==> " << v.size() );
45     //BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(v) == v.size()) );
46     // [/NOT_COMPILE]
47 }
48 
49 
BOOST_UBLAS_TEST_DEF(test_vector_expression)50 BOOST_UBLAS_TEST_DEF( test_vector_expression )
51 {
52     BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Expression" );
53 
54     typedef double value_type;
55     typedef boost::numeric::ublas::vector<value_type> vector_type;
56 
57     vector_type v(5);
58 
59     v(0) = 0.555950;
60     v(1) = 0.108929;
61     v(2) = 0.948014;
62     v(3) = 0.023787;
63     v(4) = 1.023787;
64 
65 
66     // size(-v)
67     BOOST_UBLAS_DEBUG_TRACE( "size(-v) = " << boost::numeric::ublas::size(-v) << " ==> " << (-v).size() );
68     BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(-v) == (-v).size() );
69 
70     // size<1>(-v)
71     BOOST_UBLAS_DEBUG_TRACE( "size<1>(-v) = " << (boost::numeric::ublas::size<1>(-v)) << " ==> " << (-v).size() );
72     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(-v) == (-v).size()) );
73 }
74 
75 
BOOST_UBLAS_TEST_DEF(test_vector_reference)76 BOOST_UBLAS_TEST_DEF( test_vector_reference )
77 {
78     BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Reference" );
79 
80     typedef double value_type;
81     typedef boost::numeric::ublas::vector<value_type> vector_type;
82     typedef boost::numeric::ublas::vector_reference<vector_type> vector_reference_type;
83 
84     vector_type v(5);
85 
86     v(0) = 0.555950;
87     v(1) = 0.108929;
88     v(2) = 0.948014;
89     v(3) = 0.023787;
90     v(4) = 1.023787;
91 
92 
93     // size(reference(v)
94     BOOST_UBLAS_DEBUG_TRACE( "size(reference(v)) = " << boost::numeric::ublas::size(vector_reference_type(v)) << " ==> " << vector_reference_type(v).size() );
95     BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(vector_reference_type(v)) == vector_reference_type(v).size() );
96 
97     // size<1>(reference(v))
98     BOOST_UBLAS_DEBUG_TRACE( "size<1>(reference(v)) = " << (boost::numeric::ublas::size<1>(vector_reference_type(v))) << " ==> " << vector_reference_type(v).size() );
99     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(vector_reference_type(v)) == vector_reference_type(v).size()) );
100 }
101 
102 
BOOST_UBLAS_TEST_DEF(test_row_major_matrix_container)103 BOOST_UBLAS_TEST_DEF( test_row_major_matrix_container )
104 {
105     BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Container" );
106 
107     typedef double value_type;
108     typedef boost::numeric::ublas::matrix<value_type, boost::numeric::ublas::row_major> matrix_type;
109 
110     matrix_type A(5,4);
111 
112     A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938;
113     A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283;
114     A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152;
115     A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332;
116     A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332;
117 
118 
119     // [NOT_COMPILE]
120     // size(A)
121     //BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << boost::numeric::ublas::size(A) << " ==> " << A.size1() );
122     //BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(A) == A.size1() );
123     // [/NOT_COMPILE]
124 
125     // size<1>(A)
126     BOOST_UBLAS_DEBUG_TRACE( "size<1>(A) = " << (boost::numeric::ublas::size<1>(A)) << " ==> " << A.size1() );
127     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(A) == A.size1()) );
128 
129     // size<2>(A)
130     BOOST_UBLAS_DEBUG_TRACE( "size<2>(A) = " << (boost::numeric::ublas::size<2>(A)) << " ==> " << A.size2() );
131     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(A) == A.size2()) );
132 
133     // size<major>(A)
134     BOOST_UBLAS_DEBUG_TRACE( "size<major>(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(A)) << " ==> " << A.size1() );
135     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(A) == A.size1()) );
136 
137     // size<minor>(A)
138     BOOST_UBLAS_DEBUG_TRACE( "size<minor>(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(A)) << " ==> " << A.size2() );
139     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(A) == A.size2()) );
140 
141     // size<leading>(A)
142     BOOST_UBLAS_DEBUG_TRACE( "size<leading>(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(A)) << " ==> " << A.size2() );
143     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(A) == A.size2()) );
144 }
145 
146 
BOOST_UBLAS_TEST_DEF(test_col_major_matrix_container)147 BOOST_UBLAS_TEST_DEF( test_col_major_matrix_container )
148 {
149     BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Container" );
150 
151     typedef double value_type;
152     typedef boost::numeric::ublas::matrix<value_type, boost::numeric::ublas::column_major> matrix_type;
153 
154     matrix_type A(5,4);
155 
156     A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938;
157     A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283;
158     A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152;
159     A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332;
160     A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332;
161 
162 
163     // size<1>(A)
164     BOOST_UBLAS_DEBUG_TRACE( "size<1>(A) = " << (boost::numeric::ublas::size<1>(A)) << " ==> " << A.size1() );
165     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(A) == A.size1()) );
166 
167     // size<2>(A)
168     BOOST_UBLAS_DEBUG_TRACE( "size<2>(A) = " << (boost::numeric::ublas::size<2>(A)) << " ==> " << A.size2() );
169     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(A) == A.size2()) );
170 
171     // size<major>(A)
172     BOOST_UBLAS_DEBUG_TRACE( "size<major>(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(A)) << " ==> " << A.size2() );
173     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(A) == A.size2()) );
174 
175     // size<minor>(A)
176     BOOST_UBLAS_DEBUG_TRACE( "size<minor>(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(A)) << " ==> " << A.size1() );
177     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(A) == A.size1()) );
178 
179     // size<leading>(A)
180     BOOST_UBLAS_DEBUG_TRACE( "size<leading>(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(A)) << " ==> " << A.size1() );
181     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(A) == A.size1()) );
182 }
183 
184 
BOOST_UBLAS_TEST_DEF(test_matrix_expression)185 BOOST_UBLAS_TEST_DEF( test_matrix_expression )
186 {
187     BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Expression" );
188 
189     typedef double value_type;
190     typedef boost::numeric::ublas::matrix<value_type> matrix_type;
191 
192     matrix_type A(5,4);
193 
194     A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938;
195     A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283;
196     A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152;
197     A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332;
198     A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332;
199 
200 
201     // size<1>(A')
202     BOOST_UBLAS_DEBUG_TRACE( "size<1>(A') = " << (boost::numeric::ublas::size<1>(boost::numeric::ublas::trans(A))) << " ==> " << A.size2() );
203     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(boost::numeric::ublas::trans(A)) == A.size2()) );
204 
205     // size<2>(A')
206     BOOST_UBLAS_DEBUG_TRACE( "size<2>(A') = " << (boost::numeric::ublas::size<2>(boost::numeric::ublas::trans(A))) << " ==> " << A.size1() );
207     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(boost::numeric::ublas::trans(A)) == A.size1()) );
208 
209     // size<major>(A') [A is row-major => A' column-major, and viceversa]
210     BOOST_UBLAS_DEBUG_TRACE( "size<major>(A') = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(boost::numeric::ublas::trans(A))) << " ==> " << A.size1() );
211     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(boost::numeric::ublas::trans(A)) == A.size1()) );
212 
213     // size<minor>(A')  [A is row-major => A' column-major, and viceversa]
214     BOOST_UBLAS_DEBUG_TRACE( "size<minor>(A') = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(boost::numeric::ublas::trans(A))) << " ==> " << A.size2() );
215     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(boost::numeric::ublas::trans(A)) == A.size2()) );
216 
217     // size<leading>(A')  [A row-major => A' column-major, and viceversa]
218     BOOST_UBLAS_DEBUG_TRACE( "size<leading>(A') = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(boost::numeric::ublas::trans(A))) << " ==> " << A.size2() );
219     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(boost::numeric::ublas::trans(A)) == A.size2()) );
220 }
221 
222 
BOOST_UBLAS_TEST_DEF(test_matrix_reference)223 BOOST_UBLAS_TEST_DEF( test_matrix_reference )
224 {
225     BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Reference" );
226 
227     typedef double value_type;
228     typedef boost::numeric::ublas::matrix<value_type> matrix_type;
229     typedef boost::numeric::ublas::matrix_reference<matrix_type> matrix_reference_type;
230 
231     matrix_type A(5,4);
232 
233     A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938;
234     A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283;
235     A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152;
236     A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332;
237     A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332;
238 
239 
240     // size<1>(reference(A))
241     BOOST_UBLAS_DEBUG_TRACE( "size<1>(reference(A)) = " << (boost::numeric::ublas::size<1>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size1() );
242     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(matrix_reference_type(A)) == matrix_reference_type(A).size1()) );
243 
244     // size<2>(reference(A))
245     BOOST_UBLAS_DEBUG_TRACE( "size<2>(reference(A)) = " << (boost::numeric::ublas::size<2>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size2() );
246     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(matrix_reference_type(A)) == matrix_reference_type(A).size2()) );
247 
248     // size<major>(reference(A))
249     BOOST_UBLAS_DEBUG_TRACE( "size<major>(reference(A) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size1() );
250     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::major>(matrix_reference_type(A)) == matrix_reference_type(A).size1()) );
251 
252     // size<minor>(reference(A))
253     BOOST_UBLAS_DEBUG_TRACE( "size<minor>(reference(A)) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size2() );
254     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::minor>(matrix_reference_type(A)) == matrix_reference_type(A).size2()) );
255 
256     // size<leading>(reference(A))
257     BOOST_UBLAS_DEBUG_TRACE( "size<leading>(reference(A)) = " << (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size2() );
258     BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<boost::numeric::ublas::tag::leading>(matrix_reference_type(A)) == matrix_reference_type(A).size2()) );
259 }
260 
261 
main()262 int main()
263 {
264     BOOST_UBLAS_TEST_BEGIN();
265 
266     BOOST_UBLAS_TEST_DO( test_vector_container );
267     BOOST_UBLAS_TEST_DO( test_vector_expression );
268     BOOST_UBLAS_TEST_DO( test_vector_reference );
269     BOOST_UBLAS_TEST_DO( test_row_major_matrix_container );
270     BOOST_UBLAS_TEST_DO( test_col_major_matrix_container );
271     BOOST_UBLAS_TEST_DO( test_matrix_expression );
272     BOOST_UBLAS_TEST_DO( test_matrix_reference );
273 
274     BOOST_UBLAS_TEST_END();
275 }
276