]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multiprecision/test/ublas_interop/test42.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / multiprecision / test / ublas_interop / test42.cpp
1 //
2 // Copyright (c) 2000-2002
3 // Joerg Walter, Mathias Koch
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 //
9 // The authors gratefully acknowledge the support of
10 // GeNeSys mbH & Co. KG in producing this work.
11 //
12
13 #if defined(__GNUC__) && (__GNUC__ >= 9)
14 #pragma GCC diagnostic ignored "-Wdeprecated-copy"
15 #endif
16
17 #include "test4.hpp"
18
19 // Test matrix & vector expression templates
20 template <class V, class M, int N>
21 struct test_my_matrix_vector
22 {
23 typedef typename V::value_type value_type;
24
25 template <class VP, class MP>
26 void test_with(VP& v1, VP& v2, MP& m1) const
27 {
28 {
29 #ifndef USE_DIAGONAL
30 // Rows and columns
31 initialize_matrix(m1);
32 for (int i = 0; i < N; ++i)
33 {
34 v2 = ublas::row(m1, i);
35 std::cout << "row (m, " << i << ") = " << v2 << std::endl;
36 v2 = ublas::column(m1, i);
37 std::cout << "column (m, " << i << ") = " << v2 << std::endl;
38 }
39
40 // Outer product
41 initialize_vector(v1);
42 initialize_vector(v2);
43 v1(0) = 0;
44 v1(N - 1) = 0;
45 m1 = ublas::outer_prod(v1, v2);
46 std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
47
48 // Matrix vector product
49 initialize_matrix(m1);
50 initialize_vector(v1);
51 v2 = ublas::prod(m1, v1);
52 std::cout << "prod (m1, v1) = " << v2 << std::endl;
53 v2 = ublas::prod(v1, m1);
54 std::cout << "prod (v1, m1) = " << v2 << std::endl;
55 #endif
56 }
57 }
58 void operator()() const
59 {
60 {
61 V v1(N), v2(N);
62 #ifdef USE_BANDED
63 M m1(N, N, 1, 1);
64 #endif
65 #ifdef USE_DIAGONAL
66 M m1(N, N);
67 #endif
68 test_with(v1, v2, m1);
69
70 ublas::matrix_row<M> mr1(m1, 1), mr2(m1, 1);
71 test_with(mr1, mr2, m1);
72
73 ublas::matrix_column<M> mc1(m1, 1), mc2(m1, 1);
74 test_with(mc1, mc2, m1);
75
76 #ifdef USE_RANGE
77 ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),
78 mvr2(m1, ublas::range(0, N), ublas::range(0, N));
79 test_with(mvr1, mvr2, m1);
80 #endif
81
82 #ifdef USE_SLICE
83 ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
84 mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
85 test_with(mvs1, mvs2, m1);
86 #endif
87 }
88 }
89
90 void operator()(int) const
91 {
92 #ifdef USE_ADAPTOR
93 {
94 #ifdef USE_BANDED
95 V v1(N), v2(N);
96 M m1(N, N, 1, 1);
97 ublas::banded_adaptor<M> bam1(m1, 1, 1);
98 test_with(v1, v2, bam1);
99
100 ublas::matrix_row<ublas::banded_adaptor<M> > mr1(bam1, 1), mr2(bam1, 1);
101 test_with(mr1, mr2, bam1);
102
103 ublas::matrix_column<ublas::banded_adaptor<M> > mc1(bam1, 1), mc2(bam1, 1);
104 test_with(mc1, mc2, bam1);
105
106 #ifdef USE_RANGE
107 ublas::matrix_vector_range<ublas::banded_adaptor<M> > mvr1(bam1, ublas::range(0, N), ublas::range(0, N)),
108 mvr2(bam1, ublas::range(0, N), ublas::range(0, N));
109 test_with(mvr1, mvr2, bam1);
110 #endif
111
112 #ifdef USE_SLICE
113 ublas::matrix_vector_slice<ublas::banded_adaptor<M> > mvs1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
114 mvs2(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
115 test_with(mvs1, mvs2, bam1);
116 #endif
117 #endif
118 #ifdef USE_DIAGONAL
119 V v1(N), v2(N);
120 M m1(N, N);
121 ublas::diagonal_adaptor<M> dam1(m1);
122 test_with(v1, v2, dam1);
123
124 ublas::matrix_row<ublas::diagonal_adaptor<M> > mr1(dam1, 1), mr2(dam1, 1);
125 test_with(mr1, mr2, dam1);
126
127 ublas::matrix_column<ublas::diagonal_adaptor<M> > mc1(dam1, 1), mc2(dam1, 1);
128 test_with(mc1, mc2, dam1);
129
130 #ifdef USE_RANGE
131 ublas::matrix_vector_range<ublas::diagonal_adaptor<M> > mvr1(dam1, ublas::range(0, N), ublas::range(0, N)),
132 mvr2(dam1, ublas::range(0, N), ublas::range(0, N));
133 test_with(mvr1, mvr2, dam1);
134 #endif
135
136 #ifdef USE_SLICE
137 ublas::matrix_vector_slice<ublas::diagonal_adaptor<M> > mvs1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
138 mvs2(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
139 test_with(mvs1, mvs2, dam1);
140 #endif
141 #endif
142 }
143 #endif
144 }
145 };
146
147 // Test matrix & vector
148 void test_matrix_vector()
149 {
150 std::cout << "test_matrix_vector" << std::endl;
151
152 #ifdef USE_BANDED
153 #ifdef USE_BOUNDED_ARRAY
154 #ifdef USE_FLOAT
155 std::cout << "mp_test_type, bounded_array" << std::endl;
156 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
157 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
158 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
159 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
160 #endif
161
162 #ifdef USE_DOUBLE
163 std::cout << "double, bounded_array" << std::endl;
164 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
165 ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
166 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
167 ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
168 #endif
169
170 #ifdef USE_STD_COMPLEX
171 #ifdef USE_FLOAT
172 std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
173 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
174 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
175 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
176 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
177 #endif
178
179 #ifdef USE_DOUBLE
180 std::cout << "std::complex<double>, bounded_array" << std::endl;
181 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
182 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
183 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
184 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
185 #endif
186 #endif
187 #endif
188
189 #ifdef USE_UNBOUNDED_ARRAY
190 #ifdef USE_FLOAT
191 std::cout << "mp_test_type, unbounded_array" << std::endl;
192 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
193 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
194 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
195 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
196 #endif
197
198 #ifdef USE_DOUBLE
199 std::cout << "double, unbounded_array" << std::endl;
200 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
201 ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
202 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
203 ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
204 #endif
205
206 #ifdef USE_STD_COMPLEX
207 #ifdef USE_FLOAT
208 std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
209 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
210 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
211 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
212 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
213 #endif
214
215 #ifdef USE_DOUBLE
216 std::cout << "std::complex<double>, unbounded_array" << std::endl;
217 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
218 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
219 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
220 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
221 #endif
222 #endif
223 #endif
224
225 #ifdef USE_STD_VECTOR
226 #ifdef USE_FLOAT
227 std::cout << "mp_test_type, std::vector" << std::endl;
228 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
229 ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();
230 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
231 ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
232 #endif
233
234 #ifdef USE_DOUBLE
235 std::cout << "double, std::vector" << std::endl;
236 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
237 ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()();
238 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
239 ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);
240 #endif
241
242 #ifdef USE_STD_COMPLEX
243 #ifdef USE_FLOAT
244 std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
245 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
246 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
247 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
248 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
249 #endif
250
251 #ifdef USE_DOUBLE
252 std::cout << "std::complex<double>, std::vector" << std::endl;
253 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
254 ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
255 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
256 ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);
257 #endif
258 #endif
259 #endif
260 #endif
261
262 #ifdef USE_DIAGONAL
263 #ifdef USE_BOUNDED_ARRAY
264 #ifdef USE_FLOAT
265 std::cout << "mp_test_type, bounded_array" << std::endl;
266 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
267 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
268 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
269 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
270 #endif
271
272 #ifdef USE_DOUBLE
273 std::cout << "double, bounded_array" << std::endl;
274 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
275 ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
276 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
277 ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
278 #endif
279
280 #ifdef USE_STD_COMPLEX
281 #ifdef USE_FLOAT
282 std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
283 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
284 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
285 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
286 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
287 #endif
288
289 #ifdef USE_DOUBLE
290 std::cout << "std::complex<double>, bounded_array" << std::endl;
291 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
292 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
293 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
294 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
295 #endif
296 #endif
297 #endif
298
299 #ifdef USE_UNBOUNDED_ARRAY
300 #ifdef USE_FLOAT
301 std::cout << "mp_test_type, unbounded_array" << std::endl;
302 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
303 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
304 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
305 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
306 #endif
307
308 #ifdef USE_DOUBLE
309 std::cout << "double, unbounded_array" << std::endl;
310 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
311 ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
312 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
313 ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
314 #endif
315
316 #ifdef USE_STD_COMPLEX
317 #ifdef USE_FLOAT
318 std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
319 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
320 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
321 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
322 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
323 #endif
324
325 #ifdef USE_DOUBLE
326 std::cout << "std::complex<double>, unbounded_array" << std::endl;
327 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
328 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
329 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
330 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
331 #endif
332 #endif
333 #endif
334
335 #ifdef USE_STD_VECTOR
336 #ifdef USE_FLOAT
337 std::cout << "mp_test_type, std::vector" << std::endl;
338 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
339 ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();
340 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
341 ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
342 #endif
343
344 #ifdef USE_DOUBLE
345 std::cout << "double, std::vector" << std::endl;
346 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
347 ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()();
348 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
349 ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);
350 #endif
351
352 #ifdef USE_STD_COMPLEX
353 #ifdef USE_FLOAT
354 std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
355 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
356 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
357 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
358 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
359 #endif
360
361 #ifdef USE_DOUBLE
362 std::cout << "std::complex<double>, std::vector" << std::endl;
363 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
364 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
365 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
366 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);
367 #endif
368 #endif
369 #endif
370 #endif
371 }