Imported Upstream version 1.72.0
[platform/upstream/boost.git] / 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 }