1 //------------------------------------------------------------------------------
2 // GB_Descriptor_check: check and print a Descriptor
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
12 //------------------------------------------------------------------------------
13 // GB_dc: check a single descriptor field
14 //------------------------------------------------------------------------------
15
GB_dc(int kind,const char * field,const GrB_Desc_Value v,const GrB_Desc_Value nondefault,int pr,FILE * f)16 static GrB_Info GB_dc
17 (
18 int kind, // 0, 1, or 2
19 const char *field,
20 const GrB_Desc_Value v,
21 const GrB_Desc_Value nondefault, // for kind == 0
22 int pr, // print level
23 FILE *f
24 )
25 {
26
27 bool ok = true ;
28 GrB_Info info = GrB_SUCCESS ;
29
30 GBPR0 (" d.%s = ", field) ;
31 switch ((int) v)
32 {
33 case GxB_DEFAULT : GBPR0 ("default ") ; break ;
34 case GrB_COMP : GBPR0 ("complement") ; break ;
35 case GrB_STRUCTURE : GBPR0 ("structure ") ; break ;
36 case GrB_COMP+GrB_STRUCTURE : GBPR0 ("structural complement") ; break ;
37 case GrB_TRAN : GBPR0 ("transpose ") ; break ;
38 case GrB_REPLACE : GBPR0 ("replace ") ; break ;
39 case GxB_AxB_SAXPY : GBPR0 ("saxpy ") ; break ;
40 case GxB_AxB_GUSTAVSON : GBPR0 ("Gustavson ") ; break ;
41 case GxB_AxB_HASH : GBPR0 ("hash ") ; break ;
42 case GxB_AxB_DOT : GBPR0 ("dot ") ; break ;
43 default : GBPR0 ("unknown ") ;
44 info = GrB_INVALID_OBJECT ;
45 ok = false ;
46 break ;
47 }
48
49 if (ok)
50 {
51 if (kind == 0)
52 {
53 // most descriptor fields can be set to the default,
54 // or just one non-default value
55 if (! (v == GxB_DEFAULT || v == nondefault))
56 {
57 ok = false ;
58 }
59 }
60 else if (kind == 1)
61 {
62 // mask: can only be one of 4 different values
63 if (! (v == GxB_DEFAULT || v == GrB_COMP || v == GrB_STRUCTURE ||
64 v == (GrB_COMP + GrB_STRUCTURE)))
65 {
66 ok = false ;
67 }
68 }
69 else // kind == 2
70 {
71 // GxB_AxB_METHOD:
72 if (! (v == GxB_DEFAULT || v == GxB_AxB_GUSTAVSON
73 || v == GxB_AxB_DOT || v == GxB_AxB_HASH || v == GxB_AxB_SAXPY))
74 {
75 ok = false ;
76 }
77 }
78 }
79
80 if (!ok)
81 {
82 GBPR0 (" (invalid value for this field)") ;
83 info = GrB_INVALID_OBJECT ;
84 }
85
86 GBPR0 ("\n") ;
87
88 return (info) ;
89 }
90
91 //------------------------------------------------------------------------------
92 // GB_Descriptor_check
93 //------------------------------------------------------------------------------
94
95 GB_PUBLIC // accessed by the MATLAB tests in GraphBLAS/Test only
GB_Descriptor_check(const GrB_Descriptor D,const char * name,int pr,FILE * f)96 GrB_Info GB_Descriptor_check // check a GraphBLAS descriptor
97 (
98 const GrB_Descriptor D, // GraphBLAS descriptor to print and check
99 const char *name, // name of the descriptor, optional
100 int pr, // print level
101 FILE *f // file for output
102 )
103 {
104
105 //--------------------------------------------------------------------------
106 // check inputs
107 //--------------------------------------------------------------------------
108
109 GBPR0 ("\n GraphBLAS Descriptor: %s ", ((name != NULL) ? name : "")) ;
110
111 if (D == NULL)
112 {
113 GBPR0 ("NULL\n") ;
114 return (GrB_NULL_POINTER) ;
115 }
116
117 //--------------------------------------------------------------------------
118 // check object
119 //--------------------------------------------------------------------------
120
121 GB_CHECK_MAGIC (D, "Descriptor") ;
122
123 GBPR0 ("\n") ;
124
125 GrB_Info info [5] ;
126 info [0] = GB_dc (0, "out ", D->out, GrB_REPLACE, pr, f) ;
127 info [1] = GB_dc (1, "mask ", D->mask, GxB_DEFAULT, pr, f) ;
128 info [2] = GB_dc (0, "in0 ", D->in0, GrB_TRAN, pr, f) ;
129 info [3] = GB_dc (0, "in1 ", D->in1, GrB_TRAN, pr, f) ;
130 info [4] = GB_dc (2, "axb ", D->axb, GxB_DEFAULT, pr, f) ;
131
132 for (int i = 0 ; i < 5 ; i++)
133 {
134 if (info [i] != GrB_SUCCESS)
135 {
136 GBPR0 (" Descriptor field set to an invalid value\n") ;
137 return (GrB_INVALID_OBJECT) ;
138 }
139 }
140
141 int nthreads_max = D->nthreads_max ;
142 double chunk = D->chunk ;
143
144 GBPR0 (" d.nthreads = ") ;
145 if (nthreads_max <= GxB_DEFAULT)
146 {
147 GBPR0 ("default\n") ;
148 }
149 else
150 {
151 GBPR0 ("%d\n", nthreads_max) ;
152 }
153 GBPR0 (" d.chunk = ") ;
154 if (chunk <= GxB_DEFAULT)
155 {
156 GBPR0 ("default\n") ;
157 }
158 else
159 {
160 GBPR0 ("%g\n", chunk) ;
161 }
162
163 if (D->do_sort)
164 {
165 GBPR0 (" d.sort = true\n") ;
166 }
167
168 return (GrB_SUCCESS) ;
169 }
170
171