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