17faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// This file is part of Eigen, a lightweight C++ template library
27faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// for linear algebra.
37faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//
47faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>
57faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>
67faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>
77faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>
87faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//
97faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// This Source Code Form is subject to the terms of the Mozilla
107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Public License v. 2.0. If a copy of the MPL was not distributed
117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// with this file, You can obtain one at http://mozilla.org/MPL/2.0/
127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Bench to compare the efficiency of SVD algorithms
147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <iostream>
167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <bench/BenchTimer.h>
177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <unsupported/Eigen/SVD>
187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezusing namespace Eigen;
217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezusing namespace std;
227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// number of computations of each algorithm before the print of the time
247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#ifndef REPEAT
257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define REPEAT 10
267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// number of tests of the same type
297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#ifndef NUMBER_SAMPLE
307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define NUMBER_SAMPLE 2
317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename MatrixType>
347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezvoid bench_svd(const MatrixType& a = MatrixType())
357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  MatrixType m = MatrixType::Random(a.rows(), a.cols());
377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  BenchTimer timerJacobi;
387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  BenchTimer timerBDC;
397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  timerJacobi.reset();
407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  timerBDC.reset();
417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  cout << " Only compute Singular Values" <<endl;
437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  for (int k=1; k<=NUMBER_SAMPLE; ++k)
447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerBDC.start();
467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for (int i=0; i<REPEAT; ++i)
477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      BDCSVD<MatrixType> bdc_matrix(m);
497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerBDC.stop();
517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerJacobi.start();
537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for (int i=0; i<REPEAT; ++i)
547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      JacobiSVD<MatrixType> jacobi_matrix(m);
567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerJacobi.stop();
587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    cout << "Sample " << k << " : " << REPEAT << " computations :  Jacobi : " << fixed << timerJacobi.value() << "s ";
617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    cout << " || " << " BDC : " << timerBDC.value() << "s " <<endl <<endl;
627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (timerBDC.value() >= timerJacobi.value())
647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      cout << "KO : BDC is " <<  timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi" <<endl;
657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else
667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi"  <<endl;
677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  cout << "       =================" <<endl;
707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< std::endl;
717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  timerJacobi.reset();
727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  timerBDC.reset();
737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  cout << " Computes rotaion matrix" <<endl;
747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  for (int k=1; k<=NUMBER_SAMPLE; ++k)
757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerBDC.start();
777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for (int i=0; i<REPEAT; ++i)
787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      BDCSVD<MatrixType> bdc_matrix(m, ComputeFullU|ComputeFullV);
807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerBDC.stop();
827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerJacobi.start();
847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for (int i=0; i<REPEAT; ++i)
857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      JacobiSVD<MatrixType> jacobi_matrix(m, ComputeFullU|ComputeFullV);
877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    timerJacobi.stop();
897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    cout << "Sample " << k << " : " << REPEAT << " computations :  Jacobi : " << fixed << timerJacobi.value() << "s ";
927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    cout << " || " << " BDC : " << timerBDC.value() << "s " <<endl <<endl;
937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (timerBDC.value() >= timerJacobi.value())
957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      cout << "KO : BDC is " <<  timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi" <<endl;
967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else
977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi"  <<endl;
987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
1007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< std::endl;
1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
1027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint main(int argc, char* argv[])
1067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< std::endl;
1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<<"On a (Dynamic, Dynamic) (6, 6) Matrix" <<std::endl;
1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(6, 6));
1117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<<"On a (Dynamic, Dynamic) (32, 32) Matrix" <<std::endl;
1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(32, 32));
1147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  //std::cout<<"On a (Dynamic, Dynamic) (128, 128) Matrix" <<std::endl;
1167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  //bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(128, 128));
1177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<<"On a (Dynamic, Dynamic) (160, 160) Matrix" <<std::endl;
1197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(160, 160));
1207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< "--------------------------------------------------------------------"<< std::endl;
1227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
124