xref: /aosp_15_r20/external/eigen/unsupported/bench/bench_svd.cpp (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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