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