File: GxB_Vector_extractTuples_Vector.c

package info (click to toggle)
suitesparse 1%3A7.10.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, 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 (93 lines) | stat: -rw-r--r-- 3,851 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
//------------------------------------------------------------------------------
// GxB_Vector_extractTuples_Vector: extract all tuples from a vector
//------------------------------------------------------------------------------

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

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

// Extracts all tuples from a column vector, like [I,~,X] = find (v) in MATLAB.
// If any parameter I and/or X is NULL, then that component is not extracted.
// I and X are GrB_Vectors, and on output they are dense vectors of
// length (nvals (V)), with types revised to match the content of V.
//
// X is returned with the same type V.  I is returned as GrB_UINT32 if the
// length of V is <= INT32_MAX, or GrB_UINT64 otherwise.

// If any parameter I and/or X is NULL, that component is not extracted.  For
// example, to extract just the row indices, pass I as non-NULL, and X as NULL.
// This is like [I,~,~] = find (v) in MATLAB.

// If v is iso and X is not NULL, the iso scalar vx [0] is expanded into X.

#include "GB.h"
#include "extractTuples/GB_extractTuples.h"
#define GB_FREE_ALL ;

GrB_Info GxB_Vector_extractTuples_Vector    // [I,~,X] = find (V)
(
    GrB_Vector I_vector,    // row indices
    GrB_Vector X_vector,    // values
    const GrB_Vector V,     // vectors to extract tuples from
    const GrB_Descriptor desc   // currently unused; for future expansion
)
{ 

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

    GB_RETURN_IF_NULL (V) ;
    GB_RETURN_IF_OUTPUT_IS_READONLY (I_vector) ;
    GB_RETURN_IF_OUTPUT_IS_READONLY (X_vector) ;
    GB_WHERE_3 (I_vector, X_vector, V,
        "GxB_Vector_extractTuples_Vector (I, J, X, A, desc)") ;
    GB_BURBLE_START ("GxB_Vector_extractTuples_Vector") ;
    ASSERT_VECTOR_OK (V, "V for GxB_Vector_extractTuples_Vector", GB0) ;

    if (V == I_vector || V == X_vector ||
        (I_vector != NULL && I_vector == X_vector))
    { 
        return (GrB_NOT_IMPLEMENTED) ;  // input vectors cannot be aliased
    }

    //--------------------------------------------------------------------------
    // finish any pending work in V
    //--------------------------------------------------------------------------

    GB_MATRIX_WAIT_IF_PENDING_OR_ZOMBIES (V) ;

    //--------------------------------------------------------------------------
    // prepare the I, X vectors
    //--------------------------------------------------------------------------

    uint64_t nvals = GB_nnz ((GrB_Matrix) V) ;
    int64_t nrows = V->vlen ;
    bool I_is_32 = (nrows <= INT32_MAX) ;
    GrB_Type I_type = (I_is_32) ? GrB_UINT32 : GrB_UINT64 ;
    GrB_Type X_type = V->type ;

    GB_OK (GB_extractTuples_prep (I_vector, nvals, I_type)) ;
    GB_OK (GB_extractTuples_prep (X_vector, nvals, X_type)) ;

    void *I = (I_vector == NULL) ? NULL : I_vector->x ;
    void *X = (X_vector == NULL) ? NULL : X_vector->x ;

    //--------------------------------------------------------------------------
    // extract tuples into the I, X vectors
    //--------------------------------------------------------------------------

    GB_OK (GB_extractTuples (I, I_is_32, NULL, false, X, &nvals, X_type,
        (GrB_Matrix) V, Werk)) ;

    //--------------------------------------------------------------------------
    // return results
    //--------------------------------------------------------------------------

    ASSERT_VECTOR_OK_OR_NULL (I_vector, "I: Vector_extractTuples_Vector", GB0) ;
    ASSERT_VECTOR_OK_OR_NULL (X_vector, "X: Vector_extractTuples_Vector", GB0) ;
    GB_BURBLE_END ;
    return (GrB_SUCCESS) ;
}