1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Copyright (c) 2011, Intel Corporation. All rights reserved. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Redistribution and use in source and binary forms, with or without modification, 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath are permitted provided that the following conditions are met: 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions of source code must retain the above copyright notice, this 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath list of conditions and the following disclaimer. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions in binary form must reproduce the above copyright notice, 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath this list of conditions and the following disclaimer in the documentation 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath and/or other materials provided with the distribution. 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Neither the name of Intel Corporation nor the names of its contributors may 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath be used to endorse or promote products derived from this software without 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath specific prior written permission. 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ******************************************************************************** 282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * Content : Eigen bindings to BLAS F77 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Selfadjoint matrix-vector product functionality based on ?SYMV/HEMV. 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ******************************************************************************** 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/ 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H 342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/********************************************************************** 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* This file implements selfadjoint matrix-vector multiplication using BLAS 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath**********************************************************************/ 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// symv/hemv specialization 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct selfadjoint_matrix_vector_product_symv : 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn> {}; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_BLAS_SYMV_SPECIALIZE(Scalar) \ 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Specialized> { \ 537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstatic void run( \ 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index size, const Scalar* lhs, Index lhsStride, \ 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* _rhs, Scalar* res, Scalar alpha) { \ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum {\ 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsColMajor = StorageOrder==ColMajor \ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; \ 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (IsColMajor == ConjugateLhs) {\ 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn>::run( \ 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang size, lhs, lhsStride, _rhs, res, alpha); \ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } else {\ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath selfadjoint_matrix_vector_product_symv<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs>::run( \ 642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang size, lhs, lhsStride, _rhs, res, alpha); \ 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }\ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } \ 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; \ 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZE(double) 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZE(float) 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZE(dcomplex) 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZE(scomplex) 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_BLAS_SYMV_SPECIALIZATION(EIGTYPE,BLASTYPE,BLASFUNC) \ 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \ 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct selfadjoint_matrix_vector_product_symv<EIGTYPE,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs> \ 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \ 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Matrix<EIGTYPE,Dynamic,1,ColMajor> SYMVVector;\ 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\ 807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstatic void run( \ 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathIndex size, const EIGTYPE* lhs, Index lhsStride, \ 822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangconst EIGTYPE* _rhs, EIGTYPE* res, EIGTYPE alpha) \ 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \ 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum {\ 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsRowMajor = StorageOrder==RowMajor ? 1 : 0, \ 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsLower = UpLo == Lower ? 1 : 0 \ 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; \ 882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang BlasIndex n=convert_index<BlasIndex>(size), lda=convert_index<BlasIndex>(lhsStride), incx=1, incy=1; \ 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGTYPE beta(1); \ 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const EIGTYPE *x_ptr; \ 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath char uplo=(IsRowMajor) ? (IsLower ? 'U' : 'L') : (IsLower ? 'L' : 'U'); \ 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SYMVVector x_tmp; \ 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (ConjugateRhs) { \ 942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Map<const SYMVVector, 0 > map_x(_rhs,size,1); \ 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath x_tmp=map_x.conjugate(); \ 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath x_ptr=x_tmp.data(); \ 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } else x_ptr=_rhs; \ 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang BLASFUNC(&uplo, &n, &numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, &numext::real_ref(beta), (BLASTYPE*)res, &incy); \ 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}\ 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZATION(double, double, dsymv_) 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZATION(float, float, ssymv_) 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZATION(dcomplex, double, zhemv_) 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_BLAS_SYMV_SPECIALIZATION(scomplex, float, chemv_) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H 112