1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "common.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHEMV  performs the matrix-vector  operation
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     y := alpha*A*x + beta*y,
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha and beta are scalars, x and y are n element vectors and
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  A is an n by n hermitian matrix.
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(hemv)(char *uplo, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy)
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef void (*functype)(int, const Scalar*, int, const Scalar*, int, Scalar*, Scalar);
227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static functype func[2];
237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static bool init = false;
257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(!init)
267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for(int k=0; k<2; ++k)
287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      func[k] = 0;
297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[UP] = (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Upper,false,false>::run);
317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[LO] = (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Lower,false,false>::run);
327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    init = true;
347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* a = reinterpret_cast<Scalar*>(pa);
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x = reinterpret_cast<Scalar*>(px);
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y = reinterpret_cast<Scalar*>(py);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar alpha  = *reinterpret_cast<Scalar*>(palpha);
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar beta   = *reinterpret_cast<Scalar*>(pbeta);
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // check arguments
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int info = 0;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(UPLO(*uplo)==INVALID)        info = 1;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*n<0)                   info = 2;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*lda<std::max(1,*n))    info = 5;
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incx==0)               info = 7;
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incy==0)               info = 10;
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(info)
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return xerbla_(SCALAR_SUFFIX_UP"HEMV ",&info,6);
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(*n==0)
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return 1;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* actual_x = get_compact_vector(x,*n,*incx);
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* actual_y = get_compact_vector(y,*n,*incy);
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(beta!=Scalar(1))
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(beta==Scalar(0)) vector(actual_y, *n).setZero();
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    else                vector(actual_y, *n) *= beta;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(alpha!=Scalar(0))
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    int code = UPLO(*uplo);
677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(code>=2 || func[code]==0)
687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return 0;
697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[code](*n, a, *lda, actual_x, 1, actual_y, alpha);
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(actual_x!=x) delete[] actual_x;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(actual_y!=y) delete[] copy_back(actual_y,y,*n,*incy);
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return 1;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHBMV  performs the matrix-vector  operation
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     y := alpha*A*x + beta*y,
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha and beta are scalars, x and y are n element vectors and
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  A is an n by n hermitian band matrix, with k super-diagonals.
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// int EIGEN_BLAS_FUNC(hbmv)(char *uplo, int *n, int *k, RealScalar *alpha, RealScalar *a, int *lda,
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//                           RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// {
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//   return 1;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// }
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHPMV  performs the matrix-vector operation
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     y := alpha*A*x + beta*y,
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha and beta are scalars, x and y are n element vectors and
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  A is an n by n hermitian matrix, supplied in packed form.
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// int EIGEN_BLAS_FUNC(hpmv)(char *uplo, int *n, RealScalar *alpha, RealScalar *ap, RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// {
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//   return 1;
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// }
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHPR    performs the hermitian rank 1 operation
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     A := alpha*x*conjg( x' ) + A,
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha is a real scalar, x is an n element vector and A is an
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  n by n hermitian matrix, supplied in packed form.
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
1117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint EIGEN_BLAS_FUNC(hpr)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pap)
1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef void (*functype)(int, Scalar*, const Scalar*, RealScalar);
1147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static functype func[2];
1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static bool init = false;
1177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(!init)
1187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
1197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for(int k=0; k<2; ++k)
1207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      func[k] = 0;
1217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[UP] = (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run);
1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[LO] = (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run);
1247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    init = true;
1267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
1277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* x = reinterpret_cast<Scalar*>(px);
1297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* ap = reinterpret_cast<Scalar*>(pap);
1307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  RealScalar alpha = *palpha;
1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  int info = 0;
1337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(UPLO(*uplo)==INVALID)                                            info = 1;
1347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  else if(*n<0)                                                       info = 2;
1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  else if(*incx==0)                                                   info = 5;
1367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(info)
1377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return xerbla_(SCALAR_SUFFIX_UP"HPR  ",&info,6);
1387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(alpha==Scalar(0))
1407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return 1;
1417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* x_cpy = get_compact_vector(x, *n, *incx);
1437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  int code = UPLO(*uplo);
1457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(code>=2 || func[code]==0)
1467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return 0;
1477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  func[code](*n, ap, x_cpy, alpha);
1497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(x_cpy!=x)  delete[] x_cpy;
1517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return 1;
1537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHPR2  performs the hermitian rank 2 operation
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha is a scalar, x and y are n element vectors and A is an
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  n by n hermitian matrix, supplied in packed form.
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
1627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint EIGEN_BLAS_FUNC(hpr2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pap)
1637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
1647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef void (*functype)(int, Scalar*, const Scalar*, const Scalar*, Scalar);
1657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static functype func[2];
1667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static bool init = false;
1687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(!init)
1697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
1707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for(int k=0; k<2; ++k)
1717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      func[k] = 0;
1727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[UP] = (internal::packed_rank2_update_selector<Scalar,int,Upper>::run);
1747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[LO] = (internal::packed_rank2_update_selector<Scalar,int,Lower>::run);
1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    init = true;
1777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
1787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* x = reinterpret_cast<Scalar*>(px);
1807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* y = reinterpret_cast<Scalar*>(py);
1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* ap = reinterpret_cast<Scalar*>(pap);
1827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
1837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  int info = 0;
1857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(UPLO(*uplo)==INVALID)                                            info = 1;
1867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  else if(*n<0)                                                       info = 2;
1877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  else if(*incx==0)                                                   info = 5;
1887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  else if(*incy==0)                                                   info = 7;
1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(info)
1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return xerbla_(SCALAR_SUFFIX_UP"HPR2 ",&info,6);
1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(alpha==Scalar(0))
1937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return 1;
1947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* x_cpy = get_compact_vector(x, *n, *incx);
1967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  Scalar* y_cpy = get_compact_vector(y, *n, *incy);
1977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  int code = UPLO(*uplo);
1997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(code>=2 || func[code]==0)
2007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return 0;
2017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  func[code](*n, ap, x_cpy, y_cpy, alpha);
2037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(x_cpy!=x)  delete[] x_cpy;
2057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(y_cpy!=y)  delete[] y_cpy;
2067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return 1;
2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHER   performs the hermitian rank 1 operation
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     A := alpha*x*conjg( x' ) + A,
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha is a real scalar, x is an n element vector and A is an
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  n by n hermitian matrix.
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(her)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pa, int *lda)
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, const Scalar&);
2207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static functype func[2];
2217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static bool init = false;
2237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(!init)
2247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
2257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for(int k=0; k<2; ++k)
2267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      func[k] = 0;
2277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[UP] = (selfadjoint_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run);
2297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[LO] = (selfadjoint_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run);
2307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    init = true;
2327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x = reinterpret_cast<Scalar*>(px);
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* a = reinterpret_cast<Scalar*>(pa);
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RealScalar alpha = *reinterpret_cast<RealScalar*>(palpha);
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int info = 0;
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(UPLO(*uplo)==INVALID)                                            info = 1;
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*n<0)                                                       info = 2;
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incx==0)                                                   info = 5;
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*lda<std::max(1,*n))                                        info = 7;
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(info)
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return xerbla_(SCALAR_SUFFIX_UP"HER  ",&info,6);
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(alpha==RealScalar(0))
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return 1;
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x_cpy = get_compact_vector(x, *n, *incx);
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  int code = UPLO(*uplo);
2527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(code>=2 || func[code]==0)
2537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return 0;
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  func[code](*n, a, *lda, x_cpy, x_cpy, alpha);
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  matrix(a,*n,*n,*lda).diagonal().imag().setZero();
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(x_cpy!=x)  delete[] x_cpy;
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return 1;
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZHER2  performs the hermitian rank 2 operation
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha is a scalar, x and y are n element vectors and A is an n
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  by n hermitian matrix.
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(her2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, Scalar);
2747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static functype func[2];
2757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  static bool init = false;
2777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(!init)
2787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
2797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    for(int k=0; k<2; ++k)
2807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      func[k] = 0;
2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[UP] = (internal::rank2_update_selector<Scalar,int,Upper>::run);
2837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    func[LO] = (internal::rank2_update_selector<Scalar,int,Lower>::run);
2847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    init = true;
2867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
2877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x = reinterpret_cast<Scalar*>(px);
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y = reinterpret_cast<Scalar*>(py);
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* a = reinterpret_cast<Scalar*>(pa);
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int info = 0;
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(UPLO(*uplo)==INVALID)                                            info = 1;
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*n<0)                                                       info = 2;
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incx==0)                                                   info = 5;
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incy==0)                                                   info = 7;
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*lda<std::max(1,*n))                                        info = 9;
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(info)
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return xerbla_(SCALAR_SUFFIX_UP"HER2 ",&info,6);
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(alpha==Scalar(0))
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return 1;
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x_cpy = get_compact_vector(x, *n, *incx);
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y_cpy = get_compact_vector(y, *n, *incy);
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  int code = UPLO(*uplo);
3097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(code>=2 || func[code]==0)
3107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return 0;
3117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
3127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  func[code](*n, a, *lda, x_cpy, y_cpy, alpha);
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  matrix(a,*n,*n,*lda).diagonal().imag().setZero();
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(x_cpy!=x)  delete[] x_cpy;
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(y_cpy!=y)  delete[] y_cpy;
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return 1;
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZGERU  performs the rank 1 operation
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     A := alpha*x*y' + A,
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha is a scalar, x is an m element vector, y is an n element
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  vector and A is an m by n matrix.
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(geru)(int *m, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x = reinterpret_cast<Scalar*>(px);
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y = reinterpret_cast<Scalar*>(py);
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* a = reinterpret_cast<Scalar*>(pa);
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int info = 0;
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath       if(*m<0)                                                       info = 1;
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*n<0)                                                       info = 2;
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incx==0)                                                   info = 5;
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incy==0)                                                   info = 7;
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*lda<std::max(1,*m))                                        info = 9;
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(info)
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return xerbla_(SCALAR_SUFFIX_UP"GERU ",&info,6);
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(alpha==Scalar(0))
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return 1;
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x_cpy = get_compact_vector(x,*m,*incx);
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y_cpy = get_compact_vector(y,*n,*incy);
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  internal::general_rank1_update<Scalar,int,ColMajor,false,false>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(x_cpy!=x)  delete[] x_cpy;
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(y_cpy!=y)  delete[] y_cpy;
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return 1;
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**  ZGERC  performs the rank 1 operation
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *     A := alpha*x*conjg( y' ) + A,
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  where alpha is a scalar, x is an m element vector, y is an n element
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *  vector and A is an m by n matrix.
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(gerc)(int *m, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x = reinterpret_cast<Scalar*>(px);
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y = reinterpret_cast<Scalar*>(py);
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* a = reinterpret_cast<Scalar*>(pa);
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int info = 0;
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath       if(*m<0)                                                       info = 1;
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*n<0)                                                       info = 2;
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incx==0)                                                   info = 5;
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*incy==0)                                                   info = 7;
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else if(*lda<std::max(1,*m))                                        info = 9;
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(info)
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return xerbla_(SCALAR_SUFFIX_UP"GERC ",&info,6);
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(alpha==Scalar(0))
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return 1;
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* x_cpy = get_compact_vector(x,*m,*incx);
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* y_cpy = get_compact_vector(y,*n,*incy);
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  internal::general_rank1_update<Scalar,int,ColMajor,false,Conj>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(x_cpy!=x)  delete[] x_cpy;
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(y_cpy!=y)  delete[] y_cpy;
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return 1;
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
395