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