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