23 size_t nnz,
size_t* capacity,
size_t** rows,
size_t** cols,
33 if (!lmmc_safe_mul_size(*capacity, 2, &new_cap) ||
34 !lmmc_safe_mul_size(new_cap,
sizeof(
size_t), &sz_idx) ||
35 !lmmc_safe_mul_size(new_cap,
sizeof(
lmmc_real_t), &sz_vals)) {
43 if (nr == NULL || nc == NULL || nv == NULL) {
56 for (
size_t k = 0; k < new_cap; ++k) {
61 memcpy(nr, *rows, nnz *
sizeof(
size_t));
62 memcpy(nc, *cols, nnz *
sizeof(
size_t));
63 for (
size_t k = 0; k < nnz; ++k) {
68 for (
size_t k = 0; k < *capacity; ++k) {
85 if (out_builder == NULL || rows == 0 || cols == 0) {
97 b->
capacity = initial_capacity > 0 ? initial_capacity : 16;
101 if (!lmmc_safe_mul_size(b->
capacity,
sizeof(
size_t), &sz_idx) ||
116 for (
size_t k = 0; k < b->
capacity; ++k) {
125 if (b == NULL || row >= b->
rows || col >= b->
cols) {
153 for (
size_t k = 0; k < b->
capacity; ++k) {
163 if (b == NULL || out == NULL ||
182 size_t rows,
size_t cols,
size_t capacity,
189 if (out_coo == NULL || rows == 0 || cols == 0) {
193 actual_cap = capacity > 0 ? capacity : 16;
195 if (!lmmc_safe_mul_size(actual_cap,
sizeof(
size_t), &sz_idx) ||
196 !lmmc_safe_mul_size(actual_cap,
sizeof(
lmmc_real_t), &sz_vals)) {
220 for (
size_t k = 0; k < actual_cap; ++k) {
224 out_coo->
rows = rows;
225 out_coo->
cols = cols;
238 if (row >= coo->
rows || col >= coo->
cols) {
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t lmmc_sparse_coo_add_entry(lmmc_sparse_coo_t *coo, size_t row, size_t col, lmmc_real_t value)
向 COO 追加一项非零元,达到容量时返回错误。
lmmc_status_t lmmc_sparse_builder_build(lmmc_sparse_builder_t *builder, lmmc_sparse_format_t format, lmmc_sparse_mat_t *out_sparse)
将构造器条目转换为指定压缩格式的稀疏矩阵。
lmmc_status_t lmmc_sparse_coo_to_csr(const lmmc_sparse_coo_t *coo, lmmc_sparse_mat_t *out_csr)
将 COO 排序为 CSR,重复坐标按插入顺序累加,保留显式零。 要求非零维度、nnz<=capacity、有效条目数组和范围内坐标。 输入保持不变;非法描述符返回 INVALID_ARGUMENT,输...
void lmmc_sparse_builder_destroy(lmmc_sparse_builder_t *builder)
销毁稀疏构造器,释放动态数组与句柄。
lmmc_status_t lmmc_sparse_builder_create(size_t rows, size_t cols, size_t initial_capacity, lmmc_sparse_builder_t **out_builder)
创建稀疏矩阵增量构造器。
lmmc_status_t lmmc_sparse_coo_create(size_t rows, size_t cols, size_t capacity, lmmc_sparse_coo_t *out_coo)
创建容量为 capacity 的空 COO 矩阵。
lmmc_status_t lmmc_sparse_builder_add(lmmc_sparse_builder_t *builder, size_t row, size_t col, lmmc_real_t value)
向构造器追加一项非零元。
lmmc_status_t lmmc_sparse_coo_to_csc(const lmmc_sparse_coo_t *coo, lmmc_sparse_mat_t *out_csc)
将 COO 转换为 CSC,校验、稳定合并与显式零语义同 COO→CSR。
lmmc_sparse_format_t
稀疏矩阵存储格式。
通用稀疏矩阵(CSR / CSC 共用同一结构)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INDEX_OUT_OF_BOUNDS