6#include "openblas/lapack.h"
16#define FSB_MAX(a, b) (((a) > (b)) ? (a) : (b))
17#define FSB_MIN(a, b) (((a) < (b)) ? (a) : (b))
69 Span<const Real> mat,
size_t dim,
88 Span<const Real> mat,
size_t dim,
89 Span<const Real> b_vec,
size_t nrhs,
104 Span<const Real> mat,
size_t dim,
123 Span<const Real> mat,
size_t dim,
124 Span<const Real> y_vec,
size_t nrhs,
126 Span<lapack_int> iwork,
145 Span<const Real> mat,
size_t rows,
size_t cols,
166 Span<const Real> mat,
size_t rows,
size_t cols,
167 Span<const Real> b_vec,
size_t nrhs,
194 Span<const Real> mat,
size_t rows,
size_t cols,
195 bool u_full,
bool v_full,
197 Span<Real> unitary_u,
199 Span<Real> unitary_vt);
218 Span<const Real> mat,
size_t dim,
223 Span<Real> vec_imag);
241 Span<const Real> mat,
size_t dim,
246template <
size_t MaxMat,
size_t MaxWorkLen,
size_t MaxU,
size_t MaxS,
size_t MaxVT>
248 const Array<MaxMat>& mat,
size_t rows,
size_t cols,
249 bool u_full,
bool v_full,
250 Array<MaxWorkLen>& work,
size_t work_len,
251 Array<MaxU>& unitary_u,
252 Array<MaxS>& sing_val,
size_t s_dim,
253 Array<MaxVT>& unitary_vt)
256 mat.active(rows * cols), rows, cols,
258 work.active(work_len),
259 unitary_u.active(rows * rows),
260 sing_val.active(s_dim),
261 unitary_vt.active(s_dim * cols));
264template <
size_t MaxMat,
size_t MaxWorkLen,
size_t MaxEig,
size_t MaxVec>
266 const Array<MaxMat>& mat,
size_t dim,
267 Array<MaxWorkLen>& work,
size_t work_len,
268 Array<MaxEig>& val_real,
269 Array<MaxEig>& val_imag,
270 Array<MaxVec>& vec_real,
271 Array<MaxVec>& vec_imag)
274 mat.active(dim * dim), dim,
275 work.active(work_len),
276 val_real.active(dim),
277 val_imag.active(dim),
278 vec_real.active(dim * dim),
279 vec_imag.active(dim * dim));
282template <
size_t MaxMat,
size_t MaxWorkLen,
size_t MaxEig,
size_t MaxVec>
284 const Array<MaxMat>& mat,
size_t dim,
285 Array<MaxWorkLen>& work,
size_t work_len,
290 mat.active(dim * dim), dim,
291 work.active(work_len),
293 vec.active(dim * dim));
296template <
size_t MaxMat>
298 const Array<MaxMat>& mat,
size_t dim,
299 Array<MaxMat>& mat_chol)
302 mat.active(dim * dim), dim,
303 mat_chol.active(dim * dim));
306template <
size_t MaxMat,
size_t MaxWorkLen>
307inline bool linalg_is_posdef_array(
308 const Array<MaxMat>& mat,
size_t dim,
309 Array<MaxWorkLen>& work,
size_t work_len)
314template <
size_t MaxMat,
size_t MaxVec,
size_t MaxWorkLen>
316 const Array<MaxMat>& mat,
size_t dim,
317 const Array<MaxVec>& b_vec,
size_t nrhs,
318 Array<MaxWorkLen>& work,
size_t work_len,
319 Array<MaxVec>& x_vec)
322 mat.active(dim * dim), dim,
323 b_vec.active(dim * nrhs), nrhs,
324 work.active(work_len),
325 x_vec.active(dim * nrhs));
328template <
size_t MaxMat,
size_t MaxVec,
size_t MaxWorkLen,
size_t MaxIWorkLen>
330 const Array<MaxMat>& mat,
size_t dim,
331 const Array<MaxVec>& y_vec,
size_t nrhs,
332 Array<MaxWorkLen>& work,
size_t work_len,
333 Array<MaxIWorkLen, lapack_int>& iwork,
size_t iwork_len,
334 Array<MaxVec>& x_vec)
337 mat.active(dim * dim), dim,
338 y_vec.active(dim * nrhs), nrhs,
339 work.active(work_len),
340 iwork.active(iwork_len),
341 x_vec.active(dim * nrhs));
344template <
size_t MaxMat,
size_t MaxInv,
size_t MaxWorkLen>
346 const Array<MaxMat>& mat,
size_t rows,
size_t cols,
347 Array<MaxWorkLen>& work,
size_t work_len,
348 Array<MaxInv>& inv_mat)
351 mat.active(rows * cols), rows, cols,
352 work.active(work_len),
353 inv_mat.active(cols * rows));
356template <
size_t MaxMat,
size_t MaxB,
size_t MaxX,
size_t MaxWorkLen>
358 const Array<MaxMat>& mat,
size_t rows,
size_t cols,
359 const Array<MaxB>& b_vec,
size_t nrhs,
360 Array<MaxWorkLen>& work,
size_t work_len,
364 mat.active(rows * cols), rows, cols,
365 b_vec.active(rows * nrhs), nrhs,
366 work.active(work_len),
367 x_vec.active(cols * nrhs));
LinalgErrorType linalg_svd(Span< const Real > mat, size_t rows, size_t cols, bool u_full, bool v_full, Span< Real > work, Span< Real > unitary_u, Span< Real > sing_val, Span< Real > unitary_vt)
SVD decomposition.
Definition fsb_linalg.cpp:11
LinalgErrorType linalg_matrix_sqr_solve(Span< const Real > mat, size_t dim, Span< const Real > y_vec, size_t nrhs, Span< Real > work, Span< lapack_int > iwork, Span< Real > x_vec)
Solve a square linear system A * x = b using LU factorization.
Definition fsb_linalg.cpp:345
LinalgErrorType linalg_pseudoinverse(Span< const Real > mat, size_t rows, size_t cols, Span< Real > work, Span< Real > inv_mat)
Moore-Penrose pseudoinverse via SVD.
Definition fsb_linalg.cpp:409
LinalgErrorType linalg_leastsquares_solve(Span< const Real > mat, size_t rows, size_t cols, Span< const Real > b_vec, size_t nrhs, Span< Real > work, Span< Real > x_vec)
Solve an overdetermined or underdetermined least-squares problem.
Definition fsb_linalg.cpp:497
LinalgErrorType linalg_cholesky_solve(Span< const Real > mat, size_t dim, Span< const Real > b_vec, size_t nrhs, Span< Real > work, Span< Real > x_vec)
Cholesky solve.
Definition fsb_linalg.cpp:259
LinalgErrorType linalg_cholesky_decomposition(Span< const Real > mat, size_t dim, Span< Real > mat_chol)
Cholesky factorization for a symmetric positive definite matrix.
Definition fsb_linalg.cpp:218
bool linalg_is_posdef(Span< const Real > mat, size_t dim, Span< Real > work)
Check if a symmetric matrix (lower triangular storage) is positive definite.
Definition fsb_linalg.cpp:318
LinalgErrorType
Error codes for linear algebra functions.
Definition fsb_linalg.h:25
LinalgErrorType linalg_sym_lt_eig(Span< const Real > mat, size_t dim, Span< Real > work, Span< Real > val, Span< Real > vec)
Eigenvalue decomposition for a real symmetric matrix (lower triangular storage)
Definition fsb_linalg.cpp:607
LinalgErrorType linalg_matrix_eig(Span< const Real > mat, size_t dim, Span< Real > work, Span< Real > val_real, Span< Real > val_imag, Span< Real > vec_real, Span< Real > vec_imag)
Eigenvalue decomposition for a general square matrix.
Definition fsb_linalg.cpp:126
@ ERROR_QUERY
Work query failed.
@ ERROR_INPUT
Input value error.
@ ERROR_CONVERGE
Solution did not converge.
@ ERROR_NOT_FULL_RANK
Matrix is not full rank.
@ SINGULAR
Input matrix is singular.
@ ERROR_MEMORY
Not enough memory.
@ NOT_POSITIVE_DEFINITE
Matrix not positive definite.