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 122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Index, typename Scalar, int StorageOrder, bool ConjugateLhs, bool ConjugateRhs> 132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct general_matrix_vector_product_wrapper 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(Index rows, Index cols,const Scalar *lhs, Index lhsStride, const Scalar *rhs, Index rhsIncr, Scalar* res, Index resIncr, Scalar alpha) 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef internal::const_blas_data_mapper<Scalar,Index,StorageOrder> LhsMapper; 182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef internal::const_blas_data_mapper<Scalar,Index,RowMajor> RhsMapper; 192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang internal::general_matrix_vector_product 212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang <Index,Scalar,LhsMapper,StorageOrder,ConjugateLhs,Scalar,RhsMapper,ConjugateRhs>::run( 222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang rows, cols, LhsMapper(lhs, lhsStride), RhsMapper(rhs, rhsIncr), res, resIncr, alpha); 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangint EIGEN_BLAS_FUNC(gemv)(const char *opa, const int *m, const int *n, const RealScalar *palpha, 272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const RealScalar *pa, const int *lda, const RealScalar *pb, const int *incb, const RealScalar *pbeta, RealScalar *pc, const int *incc) 282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int , Scalar *, int, Scalar); 302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const functype func[4] = { 312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR 322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (general_matrix_vector_product_wrapper<int,Scalar,ColMajor,false,false>::run), 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR 342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (general_matrix_vector_product_wrapper<int,Scalar,RowMajor,false,false>::run), 352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ 362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (general_matrix_vector_product_wrapper<int,Scalar,RowMajor,Conj ,false>::run), 372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0 382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* a = reinterpret_cast<const Scalar*>(pa); 412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* b = reinterpret_cast<const Scalar*>(pb); 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* c = reinterpret_cast<Scalar*>(pc); 432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar alpha = *reinterpret_cast<const Scalar*>(palpha); 442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar beta = *reinterpret_cast<const Scalar*>(pbeta); 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // check arguments 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*opa)==INVALID) info = 1; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*m<0) info = 2; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 3; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<std::max(1,*m)) info = 6; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incb==0) info = 8; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incc==0) info = 11; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"GEMV ",&info,6); 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1))) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_m = *m; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int code = OP(*opa); 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(code!=NOTR) 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::swap(actual_m,actual_n); 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* actual_b = get_compact_vector(b,actual_n,*incb); 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_c = get_compact_vector(c,actual_m,*incc); 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(beta!=Scalar(1)) 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(beta==Scalar(0)) make_vector(actual_c, actual_m).setZero(); 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else make_vector(actual_c, actual_m) *= beta; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(code>=4 || func[code]==0) 767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 0; 777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](actual_m, actual_n, a, *lda, actual_b, 1, actual_c, 1, alpha); 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_b!=b) delete[] actual_b; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_c!=c) delete[] copy_back(actual_c,c,actual_m,*incc); 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 1; 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangint EIGEN_BLAS_FUNC(trsv)(const char *uplo, const char *opa, const char *diag, const int *n, const RealScalar *pa, const int *lda, RealScalar *pb, const int *incb) 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef void (*functype)(int, const Scalar *, int, Scalar *); 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const functype func[16] = { 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (NUNIT << 3) 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run), 922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (NUNIT << 3) 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run), 942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (NUNIT << 3) 952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run), 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (NUNIT << 3) 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run), 992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (NUNIT << 3) 1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run), 1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (NUNIT << 3) 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run), 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (UNIT << 3) 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run), 1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (UNIT << 3) 1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run), 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (UNIT << 3) 1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run), 1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (UNIT << 3) 1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run), 1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (UNIT << 3) 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run), 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (UNIT << 3) 1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run), 1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0 1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* a = reinterpret_cast<const Scalar*>(pa); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* b = reinterpret_cast<Scalar*>(pb); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*opa)==INVALID) info = 2; 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<std::max(1,*n)) info = 6; 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incb==0) info = 8; 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TRSV ",&info,6); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_b = get_compact_vector(b,*n,*incb); 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](*n, a, *lda, actual_b); 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_b!=b) delete[] copy_back(actual_b,b,*n,*incb); 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangint EIGEN_BLAS_FUNC(trmv)(const char *uplo, const char *opa, const char *diag, const int *n, const RealScalar *pa, const int *lda, RealScalar *pb, const int *incb) 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int, Scalar *, int, const Scalar&); 1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const functype func[16] = { 1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (NUNIT << 3) 1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run), 1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (NUNIT << 3) 1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run), 1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (NUNIT << 3) 1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run), 1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (NUNIT << 3) 1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run), 1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (NUNIT << 3) 1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run), 1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (NUNIT << 3) 1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run), 1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (UNIT << 3) 1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run), 1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (UNIT << 3) 1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run), 1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (UNIT << 3) 1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run), 1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (UNIT << 3) 1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run), 1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (UNIT << 3) 1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run), 1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (UNIT << 3) 1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run), 1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0 1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* a = reinterpret_cast<const Scalar*>(pa); 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* b = reinterpret_cast<Scalar*>(pb); 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*opa)==INVALID) info = 2; 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<std::max(1,*n)) info = 6; 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incb==0) info = 8; 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TRMV ",&info,6); 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n==0) 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 1; 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_b = get_compact_vector(b,*n,*incb); 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix<Scalar,Dynamic,1> res(*n); 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.setZero(); 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(code>=16 || func[code]==0) 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](*n, *n, a, *lda, actual_b, 1, res.data(), 1, Scalar(1)); 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath copy_back(res.data(),b,*n,*incb); 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_b!=b) delete[] actual_b; 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 1; 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** GBMV performs one of the matrix-vector operations 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where alpha and beta are scalars, x and y are vectors and A is an 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * m by n band matrix, with kl sub-diagonals and ku super-diagonals. 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(gbmv)(char *trans, int *m, int *n, int *kl, int *ku, RealScalar *palpha, RealScalar *pa, int *lda, 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy) 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* a = reinterpret_cast<const Scalar*>(pa); 2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* x = reinterpret_cast<const Scalar*>(px); 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* y = reinterpret_cast<Scalar*>(py); 2242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar alpha = *reinterpret_cast<const Scalar*>(palpha); 2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar beta = *reinterpret_cast<const Scalar*>(pbeta); 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int coeff_rows = *kl+*ku+1; 2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)==INVALID) info = 1; 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*m<0) info = 2; 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 3; 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*kl<0) info = 4; 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*ku<0) info = 5; 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<coeff_rows) info = 8; 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx==0) info = 10; 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incy==0) info = 13; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"GBMV ",&info,6); 2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1))) 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 2422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_m = *m; 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)!=NOTR) 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::swap(actual_m,actual_n); 2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_y = get_compact_vector(y,actual_m,*incy); 2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(beta!=Scalar(1)) 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if(beta==Scalar(0)) make_vector(actual_y, actual_m).setZero(); 2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang else make_vector(actual_y, actual_m) *= beta; 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang ConstMatrixType mat_coeffs(a,coeff_rows,*n,*lda); 2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int nb = std::min(*n,(*m)+(*ku)); 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int j=0; j<nb; ++j) 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int start = std::max(0,j - *ku); 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int end = std::min((*m)-1,j + *kl); 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int len = end - start + 1; 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int offset = (*ku) - j + start; 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)==NOTR) 2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang make_vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len); 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*trans)==TR) 2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * make_vector(actual_x+start,len) ).value(); 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * make_vector(actual_x+start,len) ).value(); 2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_x!=x) delete[] actual_x; 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy); 2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if 0 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** TBMV performs one of the matrix-vector operations 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * x := A*x, or x := A'*x, 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where x is an n element vector and A is an n by n unit, or non-unit, 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * upper or lower triangular band matrix, with ( k + 1 ) diagonals. 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(tbmv)(char *uplo, char *opa, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int coeff_rows = *k + 1; 2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*opa)==INVALID) info = 2; 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*k<0) info = 5; 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<coeff_rows) info = 7; 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx==0) info = 9; 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TBMV ",&info,6); 3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n==0) 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 3072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 3092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 3112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType mat_coeffs(a,coeff_rows,*n,*lda); 3132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int ku = UPLO(*uplo)==UPPER ? *k : 0; 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int kl = UPLO(*uplo)==LOWER ? *k : 0; 3162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int j=0; j<*n; ++j) 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int start = std::max(0,j - ku); 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int end = std::min((*m)-1,j + kl); 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int len = end - start + 1; 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int offset = (ku) - j + start; 3232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(OP(*trans)==NOTR) 3252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang make_vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len); 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*trans)==TR) 3272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * make_vector(actual_x+start,len) ).value(); 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 3292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * make_vector(actual_x+start,len) ).value(); 3302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_x!=x) delete[] actual_x; 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy); 3342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** DTBSV solves one of the systems of equations 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * A*x = b, or A'*x = b, 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where b and x are n element vectors and A is an n by n unit, or 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * non-unit, upper or lower triangular band matrix, with ( k + 1 ) 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * diagonals. 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * No test for singularity or near-singularity is included in this 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * routine. Such tests must be performed before calling this routine. 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(tbsv)(char *uplo, char *op, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef void (*functype)(int, int, const Scalar *, int, Scalar *); 3532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const functype func[16] = { 3542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (NUNIT << 3) 3552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Upper|0, Scalar,false,Scalar,ColMajor>::run), 3562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (NUNIT << 3) 3572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Lower|0, Scalar,false,Scalar,RowMajor>::run), 3582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (NUNIT << 3) 3592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Lower|0, Scalar,Conj, Scalar,RowMajor>::run), 3602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 3612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (NUNIT << 3) 3622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Lower|0, Scalar,false,Scalar,ColMajor>::run), 3632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (NUNIT << 3) 3642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Upper|0, Scalar,false,Scalar,RowMajor>::run), 3652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (NUNIT << 3) 3662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Upper|0, Scalar,Conj, Scalar,RowMajor>::run), 3672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 3682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (UNIT << 3) 3692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,ColMajor>::run), 3702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (UNIT << 3) 3712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,RowMajor>::run), 3722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (UNIT << 3) 3732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run), 3742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 3752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (UNIT << 3) 3762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,ColMajor>::run), 3772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (UNIT << 3) 3782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,RowMajor>::run), 3792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (UNIT << 3) 3802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run), 3812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 3822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* a = reinterpret_cast<Scalar*>(pa); 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int coeff_rows = *k+1; 3872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(UPLO(*uplo)==INVALID) info = 1; 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(OP(*op)==INVALID) info = 2; 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(DIAG(*diag)==INVALID) info = 3; 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*n<0) info = 4; 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*k<0) info = 5; 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*lda<coeff_rows) info = 7; 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx==0) info = 9; 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return xerbla_(SCALAR_SUFFIX_UP"TBSV ",&info,6); 3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n==0 || (*k==0 && DIAG(*diag)==UNIT)) 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 4012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int actual_n = *n; 4032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 4052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int code = OP(*op) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(code>=16 || func[code]==0) 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath func[code](*n, *k, a, *lda, actual_x); 4112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(actual_x!=x) delete[] copy_back(actual_x,x,actual_n,*incx); 4132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** DTPMV performs one of the matrix-vector operations 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * x := A*x, or x := A'*x, 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where x is an n element vector and A is an n by n unit, or non-unit, 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * upper or lower triangular matrix, supplied in packed form. 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 4247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint EIGEN_BLAS_FUNC(tpmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx) 4257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 4267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef void (*functype)(int, const Scalar*, const Scalar*, Scalar*, Scalar); 4272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const functype func[16] = { 4282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (NUNIT << 3) 4292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run), 4302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (NUNIT << 3) 4312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run), 4322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (NUNIT << 3) 4332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run), 4342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 4352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (NUNIT << 3) 4362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run), 4372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (NUNIT << 3) 4382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run), 4392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (NUNIT << 3) 4402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run), 4412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 4422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (UNIT << 3) 4432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run), 4442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (UNIT << 3) 4452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run), 4462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (UNIT << 3) 4472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run), 4482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 4492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (UNIT << 3) 4502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run), 4512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (UNIT << 3) 4522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run), 4532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (UNIT << 3) 4542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run), 4552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0 4562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 4577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* ap = reinterpret_cast<Scalar*>(pap); 4597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* x = reinterpret_cast<Scalar*>(px); 4607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int info = 0; 4627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(UPLO(*uplo)==INVALID) info = 1; 4637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(OP(*opa)==INVALID) info = 2; 4647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(DIAG(*diag)==INVALID) info = 3; 4657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*n<0) info = 4; 4667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*incx==0) info = 7; 4677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(info) 4687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return xerbla_(SCALAR_SUFFIX_UP"TPMV ",&info,6); 4697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(*n==0) 4717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 1; 4727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* actual_x = get_compact_vector(x,*n,*incx); 4747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Matrix<Scalar,Dynamic,1> res(*n); 4757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez res.setZero(); 4767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 4787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(code>=16 || func[code]==0) 4797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 0; 4807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[code](*n, ap, actual_x, res.data(), Scalar(1)); 4827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez copy_back(res.data(),x,*n,*incx); 4847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(actual_x!=x) delete[] actual_x; 4857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 1; 4877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** DTPSV solves one of the systems of equations 490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * A*x = b, or A'*x = b, 492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * where b and x are n element vectors and A is an n by n unit, or 494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * non-unit, upper or lower triangular matrix, supplied in packed form. 495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * No test for singularity or near-singularity is included in this 497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * routine. Such tests must be performed before calling this routine. 498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 4997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint EIGEN_BLAS_FUNC(tpsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx) 500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 5017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef void (*functype)(int, const Scalar*, Scalar*); 5022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const functype func[16] = { 5032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (NUNIT << 3) 5042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run), 5052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (NUNIT << 3) 5062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run), 5072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (NUNIT << 3) 5082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run), 5092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 5102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (NUNIT << 3) 5112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run), 5122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (NUNIT << 3) 5132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run), 5142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (NUNIT << 3) 5152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run), 5162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 5172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (UP << 2) | (UNIT << 3) 5182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run), 5192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (UP << 2) | (UNIT << 3) 5202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run), 5212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (UP << 2) | (UNIT << 3) 5222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run), 5232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0, 5242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: NOTR | (LO << 2) | (UNIT << 3) 5252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run), 5262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: TR | (LO << 2) | (UNIT << 3) 5272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run), 5282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // array index: ADJ | (LO << 2) | (UNIT << 3) 5292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run), 5302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 0 5312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 5327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 5337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* ap = reinterpret_cast<Scalar*>(pap); 534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int info = 0; 5377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(UPLO(*uplo)==INVALID) info = 1; 5387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(OP(*opa)==INVALID) info = 2; 5397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(DIAG(*diag)==INVALID) info = 3; 5407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*n<0) info = 4; 5417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else if(*incx==0) info = 7; 542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(info) 5437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return xerbla_(SCALAR_SUFFIX_UP"TPSV ",&info,6); 544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar* actual_x = get_compact_vector(x,*n,*incx); 546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 5487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez func[code](*n, ap, actual_x); 549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(actual_x!=x) delete[] copy_back(actual_x,x,*n,*incx); 551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 1; 553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 554