Loading...
Searching...
No Matches
lapack.hpp
Go to the documentation of this file.
1#pragma once
2
3/**
4 * Centralized LAPACK declarations for the Q3 codebase.
5 *
6 * All LAPACK extern "C" function declarations are collected here to avoid
7 * duplication across translation units. Each routine links against the
8 * system LAPACK library (e.g., macOS Accelerate or a linked LAPACK build).
9 *
10 * Routines included:
11 * - zheev_ : complex Hermitian eigensolver (standard)
12 * - zhegv_ : complex Hermitian eigensolver (generalized)
13 * - dsygv_ : real symmetric eigensolver (generalized)
14 * - dgels_ : real least-squares solver
15 * - dsytrf_ : real symmetric factorization (Bunch-Kaufman)
16 * - dsytri_ : real symmetric matrix inverse from dsytrf_ factors
17 * - zgesvd_ : complex singular value decomposition
18 * - dgesvd_ : real singular value decomposition
19 * - zgeqp3_ : complex QR factorization with column pivoting
20 * - zgetrf_ : complex general matrix LU factorization
21 * - zgetri_ : complex general matrix inverse from zgetrf_ factors
22 */
23
24#include <complex>
25
26namespace q3::lapack {
27
28extern "C" {
29
30/**
31 * ZHEEV: Complex Hermitian eigensolver (standard eigenproblem).
32 * Computes all eigenvalues and, optionally, eigenvectors of a complex
33 * Hermitian matrix A: A * v = lambda * v.
34 */
35void zheev_(const char* jobz,
36 const char* uplo,
37 const int* n,
38 std::complex<double>* a,
39 const int* lda,
40 double* w,
41 std::complex<double>* work,
42 const int* lwork,
43 double* rwork,
44 int* info);
45
46/**
47 * ZHEGV: Complex Hermitian eigensolver (generalized eigenproblem).
48 * Solves A * v = lambda * B * v for Hermitian A and positive-definite B.
49 */
50void zhegv_(const int* itype,
51 const char* jobz,
52 const char* uplo,
53 const int* n,
54 std::complex<double>* a,
55 const int* lda,
56 std::complex<double>* b,
57 const int* ldb,
58 double* w,
59 std::complex<double>* work,
60 const int* lwork,
61 double* rwork,
62 int* info);
63
64/**
65 * DSYGV: Real symmetric eigensolver (generalized eigenproblem).
66 * Solves A * v = lambda * B * v for symmetric A and positive-definite B.
67 */
68void dsygv_(const int* itype,
69 const char* jobz,
70 const char* uplo,
71 const int* n,
72 double* a,
73 const int* lda,
74 double* b,
75 const int* ldb,
76 double* w,
77 double* work,
78 const int* lwork,
79 int* info);
80
81/**
82 * DGELS: Real least-squares solver.
83 * Solves overdetermined or underdetermined real linear systems using
84 * QR or LQ factorization of A.
85 */
86void dgels_(const char* trans,
87 const int* m,
88 const int* n,
89 const int* nrhs,
90 double* a,
91 const int* lda,
92 double* b,
93 const int* ldb,
94 double* work,
95 const int* lwork,
96 int* info);
97
98/**
99 * DSYTRF: Real symmetric matrix factorization (Bunch-Kaufman).
100 * Computes the factorization of a real symmetric matrix using the
101 * Bunch-Kaufman diagonal pivoting method.
102 */
103void dsytrf_(const char* uplo,
104 const int* n,
105 double* a,
106 const int* lda,
107 int* ipiv,
108 double* work,
109 const int* lwork,
110 int* info);
111
112/**
113 * DSYTRI: Real symmetric matrix inverse from DSYTRF factors.
114 * Computes the inverse of a real symmetric matrix from the Bunch-Kaufman
115 * factorization computed by DSYTRF.
116 */
117void dsytri_(const char* uplo,
118 const int* n,
119 double* a,
120 const int* lda,
121 const int* ipiv,
122 double* work,
123 int* info);
124
125/**
126 * ZGESVD: Complex singular value decomposition.
127 * Computes the singular value decomposition A = U * Sigma * V**H of a
128 * complex M-by-N matrix A, optionally computing the left and/or right
129 * singular vectors.
130 */
131void zgesvd_(const char* jobu,
132 const char* jobvt,
133 const int* m,
134 const int* n,
135 std::complex<double>* a,
136 const int* lda,
137 double* s,
138 std::complex<double>* u,
139 const int* ldu,
140 std::complex<double>* vt,
141 const int* ldvt,
142 std::complex<double>* work,
143 const int* lwork,
144 double* rwork,
145 int* info);
146
147/**
148 * DGESVD: Real singular value decomposition.
149 * Computes the singular value decomposition A = U * Sigma * V**T of a
150 * real M-by-N matrix A, optionally computing the left and/or right
151 * singular vectors.
152 */
153void dgesvd_(const char* jobu,
154 const char* jobvt,
155 const int* m,
156 const int* n,
157 double* a,
158 const int* lda,
159 double* s,
160 double* u,
161 const int* ldu,
162 double* vt,
163 const int* ldvt,
164 double* work,
165 const int* lwork,
166 int* info);
167
168/**
169 * ZGEQP3: Complex QR factorization with column pivoting.
170 * Computes a QR factorization with column pivoting of a complex M-by-N
171 * matrix A: A * P = Q * R, using Level 3 BLAS.
172 */
173void zgeqp3_(const int* m,
174 const int* n,
175 std::complex<double>* a,
176 const int* lda,
177 int* jpvt,
178 std::complex<double>* tau,
179 std::complex<double>* work,
180 const int* lwork,
181 double* rwork,
182 int* info);
183
184/**
185 * ZGETRF: Complex general matrix LU factorization.
186 * Computes an LU factorization of a general M-by-N complex matrix A using
187 * partial pivoting with row interchanges: A = P * L * U.
188 */
190 const int* m, const int* n, std::complex<double>* a, const int* lda, int* ipiv, int* info);
191
192/**
193 * ZGETRI: Complex general matrix inverse from ZGETRF factors.
194 * Computes the inverse of a complex matrix using the LU factorization
195 * computed by ZGETRF.
196 */
197void zgetri_(const int* n,
198 std::complex<double>* a,
199 const int* lda,
200 const int* ipiv,
201 std::complex<double>* work,
202 const int* lwork,
203 int* info);
204
205} // extern "C"
206
207} // namespace q3::lapack
void dsytri_(const char *uplo, const int *n, double *a, const int *lda, const int *ipiv, double *work, int *info)
void zhegv_(const int *itype, const char *jobz, const char *uplo, const int *n, std::complex< double > *a, const int *lda, std::complex< double > *b, const int *ldb, double *w, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void dgels_(const char *trans, const int *m, const int *n, const int *nrhs, double *a, const int *lda, double *b, const int *ldb, double *work, const int *lwork, int *info)
void dsytrf_(const char *uplo, const int *n, double *a, const int *lda, int *ipiv, double *work, const int *lwork, int *info)
void zgetri_(const int *n, std::complex< double > *a, const int *lda, const int *ipiv, std::complex< double > *work, const int *lwork, int *info)
void zheev_(const char *jobz, const char *uplo, const int *n, std::complex< double > *a, const int *lda, double *w, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void zgeqp3_(const int *m, const int *n, std::complex< double > *a, const int *lda, int *jpvt, std::complex< double > *tau, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void zgetrf_(const int *m, const int *n, std::complex< double > *a, const int *lda, int *ipiv, int *info)
void zgesvd_(const char *jobu, const char *jobvt, const int *m, const int *n, std::complex< double > *a, const int *lda, double *s, std::complex< double > *u, const int *ldu, std::complex< double > *vt, const int *ldvt, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void dsygv_(const int *itype, const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *b, const int *ldb, double *w, double *work, const int *lwork, int *info)
void dgesvd_(const char *jobu, const char *jobvt, const int *m, const int *n, double *a, const int *lda, double *s, double *u, const int *ldu, double *vt, const int *ldvt, double *work, const int *lwork, int *info)