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 Kamathint EIGEN_BLAS_FUNC(gemv)(char *opa, int *m, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *incb, RealScalar *pbeta, RealScalar *pc, int *incc) 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int , Scalar *, int, Scalar); 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static functype func[4]; 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static bool init = false; 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!init) 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int k=0; k<4; ++k) 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[k] = 0; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR] = (internal::general_matrix_vector_product<int,Scalar,ColMajor,false,Scalar,false>::run); 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR ] = (internal::general_matrix_vector_product<int,Scalar,RowMajor,false,Scalar,false>::run); 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ ] = (internal::general_matrix_vector_product<int,Scalar,RowMajor,Conj, Scalar,false>::run); 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath init = true; 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* b = reinterpret_cast<Scalar*>(pb); 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* c = reinterpret_cast<Scalar*>(pc); 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar alpha = *reinterpret_cast<Scalar*>(palpha); 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar beta = *reinterpret_cast<Scalar*>(pbeta); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // check arguments 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*opa)==INVALID) info = 1; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*m<0) info = 2; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 3; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<std::max(1,*m)) info = 6; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incb==0) info = 8; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incc==0) info = 11; 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"GEMV ",&info,6); 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1))) 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_m = *m; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int code = OP(*opa); 537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(code!=NOTR) 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::swap(actual_m,actual_n); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_b = get_compact_vector(b,actual_n,*incb); 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_c = get_compact_vector(c,actual_m,*incc); 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(beta!=Scalar(1)) 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(beta==Scalar(0)) vector(actual_c, actual_m).setZero(); 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else vector(actual_c, actual_m) *= beta; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(code>=4 || func[code]==0) 667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 0; 677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](actual_m, actual_n, a, *lda, actual_b, 1, actual_c, 1, alpha); 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_b!=b) delete[] actual_b; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_c!=c) delete[] copy_back(actual_c,c,actual_m,*incc); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 1; 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(trsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pa, int *lda, RealScalar *pb, int *incb) 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef void (*functype)(int, const Scalar *, int, Scalar *); 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static functype func[16]; 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static bool init = false; 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!init) 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int k=0; k<16; ++k) 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[k] = 0; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run); 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run); 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run); 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run); 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run); 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (UP << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run); 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run); 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run); 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (LO << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run); 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run); 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath init = true; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* b = reinterpret_cast<Scalar*>(pb); 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*opa)==INVALID) info = 2; 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<std::max(1,*n)) info = 6; 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incb==0) info = 8; 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TRSV ",&info,6); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_b = get_compact_vector(b,*n,*incb); 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](*n, a, *lda, actual_b); 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_b!=b) delete[] copy_back(actual_b,b,*n,*incb); 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(trmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pa, int *lda, RealScalar *pb, int *incb) 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int, Scalar *, int, const Scalar&); 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static functype func[16]; 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static bool init = false; 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!init) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int k=0; k<16; ++k) 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[k] = 0; 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run); 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run); 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run); 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run); 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run); 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath init = true; 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* b = reinterpret_cast<Scalar*>(pb); 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*opa)==INVALID) info = 2; 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<std::max(1,*n)) info = 6; 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incb==0) info = 8; 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TRMV ",&info,6); 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n==0) 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 1; 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_b = get_compact_vector(b,*n,*incb); 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix<Scalar,Dynamic,1> res(*n); 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.setZero(); 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(code>=16 || func[code]==0) 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](*n, *n, a, *lda, actual_b, 1, res.data(), 1, Scalar(1)); 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath copy_back(res.data(),b,*n,*incb); 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_b!=b) delete[] actual_b; 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 1; 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** GBMV performs one of the matrix-vector operations 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where alpha and beta are scalars, x and y are vectors and A is an 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * m by n band matrix, with kl sub-diagonals and ku super-diagonals. 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(gbmv)(char *trans, int *m, int *n, int *kl, int *ku, RealScalar *palpha, RealScalar *pa, int *lda, 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy) 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* y = reinterpret_cast<Scalar*>(py); 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar alpha = *reinterpret_cast<Scalar*>(palpha); 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar beta = *reinterpret_cast<Scalar*>(pbeta); 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int coeff_rows = *kl+*ku+1; 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)==INVALID) info = 1; 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*m<0) info = 2; 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 3; 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*kl<0) info = 4; 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*ku<0) info = 5; 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<coeff_rows) info = 8; 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx==0) info = 10; 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incy==0) info = 13; 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"GBMV ",&info,6); 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1))) 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_m = *m; 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)!=NOTR) 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::swap(actual_m,actual_n); 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_y = get_compact_vector(y,actual_m,*incy); 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(beta!=Scalar(1)) 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(beta==Scalar(0)) vector(actual_y, actual_m).setZero(); 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else vector(actual_y, actual_m) *= beta; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType mat_coeffs(a,coeff_rows,*n,*lda); 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int nb = std::min(*n,(*m)+(*ku)); 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int j=0; j<nb; ++j) 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int start = std::max(0,j - *ku); 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int end = std::min((*m)-1,j + *kl); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int len = end - start + 1; 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int offset = (*ku) - j + start; 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)==NOTR) 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len); 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*trans)==TR) 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * vector(actual_x+start,len) ).value(); 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * vector(actual_x+start,len) ).value(); 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_x!=x) delete[] actual_x; 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy); 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if 0 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** TBMV performs one of the matrix-vector operations 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * x := A*x, or x := A'*x, 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where x is an n element vector and A is an n by n unit, or non-unit, 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * upper or lower triangular band matrix, with ( k + 1 ) diagonals. 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(tbmv)(char *uplo, char *opa, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int coeff_rows = *k + 1; 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*opa)==INVALID) info = 2; 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*k<0) info = 5; 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<coeff_rows) info = 7; 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx==0) info = 9; 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TBMV ",&info,6); 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n==0) 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType mat_coeffs(a,coeff_rows,*n,*lda); 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int ku = UPLO(*uplo)==UPPER ? *k : 0; 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int kl = UPLO(*uplo)==LOWER ? *k : 0; 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int j=0; j<*n; ++j) 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int start = std::max(0,j - ku); 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int end = std::min((*m)-1,j + kl); 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int len = end - start + 1; 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int offset = (ku) - j + start; 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)==NOTR) 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len); 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*trans)==TR) 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * vector(actual_x+start,len) ).value(); 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * vector(actual_x+start,len) ).value(); 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_x!=x) delete[] actual_x; 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy); 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** DTBSV solves one of the systems of equations 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * A*x = b, or A'*x = b, 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where b and x are n element vectors and A is an n by n unit, or 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * non-unit, upper or lower triangular band matrix, with ( k + 1 ) 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * diagonals. 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * No test for singularity or near-singularity is included in this 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * routine. Such tests must be performed before calling this routine. 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(tbsv)(char *uplo, char *op, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef void (*functype)(int, int, const Scalar *, int, Scalar *); 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static functype func[16]; 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static bool init = false; 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!init) 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int k=0; k<16; ++k) 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[k] = 0; 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0, Scalar,false,Scalar,ColMajor>::run); 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0, Scalar,false,Scalar,RowMajor>::run); 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0, Scalar,Conj, Scalar,RowMajor>::run); 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0, Scalar,false,Scalar,ColMajor>::run); 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0, Scalar,false,Scalar,RowMajor>::run); 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0, Scalar,Conj, Scalar,RowMajor>::run); 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,ColMajor>::run); 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,RowMajor>::run); 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run); 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,ColMajor>::run); 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[TR | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,RowMajor>::run); 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run); 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath init = true; 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int coeff_rows = *k+1; 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*op)==INVALID) info = 2; 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*k<0) info = 5; 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<coeff_rows) info = 7; 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx==0) info = 9; 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TBSV ",&info,6); 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n==0 || (*k==0 && DIAG(*diag)==UNIT)) 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int code = OP(*op) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(code>=16 || func[code]==0) 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](*n, *k, a, *lda, actual_x); 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_x!=x) delete[] copy_back(actual_x,x,actual_n,*incx); 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** DTPMV performs one of the matrix-vector operations 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * x := A*x, or x := A'*x, 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where x is an n element vector and A is an n by n unit, or non-unit, 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * upper or lower triangular matrix, supplied in packed form. 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 4027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint EIGEN_BLAS_FUNC(tpmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx) 4037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 4047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef void (*functype)(int, const Scalar*, const Scalar*, Scalar*, Scalar); 4057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static functype func[16]; 4067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static bool init = false; 4087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(!init) 4097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 4107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int k=0; k<16; ++k) 4117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[k] = 0; 4127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run); 4147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run); 4157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run); 4167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run); 4187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run); 4197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run); 4207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 4227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 4237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 4247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 4267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 4277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 4287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez init = true; 4307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* ap = reinterpret_cast<Scalar*>(pap); 4337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* x = reinterpret_cast<Scalar*>(px); 4347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int info = 0; 4367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(UPLO(*uplo)==INVALID) info = 1; 4377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(OP(*opa)==INVALID) info = 2; 4387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(DIAG(*diag)==INVALID) info = 3; 4397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*n<0) info = 4; 4407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*incx==0) info = 7; 4417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(info) 4427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return xerbla_(SCALAR_SUFFIX_UP"TPMV ",&info,6); 4437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(*n==0) 4457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 1; 4467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* actual_x = get_compact_vector(x,*n,*incx); 4487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Matrix<Scalar,Dynamic,1> res(*n); 4497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez res.setZero(); 4507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 4527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(code>=16 || func[code]==0) 4537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 0; 4547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[code](*n, ap, actual_x, res.data(), Scalar(1)); 4567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez copy_back(res.data(),x,*n,*incx); 4587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(actual_x!=x) delete[] actual_x; 4597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 1; 4617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** DTPSV solves one of the systems of equations 464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * A*x = b, or A'*x = b, 466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where b and x are n element vectors and A is an n by n unit, or 468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * non-unit, upper or lower triangular matrix, supplied in packed form. 469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * No test for singularity or near-singularity is included in this 471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * routine. Such tests must be performed before calling this routine. 472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 4737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint EIGEN_BLAS_FUNC(tpsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx) 474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 4757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef void (*functype)(int, const Scalar*, Scalar*); 4767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static functype func[16]; 4777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static bool init = false; 4797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(!init) 4807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 4817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int k=0; k<16; ++k) 4827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[k] = 0; 4837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run); 4857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run); 4867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run); 4877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run); 4897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run); 4907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run); 4917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run); 4937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run); 4947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run); 4957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run); 4977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[TR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run); 4987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run); 4997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 5007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez init = true; 5017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 5027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 5037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* ap = reinterpret_cast<Scalar*>(pap); 504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 5077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(UPLO(*uplo)==INVALID) info = 1; 5087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(OP(*opa)==INVALID) info = 2; 5097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(DIAG(*diag)==INVALID) info = 3; 5107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*n<0) info = 4; 5117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*incx==0) info = 7; 512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 5137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return xerbla_(SCALAR_SUFFIX_UP"TPSV ",&info,6); 514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* actual_x = get_compact_vector(x,*n,*incx); 516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 5187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[code](*n, ap, actual_x); 519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(actual_x!=x) delete[] copy_back(actual_x,x,*n,*incx); 521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 1; 523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 525