File: GB_unload_into_container.c

package info (click to toggle)
suitesparse 1%3A7.10.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 254,920 kB
  • sloc: ansic: 1,134,743; cpp: 46,133; makefile: 4,875; fortran: 2,087; java: 1,826; sh: 996; ruby: 725; python: 495; asm: 371; sed: 166; awk: 44
file content (145 lines) | stat: -rw-r--r-- 5,523 bytes parent folder | download | duplicates (2)
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//------------------------------------------------------------------------------
// GB_unload_into_container: unload a GrB_Matrix into a Container
//------------------------------------------------------------------------------

// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//------------------------------------------------------------------------------

// This method takes O(1) time and performs no mallocs at all, unless A has
// pending work that must be finished.  It typically will perform no frees,
// unless A has an error string in A->logger, or if the Container has prior
// content (which is freed).

#include "GB_container.h"
#define GB_FREE_ALL ;

GrB_Info GB_unload_into_container   // GrB_Matrix -> GxB_Container
(
    GrB_Matrix A,               // matrix to unload into the Container
    GxB_Container Container,    // Container to hold the contents of A
    GB_Werk Werk
)
{ 

    //--------------------------------------------------------------------------
    // check inputs
    //--------------------------------------------------------------------------

    GrB_Info info ;
    ASSERT_MATRIX_OK (A, "A to unload into Container", GB0) ;
    ASSERT_MATRIX_OK_OR_NULL (Container->Y, "Container->Y before unload", GB0) ;
    GB_CHECK_CONTAINER (Container) ;

    //--------------------------------------------------------------------------
    // finish any pending work, but permit A to still be jumbled
    //--------------------------------------------------------------------------

    GB_MATRIX_WAIT_IF_PENDING_OR_ZOMBIES (A) ;

    //--------------------------------------------------------------------------
    // unload the matrix into the container
    //--------------------------------------------------------------------------

    int64_t nvals = GB_nnz (A) ;
    int64_t nx = GB_nnz_held (A) ;
    bool iso = A->iso ;
    bool is_csc = A->is_csc ;

    int64_t nvec_nonempty = GB_nvec_nonempty_get (A) ;

    Container->nrows = (is_csc) ? A->vlen : A->vdim ;
    Container->ncols = (is_csc) ? A->vdim : A->vlen ;
    Container->nrows_nonempty = (is_csc) ? -1 : nvec_nonempty ;
    Container->ncols_nonempty = (is_csc) ? nvec_nonempty : -1 ;
    Container->nvals = nvals ;
    Container->format = GB_sparsity (A) ;
    Container->orientation = (is_csc) ? GrB_COLMAJOR : GrB_ROWMAJOR ;
    Container->iso = iso ;
    Container->jumbled = A->jumbled ;

    switch (Container->format)
    {

        case GxB_HYPERSPARSE : 

            // unload A->Y into the Container unless it is entirely shallow
            GB_Matrix_free (&(Container->Y)) ;
            if (!A->Y_shallow)
            { 
                // A->Y may still have shallow components, which is OK
                Container->Y = A->Y ;
                A->Y = NULL ;
            }
            // unload A->p, A->h, and A->i into the Container
            GB_vector_load (Container->p, &(A->p),
                A->p_is_32 ? GrB_UINT32 : GrB_UINT64,
                A->nvec+1, A->p_size, A->p_shallow) ;
            GB_vector_load (Container->h, &(A->h),
                A->j_is_32 ? GrB_INT32 : GrB_INT64,
                A->nvec, A->h_size, A->h_shallow) ;
            GB_vector_load (Container->i, &(A->i),
                A->i_is_32 ? GrB_INT32 : GrB_INT64,
                nvals, A->i_size, A->i_shallow) ;
            break ;

        case GxB_SPARSE : 

            // unload A->p and A->i into the Container
            GB_vector_load (Container->p, &(A->p),
                A->p_is_32 ? GrB_UINT32 : GrB_UINT64,
                A->plen+1, A->p_size, A->p_shallow) ;
            GB_vector_load (Container->i, &(A->i),
                A->i_is_32 ? GrB_INT32 : GrB_INT64,
                nvals, A->i_size, A->i_shallow) ;
            break ;

        case GxB_BITMAP : 

            // unload A->b into the Container
            GB_vector_load (Container->b, (void **) &(A->b), GrB_INT8,
                nx, A->b_size, A->b_shallow) ;
            break ;

        case GxB_FULL : 
        default :;
            break ;
    }

    // unload A->x into the Container
    GB_vector_load (Container->x, &(A->x), A->type, iso ? 1 : nx,
        A->x_size, A->x_shallow) ;

    //--------------------------------------------------------------------------
    // change A to a dense 0-by-0 matrix with no content
    //--------------------------------------------------------------------------

    // A->user_name, A->type, and all controls are preserved.  Everything else
    // is revised.

    GB_phybix_free (A) ;
    A->plen = -1 ;
    A->vlen = 0 ;
    A->vdim = 0 ;
//  A->nvec_nonempty = 0 ;
    GB_nvec_nonempty_set (A, 0) ;
    A->p_is_32 = false ;
    A->j_is_32 = false ;
    A->i_is_32 = false ;
    A->magic = GB_MAGIC ;

    //--------------------------------------------------------------------------
    // return result
    //--------------------------------------------------------------------------

    ASSERT_MATRIX_OK (A, "A unloaded into Container", GB0) ;
    ASSERT_VECTOR_OK (Container->p, "Container->p after unload", GB0) ;
    ASSERT_VECTOR_OK (Container->h, "Container->h after unload", GB0) ;
    ASSERT_VECTOR_OK (Container->b, "Container->b after unload", GB0) ;
    ASSERT_VECTOR_OK (Container->i, "Container->i after unload", GB0) ;
    ASSERT_VECTOR_OK (Container->x, "Container->x after unload", GB0) ;
    ASSERT_MATRIX_OK_OR_NULL (Container->Y, "Container->Y after unload", GB0) ;
    return (GrB_SUCCESS) ;
}