1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li // for linear algebra.
3*bf2c3715SXin Li //
4*bf2c3715SXin Li // Copyright (C) 2013 Gauthier Brun <[email protected]>
5*bf2c3715SXin Li // Copyright (C) 2013 Nicolas Carre <[email protected]>
6*bf2c3715SXin Li // Copyright (C) 2013 Jean Ceccato <[email protected]>
7*bf2c3715SXin Li // Copyright (C) 2013 Pierre Zoppitelli <[email protected]>
8*bf2c3715SXin Li //
9*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla
10*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed
11*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/
12*bf2c3715SXin Li
13*bf2c3715SXin Li // Bench to compare the efficiency of SVD algorithms
14*bf2c3715SXin Li
15*bf2c3715SXin Li #include <iostream>
16*bf2c3715SXin Li #include <bench/BenchTimer.h>
17*bf2c3715SXin Li #include <unsupported/Eigen/SVD>
18*bf2c3715SXin Li
19*bf2c3715SXin Li
20*bf2c3715SXin Li using namespace Eigen;
21*bf2c3715SXin Li using namespace std;
22*bf2c3715SXin Li
23*bf2c3715SXin Li // number of computations of each algorithm before the print of the time
24*bf2c3715SXin Li #ifndef REPEAT
25*bf2c3715SXin Li #define REPEAT 10
26*bf2c3715SXin Li #endif
27*bf2c3715SXin Li
28*bf2c3715SXin Li // number of tests of the same type
29*bf2c3715SXin Li #ifndef NUMBER_SAMPLE
30*bf2c3715SXin Li #define NUMBER_SAMPLE 2
31*bf2c3715SXin Li #endif
32*bf2c3715SXin Li
33*bf2c3715SXin Li template<typename MatrixType>
bench_svd(const MatrixType & a=MatrixType ())34*bf2c3715SXin Li void bench_svd(const MatrixType& a = MatrixType())
35*bf2c3715SXin Li {
36*bf2c3715SXin Li MatrixType m = MatrixType::Random(a.rows(), a.cols());
37*bf2c3715SXin Li BenchTimer timerJacobi;
38*bf2c3715SXin Li BenchTimer timerBDC;
39*bf2c3715SXin Li timerJacobi.reset();
40*bf2c3715SXin Li timerBDC.reset();
41*bf2c3715SXin Li
42*bf2c3715SXin Li cout << " Only compute Singular Values" <<endl;
43*bf2c3715SXin Li for (int k=1; k<=NUMBER_SAMPLE; ++k)
44*bf2c3715SXin Li {
45*bf2c3715SXin Li timerBDC.start();
46*bf2c3715SXin Li for (int i=0; i<REPEAT; ++i)
47*bf2c3715SXin Li {
48*bf2c3715SXin Li BDCSVD<MatrixType> bdc_matrix(m);
49*bf2c3715SXin Li }
50*bf2c3715SXin Li timerBDC.stop();
51*bf2c3715SXin Li
52*bf2c3715SXin Li timerJacobi.start();
53*bf2c3715SXin Li for (int i=0; i<REPEAT; ++i)
54*bf2c3715SXin Li {
55*bf2c3715SXin Li JacobiSVD<MatrixType> jacobi_matrix(m);
56*bf2c3715SXin Li }
57*bf2c3715SXin Li timerJacobi.stop();
58*bf2c3715SXin Li
59*bf2c3715SXin Li
60*bf2c3715SXin Li cout << "Sample " << k << " : " << REPEAT << " computations : Jacobi : " << fixed << timerJacobi.value() << "s ";
61*bf2c3715SXin Li cout << " || " << " BDC : " << timerBDC.value() << "s " <<endl <<endl;
62*bf2c3715SXin Li
63*bf2c3715SXin Li if (timerBDC.value() >= timerJacobi.value())
64*bf2c3715SXin Li cout << "KO : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
65*bf2c3715SXin Li else
66*bf2c3715SXin Li cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
67*bf2c3715SXin Li
68*bf2c3715SXin Li }
69*bf2c3715SXin Li cout << " =================" <<endl;
70*bf2c3715SXin Li std::cout<< std::endl;
71*bf2c3715SXin Li timerJacobi.reset();
72*bf2c3715SXin Li timerBDC.reset();
73*bf2c3715SXin Li cout << " Computes rotation matrix" <<endl;
74*bf2c3715SXin Li for (int k=1; k<=NUMBER_SAMPLE; ++k)
75*bf2c3715SXin Li {
76*bf2c3715SXin Li timerBDC.start();
77*bf2c3715SXin Li for (int i=0; i<REPEAT; ++i)
78*bf2c3715SXin Li {
79*bf2c3715SXin Li BDCSVD<MatrixType> bdc_matrix(m, ComputeFullU|ComputeFullV);
80*bf2c3715SXin Li }
81*bf2c3715SXin Li timerBDC.stop();
82*bf2c3715SXin Li
83*bf2c3715SXin Li timerJacobi.start();
84*bf2c3715SXin Li for (int i=0; i<REPEAT; ++i)
85*bf2c3715SXin Li {
86*bf2c3715SXin Li JacobiSVD<MatrixType> jacobi_matrix(m, ComputeFullU|ComputeFullV);
87*bf2c3715SXin Li }
88*bf2c3715SXin Li timerJacobi.stop();
89*bf2c3715SXin Li
90*bf2c3715SXin Li
91*bf2c3715SXin Li cout << "Sample " << k << " : " << REPEAT << " computations : Jacobi : " << fixed << timerJacobi.value() << "s ";
92*bf2c3715SXin Li cout << " || " << " BDC : " << timerBDC.value() << "s " <<endl <<endl;
93*bf2c3715SXin Li
94*bf2c3715SXin Li if (timerBDC.value() >= timerJacobi.value())
95*bf2c3715SXin Li cout << "KO : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
96*bf2c3715SXin Li else
97*bf2c3715SXin Li cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
98*bf2c3715SXin Li
99*bf2c3715SXin Li }
100*bf2c3715SXin Li std::cout<< std::endl;
101*bf2c3715SXin Li }
102*bf2c3715SXin Li
103*bf2c3715SXin Li
104*bf2c3715SXin Li
main(int argc,char * argv[])105*bf2c3715SXin Li int main(int argc, char* argv[])
106*bf2c3715SXin Li {
107*bf2c3715SXin Li std::cout<< std::endl;
108*bf2c3715SXin Li
109*bf2c3715SXin Li std::cout<<"On a (Dynamic, Dynamic) (6, 6) Matrix" <<std::endl;
110*bf2c3715SXin Li bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(6, 6));
111*bf2c3715SXin Li
112*bf2c3715SXin Li std::cout<<"On a (Dynamic, Dynamic) (32, 32) Matrix" <<std::endl;
113*bf2c3715SXin Li bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(32, 32));
114*bf2c3715SXin Li
115*bf2c3715SXin Li //std::cout<<"On a (Dynamic, Dynamic) (128, 128) Matrix" <<std::endl;
116*bf2c3715SXin Li //bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(128, 128));
117*bf2c3715SXin Li
118*bf2c3715SXin Li std::cout<<"On a (Dynamic, Dynamic) (160, 160) Matrix" <<std::endl;
119*bf2c3715SXin Li bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(160, 160));
120*bf2c3715SXin Li
121*bf2c3715SXin Li std::cout<< "--------------------------------------------------------------------"<< std::endl;
122*bf2c3715SXin Li
123*bf2c3715SXin Li }
124