1 //------------------------------------------------------------------------------
2 // GxB_Global_Option_get: get a global default option for all future matrices
3 //------------------------------------------------------------------------------
4 
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7 
8 //------------------------------------------------------------------------------
9 
10 #include "GB.h"
11 
GxB_Global_Option_get(GxB_Option_Field field,...)12 GrB_Info GxB_Global_Option_get      // gets the current global option
13 (
14     GxB_Option_Field field,         // option to query
15     ...                             // return value of the global option
16 )
17 {
18 
19     //--------------------------------------------------------------------------
20     // check inputs
21     //--------------------------------------------------------------------------
22 
23     GB_WHERE1 ("GxB_Global_Option_get (field, &value)") ;
24 
25     //--------------------------------------------------------------------------
26     // get the option
27     //--------------------------------------------------------------------------
28 
29     va_list ap ;
30 
31     switch (field)
32     {
33 
34         //----------------------------------------------------------------------
35         // matrix format
36         //----------------------------------------------------------------------
37 
38         case GxB_HYPER_SWITCH :
39 
40             {
41                 va_start (ap, field) ;
42                 double *hyper_switch = va_arg (ap, double *) ;
43                 va_end (ap) ;
44                 GB_RETURN_IF_NULL (hyper_switch) ;
45                 (*hyper_switch) = (double) GB_Global_hyper_switch_get ( ) ;
46             }
47             break ;
48 
49         case GxB_BITMAP_SWITCH :
50 
51             {
52                 va_start (ap, field) ;
53                 double *bitmap_switch = va_arg (ap, double *) ;
54                 va_end (ap) ;
55                 GB_RETURN_IF_NULL (bitmap_switch) ;
56                 for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++)
57                 {
58                     double b = (double) GB_Global_bitmap_switch_get (k) ;
59                     bitmap_switch [k] = b ;
60                 }
61             }
62             break ;
63 
64         case GxB_FORMAT :
65 
66             {
67                 va_start (ap, field) ;
68                 GxB_Format_Value *format = va_arg (ap, GxB_Format_Value *) ;
69                 va_end (ap) ;
70                 GB_RETURN_IF_NULL (format) ;
71                 (*format) = (GB_Global_is_csc_get ( )) ?
72                     GxB_BY_COL : GxB_BY_ROW ;
73             }
74             break ;
75 
76         //----------------------------------------------------------------------
77         // mode from GrB_init (blocking or non-blocking)
78         //----------------------------------------------------------------------
79 
80         case GxB_MODE :
81 
82             {
83                 va_start (ap, field) ;
84                 GrB_Mode *mode = va_arg (ap, GrB_Mode *) ;
85                 va_end (ap) ;
86                 GB_RETURN_IF_NULL (mode) ;
87                 (*mode) = GB_Global_mode_get ( )  ;
88             }
89             break ;
90 
91         //----------------------------------------------------------------------
92         // default number of threads
93         //----------------------------------------------------------------------
94 
95         case GxB_GLOBAL_NTHREADS :      // same as GxB_NTHREADS
96 
97             {
98                 va_start (ap, field) ;
99                 int *nthreads_max = va_arg (ap, int *) ;
100                 va_end (ap) ;
101                 GB_RETURN_IF_NULL (nthreads_max) ;
102                 (*nthreads_max) = GB_Global_nthreads_max_get ( ) ;
103             }
104             break ;
105 
106         //----------------------------------------------------------------------
107         // default chunk size
108         //----------------------------------------------------------------------
109 
110         case GxB_GLOBAL_CHUNK :         // same as GxB_CHUNK
111 
112             {
113                 va_start (ap, field) ;
114                 double *chunk = va_arg (ap, double *) ;
115                 va_end (ap) ;
116                 GB_RETURN_IF_NULL (chunk) ;
117                 (*chunk) = GB_Global_chunk_get ( ) ;
118             }
119             break ;
120 
121         //----------------------------------------------------------------------
122         // memory pool control
123         //----------------------------------------------------------------------
124 
125         case GxB_MEMORY_POOL :
126 
127             {
128                 va_start (ap, field) ;
129                 int64_t *free_pool_limit = va_arg (ap, int64_t *) ;
130                 va_end (ap) ;
131                 GB_RETURN_IF_NULL (free_pool_limit) ;
132                 for (int k = 0 ; k < 64 ; k++)
133                 {
134                     free_pool_limit [k] = GB_Global_free_pool_limit_get (k) ;
135                 }
136             }
137             break ;
138 
139         //----------------------------------------------------------------------
140         // SuiteSparse:GraphBLAS version, date, license, etc
141         //----------------------------------------------------------------------
142 
143         case GxB_LIBRARY_NAME :
144 
145             {
146                 va_start (ap, field) ;
147                 char **name = va_arg (ap, char **) ;
148                 va_end (ap) ;
149                 GB_RETURN_IF_NULL (name) ;
150                 (*name) = GxB_IMPLEMENTATION_NAME ;
151             }
152             break ;
153 
154         case GxB_LIBRARY_VERSION :
155 
156             {
157                 va_start (ap, field) ;
158                 int *version = va_arg (ap, int *) ;
159                 va_end (ap) ;
160                 GB_RETURN_IF_NULL (version) ;
161                 version [0] = GxB_IMPLEMENTATION_MAJOR ;
162                 version [1] = GxB_IMPLEMENTATION_MINOR ;
163                 version [2] = GxB_IMPLEMENTATION_SUB ;
164             }
165             break ;
166 
167         case GxB_LIBRARY_DATE :
168 
169             {
170                 va_start (ap, field) ;
171                 char **date = va_arg (ap, char **) ;
172                 va_end (ap) ;
173                 GB_RETURN_IF_NULL (date) ;
174                 (*date) = GxB_IMPLEMENTATION_DATE ;
175             }
176             break ;
177 
178         case GxB_LIBRARY_ABOUT :
179 
180             {
181                 va_start (ap, field) ;
182                 char **about = va_arg (ap, char **) ;
183                 va_end (ap) ;
184                 GB_RETURN_IF_NULL (about) ;
185                 (*about) = GxB_IMPLEMENTATION_ABOUT ;
186             }
187             break ;
188 
189         case GxB_LIBRARY_LICENSE :
190 
191             {
192                 va_start (ap, field) ;
193                 char **license = va_arg (ap, char **) ;
194                 va_end (ap) ;
195                 GB_RETURN_IF_NULL (license) ;
196                 (*license) = GxB_IMPLEMENTATION_LICENSE ;
197             }
198             break ;
199 
200         case GxB_LIBRARY_COMPILE_DATE :
201 
202             {
203                 va_start (ap, field) ;
204                 char **compile_date = va_arg (ap, char **) ;
205                 va_end (ap) ;
206                 GB_RETURN_IF_NULL (compile_date) ;
207                 (*compile_date) = __DATE__ ;
208             }
209             break ;
210 
211         case GxB_LIBRARY_COMPILE_TIME :
212 
213             {
214                 va_start (ap, field) ;
215                 char **compile_time = va_arg (ap, char **) ;
216                 va_end (ap) ;
217                 GB_RETURN_IF_NULL (compile_time) ;
218                 (*compile_time) = __TIME__ ;
219             }
220             break ;
221 
222         case GxB_LIBRARY_URL :
223 
224             {
225                 va_start (ap, field) ;
226                 char **url = va_arg (ap, char **) ;
227                 va_end (ap) ;
228                 GB_RETURN_IF_NULL (url) ;
229                 (*url) = "http://faculty.cse.tamu.edu/davis/GraphBLAS" ;
230             }
231             break ;
232 
233         //----------------------------------------------------------------------
234         // GraphBLAS API version, date, etc
235         //----------------------------------------------------------------------
236 
237         case GxB_API_VERSION :
238 
239             {
240                 va_start (ap, field) ;
241                 int *api_version = va_arg (ap, int *) ;
242                 va_end (ap) ;
243                 GB_RETURN_IF_NULL (api_version) ;
244                 api_version [0] = GxB_SPEC_MAJOR ;
245                 api_version [1] = GxB_SPEC_MINOR ;
246                 api_version [2] = GxB_SPEC_SUB ;
247             }
248             break ;
249 
250         case GxB_API_DATE :
251 
252             {
253                 va_start (ap, field) ;
254                 char **api_date = va_arg (ap, char **) ;
255                 va_end (ap) ;
256                 GB_RETURN_IF_NULL (api_date) ;
257                 (*api_date) = GxB_SPEC_DATE ;
258             }
259             break ;
260 
261         case GxB_API_ABOUT :
262 
263             {
264                 va_start (ap, field) ;
265                 char **api_about = va_arg (ap, char **) ;
266                 va_end (ap) ;
267                 GB_RETURN_IF_NULL (api_about) ;
268                 (*api_about) = GxB_SPEC_ABOUT ;
269             }
270             break ;
271 
272         case GxB_API_URL :
273 
274             {
275                 va_start (ap, field) ;
276                 char **api_url = va_arg (ap, char **) ;
277                 va_end (ap) ;
278                 GB_RETURN_IF_NULL (api_url) ;
279                 (*api_url) = "http://graphblas.org" ;
280             }
281             break ;
282 
283         //----------------------------------------------------------------------
284         // controlling diagnostic output
285         //----------------------------------------------------------------------
286 
287         case GxB_BURBLE :
288 
289             {
290                 va_start (ap, field) ;
291                 bool *burble = va_arg (ap, bool *) ;
292                 va_end (ap) ;
293                 GB_RETURN_IF_NULL (burble) ;
294                 (*burble) = GB_Global_burble_get ( ) ;
295             }
296             break ;
297 
298         case GxB_PRINTF :
299 
300             {
301                 va_start (ap, field) ;
302                 void **printf_func = va_arg (ap, void **) ;
303                 va_end (ap) ;
304                 GB_RETURN_IF_NULL (printf_func) ;
305                 (*printf_func) = (void *) GB_Global_printf_get ( ) ;
306             }
307             break ;
308 
309         case GxB_FLUSH :
310 
311             {
312                 va_start (ap, field) ;
313                 void **flush_func = va_arg (ap, void **) ;
314                 va_end (ap) ;
315                 GB_RETURN_IF_NULL (flush_func) ;
316                 (*flush_func) = (void *) GB_Global_flush_get ( ) ;
317             }
318             break ;
319 
320         //----------------------------------------------------------------------
321         // CUDA (DRAFT: in progress, do not use)
322         //----------------------------------------------------------------------
323 
324         case GxB_GLOBAL_GPU_CONTROL :       // same as GxB_GPU_CONTROL
325 
326             {
327                 va_start (ap, field) ;
328                 GrB_Desc_Value *gpu_control = va_arg (ap, GrB_Desc_Value *) ;
329                 va_end (ap) ;
330                 GB_RETURN_IF_NULL (gpu_control) ;
331                 (*gpu_control) = GB_Global_gpu_control_get ( ) ;
332             }
333             break ;
334 
335         case GxB_GLOBAL_GPU_CHUNK :         // same as GxB_GPU_CHUNK
336 
337             {
338                 va_start (ap, field) ;
339                 double *gpu_chunk = va_arg (ap, double *) ;
340                 va_end (ap) ;
341                 GB_RETURN_IF_NULL (gpu_chunk) ;
342                 (*gpu_chunk) = GB_Global_gpu_chunk_get ( ) ;
343             }
344             break ;
345 
346         default :
347 
348             return (GrB_INVALID_VALUE) ;
349     }
350 
351     return (GrB_SUCCESS) ;
352 }
353 
354