File: GB_selectop_to_idxunop.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 (239 lines) | stat: -rw-r--r-- 10,745 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
//------------------------------------------------------------------------------
// GB_selectop_to_idxunop: convert a GxB_SelectOp to a GrB_IndexUnaryOp
//------------------------------------------------------------------------------

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

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

// The GxB_SelectOp is historical, and part of its functionality is now
// deprecated.  In particular, user-defined GxB_SelectOps are not supported.
// The GxB_EQ* and GxB_NE* operators are not supported for user-defined types.
// Otherwise, this function converts a supported GxB_SelectOp and its optional
// Thunk scalar into its corresponding GrB_IndexUnaryOp and its required
// NewThunk scalar.

#define GB_FREE_ALL                             \
{                                               \
    GB_Matrix_free ((GrB_Matrix *) &NewThunk) ; \
}

#include "select/GB_select.h"

GrB_Info GB_selectop_to_idxunop
(
    // output:
    GrB_IndexUnaryOp *idxunop_handle,
    GrB_Scalar *NewThunk_handle,
    // input:
    GxB_SelectOp selectop,
    GrB_Scalar Thunk,
    GrB_Type atype,
    GB_Werk Werk
)
{

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

    GrB_Info info ;
    GrB_Scalar NewThunk = NULL ;
    GrB_IndexUnaryOp idxunop = NULL ;
    GB_RETURN_IF_NULL_OR_FAULTY (selectop) ;

    ASSERT (idxunop_handle != NULL) ;
    ASSERT (NewThunk_handle != NULL) ;
    ASSERT_OP_OK ((GB_Operator) selectop, "selop to convert to idxunop", GB0) ;
    ASSERT_TYPE_OK (atype, "atype for selectop_to_idxunop", GB0) ;
    ASSERT (GB_IS_SELECTOP_CODE (selectop->opcode)) ;

    (*idxunop_handle) = NULL ;
    (*NewThunk_handle) = NULL ;
    GB_Type_code acode = atype->code ;

    //--------------------------------------------------------------------------
    // find the new GrB_IndexUnaryOp
    //--------------------------------------------------------------------------

    switch (selectop->opcode)
    {
        // built-in positional select operators: thunk optional; defaults to 0
        case GB_TRIL_selop_code      : idxunop = GrB_TRIL    ; break ;
        case GB_TRIU_selop_code      : idxunop = GrB_TRIU    ; break ;
        case GB_DIAG_selop_code      : idxunop = GrB_DIAG    ; break ;
        case GB_OFFDIAG_selop_code   : idxunop = GrB_OFFDIAG ; break ;

        // built-in select comparators, thunk defaults to zero
        case GB_NONZERO_selop_code   : Thunk = NULL ;
        case GB_NE_THUNK_selop_code  : 

            switch (acode)
            {
                case GB_BOOL_code    : idxunop = GrB_VALUENE_BOOL   ; break ;
                case GB_INT8_code    : idxunop = GrB_VALUENE_INT8   ; break ;
                case GB_INT16_code   : idxunop = GrB_VALUENE_INT16  ; break ;
                case GB_INT32_code   : idxunop = GrB_VALUENE_INT32  ; break ;
                case GB_INT64_code   : idxunop = GrB_VALUENE_INT64  ; break ;
                case GB_UINT8_code   : idxunop = GrB_VALUENE_UINT8  ; break ;
                case GB_UINT16_code  : idxunop = GrB_VALUENE_UINT16 ; break ;
                case GB_UINT32_code  : idxunop = GrB_VALUENE_UINT32 ; break ;
                case GB_UINT64_code  : idxunop = GrB_VALUENE_UINT64 ; break ;
                case GB_FP32_code    : idxunop = GrB_VALUENE_FP32   ; break ;
                case GB_FP64_code    : idxunop = GrB_VALUENE_FP64   ; break ;
                case GB_FC32_code    : idxunop = GxB_VALUENE_FC32   ; break ;
                case GB_FC64_code    : idxunop = GxB_VALUENE_FC64   ; break ;
                default:;
            }
            break ;

        case GB_EQ_ZERO_selop_code   : Thunk = NULL ;
        case GB_EQ_THUNK_selop_code  : 

            switch (acode)
            {
                case GB_BOOL_code    : idxunop = GrB_VALUEEQ_BOOL   ; break ;
                case GB_INT8_code    : idxunop = GrB_VALUEEQ_INT8   ; break ;
                case GB_INT16_code   : idxunop = GrB_VALUEEQ_INT16  ; break ;
                case GB_INT32_code   : idxunop = GrB_VALUEEQ_INT32  ; break ;
                case GB_INT64_code   : idxunop = GrB_VALUEEQ_INT64  ; break ;
                case GB_UINT8_code   : idxunop = GrB_VALUEEQ_UINT8  ; break ;
                case GB_UINT16_code  : idxunop = GrB_VALUEEQ_UINT16 ; break ;
                case GB_UINT32_code  : idxunop = GrB_VALUEEQ_UINT32 ; break ;
                case GB_UINT64_code  : idxunop = GrB_VALUEEQ_UINT64 ; break ;
                case GB_FP32_code    : idxunop = GrB_VALUEEQ_FP32   ; break ;
                case GB_FP64_code    : idxunop = GrB_VALUEEQ_FP64   ; break ;
                case GB_FC32_code    : idxunop = GxB_VALUEEQ_FC32   ; break ;
                case GB_FC64_code    : idxunop = GxB_VALUEEQ_FC64   ; break ;
                default:;
            }
            break ;

        case GB_GT_ZERO_selop_code   : Thunk = NULL ;
        case GB_GT_THUNK_selop_code  : 

            switch (acode)
            {
                case GB_BOOL_code    : idxunop = GrB_VALUEGT_BOOL   ; break ;
                case GB_INT8_code    : idxunop = GrB_VALUEGT_INT8   ; break ;
                case GB_INT16_code   : idxunop = GrB_VALUEGT_INT16  ; break ;
                case GB_INT32_code   : idxunop = GrB_VALUEGT_INT32  ; break ;
                case GB_INT64_code   : idxunop = GrB_VALUEGT_INT64  ; break ;
                case GB_UINT8_code   : idxunop = GrB_VALUEGT_UINT8  ; break ;
                case GB_UINT16_code  : idxunop = GrB_VALUEGT_UINT16 ; break ;
                case GB_UINT32_code  : idxunop = GrB_VALUEGT_UINT32 ; break ;
                case GB_UINT64_code  : idxunop = GrB_VALUEGT_UINT64 ; break ;
                case GB_FP32_code    : idxunop = GrB_VALUEGT_FP32   ; break ;
                case GB_FP64_code    : idxunop = GrB_VALUEGT_FP64   ; break ;
                default:;
            }
            break ;

        case GB_GE_ZERO_selop_code   : Thunk = NULL ;
        case GB_GE_THUNK_selop_code  : 

            switch (acode)
            {
                case GB_BOOL_code    : idxunop = GrB_VALUEGE_BOOL   ; break ;
                case GB_INT8_code    : idxunop = GrB_VALUEGE_INT8   ; break ;
                case GB_INT16_code   : idxunop = GrB_VALUEGE_INT16  ; break ;
                case GB_INT32_code   : idxunop = GrB_VALUEGE_INT32  ; break ;
                case GB_INT64_code   : idxunop = GrB_VALUEGE_INT64  ; break ;
                case GB_UINT8_code   : idxunop = GrB_VALUEGE_UINT8  ; break ;
                case GB_UINT16_code  : idxunop = GrB_VALUEGE_UINT16 ; break ;
                case GB_UINT32_code  : idxunop = GrB_VALUEGE_UINT32 ; break ;
                case GB_UINT64_code  : idxunop = GrB_VALUEGE_UINT64 ; break ;
                case GB_FP32_code    : idxunop = GrB_VALUEGE_FP32   ; break ;
                case GB_FP64_code    : idxunop = GrB_VALUEGE_FP64   ; break ;
                default:;
            }
            break ;

        case GB_LT_ZERO_selop_code   : Thunk = NULL ;
        case GB_LT_THUNK_selop_code  : 

            switch (acode)
            {
                case GB_BOOL_code    : idxunop = GrB_VALUELT_BOOL   ; break ;
                case GB_INT8_code    : idxunop = GrB_VALUELT_INT8   ; break ;
                case GB_INT16_code   : idxunop = GrB_VALUELT_INT16  ; break ;
                case GB_INT32_code   : idxunop = GrB_VALUELT_INT32  ; break ;
                case GB_INT64_code   : idxunop = GrB_VALUELT_INT64  ; break ;
                case GB_UINT8_code   : idxunop = GrB_VALUELT_UINT8  ; break ;
                case GB_UINT16_code  : idxunop = GrB_VALUELT_UINT16 ; break ;
                case GB_UINT32_code  : idxunop = GrB_VALUELT_UINT32 ; break ;
                case GB_UINT64_code  : idxunop = GrB_VALUELT_UINT64 ; break ;
                case GB_FP32_code    : idxunop = GrB_VALUELT_FP32   ; break ;
                case GB_FP64_code    : idxunop = GrB_VALUELT_FP64   ; break ;
                default:;
            }
            break ;

        case GB_LE_ZERO_selop_code   : Thunk = NULL ;
        case GB_LE_THUNK_selop_code  : 

            switch (acode)
            {
                case GB_BOOL_code    : idxunop = GrB_VALUELE_BOOL   ; break ;
                case GB_INT8_code    : idxunop = GrB_VALUELE_INT8   ; break ;
                case GB_INT16_code   : idxunop = GrB_VALUELE_INT16  ; break ;
                case GB_INT32_code   : idxunop = GrB_VALUELE_INT32  ; break ;
                case GB_INT64_code   : idxunop = GrB_VALUELE_INT64  ; break ;
                case GB_UINT8_code   : idxunop = GrB_VALUELE_UINT8  ; break ;
                case GB_UINT16_code  : idxunop = GrB_VALUELE_UINT16 ; break ;
                case GB_UINT32_code  : idxunop = GrB_VALUELE_UINT32 ; break ;
                case GB_UINT64_code  : idxunop = GrB_VALUELE_UINT64 ; break ;
                case GB_FP32_code    : idxunop = GrB_VALUELE_FP32   ; break ;
                case GB_FP64_code    : idxunop = GrB_VALUELE_FP64   ; break ;
                default:;
            }
            break ;

        default: ;
    }

    if (idxunop == NULL)
    { 
        // user-defined GxB_SelectOps and the NONZOMBIE opcode are not supported
        return (GrB_NOT_IMPLEMENTED) ;
    }

    //--------------------------------------------------------------------------
    // create the new Thunk
    //--------------------------------------------------------------------------

    // finish any pending work on the Thunk
    GB_MATRIX_WAIT (Thunk) ;

    // allocate the NewThunk as a full scalar
    GB_OK (GB_new_bix ((GrB_Matrix *) &NewThunk, idxunop->ytype, 1, 1,
        GB_ph_calloc, true, GxB_FULL, false, GB_Global_hyper_switch_get ( ),
        1, 1, true, false, false, false, false)) ;

    // NewThunk = 0
    memset (NewThunk->x, 0, idxunop->ytype->size) ;
    NewThunk->magic = GB_MAGIC ;

    // copy/typecast Thunk into NewThunk
    if (Thunk != NULL && GB_nnz ((GrB_Matrix) Thunk) == 1)
    {
        if (!GB_Type_compatible (idxunop->ytype, Thunk->type))
        { 
            GB_FREE_ALL ;
            return (GrB_DOMAIN_MISMATCH) ;
        }
        GB_cast_matrix ((GrB_Matrix) NewThunk, (GrB_Matrix) Thunk) ;
    }
    
    ASSERT_MATRIX_OK ((GrB_Matrix) NewThunk, "new thunk", GB0) ;

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

    (*idxunop_handle) = idxunop ;
    (*NewThunk_handle) = NewThunk ;
    return (GrB_SUCCESS) ;
}