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