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