]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multiprecision/test/ublas_interop/test63.cpp
2 // Copyright (c) 2000-2002
3 // Joerg Walter, Mathias Koch
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)
9 // The authors gratefully acknowledge the support of
10 // GeNeSys mbH & Co. KG in producing this work.
15 // Test matrix expression templates
16 template<class M
, int N
>
17 struct test_my_matrix
{
18 typedef typename
M::value_type value_type
;
21 void test_with (MP
&m1
, MP
&m2
, MP
&m3
) const {
26 default_construct
<MP
>::test ();
29 initialize_matrix (m1
);
30 initialize_matrix (m2
);
32 std::cout
<< "m1 = m2 = " << m1
<< std::endl
;
33 m1
.assign_temporary (m2
);
34 std::cout
<< "m1.assign_temporary (m2) = " << m1
<< std::endl
;
36 std::cout
<< "m1.swap (m2) = " << m1
<< " " << m2
<< std::endl
;
39 m1
= ublas::zero_matrix
<> (m1
.size1 (), m1
.size2 ());
40 std::cout
<< "m1.zero_matrix = " << m1
<< std::endl
;
43 // Unary matrix operations resulting in a matrix
44 initialize_matrix (m1
);
46 std::cout
<< "- m1 = " << m2
<< std::endl
;
47 m2
= ublas::conj (m1
);
48 std::cout
<< "conj (m1) = " << m2
<< std::endl
;
50 // Binary matrix operations resulting in a matrix
51 initialize_matrix (m1
);
52 initialize_matrix (m2
);
54 std::cout
<< "m1 + m2 = " << m3
<< std::endl
;
56 std::cout
<< "m1 - m2 = " << m3
<< std::endl
;
60 initialize_matrix (m1
);
61 m2
= value_type (1.) * m1
;
62 std::cout
<< "1. * m1 = " << m2
<< std::endl
;
64 std::cout
<< "N * m1 = " << m2
<< std::endl
;
65 initialize_matrix (m1
);
66 m2
= m1
* value_type (1.);
67 std::cout
<< "m1 * 1. = " << m2
<< std::endl
;
69 std::cout
<< "m1 * N = " << m2
<< std::endl
;
72 initialize_matrix (m1
);
73 initialize_matrix (m2
);
75 std::cout
<< "m2 += m1 = " << m2
<< std::endl
;
77 std::cout
<< "m2 -= m1 = " << m2
<< std::endl
;
79 std::cout
<< "m2 = m2 + m1 = " << m2
<< std::endl
;
81 std::cout
<< "m2 = m1 - m1 = " << m2
<< std::endl
;
82 m1
*= value_type (1.);
83 std::cout
<< "m1 *= 1. = " << m1
<< std::endl
;
85 std::cout
<< "m1 *= N = " << m1
<< std::endl
;
88 initialize_matrix (m1
);
89 m2
= ublas::trans (m1
);
90 std::cout
<< "trans (m1) = " << m2
<< std::endl
;
93 initialize_matrix (m1
);
94 m2
= ublas::herm (m1
);
95 std::cout
<< "herm (m1) = " << m2
<< std::endl
;
97 // Matrix multiplication
98 initialize_matrix (m1
);
99 initialize_matrix (m2
);
100 m3
= ublas::prod (m1
, m2
);
101 std::cout
<< "prod (m1, m2) = " << m3
<< std::endl
;
104 void operator () () const {
106 M
m1 (N
, N
), m2 (N
, N
), m3 (N
, N
);
107 test_with (m1
, m2
, m3
);
110 ublas::matrix_range
<M
> mr1 (m1
, ublas::range (0, N
), ublas::range (0, N
)),
111 mr2 (m2
, ublas::range (0, N
), ublas::range (0, N
)),
112 mr3 (m3
, ublas::range (0, N
), ublas::range (0, N
));
113 test_with (mr1
, mr2
, mr3
);
117 ublas::matrix_slice
<M
> ms1 (m1
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
118 ms2 (m2
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
119 ms3 (m3
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
));
120 test_with (ms1
, ms2
, ms3
);
126 M
m1 (N
, N
), m2 (N
, N
), m3 (N
, N
);
127 ublas::symmetric_adaptor
<M
> sam1 (m1
), sam2 (m2
), sam3 (m3
);
128 test_with (sam1
, sam2
, sam3
);
131 ublas::matrix_range
<ublas::symmetric_adaptor
<M
> > mr1 (sam1
, ublas::range (0, N
), ublas::range (0, N
)),
132 mr2 (sam2
, ublas::range (0, N
), ublas::range (0, N
)),
133 mr3 (sam3
, ublas::range (0, N
), ublas::range (0, N
));
134 test_with (mr1
, mr2
, mr3
);
138 ublas::matrix_slice
<ublas::symmetric_adaptor
<M
> > ms1 (sam1
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
139 ms2 (sam2
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
140 ms3 (sam3
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
));
141 test_with (ms1
, ms2
, ms3
);
149 void test_matrix () {
150 std::cout
<< "test_matrix" << std::endl
;
152 #ifdef USE_BOUNDED_ARRAY
154 std::cout
<< "mp_test_type, bounded_array" << std::endl
;
155 test_my_matrix
<ublas::symmetric_matrix
<mp_test_type
, ublas::lower
, ublas::row_major
, ublas::bounded_array
<mp_test_type
, 3 * 3> >, 3 > () ();
159 std::cout
<< "double, bounded_array" << std::endl
;
160 test_my_matrix
<ublas::symmetric_matrix
<double, ublas::lower
, ublas::row_major
, ublas::bounded_array
<double, 3 * 3> >, 3 > () ();
163 #ifdef USE_STD_COMPLEX
165 std::cout
<< "std::complex<mp_test_type>, bounded_array" << std::endl
;
166 test_my_matrix
<ublas::symmetric_matrix
<std::complex<mp_test_type
>, ublas::lower
, ublas::row_major
, ublas::bounded_array
<std::complex<mp_test_type
>, 3 * 3> >, 3 > () ();
170 std::cout
<< "std::complex<double>, bounded_array" << std::endl
;
171 test_my_matrix
<ublas::symmetric_matrix
<std::complex<double>, ublas::lower
, ublas::row_major
, ublas::bounded_array
<std::complex<double>, 3 * 3> >, 3 > () ();
176 #ifdef USE_UNBOUNDED_ARRAY
178 std::cout
<< "mp_test_type, unbounded_array" << std::endl
;
179 test_my_matrix
<ublas::symmetric_matrix
<mp_test_type
, ublas::lower
, ublas::row_major
, ublas::unbounded_array
<mp_test_type
> >, 3 > () ();
183 std::cout
<< "double, unbounded_array" << std::endl
;
184 test_my_matrix
<ublas::symmetric_matrix
<double, ublas::lower
, ublas::row_major
, ublas::unbounded_array
<double> >, 3 > () ();
187 #ifdef USE_STD_COMPLEX
189 std::cout
<< "std::complex<mp_test_type>, unbounded_array" << std::endl
;
190 test_my_matrix
<ublas::symmetric_matrix
<std::complex<mp_test_type
>, ublas::lower
, ublas::row_major
, ublas::unbounded_array
<std::complex<mp_test_type
> > >, 3 > () ();
194 std::cout
<< "std::complex<double>, unbounded_array" << std::endl
;
195 test_my_matrix
<ublas::symmetric_matrix
<std::complex<double>, ublas::lower
, ublas::row_major
, ublas::unbounded_array
<std::complex<double> > >, 3 > () ();
200 #ifdef USE_STD_VECTOR
202 std::cout
<< "mp_test_type, std::vector" << std::endl
;
203 test_my_matrix
<ublas::symmetric_matrix
<mp_test_type
, ublas::lower
, ublas::row_major
, std::vector
<mp_test_type
> >, 3 > () ();
207 std::cout
<< "double, std::vector" << std::endl
;
208 test_my_matrix
<ublas::symmetric_matrix
<double, ublas::lower
, ublas::row_major
, std::vector
<double> >, 3 > () ();
211 #ifdef USE_STD_COMPLEX
213 std::cout
<< "std::complex<mp_test_type>, std::vector" << std::endl
;
214 test_my_matrix
<ublas::symmetric_matrix
<std::complex<mp_test_type
>, ublas::lower
, ublas::row_major
, std::vector
<std::complex<mp_test_type
> > >, 3 > () ();
218 std::cout
<< "std::complex<double>, std::vector" << std::endl
;
219 test_my_matrix
<ublas::symmetric_matrix
<std::complex<double>, ublas::lower
, ublas::row_major
, std::vector
<std::complex<double> > >, 3 > () ();