1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
//------------------------------------------------------------------------------
// GB_new_bix: create a matrix and allocate space
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
// Creates a matrix (with GB_new), then allocates a given space for indices and
// values.
// Ahandle must be non-NULL on input.
// If *Ahandle is NULL on input:
// A new, dynamically allocated header for the matrix A is allocated. If
// successful, *Ahandle points to the new handle, and its contents, on
// output. If an out-of-memory condition occurs, the header is freed and
// *Ahandle is NULL on output. If successful, (*Ahandle)->static_header
// will always be false on output.
// If *Ahandle is not NULL on input:
// The existing header for A is used. The pointer *Ahandle itself is not
// modified on output, either on success or failure. If successful, the
// content of A has been created. If an out-of-memory condition occurs,
// the preexisting header is not freed and *Ahandle is unmodified on
// output. (*Ahandle)->static_header is unchanged.
#include "GB.h"
GrB_Info GB_new_bix // create a new matrix, incl. A->b, A->i, A->x
(
GrB_Matrix *Ahandle, // output matrix to create
const GrB_Type type, // type of output matrix
const int64_t vlen, // length of each vector
const int64_t vdim, // number of vectors
const GB_Ap_code Ap_option, // allocate A->p and A->h, or leave NULL
const bool is_csc, // true if CSC, false if CSR
const int sparsity, // hyper, sparse, bitmap, full, or auto
const bool bitmap_calloc, // if true, calloc A->b, otherwise use malloc
const float hyper_switch, // A->hyper_switch, unless auto
const int64_t plen, // size of A->p and A->h, if hypersparse
const int64_t nzmax, // number of nonzeros the matrix must hold;
// ignored if A is iso and full
const bool numeric, // if true, allocate A->x, else A->x is NULL
const bool A_iso, // if true, allocate A as iso
GB_Context Context
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
ASSERT (Ahandle != NULL) ;
//--------------------------------------------------------------------------
// allocate the header and the vector pointers
//--------------------------------------------------------------------------
bool preexisting_header = (*Ahandle != NULL) ;
GrB_Info info = GB_new (Ahandle, type, vlen, vdim,
Ap_option, is_csc, sparsity, hyper_switch, plen, Context) ;
if (info != GrB_SUCCESS)
{
// out of memory.
// If *Ahandle was non-NULL on input, it has not been freed.
ASSERT (preexisting_header == (*Ahandle != NULL)) ;
return (info) ;
}
GrB_Matrix A = (*Ahandle) ;
//--------------------------------------------------------------------------
// allocate the bitmap (A->b), indices (A->i), and values (A->x)
//--------------------------------------------------------------------------
// set A->iso = A_iso OK: burble in the caller
info = GB_bix_alloc (A, nzmax, sparsity, bitmap_calloc, numeric, A_iso,
Context) ;
if (info != GrB_SUCCESS)
{
// out of memory
if (!preexisting_header)
{
// free the header *Ahandle itself unless it existed on input
GB_Matrix_free (Ahandle) ;
ASSERT (*Ahandle == NULL) ;
}
return (info) ;
}
//--------------------------------------------------------------------------
// return result
//--------------------------------------------------------------------------
return (GrB_SUCCESS) ;
}
|