112 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // This file is part of Eigen, a lightweight C++ template library
 | |
| // for linear algebra.
 | |
| //
 | |
| // Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>
 | |
| // Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>
 | |
| // Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>
 | |
| // Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>
 | |
| //
 | |
| // This Source Code Form is subject to the terms of the Mozilla
 | |
| // Public License v. 2.0. If a copy of the MPL was not distributed
 | |
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/
 | |
| 
 | |
| // Bench to compare the efficiency of SVD algorithms
 | |
| 
 | |
| #include <iostream>
 | |
| #include <bench/BenchTimer.h>
 | |
| #include <unsupported/Eigen/SVD>
 | |
| 
 | |
| using namespace Eigen;
 | |
| using namespace std;
 | |
| 
 | |
| // number of computations of each algorithm before the print of the time
 | |
| #ifndef REPEAT
 | |
| #define REPEAT 10
 | |
| #endif
 | |
| 
 | |
| // number of tests of the same type
 | |
| #ifndef NUMBER_SAMPLE
 | |
| #define NUMBER_SAMPLE 2
 | |
| #endif
 | |
| 
 | |
| template <typename MatrixType>
 | |
| void bench_svd(const MatrixType& a = MatrixType()) {
 | |
|   MatrixType m = MatrixType::Random(a.rows(), a.cols());
 | |
|   BenchTimer timerJacobi;
 | |
|   BenchTimer timerBDC;
 | |
|   timerJacobi.reset();
 | |
|   timerBDC.reset();
 | |
| 
 | |
|   cout << " Only compute Singular Values" << endl;
 | |
|   for (int k = 1; k <= NUMBER_SAMPLE; ++k) {
 | |
|     timerBDC.start();
 | |
|     for (int i = 0; i < REPEAT; ++i) {
 | |
|       BDCSVD<MatrixType> bdc_matrix(m);
 | |
|     }
 | |
|     timerBDC.stop();
 | |
| 
 | |
|     timerJacobi.start();
 | |
|     for (int i = 0; i < REPEAT; ++i) {
 | |
|       JacobiSVD<MatrixType> jacobi_matrix(m);
 | |
|     }
 | |
|     timerJacobi.stop();
 | |
| 
 | |
|     cout << "Sample " << k << " : " << REPEAT << " computations :  Jacobi : " << fixed << timerJacobi.value() << "s ";
 | |
|     cout << " || "
 | |
|          << " BDC : " << timerBDC.value() << "s " << endl
 | |
|          << endl;
 | |
| 
 | |
|     if (timerBDC.value() >= timerJacobi.value())
 | |
|       cout << "KO : BDC is " << timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi" << endl;
 | |
|     else
 | |
|       cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi" << endl;
 | |
|   }
 | |
|   cout << "       =================" << endl;
 | |
|   std::cout << std::endl;
 | |
|   timerJacobi.reset();
 | |
|   timerBDC.reset();
 | |
|   cout << " Computes rotation matrix" << endl;
 | |
|   for (int k = 1; k <= NUMBER_SAMPLE; ++k) {
 | |
|     timerBDC.start();
 | |
|     for (int i = 0; i < REPEAT; ++i) {
 | |
|       BDCSVD<MatrixType> bdc_matrix(m, ComputeFullU | ComputeFullV);
 | |
|     }
 | |
|     timerBDC.stop();
 | |
| 
 | |
|     timerJacobi.start();
 | |
|     for (int i = 0; i < REPEAT; ++i) {
 | |
|       JacobiSVD<MatrixType> jacobi_matrix(m, ComputeFullU | ComputeFullV);
 | |
|     }
 | |
|     timerJacobi.stop();
 | |
| 
 | |
|     cout << "Sample " << k << " : " << REPEAT << " computations :  Jacobi : " << fixed << timerJacobi.value() << "s ";
 | |
|     cout << " || "
 | |
|          << " BDC : " << timerBDC.value() << "s " << endl
 | |
|          << endl;
 | |
| 
 | |
|     if (timerBDC.value() >= timerJacobi.value())
 | |
|       cout << "KO : BDC is " << timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi" << endl;
 | |
|     else
 | |
|       cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << "  times faster than Jacobi" << endl;
 | |
|   }
 | |
|   std::cout << std::endl;
 | |
| }
 | |
| 
 | |
| int main(int argc, char* argv[]) {
 | |
|   std::cout << std::endl;
 | |
| 
 | |
|   std::cout << "On a (Dynamic, Dynamic) (6, 6) Matrix" << std::endl;
 | |
|   bench_svd<Matrix<double, Dynamic, Dynamic> >(Matrix<double, Dynamic, Dynamic>(6, 6));
 | |
| 
 | |
|   std::cout << "On a (Dynamic, Dynamic) (32, 32) Matrix" << std::endl;
 | |
|   bench_svd<Matrix<double, Dynamic, Dynamic> >(Matrix<double, Dynamic, Dynamic>(32, 32));
 | |
| 
 | |
|   // std::cout<<"On a (Dynamic, Dynamic) (128, 128) Matrix" <<std::endl;
 | |
|   // bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(128, 128));
 | |
| 
 | |
|   std::cout << "On a (Dynamic, Dynamic) (160, 160) Matrix" << std::endl;
 | |
|   bench_svd<Matrix<double, Dynamic, Dynamic> >(Matrix<double, Dynamic, Dynamic>(160, 160));
 | |
| 
 | |
|   std::cout << "--------------------------------------------------------------------" << std::endl;
 | |
| }
 | 
