12#include <uni20/config.hpp>
15#if !(UNI20_HAS_MPLAPACK_FLOAT128)
16#error "uni20/backend/lapack/mplapack/tridiagonal.hpp requires MPLAPACK float128 support"
20#include <mplapack_config.h>
21#include <mplapack_binary128.h>
27[[nodiscard]]
inline blas_int
gtsv(blas_int n, blas_int nrhs, uni20::float128* dl, uni20::float128* d,
28 uni20::float128* du, uni20::float128* b, blas_int ldb)
31 mplapackint mplapack_info = 0;
32 Rgtsv(
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), dl, d, du, b,
static_cast<mplapackint
>(ldb),
34 return static_cast<blas_int
>(mplapack_info);
37[[nodiscard]]
inline blas_int
gttrf(blas_int n, uni20::float128* dl, uni20::float128* d, uni20::float128* du,
38 uni20::float128* du2, blas_int* ipiv)
41 mplapackint mplapack_info = 0;
42 std::vector<mplapackint> mplapack_ipiv = uni20::lapack::mplapack::detail::make_mplapack_int_work(n);
43 Rgttrf(
static_cast<mplapackint
>(n), dl, d, du, du2, mplapack_ipiv.data(), mplapack_info);
44 uni20::lapack::mplapack::detail::copy_from_mplapack_ints(mplapack_ipiv, ipiv, n);
45 return static_cast<blas_int
>(mplapack_info);
48[[nodiscard]]
inline blas_int
gttrs(
char trans, blas_int n, blas_int nrhs, uni20::float128* dl, uni20::float128* d,
49 uni20::float128* du, uni20::float128* du2, blas_int
const* ipiv, uni20::float128* b,
52 UNI20_EXTERNAL_API_CALL(LAPACK, Rgttrs, trans, n, nrhs, dl, d, du, du2, ipiv, b, ldb);
53 mplapackint mplapack_info = 0;
54 std::vector<mplapackint> mplapack_ipiv = uni20::lapack::mplapack::detail::to_mplapack_ints(ipiv, n);
55 Rgttrs(&trans,
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), dl, d, du, du2, mplapack_ipiv.data(), b,
56 static_cast<mplapackint
>(ldb), mplapack_info);
57 return static_cast<blas_int
>(mplapack_info);
60[[nodiscard]]
inline blas_int
gtcon(
char norm, blas_int n, uni20::float128* dl, uni20::float128* d, uni20::float128* du,
61 uni20::float128* du2, blas_int
const* ipiv, uni20::float128 matrix_norm,
62 uni20::float128& rcond, uni20::float128* work, blas_int* iwork)
64 UNI20_EXTERNAL_API_CALL(LAPACK, Rgtcon,
norm, n, dl, d, du, du2, ipiv, matrix_norm, work, iwork);
65 mplapackint mplapack_info = 0;
66 std::vector<mplapackint> mplapack_ipiv = uni20::lapack::mplapack::detail::to_mplapack_ints(ipiv, n);
67 std::vector<mplapackint> mplapack_iwork = uni20::lapack::mplapack::detail::make_mplapack_int_work(n);
68 Rgtcon(&
norm,
static_cast<mplapackint
>(n), dl, d, du, du2, mplapack_ipiv.data(), matrix_norm, rcond, work,
69 mplapack_iwork.data(), mplapack_info);
70 return static_cast<blas_int
>(mplapack_info);
73[[nodiscard]]
inline blas_int
gtrfs(
char trans, blas_int n, blas_int nrhs, uni20::float128* dl, uni20::float128* d,
74 uni20::float128* du, uni20::float128* dlf, uni20::float128* df,
75 uni20::float128* duf, uni20::float128* du2, blas_int
const* ipiv,
76 uni20::float128* b, blas_int ldb, uni20::float128* x, blas_int ldx,
77 uni20::float128* forward_error, uni20::float128* backward_error,
78 uni20::float128* work, blas_int* iwork)
80 UNI20_EXTERNAL_API_CALL(LAPACK, Rgtrfs, trans, n, nrhs, dl, d, du, dlf, df, duf, du2, ipiv, b, ldb, x, ldx,
81 forward_error, backward_error, work, iwork);
82 mplapackint mplapack_info = 0;
83 std::vector<mplapackint> mplapack_ipiv = uni20::lapack::mplapack::detail::to_mplapack_ints(ipiv, n);
84 std::vector<mplapackint> mplapack_iwork = uni20::lapack::mplapack::detail::make_mplapack_int_work(n);
85 Rgtrfs(&trans,
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), dl, d, du, dlf, df, duf, du2,
86 mplapack_ipiv.data(), b,
static_cast<mplapackint
>(ldb), x,
static_cast<mplapackint
>(ldx), forward_error,
87 backward_error, work, mplapack_iwork.data(), mplapack_info);
88 return static_cast<blas_int
>(mplapack_info);
91[[nodiscard]]
inline blas_int
gtsvx(
char fact,
char trans, blas_int n, blas_int nrhs, uni20::float128* dl,
92 uni20::float128* d, uni20::float128* du, uni20::float128* dlf, uni20::float128* df,
93 uni20::float128* duf, uni20::float128* du2, blas_int* ipiv, uni20::float128* b,
94 blas_int ldb, uni20::float128* x, blas_int ldx, uni20::float128& rcond,
95 uni20::float128* forward_error, uni20::float128* backward_error,
96 uni20::float128* work, blas_int* iwork)
98 UNI20_EXTERNAL_API_CALL(LAPACK, Rgtsvx, fact, trans, n, nrhs, dl, d, du, dlf, df, duf, du2, ipiv, b, ldb, x, ldx,
100 mplapackint mplapack_info = 0;
101 std::vector<mplapackint> mplapack_ipiv = uni20::lapack::mplapack::detail::to_mplapack_ints(ipiv, n);
102 std::vector<mplapackint> mplapack_iwork = uni20::lapack::mplapack::detail::make_mplapack_int_work(n);
103 Rgtsvx(&fact, &trans,
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), dl, d, du, dlf, df, duf, du2,
104 mplapack_ipiv.data(), b,
static_cast<mplapackint
>(ldb), x,
static_cast<mplapackint
>(ldx), rcond, forward_error,
105 backward_error, work, mplapack_iwork.data(), mplapack_info);
106 uni20::lapack::mplapack::detail::copy_from_mplapack_ints(mplapack_ipiv, ipiv, n);
107 return static_cast<blas_int
>(mplapack_info);
110[[nodiscard]]
inline blas_int
ptsv(blas_int n, blas_int nrhs, uni20::float128* d, uni20::float128* e,
111 uni20::float128* b, blas_int ldb)
114 mplapackint mplapack_info = 0;
115 Rptsv(
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), d, e, b,
static_cast<mplapackint
>(ldb),
117 return static_cast<blas_int
>(mplapack_info);
120[[nodiscard]]
inline blas_int
pttrf(blas_int n, uni20::float128* d, uni20::float128* e)
123 mplapackint mplapack_info = 0;
124 Rpttrf(
static_cast<mplapackint
>(n), d, e, mplapack_info);
125 return static_cast<blas_int
>(mplapack_info);
128[[nodiscard]]
inline blas_int
pttrs(blas_int n, blas_int nrhs, uni20::float128* d, uni20::float128* e,
129 uni20::float128* b, blas_int ldb)
132 mplapackint mplapack_info = 0;
133 Rpttrs(
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), d, e, b,
static_cast<mplapackint
>(ldb),
135 return static_cast<blas_int
>(mplapack_info);
138[[nodiscard]]
inline blas_int
ptcon(blas_int n, uni20::float128* d, uni20::float128* e, uni20::float128 matrix_norm,
139 uni20::float128& rcond, uni20::float128* work)
142 mplapackint mplapack_info = 0;
143 Rptcon(
static_cast<mplapackint
>(n), d, e, matrix_norm, rcond, work, mplapack_info);
144 return static_cast<blas_int
>(mplapack_info);
147[[nodiscard]]
inline blas_int
ptrfs(blas_int n, blas_int nrhs, uni20::float128* d, uni20::float128* e,
148 uni20::float128* df, uni20::float128* ef, uni20::float128* b, blas_int ldb,
149 uni20::float128* x, blas_int ldx, uni20::float128* forward_error,
150 uni20::float128* backward_error, uni20::float128* work)
152 UNI20_EXTERNAL_API_CALL(LAPACK, Rptrfs, n, nrhs, d, e, df, ef, b, ldb, x, ldx, forward_error, backward_error, work);
153 mplapackint mplapack_info = 0;
154 Rptrfs(
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), d, e, df, ef, b,
static_cast<mplapackint
>(ldb), x,
155 static_cast<mplapackint
>(ldx), forward_error, backward_error, work, mplapack_info);
156 return static_cast<blas_int
>(mplapack_info);
159[[nodiscard]]
inline blas_int
ptsvx(
char fact, blas_int n, blas_int nrhs, uni20::float128* d, uni20::float128* e,
160 uni20::float128* df, uni20::float128* ef, uni20::float128* b, blas_int ldb,
161 uni20::float128* x, blas_int ldx, uni20::float128& rcond,
162 uni20::float128* forward_error, uni20::float128* backward_error,
163 uni20::float128* work)
165 UNI20_EXTERNAL_API_CALL(LAPACK, Rptsvx, fact, n, nrhs, d, e, df, ef, b, ldb, x, ldx, work);
166 mplapackint mplapack_info = 0;
167 Rptsvx(&fact,
static_cast<mplapackint
>(n),
static_cast<mplapackint
>(nrhs), d, e, df, ef, b,
168 static_cast<mplapackint
>(ldb), x,
static_cast<mplapackint
>(ldx), rcond, forward_error, backward_error, work,
170 return static_cast<blas_int
>(mplapack_info);
173[[nodiscard]]
inline blas_int
sterf(blas_int n, uni20::float128* d, uni20::float128* e)
176 mplapackint mplapack_info = 0;
177 Rsterf(
static_cast<mplapackint
>(n), d, e, mplapack_info);
178 return static_cast<blas_int
>(mplapack_info);
181[[nodiscard]]
inline blas_int
steqr(
char compz, blas_int n, uni20::float128* d, uni20::float128* e, uni20::float128* z,
182 blas_int ldz, uni20::float128* work)
185 mplapackint mplapack_info = 0;
186 Rsteqr(&compz,
static_cast<mplapackint
>(n), d, e, z,
static_cast<mplapackint
>(ldz), work, mplapack_info);
187 return static_cast<blas_int
>(mplapack_info);
190[[nodiscard]]
inline blas_int
stevd(
char jobz, blas_int n, uni20::float128* d, uni20::float128* e, uni20::float128* z,
191 blas_int ldz, uni20::float128* work, blas_int lwork, blas_int* iwork,
194 UNI20_EXTERNAL_API_CALL(LAPACK, Rstevd, jobz, n, d, e, z, ldz, work, lwork, iwork, liwork);
195 mplapackint mplapack_info = 0;
196 blas_int
const iwork_size = std::max<blas_int>(1, liwork == -1 ? blas_int{1} : liwork);
197 std::vector<mplapackint> mplapack_iwork = uni20::lapack::mplapack::detail::make_mplapack_int_work(iwork_size);
198 Rstevd(&jobz,
static_cast<mplapackint
>(n), d, e, z,
static_cast<mplapackint
>(ldz), work,
199 static_cast<mplapackint
>(lwork), mplapack_iwork.data(),
static_cast<mplapackint
>(liwork), mplapack_info);
200 uni20::lapack::mplapack::detail::copy_from_mplapack_query_int_work(mplapack_iwork, iwork, liwork);
201 return static_cast<blas_int
>(mplapack_info);
204[[nodiscard]]
inline blas_int
stevr(
char jobz,
char range, blas_int n, uni20::float128* d, uni20::float128* e,
205 uni20::float128 vl, uni20::float128 vu, blas_int il, blas_int iu,
206 uni20::float128 abstol, blas_int& selected_count, uni20::float128* w,
207 uni20::float128* z, blas_int ldz, blas_int* isuppz, uni20::float128* work,
208 blas_int lwork, blas_int* iwork, blas_int liwork)
210 UNI20_EXTERNAL_API_CALL(LAPACK, Rstevr, jobz, range, n, d, e, vl, vu, il, iu, abstol, selected_count, w, z, ldz,
211 isuppz, work, lwork, iwork, liwork);
212 mplapackint mplapack_selected_count =
static_cast<mplapackint
>(selected_count);
213 mplapackint mplapack_info = 0;
214 blas_int
const support_size = 2 * std::max<blas_int>(1, n);
215 blas_int
const iwork_size = std::max<blas_int>(1, liwork == -1 ? blas_int{1} : liwork);
216 std::vector<mplapackint> mplapack_isuppz;
217 if (isuppz !=
nullptr)
219 mplapack_isuppz = uni20::lapack::mplapack::detail::make_mplapack_int_work(support_size);
221 std::vector<mplapackint> mplapack_iwork = uni20::lapack::mplapack::detail::make_mplapack_int_work(iwork_size);
222 Rstevr(&jobz, &range,
static_cast<mplapackint
>(n), d, e, vl, vu,
static_cast<mplapackint
>(il),
223 static_cast<mplapackint
>(iu), abstol, mplapack_selected_count, w, z,
static_cast<mplapackint
>(ldz),
224 isuppz ==
nullptr ?
nullptr : mplapack_isuppz.data(), work,
static_cast<mplapackint
>(lwork),
225 mplapack_iwork.data(),
static_cast<mplapackint
>(liwork), mplapack_info);
226 selected_count =
static_cast<blas_int
>(mplapack_selected_count);
227 if (isuppz !=
nullptr)
229 uni20::lapack::mplapack::detail::copy_from_mplapack_ints(mplapack_isuppz, isuppz, support_size);
231 uni20::lapack::mplapack::detail::copy_from_mplapack_query_int_work(mplapack_iwork, iwork, liwork);
232 return static_cast<blas_int
>(mplapack_info);
Shared helpers for LAPACK backend wrappers.
Shared helpers for MPLAPACK LAPACK wrappers.
#define UNI20_EXTERNAL_API_CALL(module, func,...)
Emits a trace log entry for an outgoing backend API call.
Definition backend.hpp:90
Definition mplapack/band.hpp:25
blas_int gtsv(blas_int n, blas_int nrhs, uni20::float128 *dl, uni20::float128 *d, uni20::float128 *du, uni20::float128 *b, blas_int ldb)
Definition backend/lapack/mplapack/tridiagonal.hpp:27
blas_int gtrfs(char trans, blas_int n, blas_int nrhs, uni20::float128 *dl, uni20::float128 *d, uni20::float128 *du, uni20::float128 *dlf, uni20::float128 *df, uni20::float128 *duf, uni20::float128 *du2, blas_int const *ipiv, uni20::float128 *b, blas_int ldb, uni20::float128 *x, blas_int ldx, uni20::float128 *forward_error, uni20::float128 *backward_error, uni20::float128 *work, blas_int *iwork)
Definition backend/lapack/mplapack/tridiagonal.hpp:73
blas_int steqr(char compz, blas_int n, uni20::float128 *d, uni20::float128 *e, uni20::float128 *z, blas_int ldz, uni20::float128 *work)
Definition backend/lapack/mplapack/tridiagonal.hpp:181
blas_int stevd(char jobz, blas_int n, uni20::float128 *d, uni20::float128 *e, uni20::float128 *z, blas_int ldz, uni20::float128 *work, blas_int lwork, blas_int *iwork, blas_int liwork)
Definition backend/lapack/mplapack/tridiagonal.hpp:190
blas_int ptrfs(blas_int n, blas_int nrhs, uni20::float128 *d, uni20::float128 *e, uni20::float128 *df, uni20::float128 *ef, uni20::float128 *b, blas_int ldb, uni20::float128 *x, blas_int ldx, uni20::float128 *forward_error, uni20::float128 *backward_error, uni20::float128 *work)
Definition backend/lapack/mplapack/tridiagonal.hpp:147
blas_int gtsvx(char fact, char trans, blas_int n, blas_int nrhs, uni20::float128 *dl, uni20::float128 *d, uni20::float128 *du, uni20::float128 *dlf, uni20::float128 *df, uni20::float128 *duf, uni20::float128 *du2, blas_int *ipiv, uni20::float128 *b, blas_int ldb, uni20::float128 *x, blas_int ldx, uni20::float128 &rcond, uni20::float128 *forward_error, uni20::float128 *backward_error, uni20::float128 *work, blas_int *iwork)
Definition backend/lapack/mplapack/tridiagonal.hpp:91
blas_int stevr(char jobz, char range, blas_int n, uni20::float128 *d, uni20::float128 *e, uni20::float128 vl, uni20::float128 vu, blas_int il, blas_int iu, uni20::float128 abstol, blas_int &selected_count, uni20::float128 *w, uni20::float128 *z, blas_int ldz, blas_int *isuppz, uni20::float128 *work, blas_int lwork, blas_int *iwork, blas_int liwork)
Definition backend/lapack/mplapack/tridiagonal.hpp:204
blas_int ptsv(blas_int n, blas_int nrhs, uni20::float128 *d, uni20::float128 *e, uni20::float128 *b, blas_int ldb)
Definition backend/lapack/mplapack/tridiagonal.hpp:110
blas_int ptcon(blas_int n, uni20::float128 *d, uni20::float128 *e, uni20::float128 matrix_norm, uni20::float128 &rcond, uni20::float128 *work)
Definition backend/lapack/mplapack/tridiagonal.hpp:138
blas_int gttrs(char trans, blas_int n, blas_int nrhs, uni20::float128 *dl, uni20::float128 *d, uni20::float128 *du, uni20::float128 *du2, blas_int const *ipiv, uni20::float128 *b, blas_int ldb)
Definition backend/lapack/mplapack/tridiagonal.hpp:48
blas_int gtcon(char norm, blas_int n, uni20::float128 *dl, uni20::float128 *d, uni20::float128 *du, uni20::float128 *du2, blas_int const *ipiv, uni20::float128 matrix_norm, uni20::float128 &rcond, uni20::float128 *work, blas_int *iwork)
Definition backend/lapack/mplapack/tridiagonal.hpp:60
blas_int ptsvx(char fact, blas_int n, blas_int nrhs, uni20::float128 *d, uni20::float128 *e, uni20::float128 *df, uni20::float128 *ef, uni20::float128 *b, blas_int ldb, uni20::float128 *x, blas_int ldx, uni20::float128 &rcond, uni20::float128 *forward_error, uni20::float128 *backward_error, uni20::float128 *work)
Definition backend/lapack/mplapack/tridiagonal.hpp:159
blas_int gttrf(blas_int n, uni20::float128 *dl, uni20::float128 *d, uni20::float128 *du, uni20::float128 *du2, blas_int *ipiv)
Definition backend/lapack/mplapack/tridiagonal.hpp:37
blas_int pttrf(blas_int n, uni20::float128 *d, uni20::float128 *e)
Definition backend/lapack/mplapack/tridiagonal.hpp:120
blas_int sterf(blas_int n, uni20::float128 *d, uni20::float128 *e)
Definition backend/lapack/mplapack/tridiagonal.hpp:173
blas_int pttrs(blas_int n, blas_int nrhs, uni20::float128 *d, uni20::float128 *e, uni20::float128 *b, blas_int ldb)
Definition backend/lapack/mplapack/tridiagonal.hpp:128
mpreal norm(mpcomplex const &z)
Definition mpcomplex.hpp:494