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
20using namespace Eigen;
21using 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
33template<typename MatrixType>
34void 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
105int 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