graph_t *graph_read(FILE *f) { graph_t *g = malloc(sizeof(graph_t)); if (g == NULL) return NULL; g->indptr = NULL; g->indices = NULL; if (!file_read_uint32(f, &g->m) || !file_read_uint32(f, &g->n) || !file_read_uint8(f, (uint8_t *)&g->fixed_rows)) { goto exit_graph_allocated; } uint64_t len_indptr; if (!file_read_uint64(f, &len_indptr)) { goto exit_graph_allocated; } uint32_array *indptr = uint32_array_new_size(len_indptr); if (indptr == NULL) { goto exit_graph_allocated; } for (int i = 0; i < len_indptr; i++) { if (!file_read_uint32(f, indptr->a + i)) { goto exit_graph_allocated; } } indptr->n = (size_t)len_indptr; g->indptr = indptr; uint64_t len_indices; if (!file_read_uint64(f, &len_indices)) { goto exit_graph_allocated; } uint32_array *indices = uint32_array_new_size(len_indices); if (indices == NULL) { goto exit_graph_allocated; } for (int i = 0; i < len_indices; i++) { if (!file_read_uint32(f, indices->a + i)) { goto exit_graph_allocated; } } indices->n = (size_t)len_indices; g->indices = indices; return g; exit_graph_allocated: graph_destroy(g); return NULL; }
graph_t *graph_new_dims(graph_type_t type, uint32_t m, uint32_t n, size_t nnz, bool fixed_rows) { graph_t *graph = malloc(sizeof(graph_t)); graph->m = m; graph->fixed_rows = fixed_rows; graph->n = n; graph->type = type; graph->indptr = uint32_array_new_size(m + 1); if (graph->indptr == NULL) { graph_destroy(graph); return NULL; } if (!fixed_rows) { uint32_array_push(graph->indptr, 0); } if (nnz > 0) { graph->indices = uint32_array_new_size(nnz); } else { graph->indices = uint32_array_new(); } if (graph->indices == NULL) { graph_destroy(graph); return NULL; } return graph; }
sparse_matrix_t *sparse_matrix_new_shape(size_t m, size_t n) { sparse_matrix_t *matrix = calloc(1, sizeof(sparse_matrix_t)); if (matrix == NULL) return NULL; matrix->m = m; matrix->n = n; matrix->indptr = uint32_array_new_size(m + 1); if (matrix->indptr == NULL) { goto exit_sparse_matrix_created; } uint32_array_push(matrix->indptr, 0); matrix->indices = uint32_array_new(); if (matrix->indices == NULL) { goto exit_sparse_matrix_created; } matrix->data = double_array_new(); if (matrix->data == NULL) { goto exit_sparse_matrix_created; } return matrix; exit_sparse_matrix_created: sparse_matrix_destroy(matrix); return NULL; }