Imported Upstream version 1.57.0
[platform/upstream/boost.git] / libs / numeric / ublas / benchmarks / bench2 / bench23.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 #include "bench2.hpp"
14
15 template<class T, int N>
16 struct bench_c_matrix_prod {
17     typedef T value_type;
18
19     void operator () (int runs) const {
20         try {
21             static typename c_matrix_traits<T, N, N>::type m1, m2, m3;
22             initialize_c_matrix<T, N, N> () (m1);
23             initialize_c_matrix<T, N, N> () (m2);
24             boost::timer t;
25             for (int i = 0; i < runs; ++ i) {
26                 for (int j = 0; j < N; ++ j) {
27                     for (int k = 0; k < N; ++ k) {
28                         m3 [j] [k] = 0;
29                         for (int l = 0; l < N; ++ l) {
30                             m3 [j] [k] += m1 [j] [l] * m2 [l] [k];
31                         }
32                     }
33                 }
34 //                sink_c_matrix<T, N, N> () (m3);
35             }
36             footer<value_type> () (N * N * N, N * N * (N - 1), runs, t.elapsed ());
37         }
38         catch (std::exception &e) {
39             std::cout << e.what () << std::endl;
40         }
41     }
42 };
43 template<class M1, class M2, int N>
44 struct bench_my_matrix_prod {
45     typedef typename M1::value_type value_type;
46
47     void operator () (int runs, safe_tag) const {
48         try {
49             static M1 m1 (N, N, N * N), m3 (N, N, N * N);
50             static M2 m2 (N, N, N * N);
51             initialize_matrix (m1);
52             initialize_matrix (m2);
53             boost::timer t;
54             for (int i = 0; i < runs; ++ i) {
55                 m3 = ublas::prod (m1, m2);
56 //                sink_matrix (m3);
57             }
58             footer<value_type> () (N * N * N, N * N * (N - 1), runs, t.elapsed ());
59         }
60         catch (std::exception &e) {
61             std::cout << e.what () << std::endl;
62         }
63     }
64     void operator () (int runs, fast_tag) const {
65         try {
66             static M1 m1 (N, N, N * N), m3 (N, N, N * N);
67             static M2 m2 (N, N, N * N);
68             initialize_matrix (m1);
69             initialize_matrix (m2);
70             boost::timer t;
71             for (int i = 0; i < runs; ++ i) {
72                 m3.assign (ublas::prod (m1, m2));
73 //                sink_matrix (m3);
74             }
75             footer<value_type> () (N * N * N, N * N * (N - 1), runs, t.elapsed ());
76         }
77         catch (std::exception &e) {
78             std::cout << e.what () << std::endl;
79         }
80     }
81 };
82 template<class M, int N>
83 struct bench_cpp_matrix_prod {
84     typedef typename M::value_type value_type;
85
86     void operator () (int runs) const {
87         try {
88             static M m1 (N * N), m2 (N * N), m3 (N * N);
89             initialize_vector (m1);
90             initialize_vector (m2);
91             boost::timer t;
92             for (int i = 0; i < runs; ++ i) {
93                 for (int j = 0; j < N; ++ j) {
94                     std::valarray<value_type> row (m1 [std::slice (N * j, N, 1)]);
95                     for (int k = 0; k < N; ++ k) {
96                         std::valarray<value_type> column (m2 [std::slice (k, N, N)]);
97                         m3 [N * j + k] = (row * column).sum ();
98                     }
99                 }
100 //                sink_vector (m3);
101             }
102             footer<value_type> () (N * N * N, N * N * (N - 1), runs, t.elapsed ());
103         }
104         catch (std::exception &e) {
105             std::cout << e.what () << std::endl;
106         }
107     }
108 };
109
110 // Benchmark O (n ^ 3)
111 template<class T, int N>
112 void bench_3<T, N>::operator () (int runs) {
113     header ("bench_3");
114
115     header ("prod (matrix, matrix)");
116
117     header ("C array");
118     bench_c_matrix_prod<T, N> () (runs);
119
120 #ifdef USE_SPARSE_MATRIX
121 #ifdef USE_MAP_ARRAY
122     header ("sparse_matrix<row_major, map_array>, sparse_matrix<column_major, map_array> safe");
123     bench_my_matrix_prod<ublas::sparse_matrix<T, ublas::row_major, ublas::map_array<std::size_t, T> >,
124                          ublas::sparse_matrix<T, ublas::column_major, ublas::map_array<std::size_t, T> >, N> () (runs, safe_tag ());
125
126     header ("sparse_matrix<row_major, map_array>, sparse_matrix<column_major, map_array> fast");
127     bench_my_matrix_prod<ublas::sparse_matrix<T, ublas::row_major, ublas::map_array<std::size_t, T> >,
128                          ublas::sparse_matrix<T, ublas::column_major, ublas::map_array<std::size_t, T> >, N> () (runs, fast_tag ());
129 #endif
130
131 #ifdef USE_STD_MAP
132     header ("sparse_matrix<row_major, std::map>, sparse_matrix<column_major, std::map> safe");
133     bench_my_matrix_prod<ublas::sparse_matrix<T, ublas::row_major, std::map<std::size_t, T> >,
134                          ublas::sparse_matrix<T, ublas::column_major, std::map<std::size_t, T> >, N> () (runs, safe_tag ());
135
136     header ("sparse_matrix<row_major, std::map>, sparse_matrix<column_major, std::map> fast");
137     bench_my_matrix_prod<ublas::sparse_matrix<T, ublas::row_major, std::map<std::size_t, T> >,
138                          ublas::sparse_matrix<T, ublas::column_major, std::map<std::size_t, T> >, N> () (runs, fast_tag ());
139 #endif
140 #endif
141
142 #ifdef USE_COMPRESSED_MATRIX
143     header ("compressed_matrix<row_major>, compressed_matrix<column_major> safe");
144     bench_my_matrix_prod<ublas::compressed_matrix<T, ublas::row_major>,
145                          ublas::compressed_matrix<T, ublas::column_major>, N> () (runs, safe_tag ());
146
147     header ("compressed_matrix<row_major>, compressed_matrix<column_major> fast");
148     bench_my_matrix_prod<ublas::compressed_matrix<T, ublas::row_major>,
149                          ublas::compressed_matrix<T, ublas::column_major>, N> () (runs, fast_tag ());
150 #endif
151
152 #ifdef USE_COORDINATE_MATRIX
153     header ("coordinate_matrix<row_major>, coordinate_matrix<column_major> safe");
154     bench_my_matrix_prod<ublas::coordinate_matrix<T, ublas::row_major>,
155                          ublas::coordinate_matrix<T, ublas::column_major>, N> () (runs, safe_tag ());
156
157     header ("coordinate_matrix<row_major>, coordinate_matrix<column_major> fast");
158     bench_my_matrix_prod<ublas::coordinate_matrix<T, ublas::row_major>,
159                          ublas::coordinate_matrix<T, ublas::column_major>, N> () (runs, fast_tag ());
160 #endif
161
162 #ifdef USE_STD_VALARRAY
163     header ("std::valarray");
164     bench_cpp_matrix_prod<std::valarray<T>, N> () (runs);
165 #endif
166 }
167
168 #ifdef USE_FLOAT
169 template struct bench_3<float, 3>;
170 template struct bench_3<float, 10>;
171 template struct bench_3<float, 30>;
172 template struct bench_3<float, 100>;
173 #endif
174
175 #ifdef USE_DOUBLE
176 template struct bench_3<double, 3>;
177 template struct bench_3<double, 10>;
178 template struct bench_3<double, 30>;
179 template struct bench_3<double, 100>;
180 #endif
181
182 #ifdef USE_STD_COMPLEX
183 #ifdef USE_FLOAT
184 template struct bench_3<std::complex<float>, 3>;
185 template struct bench_3<std::complex<float>, 10>;
186 template struct bench_3<std::complex<float>, 30>;
187 template struct bench_3<std::complex<float>, 100>;
188 #endif
189
190 #ifdef USE_DOUBLE
191 template struct bench_3<std::complex<double>, 3>;
192 template struct bench_3<std::complex<double>, 10>;
193 template struct bench_3<std::complex<double>, 30>;
194 template struct bench_3<std::complex<double>, 100>;
195 #endif
196 #endif