15267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// This file is part of Eigen, a lightweight C++ template library 25267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// for linear algebra. 35267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// 45267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 55267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// 65267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// This Source Code Form is subject to the terms of the Mozilla 75267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Public License v. 2.0. If a copy of the MPL was not distributed 85267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 95267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "common.h" 115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)int 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) 135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int , Scalar *, int, Scalar); 155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static functype func[4]; 165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static bool init = false; 185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(!init) 195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for(int k=0; k<4; ++k) 215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[k] = 0; 225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR] = (internal::general_matrix_vector_product<int,Scalar,ColMajor,false,Scalar,false>::run); 245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR ] = (internal::general_matrix_vector_product<int,Scalar,RowMajor,false,Scalar,false>::run); 255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ ] = (internal::general_matrix_vector_product<int,Scalar,RowMajor,Conj, Scalar,false>::run); 265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) init = true; 285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* a = reinterpret_cast<Scalar*>(pa); 315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* b = reinterpret_cast<Scalar*>(pb); 325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* c = reinterpret_cast<Scalar*>(pc); 335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar alpha = *reinterpret_cast<Scalar*>(palpha); 346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch Scalar beta = *reinterpret_cast<Scalar*>(pbeta); 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // check arguments 37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) int info = 0; 3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(OP(*opa)==INVALID) info = 1; 39a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch else if(*m<0) info = 2; 40aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch else if(*n<0) info = 3; 415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*lda<std::max(1,*m)) info = 6; 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*incb==0) info = 8; 435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*incc==0) info = 11; 445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(info) 455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return xerbla_(SCALAR_SUFFIX_UP"GEMV ",&info,6); 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1))) 4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return 0; 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int actual_m = *m; 5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int actual_n = *n; 5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int code = OP(*opa); 535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(code!=NOTR) 545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) std::swap(actual_m,actual_n); 5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* actual_b = get_compact_vector(b,actual_n,*incb); 575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* actual_c = get_compact_vector(c,actual_m,*incc); 585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(beta!=Scalar(1)) 606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if(beta==Scalar(0)) vector(actual_c, actual_m).setZero(); 6207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else vector(actual_c, actual_m) *= beta; 635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(code>=4 || func[code]==0) 669e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) return 0; 679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[code](actual_m, actual_n, a, *lda, actual_b, 1, actual_c, 1, alpha); 69f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if(actual_b!=b) delete[] actual_b; 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(actual_c!=c) delete[] copy_back(actual_c,c,actual_m,*incc); 725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return 1; 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)int EIGEN_BLAS_FUNC(trsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pa, int *lda, RealScalar *pb, int *incb) 771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 78f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) typedef void (*functype)(int, const Scalar *, int, Scalar *); 795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static functype func[16]; 805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static bool init = false; 825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if(!init) 835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for(int k=0; k<16; ++k) 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[k] = 0; 865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run); 885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run); 895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run); 90f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 9119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run); 926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[TR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run); 93aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run); 94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run); 969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) func[TR | (UP << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run); 975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run); 985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run); 1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (LO << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run); 1015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run); 1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) init = true; 1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Scalar* a = reinterpret_cast<Scalar*>(pa); 1075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* b = reinterpret_cast<Scalar*>(pb); 1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int info = 0; 1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if(UPLO(*uplo)==INVALID) info = 1; 1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(OP(*opa)==INVALID) info = 2; 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(DIAG(*diag)==INVALID) info = 3; 11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(*n<0) info = 4; 11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(*lda<std::max(1,*n)) info = 6; 11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(*incb==0) info = 8; 11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(info) 1175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return xerbla_(SCALAR_SUFFIX_UP"TRSV ",&info,6); 118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 119f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Scalar* actual_b = get_compact_vector(b,*n,*incb); 1209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 12119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 12207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch func[code](*n, a, *lda, actual_b); 12319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 1249e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if(actual_b!=b) delete[] copy_back(actual_b,b,*n,*incb); 1259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 1269e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) return 0; 1279e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)} 1289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 1295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)int EIGEN_BLAS_FUNC(trmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pa, int *lda, RealScalar *pb, int *incb) 1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 1335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int, Scalar *, int, const Scalar&); 13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch static functype func[16]; 1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static bool init = false; 1375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(!init) 1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 139a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch for(int k=0; k<16; ++k) 140a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch func[k] = 0; 141a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run); 1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run); 1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run); 14507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run); 1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run); 1481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run); 1491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 1501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) func[TR | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 15307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 1555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 1565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 15707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) init = true; 1595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* a = reinterpret_cast<Scalar*>(pa); 162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Scalar* b = reinterpret_cast<Scalar*>(pb); 163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) int info = 0; 1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(UPLO(*uplo)==INVALID) info = 1; 1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(OP(*opa)==INVALID) info = 2; 167a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch else if(DIAG(*diag)==INVALID) info = 3; 1685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*n<0) info = 4; 1695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*lda<std::max(1,*n)) info = 6; 17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(*incb==0) info = 8; 1715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(info) 1721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return xerbla_(SCALAR_SUFFIX_UP"TRMV ",&info,6); 17307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if(*n==0) 1756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return 1; 176aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 177aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch Scalar* actual_b = get_compact_vector(b,*n,*incb); 178aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch Matrix<Scalar,Dynamic,1> res(*n); 179aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch res.setZero(); 180aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 181aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 182aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if(code>=16 || func[code]==0) 183aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return 0; 1846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[code](*n, *n, a, *lda, actual_b, 1, res.data(), 1, Scalar(1)); 1865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) copy_back(res.data(),b,*n,*incb); 1885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(actual_b!=b) delete[] actual_b; 18907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return 1; 1915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/** GBMV performs one of the matrix-vector operations 1945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 1955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, 196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * 197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * where alpha and beta are scalars, x and y are vectors and A is an 198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * m by n band matrix, with kl sub-diagonals and ku super-diagonals. 199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */ 200197021e6b966cfb06891637935ef33fff06433d1Ben Murdochint EIGEN_BLAS_FUNC(gbmv)(char *trans, int *m, int *n, int *kl, int *ku, RealScalar *palpha, RealScalar *pa, int *lda, 201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy) 202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Scalar* a = reinterpret_cast<Scalar*>(pa); 204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Scalar* x = reinterpret_cast<Scalar*>(px); 205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Scalar* y = reinterpret_cast<Scalar*>(py); 206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Scalar alpha = *reinterpret_cast<Scalar*>(palpha); 207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Scalar beta = *reinterpret_cast<Scalar*>(pbeta); 208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch int coeff_rows = *kl+*ku+1; 209197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 210197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch int info = 0; 211197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if(OP(*trans)==INVALID) info = 1; 212197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*m<0) info = 2; 213197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*n<0) info = 3; 214197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*kl<0) info = 4; 215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*ku<0) info = 5; 216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*lda<coeff_rows) info = 8; 217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*incx==0) info = 10; 218197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(*incy==0) info = 13; 219197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if(info) 220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return xerbla_(SCALAR_SUFFIX_UP"GBMV ",&info,6); 221197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 2225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1))) 22307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return 0; 2245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int actual_m = *m; 226aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch int actual_n = *n; 227aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if(OP(*trans)!=NOTR) 228aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch std::swap(actual_m,actual_n); 229aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 2305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 2315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* actual_y = get_compact_vector(y,actual_m,*incy); 2325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 23307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(beta!=Scalar(1)) 23407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch { 23507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(beta==Scalar(0)) vector(actual_y, actual_m).setZero(); 23607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else vector(actual_y, actual_m) *= beta; 23707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 23807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 23907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch MatrixType mat_coeffs(a,coeff_rows,*n,*lda); 24007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 24107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch int nb = std::min(*n,(*m)+(*ku)); 2425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for(int j=0; j<nb; ++j) 2435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 24407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch int start = std::max(0,j - *ku); 2455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int end = std::min((*m)-1,j + *kl); 2465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int len = end - start + 1; 24707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch int offset = (*ku) - j + start; 2485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(OP(*trans)==NOTR) 2495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len); 2505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(OP(*trans)==TR) 25107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * vector(actual_x+start,len) ).value(); 2525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else 2535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * vector(actual_x+start,len) ).value(); 254e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 2555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(actual_x!=x) delete[] actual_x; 25707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy); 2585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return 0; 26007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 2615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#if 0 2635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/** TBMV performs one of the matrix-vector operations 2645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 265a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch * x := A*x, or x := A'*x, 2665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 2675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * where x is an n element vector and A is an n by n unit, or non-unit, 2685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * upper or lower triangular band matrix, with ( k + 1 ) diagonals. 2695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */ 270d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)int EIGEN_BLAS_FUNC(tbmv)(char *uplo, char *opa, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) 2715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 2725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* a = reinterpret_cast<Scalar*>(pa); 27307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Scalar* x = reinterpret_cast<Scalar*>(px); 2745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int coeff_rows = *k + 1; 2755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 27607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch int info = 0; 2775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(UPLO(*uplo)==INVALID) info = 1; 2785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(OP(*opa)==INVALID) info = 2; 27907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(DIAG(*diag)==INVALID) info = 3; 2805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*n<0) info = 4; 2815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*k<0) info = 5; 28207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(*lda<coeff_rows) info = 7; 2835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*incx==0) info = 9; 2845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(info) 28507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return xerbla_(SCALAR_SUFFIX_UP"TBMV ",&info,6); 2865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(*n==0) 28807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return 0; 2895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int actual_n = *n; 29107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 2925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 2935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) MatrixType mat_coeffs(a,coeff_rows,*n,*lda); 2955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 296a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch int ku = UPLO(*uplo)==UPPER ? *k : 0; 2975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int kl = UPLO(*uplo)==LOWER ? *k : 0; 2985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for(int j=0; j<*n; ++j) 3005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 30107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch int start = std::max(0,j - ku); 3025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int end = std::min((*m)-1,j + kl); 303323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) int len = end - start + 1; 304323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) int offset = (ku) - j + start; 305323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 306197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if(OP(*trans)==NOTR) 307197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len); 308197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if(OP(*trans)==TR) 309197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * vector(actual_x+start,len) ).value(); 310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else 3115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * vector(actual_x+start,len) ).value(); 312197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 314323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if(actual_x!=x) delete[] actual_x; 315197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy); 316197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 317197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return 0; 318197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 319197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 3206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/** DTBSV solves one of the systems of equations 322197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * 3236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A*x = b, or A'*x = b, 3246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * 3256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * where b and x are n element vectors and A is an n by n unit, or 32643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) * non-unit, upper or lower triangular band matrix, with ( k + 1 ) 32743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) * diagonals. 32843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) * 32943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) * No test for singularity or near-singularity is included in this 33043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) * routine. Such tests must be performed before calling this routine. 33143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) */ 3325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)int EIGEN_BLAS_FUNC(tbsv)(char *uplo, char *op, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) 3336f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 3346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef void (*functype)(int, int, const Scalar *, int, Scalar *); 3356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static functype func[16]; 3366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3376f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static bool init = false; 3386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if(!init) 3396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 3406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch for(int k=0; k<16; ++k) 3416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[k] = 0; 3426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0, Scalar,false,Scalar,ColMajor>::run); 3446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[TR | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0, Scalar,false,Scalar,RowMajor>::run); 3456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0, Scalar,Conj, Scalar,RowMajor>::run); 3466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0, Scalar,false,Scalar,ColMajor>::run); 3486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[TR | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0, Scalar,false,Scalar,RowMajor>::run); 3496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0, Scalar,Conj, Scalar,RowMajor>::run); 3506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,ColMajor>::run); 3526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[TR | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,RowMajor>::run); 3536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run); 3546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,ColMajor>::run); 3566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[TR | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,RowMajor>::run); 3576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run); 3586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch init = true; 3606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 3616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch Scalar* a = reinterpret_cast<Scalar*>(pa); 3636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch Scalar* x = reinterpret_cast<Scalar*>(px); 3646f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch int coeff_rows = *k+1; 3656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 3666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch int info = 0; 3676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if(UPLO(*uplo)==INVALID) info = 1; 3686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch else if(OP(*op)==INVALID) info = 2; 3696f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch else if(DIAG(*diag)==INVALID) info = 3; 3706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch else if(*n<0) info = 4; 3716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch else if(*k<0) info = 5; 372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) else if(*lda<coeff_rows) info = 7; 373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) else if(*incx==0) info = 9; 374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if(info) 375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return xerbla_(SCALAR_SUFFIX_UP"TBSV ",&info,6); 376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if(*n==0 || (*k==0 && DIAG(*diag)==UNIT)) 378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return 0; 379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) int actual_n = *n; 381d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Scalar* actual_x = get_compact_vector(x,actual_n,*incx); 3835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int code = OP(*op) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 3855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(code>=16 || func[code]==0) 38607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return 0; 3875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[code](*n, *k, a, *lda, actual_x); 3895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(actual_x!=x) delete[] copy_back(actual_x,x,actual_n,*incx); 3915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return 0; 39307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 3945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/** DTPMV performs one of the matrix-vector operations 3965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 3975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * x := A*x, or x := A'*x, 3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 39907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * where x is an n element vector and A is an n by n unit, or non-unit, 40007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * upper or lower triangular matrix, supplied in packed form. 40107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch */ 402e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)int EIGEN_BLAS_FUNC(tpmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx) 4035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) typedef void (*functype)(int, const Scalar*, const Scalar*, Scalar*, Scalar); 4055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static functype func[16]; 40607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 4075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static bool init = false; 4085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(!init) 4095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 41007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for(int k=0; k<16; ++k) 4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[k] = 0; 4125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run); 41407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch func[TR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run); 4155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run); 4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run); 4185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run); 41907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run); 4205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 42207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch func[TR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 4241fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch 42507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run); 4261fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch func[TR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run); 42706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run); 42807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 42906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) init = true; 4306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 4315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* ap = reinterpret_cast<Scalar*>(pap); 4335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* x = reinterpret_cast<Scalar*>(px); 4345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int info = 0; 43607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(UPLO(*uplo)==INVALID) info = 1; 4375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(OP(*opa)==INVALID) info = 2; 4385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(DIAG(*diag)==INVALID) info = 3; 43907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(*n<0) info = 4; 4405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(*incx==0) info = 7; 4416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if(info) 4425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return xerbla_(SCALAR_SUFFIX_UP"TPMV ",&info,6); 4435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(*n==0) 44507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return 1; 4465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Scalar* actual_x = get_compact_vector(x,*n,*incx); 44807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Matrix<Scalar,Dynamic,1> res(*n); 4495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) res.setZero(); 4505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 45207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if(code>=16 || func[code]==0) 4535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return 0; 4546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 4555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[code](*n, ap, actual_x, res.data(), Scalar(1)); 4565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) copy_back(res.data(),x,*n,*incx); 4585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(actual_x!=x) delete[] actual_x; 4595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return 1; 4615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 4625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/** DTPSV solves one of the systems of equations 4645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 4655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * A*x = b, or A'*x = b, 4665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 4675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * where b and x are n element vectors and A is an n by n unit, or 4685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * non-unit, upper or lower triangular matrix, supplied in packed form. 4695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 4705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * No test for singularity or near-singularity is included in this 4715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * routine. Such tests must be performed before calling this routine. 4726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */ 4735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)int EIGEN_BLAS_FUNC(tpsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx) 4745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 4755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) typedef void (*functype)(int, const Scalar*, Scalar*); 4765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static functype func[16]; 4775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static bool init = false; 4795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(!init) 4805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 4815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for(int k=0; k<16; ++k) 4825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[k] = 0; 4835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 48407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run); 4855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run); 48609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run); 4875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run); 4895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run); 490f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run); 491f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 4925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run); 4935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[TR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run); 494f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run); 495f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 496f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run); 497f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) func[TR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run); 498f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run); 499f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 500f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) init = true; 501f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 502f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 503f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Scalar* ap = reinterpret_cast<Scalar*>(pap); 5046f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch Scalar* x = reinterpret_cast<Scalar*>(px); 5055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 5065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) int info = 0; 5075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(UPLO(*uplo)==INVALID) info = 1; 50807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if(OP(*opa)==INVALID) info = 2; 5095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else if(DIAG(*diag)==INVALID) info = 3; 510f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu else if(*n<0) info = 4; 511f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu else if(*incx==0) info = 7; 5126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if(info) 5135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return xerbla_(SCALAR_SUFFIX_UP"TPSV ",&info,6); 5145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 5155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Scalar* actual_x = get_compact_vector(x,*n,*incx); 5165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 5175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3); 5185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) func[code](*n, ap, actual_x); 5195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 5205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if(actual_x!=x) delete[] copy_back(actual_x,x,*n,*incx); 5215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 5225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return 1; 5235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 52407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 5255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)