LCOV - code coverage report
Current view: top level - routines - matrix_operations.hpp (source / functions) Hit Total Coverage
Test: clean.info Lines: 24 24 100.0 %
Date: 2013-05-24 Functions: 12 12 100.0 %
Branches: 13 26 50.0 %

           Branch data     Line data    Source code
       1                 :            : /* This software is distributed under BSD 3-clause license (see LICENSE file).
       2                 :            :  *
       3                 :            :  * Copyright (c) 2012-2013 Sergey Lisitsyn
       4                 :            :  *
       5                 :            :  */
       6                 :            : 
       7                 :            : #ifndef TAPKEE_MATRIX_OPS_H_
       8                 :            : #define TAPKEE_MATRIX_OPS_H_
       9                 :            : 
      10                 :            : /* Tapkee includes */
      11                 :            : #include <tapkee/defines.hpp>
      12                 :            : /* End of Tapkee includes */
      13                 :            : 
      14                 :            : namespace tapkee
      15                 :            : {
      16                 :            : namespace tapkee_internal
      17                 :            : {
      18                 :            : 
      19                 :            : //! Matrix-matrix operation used to 
      20                 :            : //! compute smallest eigenvalues and 
      21                 :            : //! associated eigenvectors of a sparse matrix
      22                 :            : //! Essentially solves linear system 
      23                 :            : //! with provided right-hand side part.
      24                 :            : //!
      25                 :          5 : struct SparseInverseMatrixOperation
      26                 :            : {
      27                 :          5 :         SparseInverseMatrixOperation(const SparseWeightMatrix& matrix) : solver()
      28                 :            :         {
      29         [ +  - ]:          5 :                 solver.compute(matrix);
      30                 :          5 :         }
      31                 :            :         /** Solves linear system with provided right-hand size
      32                 :            :          */
      33                 :         88 :         inline DenseMatrix operator()(const DenseMatrix& operatee)
      34                 :            :         {
      35                 :         88 :                 return solver.solve(operatee);
      36                 :            :         }
      37                 :            :         SparseSolver solver;
      38                 :            :         static const char* ARPACK_CODE;
      39                 :            :         static const bool largest;
      40                 :            : };
      41                 :            : const char* SparseInverseMatrixOperation::ARPACK_CODE = "SM";
      42                 :            : const bool SparseInverseMatrixOperation::largest = false;
      43                 :            : 
      44                 :            : //! Matrix-matrix operation used to 
      45                 :            : //! compute smallest eigenvalues and 
      46                 :            : //! associated eigenvectors of a dense matrix
      47                 :            : //! Essentially solves linear system 
      48                 :            : //! with provided right-hand side part.
      49                 :            : //!
      50                 :          3 : struct DenseInverseMatrixOperation
      51                 :            : {
      52                 :          3 :         DenseInverseMatrixOperation(const DenseMatrix& matrix) : solver()
      53                 :            :         {
      54         [ +  - ]:          3 :                 solver.compute(matrix);
      55                 :          3 :         }
      56                 :            :         /** Solves linear system with provided right-hand size
      57                 :            :          */
      58                 :         12 :         inline DenseMatrix operator()(const DenseMatrix& operatee)
      59                 :            :         {
      60                 :         12 :                 return solver.solve(operatee);
      61                 :            :         }
      62                 :            :         DenseSolver solver;
      63                 :            :         static const char* ARPACK_CODE;
      64                 :            :         static const bool largest;
      65                 :            : };
      66                 :            : const char* DenseInverseMatrixOperation::ARPACK_CODE = "SM";
      67                 :            : const bool DenseInverseMatrixOperation::largest = false;
      68                 :            : 
      69                 :            : //! Matrix-matrix operation used to
      70                 :            : //! compute largest eigenvalues and
      71                 :            : //! associated eigenvectors. Essentially
      72                 :            : //! computes matrix product with 
      73                 :            : //! provided right-hand side part.
      74                 :            : //!
      75                 :            : struct DenseMatrixOperation
      76                 :            : {
      77                 :         19 :         DenseMatrixOperation(const DenseMatrix& matrix) : _matrix(matrix)
      78                 :            :         {
      79                 :         19 :         }
      80                 :            :         //! Computes matrix product of the matrix and provided right-hand 
      81                 :            :         //! side matrix
      82                 :            :         //! 
      83                 :            :         //! @param rhs right-hand size matrix
      84                 :            :         //!
      85                 :        309 :         inline DenseMatrix operator()(const DenseMatrix& rhs)
      86                 :            :         {
      87 [ +  - ][ +  - ]:        309 :                 return _matrix.selfadjointView<Eigen::Upper>()*rhs;
      88                 :            :         }
      89                 :            :         const DenseMatrix& _matrix;
      90                 :            :         static const char* ARPACK_CODE;
      91                 :            :         static const bool largest;
      92                 :            : };
      93                 :            : const char* DenseMatrixOperation::ARPACK_CODE = "LM";
      94                 :            : const bool DenseMatrixOperation::largest = true;
      95                 :            : 
      96                 :            : //! Matrix-matrix operation used to
      97                 :            : //! compute largest eigenvalues and
      98                 :            : //! associated eigenvectors of X*X^T like
      99                 :            : //! matrix implicitly. Essentially
     100                 :            : //! computes matrix product with provided
     101                 :            : //! right-hand side part *twice*.
     102                 :            : //!
     103                 :            : struct DenseImplicitSquareSymmetricMatrixOperation
     104                 :            : {
     105                 :          1 :         DenseImplicitSquareSymmetricMatrixOperation(const DenseMatrix& matrix) : _matrix(matrix)
     106                 :            :         {
     107                 :          1 :         }
     108                 :            :         //! Computes matrix product of the matrix and provided right-hand 
     109                 :            :         //! side matrix twice
     110                 :            :         //! 
     111                 :            :         //! @param rhs right-hand side matrix
     112                 :            :         //!
     113                 :         20 :         inline DenseMatrix operator()(const DenseMatrix& rhs)
     114                 :            :         {
     115 [ +  - ][ +  - ]:         20 :                 return _matrix.selfadjointView<Eigen::Upper>()*(_matrix.selfadjointView<Eigen::Upper>()*rhs);
         [ +  - ][ +  - ]
                 [ +  - ]
     116                 :            :         }
     117                 :            :         const DenseMatrix& _matrix;
     118                 :            :         static const char* ARPACK_CODE;
     119                 :            :         static const bool largest;
     120                 :            : };
     121                 :            : const char* DenseImplicitSquareSymmetricMatrixOperation::ARPACK_CODE = "LM";
     122                 :            : const bool DenseImplicitSquareSymmetricMatrixOperation::largest = true;
     123                 :            : 
     124                 :            : //! Matrix-matrix operation used to
     125                 :            : //! compute largest eigenvalues and
     126                 :            : //! associated eigenvectors of X*X^T like
     127                 :            : //! matrix implicitly. Essentially
     128                 :            : //! computes matrix product with provided
     129                 :            : //! right-hand side part *twice*.
     130                 :            : //!
     131                 :            : struct DenseImplicitSquareMatrixOperation
     132                 :            : {
     133                 :          1 :         DenseImplicitSquareMatrixOperation(const DenseMatrix& matrix) : _matrix(matrix)
     134                 :            :         {
     135                 :          1 :         }
     136                 :            :         //! Computes matrix product of the matrix and provided right-hand 
     137                 :            :         //! side matrix twice
     138                 :            :         //! 
     139                 :            :         //! @param rhs right-hand side matrix
     140                 :            :         //!
     141                 :         20 :         inline DenseMatrix operator()(const DenseMatrix& rhs)
     142                 :            :         {
     143 [ +  - ][ +  - ]:         20 :                 return _matrix*(_matrix.transpose()*rhs);
         [ +  - ][ +  - ]
     144                 :            :         }
     145                 :            :         const DenseMatrix& _matrix;
     146                 :            :         static const char* ARPACK_CODE;
     147                 :            :         static const bool largest;
     148                 :            : };
     149                 :            : const char* DenseImplicitSquareMatrixOperation::ARPACK_CODE = "LM";
     150                 :            : const bool DenseImplicitSquareMatrixOperation::largest = true;
     151                 :            : 
     152                 :            : #ifdef TAPKEE_GPU
     153                 :            : struct GPUDenseImplicitSquareMatrixOperation
     154                 :            : {
     155                 :            :         GPUDenseImplicitSquareMatrixOperation(const DenseMatrix& matrix)
     156                 :            :         {
     157                 :            :                 timed_context c("Storing matrices");
     158                 :            :                 mat = viennacl::matrix<ScalarType>(matrix.cols(),matrix.rows());
     159                 :            :                 vec = viennacl::matrix<ScalarType>(matrix.cols(),1);
     160                 :            :                 res = viennacl::matrix<ScalarType>(matrix.cols(),1);
     161                 :            :                 viennacl::copy(matrix,mat);
     162                 :            :         }
     163                 :            :         //! Computes matrix product of the matrix and provided right-hand 
     164                 :            :         //! side matrix twice
     165                 :            :         //! 
     166                 :            :         //! @param rhs right-hand side matrix
     167                 :            :         //!
     168                 :            :         inline DenseMatrix operator()(const DenseMatrix& rhs)
     169                 :            :         {
     170                 :            :                 timed_context c("Computing product");
     171                 :            :                 viennacl::copy(rhs,vec);
     172                 :            :                 res = viennacl::linalg::prod(mat, vec);
     173                 :            :                 vec = res;
     174                 :            :                 res = viennacl::linalg::prod(mat, vec);
     175                 :            :                 DenseMatrix result(rhs);
     176                 :            :                 viennacl::copy(res,result);
     177                 :            :                 return result;
     178                 :            :         }
     179                 :            :         viennacl::matrix<ScalarType> mat;
     180                 :            :         viennacl::matrix<ScalarType> vec;
     181                 :            :         viennacl::matrix<ScalarType> res;
     182                 :            :         static const char* ARPACK_CODE;
     183                 :            :         static bool largest;
     184                 :            : };
     185                 :            : const char* GPUDenseImplicitSquareMatrixOperation::ARPACK_CODE = "LM";
     186                 :            : const bool GPUDenseImplicitSquareMatrixOperation::largest = true;
     187                 :            : 
     188                 :            : struct GPUDenseMatrixOperation
     189                 :            : {
     190                 :            :         GPUDenseMatrixOperation(const DenseMatrix& matrix)
     191                 :            :         {
     192                 :            :                 mat = viennacl::matrix<ScalarType>(matrix.cols(),matrix.rows());
     193                 :            :                 vec = viennacl::matrix<ScalarType>(matrix.cols(),1);
     194                 :            :                 res = viennacl::matrix<ScalarType>(matrix.cols(),1);
     195                 :            :                 viennacl::copy(matrix,mat);
     196                 :            :         }
     197                 :            :         //! Computes matrix product of the matrix and provided right-hand 
     198                 :            :         //! side matrix twice
     199                 :            :         //! 
     200                 :            :         //! @param rhs right-hand side matrix
     201                 :            :         //!
     202                 :            :         inline DenseMatrix operator()(const DenseMatrix& rhs)
     203                 :            :         {
     204                 :            :                 viennacl::copy(rhs,vec);
     205                 :            :                 res = viennacl::linalg::prod(mat, vec);
     206                 :            :                 DenseMatrix result(rhs);
     207                 :            :                 viennacl::copy(res,result);
     208                 :            :                 return result;
     209                 :            :         }
     210                 :            :         viennacl::matrix<ScalarType> mat;
     211                 :            :         viennacl::matrix<ScalarType> vec;
     212                 :            :         viennacl::matrix<ScalarType> res;
     213                 :            :         static const char* ARPACK_CODE;
     214                 :            :         static bool largest;
     215                 :            : };
     216                 :            : const char* GPUDenseMatrixOperation::ARPACK_CODE = "LM";
     217                 :            : const bool GPUDenseMatrixOperation::largest = true;
     218                 :            : #endif
     219                 :            : 
     220                 :            : }
     221                 :            : }
     222                 :            : 
     223                 :            : #endif

Generated by: LCOV version 1.9