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