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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
//------------------------------------------------------------------------------
// GB_convert_bitmap_to_sparse: convert a matrix from bitmap to sparse
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
#include "GB.h"
#define GB_FREE_ALL \
{ \
GB_FREE (&Ap, Ap_size) ; \
GB_FREE (&Ai, Ai_size) ; \
GB_FREE (&Ax, Ax_size) ; \
}
GrB_Info GB_convert_bitmap_to_sparse // convert matrix from bitmap to sparse
(
GrB_Matrix A, // matrix to convert from bitmap to sparse
GB_Context Context
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
GrB_Info info ;
ASSERT_MATRIX_OK (A, "A converting bitmap to sparse", GB0) ;
ASSERT (!GB_IS_FULL (A)) ;
ASSERT (GB_IS_BITMAP (A)) ;
ASSERT (!GB_IS_SPARSE (A)) ;
ASSERT (!GB_IS_HYPERSPARSE (A)) ;
ASSERT (!GB_PENDING (A)) ; // bitmap never has pending tuples
ASSERT (!GB_JUMBLED (A)) ; // bitmap is never jumbled
ASSERT (!GB_ZOMBIES (A)) ; // bitmap never has zomies
//--------------------------------------------------------------------------
// allocate Ap, Ai, and Ax
//--------------------------------------------------------------------------
const int64_t anvals = A->nvals ;
GB_BURBLE_N (anvals, "(bitmap to sparse) ") ;
const int64_t anzmax = GB_IMAX (anvals, 1) ;
int64_t anvec_nonempty ;
const int64_t avdim = A->vdim ;
const size_t asize = A->type->size ;
int64_t *restrict Ap = NULL ; size_t Ap_size = 0 ;
int64_t *restrict Ai = NULL ; size_t Ai_size = 0 ;
GB_void *restrict Ax = NULL ; size_t Ax_size = 0 ;
Ap = GB_MALLOC (avdim+1, int64_t, &Ap_size) ;
Ai = GB_MALLOC (anzmax, int64_t, &Ai_size) ;
if (Ap == NULL || Ai == NULL)
{
// out of memory
GB_FREE_ALL ;
return (GrB_OUT_OF_MEMORY) ;
}
bool Ax_shallow ;
const bool A_iso = A->iso ;
if (A_iso)
{
// A is iso. Remove A->x from the matrix so it is not freed by
// GB_phybix_free. It is not modified by GB_convert_bitmap_worker, and
// is transplanted back into A, below.
Ax = (GB_void *) A->x ;
Ax_shallow = A->x_shallow ;
Ax_size = A->x_size ;
A->x = NULL ;
}
else
{
// A is not iso. Allocate new space for Ax, which is filled by
// GB_convert_bitmap_worker.
Ax = GB_MALLOC (anzmax * asize, GB_void, &Ax_size) ; // x:OK
Ax_shallow = false ;
if (Ax == NULL)
{
// out of memory
GB_FREE_ALL ;
return (GrB_OUT_OF_MEMORY) ;
}
}
//--------------------------------------------------------------------------
// convert to sparse format (Ap, Ai, and Ax)
//--------------------------------------------------------------------------
// the values are not converted if A is iso
GB_OK (GB_convert_bitmap_worker (Ap, Ai, NULL, (A_iso) ? NULL : Ax,
&anvec_nonempty, A, Context)) ;
//--------------------------------------------------------------------------
// free prior content of A and transplant the new content
//--------------------------------------------------------------------------
GB_phybix_free (A) ; // clears A->nvals
A->p = Ap ; A->p_size = Ap_size ; A->p_shallow = false ;
A->i = Ai ; A->i_size = Ai_size ; A->i_shallow = false ;
A->x = Ax ; A->x_size = Ax_size ; A->x_shallow = Ax_shallow ;
A->iso = A_iso ; // OK: convert_bitmap_to_sparse, keep iso
A->nvals = anvals ;
ASSERT (A->nvals == Ap [avdim]) ;
A->plen = avdim ;
A->nvec = avdim ;
A->nvec_nonempty = anvec_nonempty ;
A->magic = GB_MAGIC ;
//--------------------------------------------------------------------------
// return result
//--------------------------------------------------------------------------
ASSERT_MATRIX_OK (A, "A converted from to bitmap to sparse", GB0) ;
ASSERT (GB_IS_SPARSE (A)) ;
ASSERT (!GB_ZOMBIES (A)) ;
ASSERT (!GB_JUMBLED (A)) ;
ASSERT (!GB_PENDING (A)) ;
return (GrB_SUCCESS) ;
}
|