max@0: // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) max@0: // Copyright (C) 2008-2011 Conrad Sanderson max@0: // Copyright (C) 2009 Edmund Highcock max@0: // Copyright (C) 2011 James Sanders max@0: // max@0: // This file is part of the Armadillo C++ library. max@0: // It is provided without any warranty of fitness max@0: // for any purpose. You can redistribute this file max@0: // and/or modify it under the terms of the GNU max@0: // Lesser General Public License (LGPL) as published max@0: // by the Free Software Foundation, either version 3 max@0: // of the License or (at your option) any later version. max@0: // (see http://www.opensource.org/licenses for more info) max@0: max@0: max@0: max@0: #ifdef ARMA_USE_LAPACK max@0: max@0: max@0: //! \namespace lapack namespace for LAPACK functions max@0: namespace lapack max@0: { max@0: max@0: max@0: template max@0: inline max@0: void max@0: getrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgetrf)(m, n, (T*)a, lda, ipiv, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgetrf)(m, n, (T*)a, lda, ipiv, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zgetrf)(m, n, (T*)a, lda, ipiv, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: getri(blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: trtri(char* uplo, char* diag, blas_int* n, eT* a, blas_int* lda, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: syev(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: heev max@0: ( max@0: char* jobz, char* uplo, blas_int* n, max@0: eT* a, blas_int* lda, typename eT::value_type* w, max@0: eT* work, blas_int* lwork, typename eT::value_type* rwork, max@0: blas_int* info max@0: ) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef float T; max@0: typedef typename std::complex cx_T; max@0: arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef double T; max@0: typedef typename std::complex cx_T; max@0: arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); max@0: } max@0: } max@0: max@0: max@0: template max@0: inline max@0: void max@0: geev max@0: ( max@0: char* jobvl, char* jobvr, blas_int* n, max@0: eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, max@0: blas_int* ldvl, eT* vr, blas_int* ldvr, max@0: eT* work, blas_int* lwork, max@0: blas_int* info max@0: ) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: template max@0: inline max@0: void max@0: cx_geev max@0: ( max@0: char* jobvl, char* jobvr, blas_int* n, max@0: eT* a, blas_int* lda, eT* w, max@0: eT* vl, blas_int* ldvl, max@0: eT* vr, blas_int* ldvr, max@0: eT* work, blas_int* lwork, typename eT::value_type* rwork, max@0: blas_int* info max@0: ) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef float T; max@0: typedef typename std::complex cx_T; max@0: arma_fortran(arma_cgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef double T; max@0: typedef typename std::complex cx_T; max@0: arma_fortran(arma_zgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: potrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info); max@0: } max@0: max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: potri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info); max@0: } max@0: max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: geqrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: orgqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: ungqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_cungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_zungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: template max@0: inline max@0: void max@0: gesvd max@0: ( max@0: char* jobu, char* jobvt, blas_int* m, blas_int* n, eT* a, blas_int* lda, max@0: eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt, max@0: eT* work, blas_int* lwork, blas_int* info max@0: ) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: cx_gesvd max@0: ( max@0: char* jobu, char* jobvt, blas_int* m, blas_int* n, std::complex* a, blas_int* lda, max@0: T* s, std::complex* u, blas_int* ldu, std::complex* vt, blas_int* ldvt, max@0: std::complex* work, blas_int* lwork, T* rwork, blas_int* info max@0: ) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: arma_type_check(( is_supported_blas_type< std::complex >::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float bT; max@0: arma_fortran(arma_cgesvd) max@0: ( max@0: jobu, jobvt, m, n, (std::complex*)a, lda, max@0: (bT*)s, (std::complex*)u, ldu, (std::complex*)vt, ldvt, max@0: (std::complex*)work, lwork, (bT*)rwork, info max@0: ); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double bT; max@0: arma_fortran(arma_zgesvd) max@0: ( max@0: jobu, jobvt, m, n, (std::complex*)a, lda, max@0: (bT*)s, (std::complex*)u, ldu, (std::complex*)vt, ldvt, max@0: (std::complex*)work, lwork, (bT*)rwork, info max@0: ); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: gesv(blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: gels(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: trtrs(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: gees(char* jobvs, char* sort, blas_int* select, blas_int* n, eT* a, blas_int* lda, blas_int* sdim, eT* wr, eT* wi, eT* vs, blas_int* ldvs, eT* work, blas_int* lwork, blas_int* bwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_sgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: cx_gees(char* jobvs, char* sort, blas_int* select, blas_int* n, std::complex* a, blas_int* lda, blas_int* sdim, std::complex* w, std::complex* vs, blas_int* ldvs, std::complex* work, blas_int* lwork, T* rwork, blas_int* bwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: arma_type_check(( is_supported_blas_type< std::complex >::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float bT; max@0: typedef std::complex cT; max@0: arma_fortran(arma_cgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double bT; max@0: typedef std::complex cT; max@0: arma_fortran(arma_zgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); max@0: } max@0: } max@0: max@0: max@0: max@0: template max@0: inline max@0: void max@0: trsyl(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const eT* a, blas_int* lda, const eT* b, blas_int* ldb, eT* c, blas_int* ldc, eT* scale, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info); max@0: } max@0: } max@0: max@0: max@0: template max@0: inline max@0: void max@0: sytrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_ssytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_csytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); max@0: } max@0: } max@0: max@0: max@0: template max@0: inline max@0: void max@0: sytri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* info) max@0: { max@0: arma_type_check(( is_supported_blas_type::value == false )); max@0: max@0: if(is_float::value == true) max@0: { max@0: typedef float T; max@0: arma_fortran(arma_ssytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); max@0: } max@0: else max@0: if(is_double::value == true) max@0: { max@0: typedef double T; max@0: arma_fortran(arma_dsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); max@0: } max@0: else max@0: if(is_supported_complex_float::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_csytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); max@0: } max@0: else max@0: if(is_supported_complex_double::value == true) max@0: { max@0: typedef std::complex T; max@0: arma_fortran(arma_zsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); max@0: } max@0: } max@0: max@0: max@0: } max@0: max@0: max@0: #endif