/** * \file matrix.hpp * \author Dhairya Malhotra, dhairya.malhotra@gmail.com * \date 2-11-2011 * \brief This file contains definition of the class Matrix. */ #include #include #include #include #ifndef _PVFMM_MATRIX_HPP_ #define _PVFMM_MATRIX_HPP_ #ifdef __INTEL_OFFLOAD #pragma offload_attribute(push,target(mic)) #endif namespace pvfmm{ template class Permutation; template class Matrix{ template friend std::ostream& operator<<(std::ostream& output, const Matrix& M); public: struct Device{ Device& operator=(Matrix& M){ dim[0]=M.Dim(0); dim[1]=M.Dim(1); dev_ptr=(uintptr_t)M[0]; return *this; } inline T* operator[](size_t j) const{ return &((T*)dev_ptr)[j*dim[1]]; } size_t dim[2]; uintptr_t dev_ptr; int lock_idx; }; Matrix(); Matrix(size_t dim1, size_t dim2, T* data_=NULL, bool own_data_=true); Matrix(const Matrix& M); ~Matrix(); void Swap(Matrix& M); void ReInit(size_t dim1, size_t dim2, T* data_=NULL, bool own_data_=true); Device& AllocDevice(bool copy); void Device2Host(T* host_ptr=NULL); void Device2HostWait(); void FreeDevice(bool copy); void Write(const char* fname); size_t Dim(size_t i) const; void Resize(size_t i, size_t j); void SetZero(); Matrix& operator=(const Matrix& M); Matrix& operator+=(const Matrix& M); Matrix& operator-=(const Matrix& M); Matrix operator+(const Matrix& M2); Matrix operator-(const Matrix& M2); T& operator()(size_t i,size_t j) const; T* operator[](size_t i) const; Matrix operator*(const Matrix& M); static void DGEMM(Matrix& M_r, const Matrix& A, const Matrix& B, T beta=0.0); void RowPerm(const Permutation& P); void ColPerm(const Permutation& P); Matrix Transpose(); static void Transpose(Matrix& M_r, const Matrix& M); // Original matrix is destroyed. void SVD(Matrix& tU, Matrix& tS, Matrix& tVT); // Original matrix is destroyed. Matrix pinv(T eps=-1); private: size_t dim[2]; T* data_ptr; bool own_data; Device dev; Vector dev_sig; }; /** * /brief P=[e(p1)*s1 e(p2)*s2 ... e(pn)*sn], * where e(k) is the kth unit vector, * perm := [p1 p2 ... pn] is the permutation vector, * scal := [s1 s2 ... sn] is the scaling vector. */ #define PERM_INT_T size_t template class Permutation{ template friend std::ostream& operator<<(std::ostream& output, const Permutation& P); public: Permutation(){} Permutation(size_t size); static Permutation RandPerm(size_t size); Matrix GetMatrix() const; size_t Dim() const; Permutation Transpose(); Permutation operator*(const Permutation& P); Matrix operator*(const Matrix& M); template friend Matrix operator*(const Matrix& M, const Permutation& P); Vector perm; Vector scal; }; }//end namespace #ifdef __INTEL_OFFLOAD #pragma offload_attribute(pop) #endif #include #endif //_PVFMM_MATRIX_HPP_