10#ifndef LMMC_SPARSE_INTERNAL_H
11#define LMMC_SPARSE_INTERNAL_H
27 for (
size_t i = 0; i < outer_size; ++i) {
38 for (
size_t i = 0; i < outer_size; ++i) {
39 for (
size_t p = sparse->
row_ptr[i]; p < sparse->row_ptr[i + 1]; ++p) {
40 if (sparse->
col_idx[p] >= inner_limit ||
50 size_t outer_size = 0;
51 size_t inner_limit = 0;
53 if (sparse == NULL || sparse->
row_ptr == NULL) {
57 sparse->
rows == 0 || sparse->
cols == 0) {
60 if (sparse->
nnz > 0 && (sparse->
col_idx == NULL || sparse->
values == NULL)) {
65 outer_size = sparse->
rows;
66 inner_limit = sparse->
cols;
68 outer_size = sparse->
cols;
69 inner_limit = sparse->
rows;
72 const lmmc_status_t status = lmmc_sparse_validate_outer(sparse, outer_size);
76 return lmmc_sparse_validate_inner(sparse, outer_size, inner_limit);
83 size_t* outer_ptr_bytes,
size_t* idx_bytes,
size_t* val_bytes) {
85 if (rows == 0 || cols == 0) {
91 if (outer_size == SIZE_MAX) {
94 if (!lmmc_safe_mul_size(outer_size + 1,
sizeof(
size_t), outer_ptr_bytes) ||
95 !lmmc_safe_mul_size(nnz,
sizeof(
size_t), idx_bytes) ||
96 !lmmc_safe_mul_size(nnz,
sizeof(
lmmc_real_t), val_bytes)) {
107 size_t outer_ptr_bytes = 0;
108 size_t idx_bytes = 0;
109 size_t val_bytes = 0;
110 size_t* outer_ptr = NULL;
111 size_t* inner_idx = NULL;
114 if (out_sparse == NULL) {
118 rows, cols, nnz, format, &outer_ptr_bytes, &idx_bytes, &val_bytes);
124 if (outer_ptr == NULL) {
127 memset(outer_ptr, 0, outer_ptr_bytes);
132 if (inner_idx == NULL || values == NULL) {
133 if (inner_idx != NULL) {
136 if (values != NULL) {
142 memset(inner_idx, 0, idx_bytes);
143 memset(values, 0, val_bytes);
144 for (
size_t i = 0; i < nnz; ++i) {
149 out_sparse->
rows = rows;
150 out_sparse->
cols = cols;
151 out_sparse->
nnz = nnz;
152 out_sparse->
row_ptr = outer_ptr;
153 out_sparse->
col_idx = inner_idx;
154 out_sparse->
values = values;
155 out_sparse->
format = format;
LMMC binary real type and arithmetic spelling.
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
double lmmc_real_t
Public and internal LMMC real type.
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_sparse_format_t
稀疏矩阵存储格式。
lmmc_sparse_format_t format
通用稀疏矩阵(CSR / CSC 共用同一结构)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT