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