FancySafeBot 0.0.1
A safe robotics library
Loading...
Searching...
No Matches
fsb_linalg.h
1#pragma once
2#include <math.h>
3#include <stddef.h>
4#include <stdbool.h>
5
6#ifdef __cplusplus
7#include <array>
8#endif
9
10#include "openblas/lapack.h"
11
12#ifdef __cplusplus
13extern "C"
14{
15#endif
16
24#define FSB_MAX(a, b) (((a) > (b)) ? (a) : (b))
25#define FSB_MIN(a, b) (((a) < (b)) ? (a) : (b))
26
30typedef double double_t;
31
67
91 const double_t mat[], size_t rows, size_t cols, bool u_full, bool v_full, size_t work_len, double_t work[], double_t unitary_u[],
92 double_t sing_val[], double_t unitary_vt[]);
93
109 const double_t mat[], size_t dim, size_t work_len, double_t work[],
110 double_t val_real[], double_t val_imag[],
111 double_t vec_real[], double_t vec_imag[]);
112
126 const double_t mat[], size_t dim, size_t work_len, double_t work[],
127 double_t val[], double_t vec[]);
128
138 const double_t mat[], size_t dim, double_t mat_chol[]);
139
157 size_t nrhs, size_t dim,
158 size_t work_len, double_t work[],
159 double_t x_vec[]);
160
170bool fsb_linalg_is_posdef(const double_t mat[], size_t dim, size_t work_len, double_t work[]);
171
187 const double_t mat[], const double_t y_vec[], size_t nrhs, size_t dim, size_t work_len,
188 size_t iwork_len, double_t work[], lapack_int iwork[], double_t x_vec[]);
189
205FsbLinalgErrorType fsb_linalg_pseudoinverse(const double_t mat[], size_t rows, size_t columns, size_t work_len, double_t work[], double_t inv_mat[]);
206
225 const double_t mat[], size_t rows, size_t columns, const double_t b_vec[], size_t nrhs,
226 size_t work_len, double_t work[], double_t x_vec[]);
227
232
237#ifdef __cplusplus
238}
239
245template <size_t Rows, size_t Cols, size_t WorkLen>
246inline FsbLinalgErrorType fsb_linalg_svd_array(
247 const std::array<double_t, Rows * Cols>& mat,
248 bool u_full,
249 bool v_full,
250 std::array<double_t, WorkLen>& work,
251 std::array<double_t, Rows * Rows>& unitary_u,
252 std::array<double_t, FSB_MIN(Rows, Cols)>& sing_val,
253 std::array<double_t, Cols * Cols>& unitary_vt)
254{
255 return fsb_linalg_svd(
256 mat.data(), Rows, Cols,
257 u_full, v_full,
258 WorkLen, work.data(),
259 unitary_u.data(), sing_val.data(), unitary_vt.data());
260}
261
262template <size_t Dim, size_t WorkLen>
263inline FsbLinalgErrorType fsb_linalg_matrix_eig_array(
264 const std::array<double_t, Dim * Dim>& mat,
265 std::array<double_t, WorkLen>& work,
266 std::array<double_t, Dim>& val_real,
267 std::array<double_t, Dim>& val_imag,
268 std::array<double_t, Dim * Dim>& vec_real,
269 std::array<double_t, Dim * Dim>& vec_imag)
270{
272 mat.data(), Dim, WorkLen, work.data(),
273 val_real.data(), val_imag.data(),
274 vec_real.data(), vec_imag.data());
275}
276
277template <size_t Dim, size_t WorkLen>
278inline FsbLinalgErrorType fsb_linalg_sym_lt_eig_array(
279 const std::array<double_t, Dim * Dim>& mat,
280 std::array<double_t, WorkLen>& work,
281 std::array<double_t, Dim>& val,
282 std::array<double_t, Dim * Dim>& vec)
283{
285 mat.data(), Dim, WorkLen, work.data(),
286 val.data(), vec.data());
287}
288
289template <size_t Dim>
290inline FsbLinalgErrorType fsb_linalg_cholesky_decomposition_array(
291 const std::array<double_t, Dim * Dim>& mat,
292 std::array<double_t, Dim * Dim>& mat_chol)
293{
294 return fsb_linalg_cholesky_decomposition(mat.data(), Dim, mat_chol.data());
295}
296
297template <size_t Dim, size_t WorkLen>
298inline bool fsb_linalg_is_posdef_array(
299 const std::array<double_t, Dim * Dim>& mat,
300 std::array<double_t, WorkLen>& work)
301{
302 return fsb_linalg_is_posdef(mat.data(), Dim, WorkLen, work.data());
303}
304
305template <size_t Dim, size_t Nrhs, size_t WorkLen>
306inline FsbLinalgErrorType fsb_linalg_cholesky_solve_array(
307 const std::array<double_t, Dim * Dim>& mat,
308 const std::array<double_t, Dim * Nrhs>& b_vec,
309 std::array<double_t, WorkLen>& work,
310 std::array<double_t, Dim * Nrhs>& x_vec)
311{
313 mat.data(), b_vec.data(),
314 Nrhs, Dim,
315 WorkLen, work.data(),
316 x_vec.data());
317}
318
319template <size_t Dim, size_t Nrhs, size_t WorkLen, size_t IWorkLen>
320inline FsbLinalgErrorType fsb_linalg_matrix_sqr_solve_array(
321 const std::array<double_t, Dim * Dim>& mat,
322 const std::array<double_t, Dim * Nrhs>& y_vec,
323 std::array<double_t, WorkLen>& work,
324 std::array<lapack_int, IWorkLen>& iwork,
325 std::array<double_t, Dim * Nrhs>& x_vec)
326{
328 mat.data(), y_vec.data(),
329 Nrhs, Dim,
330 WorkLen, IWorkLen,
331 work.data(), iwork.data(),
332 x_vec.data());
333}
334
335template <size_t Rows, size_t Cols, size_t WorkLen>
336inline FsbLinalgErrorType fsb_linalg_pseudoinverse_array(
337 const std::array<double_t, Rows * Cols>& mat,
338 std::array<double_t, WorkLen>& work,
339 std::array<double_t, Cols * Rows>& inv_mat)
340{
342 mat.data(), Rows, Cols,
343 WorkLen, work.data(),
344 inv_mat.data());
345}
346
347template <size_t Rows, size_t Cols, size_t Nrhs, size_t WorkLen>
348inline FsbLinalgErrorType fsb_linalg_leastsquares_solve_array(
349 const std::array<double_t, Rows * Cols>& mat,
350 const std::array<double_t, Rows * Nrhs>& b_vec,
351 std::array<double_t, WorkLen>& work,
352 std::array<double_t, Cols * Nrhs>& x_vec)
353{
355 mat.data(), Rows, Cols,
356 b_vec.data(), Nrhs,
357 WorkLen, work.data(),
358 x_vec.data());
359}
360
361#endif
void sample_dgels_example(void)
Example demonstrating DGELS (least squares solver) usage.
bool fsb_linalg_is_posdef(const double_t mat[], size_t dim, size_t work_len, double_t work[])
Check if lower triangular symmetric matrix is positive definite.
Definition fsb_linalg.cpp:401
FsbLapackErrorType
Error codes for linear algebra functions.
Definition fsb_linalg.h:36
FsbLinalgErrorType fsb_linalg_matrix_eig(const double_t mat[], size_t dim, size_t work_len, double_t work[], double_t val_real[], double_t val_imag[], double_t vec_real[], double_t vec_imag[])
Eigenvalue decomposition.
Definition fsb_linalg.cpp:90
FsbLinalgErrorType fsb_linalg_cholesky_decomposition(const double_t mat[], size_t dim, double_t mat_chol[])
Cholesky factorization for symmetric positive definite matrix.
Definition fsb_linalg.cpp:295
FsbLinalgErrorType fsb_linalg_leastsquares_solve(const double_t mat[], size_t rows, size_t columns, const double_t b_vec[], size_t nrhs, size_t work_len, double_t work[], double_t x_vec[])
Solve overdetermined or underdetermined system using least squares.
Definition fsb_linalg.cpp:573
FsbLinalgErrorType fsb_linalg_svd(const double_t mat[], size_t rows, size_t cols, bool u_full, bool v_full, size_t work_len, double_t work[], double_t unitary_u[], double_t sing_val[], double_t unitary_vt[])
SVD decomposition.
Definition fsb_linalg.cpp:9
FsbLinalgErrorType fsb_linalg_cholesky_solve(const double_t mat[], const double_t b_vec[], size_t nrhs, size_t dim, size_t work_len, double_t work[], double_t x_vec[])
Cholesky solve.
Definition fsb_linalg.cpp:339
FsbLinalgErrorType fsb_linalg_sym_lt_eig(const double_t mat[], size_t dim, size_t work_len, double_t work[], double_t val[], double_t vec[])
Eigenvalue decomposition for symmetric lower triangular matrix.
Definition fsb_linalg.cpp:215
double double_t
Floating point type.
Definition fsb_linalg.h:30
FsbLinalgErrorType fsb_linalg_matrix_sqr_solve(const double_t mat[], const double_t y_vec[], size_t nrhs, size_t dim, size_t work_len, size_t iwork_len, double_t work[], lapack_int iwork[], double_t x_vec[])
Definition fsb_linalg.cpp:425
enum FsbLapackErrorType FsbLinalgErrorType
Error codes for linear algebra functions.
FsbLinalgErrorType fsb_linalg_pseudoinverse(const double_t mat[], size_t rows, size_t columns, size_t work_len, double_t work[], double_t inv_mat[])
Inverse of a matrix where number of columns are great er than or equal to number of rows.
Definition fsb_linalg.cpp:491
@ EFSB_LAPACK_ERROR_INPUT
Input value error.
Definition fsb_linalg.h:44
@ EFSB_LAPACK_ERROR_NOT_FULL_RANK
Matrix is not full rank.
Definition fsb_linalg.h:65
@ EFSB_LAPACK_ERROR_QUERY
Work query failed.
Definition fsb_linalg.h:56
@ EFSB_LAPACK_ERROR_MEMORY
Not enough memory.
Definition fsb_linalg.h:48
@ EFSB_LAPACK_NOT_POSITIVE_DEFINITE
Matrix not positive definite.
Definition fsb_linalg.h:60
@ EFSB_LAPACK_ERROR_CONVERGE
Solution did not converge.
Definition fsb_linalg.h:52
@ EFSB_LAPACK_SINGULAR
Input matrix is singular.
Definition fsb_linalg.h:64
@ EFSB_LAPACK_ERROR_NONE
No error.
Definition fsb_linalg.h:40