Chris@49: // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: #ifdef ARMA_USE_ATLAS Chris@49: Chris@49: Chris@49: //! \namespace atlas namespace for ATLAS functions (imported from the global namespace) Chris@49: namespace atlas Chris@49: { Chris@49: Chris@49: template Chris@49: inline static const eT& tmp_real(const eT& X) { return X; } Chris@49: Chris@49: template Chris@49: inline static const T tmp_real(const std::complex& X) { return X.real(); } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: cblas_dot(const int N, const eT* X, const eT* Y) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_float::value == true) Chris@49: { Chris@49: typedef float T; Chris@49: return eT( arma_atlas(cblas_sdot)(N, (const T*)X, 1, (const T*)Y, 1) ); Chris@49: } Chris@49: else Chris@49: if(is_double::value == true) Chris@49: { Chris@49: typedef double T; Chris@49: return eT( arma_atlas(cblas_ddot)(N, (const T*)X, 1, (const T*)Y, 1) ); Chris@49: } Chris@49: else Chris@49: { Chris@49: return eT(0); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: cx_cblas_dot(const int N, const eT* X, const eT* Y) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_supported_complex_float::value == true) Chris@49: { Chris@49: typedef typename std::complex T; Chris@49: Chris@49: T out; Chris@49: arma_atlas(cblas_cdotu_sub)(N, (const T*)X, 1, (const T*)Y, 1, &out); Chris@49: Chris@49: return eT(out); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_double::value == true) Chris@49: { Chris@49: typedef typename std::complex T; Chris@49: Chris@49: T out; Chris@49: arma_atlas(cblas_zdotu_sub)(N, (const T*)X, 1, (const T*)Y, 1, &out); Chris@49: Chris@49: return eT(out); Chris@49: } Chris@49: else Chris@49: { Chris@49: return eT(0); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: cblas_gemv Chris@49: ( Chris@49: const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, Chris@49: const int M, const int N, Chris@49: const eT alpha, Chris@49: const eT *A, const int lda, Chris@49: const eT *X, const int incX, Chris@49: const eT beta, Chris@49: eT *Y, const int incY Chris@49: ) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_float::value == true) Chris@49: { Chris@49: typedef float T; Chris@49: arma_atlas(cblas_sgemv)(Order, TransA, M, N, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)X, incX, (const T)tmp_real(beta), (T*)Y, incY); Chris@49: } Chris@49: else Chris@49: if(is_double::value == true) Chris@49: { Chris@49: typedef double T; Chris@49: arma_atlas(cblas_dgemv)(Order, TransA, M, N, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)X, incX, (const T)tmp_real(beta), (T*)Y, incY); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_float::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: arma_atlas(cblas_cgemv)(Order, TransA, M, N, (const T*)&alpha, (const T*)A, lda, (const T*)X, incX, (const T*)&beta, (T*)Y, incY); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_double::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: arma_atlas(cblas_zgemv)(Order, TransA, M, N, (const T*)&alpha, (const T*)A, lda, (const T*)X, incX, (const T*)&beta, (T*)Y, incY); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: cblas_gemm Chris@49: ( Chris@49: const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, Chris@49: const enum CBLAS_TRANSPOSE TransB, const int M, const int N, Chris@49: const int K, const eT alpha, const eT *A, Chris@49: const int lda, const eT *B, const int ldb, Chris@49: const eT beta, eT *C, const int ldc Chris@49: ) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_float::value == true) Chris@49: { Chris@49: typedef float T; Chris@49: arma_atlas(cblas_sgemm)(Order, TransA, TransB, M, N, K, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)B, ldb, (const T)tmp_real(beta), (T*)C, ldc); Chris@49: } Chris@49: else Chris@49: if(is_double::value == true) Chris@49: { Chris@49: typedef double T; Chris@49: arma_atlas(cblas_dgemm)(Order, TransA, TransB, M, N, K, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)B, ldb, (const T)tmp_real(beta), (T*)C, ldc); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_float::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: arma_atlas(cblas_cgemm)(Order, TransA, TransB, M, N, K, (const T*)&alpha, (const T*)A, lda, (const T*)B, ldb, (const T*)&beta, (T*)C, ldc); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_double::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: arma_atlas(cblas_zgemm)(Order, TransA, TransB, M, N, K, (const T*)&alpha, (const T*)A, lda, (const T*)B, ldb, (const T*)&beta, (T*)C, ldc); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: int Chris@49: clapack_getrf Chris@49: ( Chris@49: const enum CBLAS_ORDER Order, const int M, const int N, Chris@49: eT *A, const int lda, int *ipiv Chris@49: ) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_float::value == true) Chris@49: { Chris@49: typedef float T; Chris@49: return arma_atlas(clapack_sgetrf)(Order, M, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: if(is_double::value == true) Chris@49: { Chris@49: typedef double T; Chris@49: return arma_atlas(clapack_dgetrf)(Order, M, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_float::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: return arma_atlas(clapack_cgetrf)(Order, M, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_double::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: return arma_atlas(clapack_zgetrf)(Order, M, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: { Chris@49: return -1; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: int Chris@49: clapack_getri Chris@49: ( Chris@49: const enum CBLAS_ORDER Order, const int N, eT *A, Chris@49: const int lda, const int *ipiv Chris@49: ) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_float::value == true) Chris@49: { Chris@49: typedef float T; Chris@49: return arma_atlas(clapack_sgetri)(Order, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: if(is_double::value == true) Chris@49: { Chris@49: typedef double T; Chris@49: return arma_atlas(clapack_dgetri)(Order, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_float::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: return arma_atlas(clapack_cgetri)(Order, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_double::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: return arma_atlas(clapack_zgetri)(Order, N, (T*)A, lda, ipiv); Chris@49: } Chris@49: else Chris@49: { Chris@49: return -1; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: int Chris@49: clapack_gesv Chris@49: ( Chris@49: const enum CBLAS_ORDER Order, Chris@49: const int N, const int NRHS, Chris@49: eT* A, const int lda, int* ipiv, Chris@49: eT* B, const int ldb Chris@49: ) Chris@49: { Chris@49: arma_type_check((is_supported_blas_type::value == false)); Chris@49: Chris@49: if(is_float::value == true) Chris@49: { Chris@49: typedef float T; Chris@49: return arma_atlas(clapack_sgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); Chris@49: } Chris@49: else Chris@49: if(is_double::value == true) Chris@49: { Chris@49: typedef double T; Chris@49: return arma_atlas(clapack_dgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_float::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: return arma_atlas(clapack_cgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); Chris@49: } Chris@49: else Chris@49: if(is_supported_complex_double::value == true) Chris@49: { Chris@49: typedef std::complex T; Chris@49: return arma_atlas(clapack_zgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); Chris@49: } Chris@49: else Chris@49: { Chris@49: return -1; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: } Chris@49: Chris@49: #endif