inline lapack_int qr_solve_factored(lapack_int m, lapack_int n, lapack_int bn, T r[], T b[], T tau[], T x[], T work[], lapack_int len, ORMQR ormqr, TRSM trsm) { T* clone_b = Clone(m, bn, b); char side ='L'; char tran = 'T'; lapack_int info = 0; ormqr(&side, &tran, &m, &bn, &n, r, &m, tau, clone_b, &m, work, &len, &info); trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, 1.0, r, m, clone_b, m); copyBtoX(m, n, bn, clone_b, x); delete[] clone_b; return info; }
inline MKL_INT qr_solve(MKL_INT m, MKL_INT n, MKL_INT bn, T a[], T b[], T x[], T work[], MKL_INT len, GELS gels) { T* clone_a = Clone(m, n, a); T* clone_b = Clone(m, bn, b); char N = 'N'; MKL_INT info = 0; gels(&N, &m, &n, &bn, clone_a, &m, clone_b, &m, work, &len, &info); copyBtoX(m, n, bn, clone_b, x); delete[] clone_a; delete[] clone_b; return info; }
inline lapack_int qr_solve(lapack_int m, lapack_int n, lapack_int bn, T a[], T b[], T x[], T work[], lapack_int len, GELS gels) { T* clone_a = Clone(m, n, a); T* clone_b = Clone(m, bn, b); char N = 'N'; lapack_int info = 0; gels(&N, &m, &n, &bn, clone_a, &m, clone_b, &m, work, &len, &info); copyBtoX(m, n, bn, clone_b, x); delete[] clone_a; delete[] clone_b; return info; }
inline lapack_int complex_qr_solve_factored(lapack_int m, lapack_int n, lapack_int bn, T r[], T b[], T tau[], T x[], T work[], lapack_int len, UNMQR unmqr, TRSM trsm) { T* clone_b = Clone(m, bn, b); char side ='L'; char tran = 'C'; lapack_int info = 0; unmqr(&side, &tran, &m, &bn, &n, r, &m, tau, clone_b, &m, work, &len, &info); T one = { 1.0f, 0.0f }; trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, reinterpret_cast<R*>(&one), reinterpret_cast<R*>(r), m, reinterpret_cast<R*>(clone_b), m); copyBtoX(m, n, bn, clone_b, x); delete[] clone_b; return info; }
inline MKL_INT complex_qr_solve_factored(MKL_INT m, MKL_INT n, MKL_INT bn, T r[], T b[], T tau[], T x[], T work[], MKL_INT len, UNMQR unmqr, TRSM trsm) { T* clone_b = Clone(m, bn, b); char side ='L'; char tran = 'C'; MKL_INT info = 0; unmqr(&side, &tran, &m, &bn, &n, r, &m, tau, clone_b, &m, work, &len, &info); T one = 1.0f; trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, &one, r, m, clone_b, m); copyBtoX(m, n, bn, clone_b, x); delete[] clone_b; return info; }
inline MKL_INT qr_solve_factored(MKL_INT m, MKL_INT n, MKL_INT bn, T r[], T b[], T tau[], T x[], T work[], MKL_INT len, void (*ormqr)(const char*, const char*, const MKL_INT*, const MKL_INT*, const MKL_INT*, const T*, const MKL_INT*, const T*, T*, const MKL_INT*, T*, const MKL_INT*, MKL_INT* info), void (*trsm)(const CBLAS_ORDER, const CBLAS_SIDE, const CBLAS_UPLO, const CBLAS_TRANSPOSE, const CBLAS_DIAG, const MKL_INT, const MKL_INT, const T, const T*, const MKL_INT, T*, const MKL_INT)) { T* clone_b = Clone(m, bn, b); char side ='L'; char tran = 'T'; MKL_INT info = 0; ormqr(&side, &tran, &m, &bn, &n, r, &m, tau, clone_b, &m, work, &len, &info); trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, 1.0, r, m, clone_b, m); copyBtoX(m, n, bn, clone_b, x); delete[] clone_b; return info; }
inline lapack_int qr_solve_factored(lapack_int m, lapack_int n, lapack_int bn, T r[], T b[], T tau[], T x[], ORMQR ormqr, TRSM trsm) { try { auto clone_b = array_clone(m * bn, b); auto info = ormqr(LAPACK_COL_MAJOR, 'L', 'T', m, bn, n, r, m, tau, clone_b.get(), m); if (info != 0) { return info; } trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, 1.0, r, m, clone_b.get(), m); copyBtoX(m, n, bn, clone_b.get(), x); return info; } catch (std::bad_alloc&) { return INSUFFICIENT_MEMORY; } }
inline lapack_int qr_solve(lapack_int m, lapack_int n, lapack_int bn, T a[], T b[], T x[], GELS gels) { try { auto clone_a = array_clone(m * n, a); auto clone_b = array_clone(m * bn, b); auto info = gels(LAPACK_COL_MAJOR, 'N', m, n, bn, clone_a.get(), m, clone_b.get(), m); if (info != 0) { return info; } copyBtoX(m, n, bn, clone_b.get(), x); return info; } catch (std::bad_alloc&) { return INSUFFICIENT_MEMORY; } }
inline lapack_int complex_qr_solve_factored(lapack_int m, lapack_int n, lapack_int bn, T r[], T b[], T tau[], T x[], UNMQR unmqr, TRSM trsm) { try { auto clone_b = array_clone(m * bn, b); auto info = unmqr(LAPACK_COL_MAJOR, 'L', 'C', m, bn, n, r, m, tau, clone_b.get(), m); if (info != 0) { return info; } T one = 1.0f; trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, reinterpret_cast<R*>(&one), reinterpret_cast<R*>(r), m, reinterpret_cast<R*>(clone_b.get()), m); copyBtoX(m, n, bn, clone_b.get(), x); return info; } catch (std::bad_alloc&) { return INSUFFICIENT_MEMORY; } }