1 //------------------------------------------------------------------------------
2 // GrB_Descriptor_set: set a field in 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 
GrB_Descriptor_set(GrB_Descriptor desc,GrB_Desc_Field field,GrB_Desc_Value value)12 GrB_Info GrB_Descriptor_set     // set a parameter in a descriptor
13 (
14     GrB_Descriptor desc,        // descriptor to modify
15     GrB_Desc_Field field,       // parameter to change
16     GrB_Desc_Value value        // value to change it to
17 )
18 {
19 
20     //--------------------------------------------------------------------------
21     // check inputs
22     //--------------------------------------------------------------------------
23 
24     if (desc != NULL && desc->header_size == 0)
25     {
26         // built-in descriptors may not be modified
27         return (GrB_INVALID_VALUE) ;
28     }
29 
30     GB_WHERE (desc, "GrB_Descriptor_set (desc, field, value)") ;
31     GB_RETURN_IF_NULL_OR_FAULTY (desc) ;
32     ASSERT_DESCRIPTOR_OK (desc, "desc to set", GB0) ;
33 
34     //--------------------------------------------------------------------------
35     // set the parameter
36     //--------------------------------------------------------------------------
37 
38     switch (field)
39     {
40 
41         case GrB_OUTP :
42 
43             if (! (value == GxB_DEFAULT || value == GrB_REPLACE))
44             {
45                 GB_ERROR (GrB_INVALID_VALUE,
46                     "invalid descriptor value [%d] for GrB_OUTP field;\n"
47                     "must be GxB_DEFAULT [%d] or GrB_REPLACE [%d]",
48                     (int) value, (int) GxB_DEFAULT, (int) GrB_REPLACE) ;
49             }
50             desc->out = value ;
51             break ;
52 
53         case GrB_MASK :
54         {
55 
56             if (! (value == GxB_DEFAULT ||
57                    value == GrB_COMP ||
58                    value == GrB_STRUCTURE ||
59                    value == (GrB_COMP + GrB_STRUCTURE)))
60             {
61                 GB_ERROR (GrB_INVALID_VALUE,
62                     "invalid descriptor value [%d] for GrB_MASK field;\n"
63                     "must be GxB_DEFAULT [%d], GrB_COMP [%d],\n"
64                     "GrB_STRUCTURE [%d], or GrB_COMP+GrB_STRUCTURE [%d]",
65                     (int) value, (int) GxB_DEFAULT, (int) GrB_COMP,
66                     (int) GrB_STRUCTURE,
67                     (int) (GrB_COMP + GrB_STRUCTURE)) ;
68             }
69             int mask = (int) desc->mask ;
70             switch (value)
71             {
72                 case GrB_COMP      : mask |= GrB_COMP ;      break ;
73                 case GrB_STRUCTURE : mask |= GrB_STRUCTURE ; break ;
74                 default            : mask = (int) value ;    break ;
75             }
76             desc->mask = (GrB_Desc_Value) mask ;
77         }
78         break ;
79 
80         case GrB_INP0 :
81 
82             if (! (value == GxB_DEFAULT || value == GrB_TRAN))
83             {
84                 GB_ERROR (GrB_INVALID_VALUE,
85                     "invalid descriptor value [%d] for GrB_INP0 field;\n"
86                     "must be GxB_DEFAULT [%d] or GrB_TRAN [%d]",
87                     (int) value, (int) GxB_DEFAULT, (int) GrB_TRAN) ;
88             }
89             desc->in0 = value ;
90             break ;
91 
92         case GrB_INP1 :
93 
94             if (! (value == GxB_DEFAULT || value == GrB_TRAN))
95             {
96                 GB_ERROR (GrB_INVALID_VALUE,
97                     "invalid descriptor value [%d] for GrB_INP1 field;\n"
98                     "must be GxB_DEFAULT [%d] or GrB_TRAN [%d]",
99                     (int) value, (int) GxB_DEFAULT, (int) GrB_TRAN) ;
100             }
101             desc->in1 = value ;
102             break ;
103 
104         case GxB_AxB_METHOD :
105 
106             if (! (value == GxB_DEFAULT  || value == GxB_AxB_GUSTAVSON
107                 || value == GxB_AxB_DOT
108                 || value == GxB_AxB_HASH || value == GxB_AxB_SAXPY))
109             {
110                 GB_ERROR (GrB_INVALID_VALUE,
111                     "invalid descriptor value [%d] for GrB_AxB_METHOD field;\n"
112                     "must be GxB_DEFAULT [%d], GxB_AxB_GUSTAVSON [%d]\n"
113                     "GxB_AxB_DOT [%d], GxB_AxB_HASH [%d] or GxB_AxB_SAXPY [%d]",
114                     (int) value, (int) GxB_DEFAULT, (int) GxB_AxB_GUSTAVSON,
115                     (int) GxB_AxB_DOT,
116                     (int) GxB_AxB_HASH, (int) GxB_AxB_SAXPY) ;
117             }
118             desc->axb = value ;
119             break ;
120 
121         default :
122 
123             GB_ERROR (GrB_INVALID_VALUE,
124                 "invalid descriptor field [%d], must be one of:\n"
125                 "GrB_OUTP [%d], GrB_MASK [%d], GrB_INP0 [%d], GrB_INP1 [%d]"
126                 "or GxB_AxB_METHOD [%d]", (int) field, (int) GrB_OUTP,
127                 (int) GrB_MASK, (int) GrB_INP0, (int) GrB_INP1,
128                 (int) GxB_AxB_METHOD) ;
129     }
130 
131     return (GrB_SUCCESS) ;
132 }
133 
134