Files
kunlun/export/inc/bsp/iot_matrix_api.h
2024-09-28 14:24:04 +08:00

381 lines
15 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef IOT_MATRIX_API_H
#define IOT_MATRIX_API_H
#ifdef __cplusplus
extern "C" {
#endif
/** \defgroup MATRIX_APIs MATRIX APIs
* @brief MATRIX APIs
*
*
*/
/** @addtogroup MATRIX_APIs
* @{
*
*/
/**
* @brief Usage:
// test case : 4x4 matrix, get matrix inverse , and count times is 14
// count times
uint32_t count = 14;
// prepare source matrix data, data length is (4*4*2)*14 word
float *src = ...;
// prepare destination matrix data, data length is (4*4*2)*14 word
float *dst = ...;
iot_math_mtx_inverse(dst, src, CHOL_SIZE_4X4, count);
// test case 4x4 matrix A, B, get the matrix of AxB, and count times is 14
// uint32_t count = 14;
// prepare source matrix data, data length is (4*4*2)*14 word
float *mtx_a = ...;
float *mtx_b = ...;
// prepare destination matrix data, data length is (4*4*2)*14 word
float *dst = ...;
// input matrix
iot_math_cmm_cfg(mtx_a, 4, 4, 0, mtx_b, 4, 4, 0);
// multiplication: AxB
iot_math_cmm_ab(dst, CMM_CONV_A, CMM_CONV_B, num);
// multiplication: AxBxB.'
iot_math_cmm_abc(dst,
CMM_CONV_A, CMM_CONV_B, CMM_CONV_C, CMM_CONV_B_CONJ_TRAN, num);
// multiplication: AxBxA.'xB.'
iot_math_cmm_abc(dst,
CMM_CONV_A, CMM_CONV_B, CMM_CONV_C, CMM_CONV_C_CONJ_TRAN, num);
*/
/**
* @brief matrix size.
*/
typedef enum {
CHOL_SIZE_3X3 = 0,
CHOL_SIZE_4X4 = 1,
CHOL_SIZE_5X5 = 2,
CHOL_SIZE_6X6 = 3,
CHOL_SIZE_7X7 = 4,
CHOL_SIZE_8X8 = 5,
CHOL_SIZE_MAX,
} chol_ctrl_size_t;
typedef enum {
CMM_CONV_A = 0, // matrix A
CMM_CONV_A_CONJ = 1, // matrix A conjugate
CMM_CONV_A_TRAN = 2, // matrix B transpose
CMM_CONV_A_CONJ_TRAN = 3, // matrix B conjugate transpose
CMM_CONV_B = 4, // matrix B
CMM_CONV_B_CONJ = 5, // matrix B conjugate
CMM_CONV_B_TRAN = 6, // matrix B transpose
CMM_CONV_B_CONJ_TRAN = 7, // matrix B conjugate transpose
CMM_CONV_C = 8, // matrix C
CMM_CONV_C_CONJ = 9, // matrix C conjugate
CMM_CONV_C_TRAN = 10, // matrix C transpose
CMM_CONV_C_CONJ_TRAN = 11, // matrix C conjugate transpose
} cmm_op_conv_t;
typedef enum _iot_mtx_err {
MTX_OK = 0, // no error
MTX_OUT_INFINITY = 1, // output is infinity
MTX_IN_NAN = 2, // input is NaN
MTX_OUT_TINY = 3, // output is tiny
MTX_OUT_OVER_MAX = 4, // output is greater than max number
} iot_mtx_err_t;
/**
* @brief iot_math_mtx_inverse() - get the inverse of the matrix,the matrix data
type is float, and each element has real and imaginary
part, the matrix input element(Ann) format in memory
follows as below:
0 31 63
|-------|-----------|
| real | imaginary | A01
|-------|-----------|
| real | imaginary | A02
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Aii
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Ann
|-------|-----------|
.
. repeat(num)
.
The number of repetition is (input param num).
Output format is same as input.
* @param dst the destination pointer of inverse matrix
* @param src the source pointer of matrix
* @param size the size of matrix, reference to chol_ctrl_size_t define
* @param num the count of operation, minimum value is 1
*
* @return 0 -- ok
* @return others -- reference to iot_mtx_err_t
*/
uint8_t iot_math_mtx_inverse
(float *dst, const float *src, uint8_t size, uint16_t num);
/**
* @brief iot_math_mtx_det() - get the determinant of the matrix,the matrix data
type is float, and each element has real and imaginary
part, the matrix input element(Ann) format in memory
follows as below:
0 31 63
|-------|-----------|
| real | imaginary | A01
|-------|-----------|
| real | imaginary | A02
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Aii
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Ann
|-------|-----------|
.
. repeat(num)
.
The number of repetition is (input param num).
Output format is a 32-bit data.
* @param dst the destination pointer of determinant
* @param src the source pointer of matrix
* @param size the size of matrix, reference to chol_ctrl_size_t define
* @param num the count of operation, minimum value is 1
*
* @return 0 -- ok
* @return others -- reference to iot_mtx_err_t
*/
uint8_t iot_math_mtx_det
(float *dst, const float *src, uint8_t size, uint16_t num);
/**
* @brief iot_math_mtx_inv_det() - get the determinant of the matrix,the matrix
data type is float, and each element has real and
imaginary part, the matrix input element(Ann) format in
memory follows as below:
0 31 63
|-------|-----------|
| real | imaginary | A01
|-------|-----------|
| real | imaginary | A02
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Aii
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Ann
|-------|-----------|
.
. repeat(num)
.
The number of repetition is (input param num).
Output format is same as input,and one more 32-bit data:
* @param inv the destination pointer of inverse matrix
* @param det the destination pointer of determinant
* @param src the source pointer of matrix
* @param size the size of matrix, reference to chol_ctrl_size_t define
* @param num the count of operation, minimum value is 1
*
* @return 0 -- ok
* @return others -- reference to iot_mtx_err_t
*/
uint8_t iot_math_mtx_inv_det
(float *inv, float *det, const float *src, uint8_t size, uint16_t num);
/**
* @brief iot_math_mtx_cholesky() - get the cholesky matrix,the matrix data
type is float, and each element has real and imaginary
part, the matrix input element(Ann) format in memory
follows as below:
0 31 63
|-------|-----------|
| real | imaginary | A(01)
|-------|-----------|
| real | imaginary | A(02)
|-------|-----------|
...
|-------|-----------|
| real | imaginary | A(ii)
|-------|-----------|
...
|-------|-----------|
| real | imaginary | A(nn)
|-------|-----------|
.
. repeat(num)
.
The number of repetition is (input param num).
Output format is a 32-bit data.
* @param dst the destination pointer of cholesky matrix
* @param src the source pointer of matrix
* @param size the size of matrix, reference to chol_ctrl_size_t define
* @param num the count of operation, minimum value is 1
*
* @return 0 -- ok
* @return others -- reference to iot_mtx_err_t
*/
uint8_t iot_math_mtx_cholesky
(float *dst, const float *src, uint8_t size, uint16_t num);
/**
* @brief iot_math_mtx_eig() - get the max eigenvalue and eigenvectorof the
matrix, the matrix data type is float, and each element
has real and imaginary part, the matrix input element
(Ann) format in memory follows as below:
0 31 63
|-------|-----------|
| real | imaginary | A(01)
|-------|-----------|
| real | imaginary | A(02)
|-------|-----------|
...
|-------|-----------|
| real | imaginary | A(ii)
|-------|-----------|
...
|-------|-----------|
| real | imaginary | A(nn),
|-------|-----------|
.
. repeat(num)
.
The number of repetition is (input param num).
Output format follows as below:
0 31 63
|-------|-----------|
| real | imaginary | Vec(0)
|-------|-----------|
| real | imaginary | Vec(1)
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Vec(i)
|-------|-----------|
...
|-------|-----------|
| real | imaginary | Vec(n)
|-------|-----------|
| norm^2| eig |
.
. repeat(num)
.
The number of repetition is (input param num).
The max eigenvector is not normalized, if need,
eigenvector shoule be divided by the square root of norm
* @param eigvec the destination pointer of eigenvector
* @param norm the destination pointer of norm
* @param eigval the destination pointer of eigenvalue
* @param src the source pointer of matrix
* @param size the size of matrix, reference to chol_ctrl_size_t define
* @param num the count of operation, minimum value is 1
*
* @return 0 -- ok
* @return others -- reference to iot_mtx_err_t
*/
uint8_t iot_math_mtx_eig(float *eigvec, float *norm, float *eigval,
const float *src, uint8_t size, uint16_t num);
/**
* @brief iot_math_cmm_cfg() - configure matrix multiplication input
if only one operation matrix, set the param as NULL
* @param a the destination pointer of the first operation matrix A
* @param ar the row length of matrix A
* @param ac the column length of matrix A
* @param adiag whether the matrix A is diagonal or not
* @param b the destination pointer of the first operation matrix B
* @param br the row length of matrix B
* @param ac the column length of matrix B
* @param bdiag whether the matrix B is diagonal or not
*/
void iot_math_cmm_cfg(float *a, uint8_t ar, uint8_t ac, uint8_t adiag,
float *b, uint8_t br, uint8_t bc, uint8_t bdiag);
/**
* @brief iot_math_cmm_ab() - get matrix multiplication , the format as AxB
* @param dst the destination pointer of multiplication result
* @param op0 the transform of matrix A, reference to cmm_op_conv_t
* @param op1 the transform of matrix B, reference to cmm_op_conv_t
* @param num the count of operation, minimum value is 1
*/
void iot_math_cmm_ab(float *dst, uint8_t op0, uint8_t op1, uint16_t num);
/**
* @brief iot_math_cmm_abc() - get matrix multiplication , the format as AxBxC,
the first operation is AxB, and then multiply with C,
C can be matrix A, B or the result of the first
operation , also transform matrix.
Such as,
(A)x(B)x(A.*) = (AxB)x(A.*)
first operation
op0: CMM_CONV_A, op1: CMM_CONV_B
seconnd operation
op2: CMM_CONV_C, op3: CMM_CONV_A_CONJ_TRAN
* @param dst the destination pointer of multiplication result
* @param op0 the transform of matrix, reference to cmm_op_conv_t
* @param op1 the transform of matrix, reference to cmm_op_conv_t
* @param op2 the transform of matrix, reference to cmm_op_conv_t
* @param op3 the transform of matrix, reference to cmm_op_conv_t
* @param num the count of operation, minimum value is 1
*/
void iot_math_cmm_abc(float *dst,
uint8_t op0, uint8_t op1, uint8_t op2, uint8_t op3, uint16_t num);
#ifdef __cplusplus
}
#endif
#endif //IOT_MATRIX_API_H