cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

bench_svd.cpp (3906B)


      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>
     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 rotation 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 
    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 }