1 #undef BOOST_UBLAS_NO_EXCEPTIONS
2 #include "common/testhelper.hpp"
3 #include <boost/numeric/ublas/vector.hpp>
4 #include <boost/numeric/ublas/matrix.hpp>
5 #include <boost/numeric/ublas/assignment.hpp>
6 #include <boost/numeric/ublas/io.hpp>
7 #include <string>
8 #include <sstream>
9 #include <complex>
10 #include <iomanip>
11 #include "utils.hpp"
12 
13 #ifdef BOOST_UBLAS_CPP_GE_2011
14 
15 using namespace boost::numeric::ublas;
16 
17 using std::cout;
18 using std::endl;
19 
20 template < class T >
test_vector(std::string type_name)21 bool test_vector( std::string type_name)
22 {
23     std::stringstream stream;
24     stream << "Testing for: " << type_name;
25     BOOST_UBLAS_DEBUG_TRACE( stream.str() );
26 
27     bool pass = true;
28 
29     {
30         typedef fixed_vector<T, 1> vec1;
31 
32         vec1 v1( 122.0 );
33 
34         pass &= ( v1(0) == (T)122 );
35 
36     }
37 
38     {
39         typedef fixed_vector<T, 3> vec3;
40 
41         vec3 v1((T)0.0, (T)0.0, (T)0.0);
42 
43         pass &=(sizeof( vec3 )  == v1.size()*sizeof( T ) ) ;
44 
45         vector<T> v( 3, 0 ) ;
46 
47         pass &= compare( v1, v );
48 
49         v1 <<= 10.0, 10, 33;
50         v  <<= 10.0, 10, 33;
51 
52         //cout << std::setprecision(20) << v1 << '\n' << v;
53 
54         pass &= compare( v1, v );
55 
56 
57         vec3 v2;
58 
59         v2( 0 ) = 10.0; v2( 1 ) = 10; v2( 2 ) = 33;
60         pass &= compare( v, v2 );
61 
62         v2 += v;
63 
64         pass &= compare( v2, 2*v );
65 
66 
67         v1 = 2*v1 + v - 6*v2;
68         pass &= compare( v1, (3-2*6)*v );
69 
70 
71         vec3 v3{ (T)-90.0, (T)-90.0, (T)-297.0 };
72         pass &= compare( v3, v1 );
73 
74         vec3 v4 =  { (T)-90.0, (T)-90.0, (T)-297.0 };
75         pass &= compare( v4, v1 );
76 
77         vec3 v5( (T)-90.0, (T)-90.0, (T)-297.0 );
78         pass &= compare( v5, v1 );
79 
80         vec3 v6((T) 5.0, (T)8.0, (T)9.0);
81 
82         matrix<T> M = outer_prod( v6, v6), L( 3, 3);
83 
84         L <<= 25, 40, 45, 40, 64, 72, 45, 72, 81;
85 
86         pass &= compare( M, L );
87 
88         L  <<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
89         v6 <<= 4, 5, 6;
90         vec3 v7 ( (T)32.0, (T)77.0, (T)122.0 );
91 
92         pass &= compare( v7, prod(L, v6) );
93 
94         vec3 v8;
95         noalias( v8 ) = prod(L, v6);
96 
97         pass &= compare( v7, v8 );
98 
99     }
100 
101 
102     {
103         const std::size_t N = 33;
104         typedef fixed_vector<T, N> vec33;
105 
106         vec33 v1;
107         vector<T> v( N );
108 
109         for ( std::size_t i = 0; i!= v1.size(); i++)
110         {
111             v1( i ) = 3.14159*i;
112             v ( i ) = 3.14159*i;
113         }
114 
115         pass &= compare( v1, v );
116 
117 
118         auto ip = inner_prod( v, v);
119         auto ip1 = inner_prod( v1, v1);
120 
121         pass &= (  ip == ip1 ) ;
122 
123         T c = 0;
124         for (auto i = v1.begin(); i != v1.end(); i++)
125         {
126             *i = c;
127             c = c + 1;
128         }
129 
130         c = 0;
131         for (auto i = v.begin(); i != v.end(); i++)
132         {
133             *i = c;
134             c = c + 1;
135         }
136 
137         pass &= compare( v1, v );
138 
139         // Check if bad index indeed works
140         try {
141             T a;
142             a=v1( 100 );
143             BOOST_UBLAS_NOT_USED( a );
144 
145         } catch ( bad_index &e) {
146             std::cout << " Caught (GOOD): " << e.what() << endl;
147             pass &= true;
148         }
149 
150 
151     }
152     return pass;
153 }
154 
155 template < class T >
test_matrix(std::string type_name)156 bool test_matrix( std::string type_name)
157 {
158     std::stringstream stream;
159     stream << "Testing for: " << type_name;
160     BOOST_UBLAS_DEBUG_TRACE( stream.str() );
161 
162     bool pass = true;
163 
164     typedef fixed_matrix<T, 3, 4> mat34;
165     typedef fixed_matrix<T, 4, 3> mat43;
166     typedef fixed_matrix<T, 3, 3> mat33;
167 
168 
169     {
170         typedef fixed_matrix<T, 1, 1> mat1;
171 
172         mat1 m1( 122.0 );
173 
174         pass &= ( m1(0, 0) == (T)122 );
175     }
176 
177 
178     {
179         mat34 m1( 3.0 );
180 
181         pass &=(sizeof( mat34 )  == m1.size1()*m1.size2()*sizeof( T ) ) ;
182 
183         matrix<T> m( 3.0, 4.0, 3.0 ) ;
184 
185         pass &= compare( m1, m );
186 
187         cout << m1 << endl;
188         cout << m << endl;
189 
190 
191         m1 <<= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
192         m  <<= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
193 
194         pass &= compare( m1, m );
195 
196         cout << m1 << endl;
197         cout << m << endl;
198 
199         mat34 m2( 0.0 );
200 
201         T count = 1 ;
202         for ( std::size_t i = 0; i != m2.size1(); i++)
203         {
204             for (std::size_t j = 0; j!= m2.size2(); j++)
205             {
206                 m2( i, j ) = count;
207                 count = count + 1;
208             }
209 
210         }
211         pass &= compare( m2, m );
212         cout << m2 << endl;
213 
214     }
215     {
216         mat34 m1 = { (T)1, (T)2, (T)3, (T)3, (T)3, (T)2, (T)5, (T)4, (T)2, (T)6, (T)5, (T)2 };
217         mat43 m2 = { (T)4, (T)5, (T)6, (T)3, (T)2, (T)2, (T)1, (T)4, (T)2, (T)6, (T)5, (T)2 };
218 
219         mat33 m3 = prod(m1, m2);
220 
221         matrix<T> m(3, 3);
222         m <<= 31,36,22,47,59,40,43,52,38;
223 
224         pass &= compare(m ,m3);
225 
226         mat33 m4;
227         m4 <<= (T)1, (T)2, (T)1, (T)2, (T)1, (T)3, (T)1, (T)2, (T) 5;
228         m3  = prod(m4, trans(m4));
229 
230         m<<=6,7,10,7,14,19,10,19,30;
231 
232         cout << m3 << endl;
233         pass &= compare(m ,m3);
234 
235         m3 = 2 * m4 - 1 * m3;
236 
237         cout << m3;
238 
239         m <<= -4,-3,-8,-3,-12,-13,-8,-15,-20;
240 
241         pass &= compare(m, m3);
242 
243         m = m3;
244 
245         m3 = trans(m);
246 
247         pass &= compare(m3, trans(m));
248 
249         // Check if bad index indeed works
250         try {
251             T a;
252             a=m1( 100, 100 );
253             BOOST_UBLAS_NOT_USED( a );
254 
255         } catch ( bad_index &e) {
256             std::cout << " Caught (GOOD): " << e.what() << endl;
257             pass &= true;
258         }
259 
260     }
261 
262     return pass;
263 
264 }
265 
BOOST_UBLAS_TEST_DEF(test_fixed)266 BOOST_UBLAS_TEST_DEF (test_fixed) {
267 
268     BOOST_UBLAS_DEBUG_TRACE( "Starting fixed container tests" );
269 
270     BOOST_UBLAS_TEST_CHECK(  test_vector< double >( "double") );
271     BOOST_UBLAS_TEST_CHECK(  test_vector< float >( "float") );
272     BOOST_UBLAS_TEST_CHECK(  test_vector< int >( "int") );
273 
274     BOOST_UBLAS_TEST_CHECK(  test_vector< std::complex<double> >( "std::complex<double>") );
275     BOOST_UBLAS_TEST_CHECK(  test_vector< std::complex<float> >( "std::complex<float>") );
276     BOOST_UBLAS_TEST_CHECK(  test_vector< std::complex<int> >( "std::complex<int>") );
277 
278     BOOST_UBLAS_TEST_CHECK(  test_matrix< double >( "double") );
279     BOOST_UBLAS_TEST_CHECK(  test_matrix< float >( "float") );
280     BOOST_UBLAS_TEST_CHECK(  test_matrix< int >( "int") );
281 
282     BOOST_UBLAS_TEST_CHECK(  test_matrix< std::complex<double> >( "std::complex<double>") );
283     BOOST_UBLAS_TEST_CHECK(  test_matrix< std::complex<float> >( "std::complex<float>") );
284     BOOST_UBLAS_TEST_CHECK(  test_matrix< std::complex<int> >( "std::complex<int>") );
285 }
286 
287 
main()288 int main () {
289 
290     BOOST_UBLAS_TEST_BEGIN();
291 
292     BOOST_UBLAS_TEST_DO( test_fixed );
293 
294     BOOST_UBLAS_TEST_END();
295     return EXIT_SUCCESS;
296 
297 }
298 
299 #else
300 
main()301 int main () {
302 
303     BOOST_UBLAS_TEST_BEGIN();
304     BOOST_UBLAS_TEST_END();
305 
306     return EXIT_SUCCESS;
307 
308 }
309 #endif // BOOST_UBLAS_CPP_GE_2011
310