10static size_t lmmc_sparse_add_row_counts(
15 for (
size_t i = 0; i < a->
rows; ++i) {
19 while (ai < a_end && bi < b_end) {
30 row_nnz += (a_end - ai) + (b_end - bi);
37static void lmmc_sparse_add_merge(
45 for (
size_t i = 0; i < pa->
rows; ++i) {
48 while (ai < a_end && bi < b_end) {
50 c_col_idx[c_idx] = pa->
col_idx[ai];
55 c_col_idx[c_idx] = pb->
col_idx[bi];
60 c_col_idx[c_idx] = pa->
col_idx[ai];
70 c_col_idx[c_idx] = pa->
col_idx[ai];
76 c_col_idx[c_idx] = pb->
col_idx[bi];
86static void lmmc_sparse_diag_copy(
89 for (
size_t i = 0; i < pa->
rows; ++i) {
90 for (
size_t p = pa->
row_ptr[i]; p < pa->row_ptr[i + 1]; ++p) {
103 if (a == NULL || b == NULL || out_c == NULL) {
119 size_t nnz,
size_t** indices,
lmmc_real_t** values)
123 if (*indices == NULL || *values == NULL) {
126 for (
size_t k = 0; k < nnz; ++k) {
143 size_t* c_row_ptr = NULL;
144 size_t* c_col_idx = NULL;
147 st = lmmc_sparse_add_validate(a, b, out_c);
171 if (c_row_ptr == NULL) {
177 nnz_c = lmmc_sparse_add_row_counts(pa, pb, c_row_ptr);
181 st = lmmc_sparse_add_allocate_values(nnz_c, &c_col_idx, &c_values);
189 lmmc_sparse_add_merge(pa, pb, alpha, beta, c_col_idx, c_values);
216 for (
size_t k = 0; k < nnz_c; ++k) {
242 for (i = 0; i < a->
nnz; ++i) {
257 if (a == NULL || out_norm == NULL) {
266 lmmc_scaled_sumsq_init(&acc);
267 for (
size_t i = 0; i < a->
nnz; ++i) {
268 lmmc_scaled_sumsq_add(&acc, a->
values[i]);
270 *out_norm = lmmc_scaled_sumsq_norm(&acc);
283 if (a == NULL || out_diag == NULL) {
287 st = lmmc_sparse_validate(a);
309 if (out_diag->
data == NULL || out_diag->
size != n) {
334 lmmc_sparse_diag_copy(pa, out_diag);
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_ADD(res, a, b)
计算 *res = *a + *b 。
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
#define LMMC_REAL_MUL(res, a, b)
计算 *res = *a * *b 。
#define LMMC_REAL_SET_D(dst, dbl)
将一个 double 字面量赋值到 lmmc_real_t 。
lmmc_status_t lmmc_vec_fill(lmmc_vec_t *vec, lmmc_real_t value)
就地将向量所有元素设为 value。
lmmc_status_t lmmc_vec_create(size_t size, lmmc_vec_t *out_vec)
创建长度为 size 的零向量。
void lmmc_vec_destroy(lmmc_vec_t *vec)
销毁向量,释放其拥有的缓冲区并清零字段。
void * lmmc_memory_alloc_array(size_t count, size_t element_size)
void * lmmc_memory_alloc_array_plus(size_t count, size_t extra, size_t element_size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t lmmc_sparse_scale(lmmc_sparse_mat_t *a, lmmc_real_t alpha)
就地标量缩放: 。
lmmc_status_t lmmc_sparse_diag(const lmmc_sparse_mat_t *a, lmmc_vec_t *out_diag)
提取主对角线为稠密向量.要求 a->rows == a->cols 。
lmmc_status_t lmmc_sparse_norm_fro(const lmmc_sparse_mat_t *a, lmmc_real_t *out_norm)
用缩放平方和计算稀疏矩阵的 Frobenius 范数。
lmmc_status_t lmmc_sparse_add(lmmc_real_t alpha, const lmmc_sparse_mat_t *a, lmmc_real_t beta, const lmmc_sparse_mat_t *b, lmmc_sparse_mat_t *out_c)
计算 C = alpha * A + beta * B .要求 a 与 b 同维同格式。
lmmc_status_t lmmc_sparse_to_csr(const lmmc_sparse_mat_t *src, lmmc_sparse_mat_t *dst)
转换为 CSR,src 已为 CSR 时执行深拷贝。
void lmmc_sparse_destroy(lmmc_sparse_mat_t *sparse)
销毁稀疏矩阵,释放其拥有的缓冲区并清零全部字段。
lmmc_sparse_format_t format
通用稀疏矩阵(CSR / CSC 共用同一结构)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT