Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
backend/lapack/mplapack/tridiagonal.hpp
Go to the documentation of this file.
1#pragma once
2
12#include <uni20/config.hpp>
13#include <uni20/core/types.hpp>
14
15#if !(UNI20_HAS_MPLAPACK_FLOAT128)
16#error "uni20/backend/lapack/mplapack/tridiagonal.hpp requires MPLAPACK float128 support"
17#endif
18
19// clang-format off
20#include <mplapack_config.h>
21#include <mplapack_binary128.h>
22// clang-format on
23
25{
26
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)
29{
30 UNI20_EXTERNAL_API_CALL(LAPACK, Rgtsv, n, nrhs, dl, d, du, b, ldb);
31 mplapackint mplapack_info = 0;
32 Rgtsv(static_cast<mplapackint>(n), static_cast<mplapackint>(nrhs), dl, d, du, b, static_cast<mplapackint>(ldb),
33 mplapack_info);
34 return static_cast<blas_int>(mplapack_info);
35}
36
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)
39{
40 UNI20_EXTERNAL_API_CALL(LAPACK, Rgttrf, n, dl, d, du, du2, 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);
46}
47
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,
50 blas_int ldb)
51{
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);
58}
59
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)
63{
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);
71}
72
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)
79{
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);
89}
90
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)
97{
98 UNI20_EXTERNAL_API_CALL(LAPACK, Rgtsvx, fact, trans, n, nrhs, dl, d, du, dlf, df, duf, du2, ipiv, b, ldb, x, ldx,
99 work, iwork);
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);
108}
109
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)
112{
113 UNI20_EXTERNAL_API_CALL(LAPACK, Rptsv, n, nrhs, d, e, b, ldb);
114 mplapackint mplapack_info = 0;
115 Rptsv(static_cast<mplapackint>(n), static_cast<mplapackint>(nrhs), d, e, b, static_cast<mplapackint>(ldb),
116 mplapack_info);
117 return static_cast<blas_int>(mplapack_info);
118}
119
120[[nodiscard]] inline blas_int pttrf(blas_int n, uni20::float128* d, uni20::float128* e)
121{
122 UNI20_EXTERNAL_API_CALL(LAPACK, Rpttrf, n, d, e);
123 mplapackint mplapack_info = 0;
124 Rpttrf(static_cast<mplapackint>(n), d, e, mplapack_info);
125 return static_cast<blas_int>(mplapack_info);
126}
127
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)
130{
131 UNI20_EXTERNAL_API_CALL(LAPACK, Rpttrs, n, nrhs, d, e, b, ldb);
132 mplapackint mplapack_info = 0;
133 Rpttrs(static_cast<mplapackint>(n), static_cast<mplapackint>(nrhs), d, e, b, static_cast<mplapackint>(ldb),
134 mplapack_info);
135 return static_cast<blas_int>(mplapack_info);
136}
137
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)
140{
141 UNI20_EXTERNAL_API_CALL(LAPACK, Rptcon, n, d, e, matrix_norm, 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);
145}
146
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)
151{
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);
157}
158
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)
164{
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,
169 mplapack_info);
170 return static_cast<blas_int>(mplapack_info);
171}
172
173[[nodiscard]] inline blas_int sterf(blas_int n, uni20::float128* d, uni20::float128* e)
174{
175 UNI20_EXTERNAL_API_CALL(LAPACK, Rsterf, n, d, e);
176 mplapackint mplapack_info = 0;
177 Rsterf(static_cast<mplapackint>(n), d, e, mplapack_info);
178 return static_cast<blas_int>(mplapack_info);
179}
180
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)
183{
184 UNI20_EXTERNAL_API_CALL(LAPACK, Rsteqr, compz, n, d, e, z, ldz, 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);
188}
189
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,
192 blas_int liwork)
193{
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);
202}
203
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)
209{
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)
218 {
219 mplapack_isuppz = uni20::lapack::mplapack::detail::make_mplapack_int_work(support_size);
220 }
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)
228 {
229 uni20::lapack::mplapack::detail::copy_from_mplapack_ints(mplapack_isuppz, isuppz, support_size);
230 }
231 uni20::lapack::mplapack::detail::copy_from_mplapack_query_int_work(mplapack_iwork, iwork, liwork);
232 return static_cast<blas_int>(mplapack_info);
233}
234
235} // namespace uni20::lapack::unchecked
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