@@ -14,83 +14,140 @@ a function, defaults to avoid hyperthreading, which is typically most performant
14
14
"""
15
15
mutable struct Descriptor <: AbstractDescriptor
16
16
name:: String
17
- p:: libgb .GrB_Descriptor
18
- function Descriptor (name, p:: libgb .GrB_Descriptor )
17
+ p:: LibGraphBLAS .GrB_Descriptor
18
+ function Descriptor (name, p:: LibGraphBLAS .GrB_Descriptor )
19
19
d = new (name, p)
20
20
function f (descriptor)
21
- libgb . GrB_Descriptor_free (Ref (descriptor. p))
21
+ LibGraphBLAS . GrB_Descriptor_free (Ref (descriptor. p))
22
22
end
23
23
return finalizer (f, d)
24
24
end
25
25
end
26
26
27
27
function Descriptor (;kwargs... )
28
- desc = Descriptor (" " , libgb. GrB_Descriptor_new ())
28
+ d = Ref {LibGraphBLAS.GrB_Descriptor} ()
29
+ @wraperror LibGraphBLAS. GrB_Descriptor_new (d)
30
+ desc = Descriptor (" " , d[])
29
31
for (s, x) in kwargs
30
32
setproperty! (desc, s, x)
31
33
end
32
34
return desc
33
35
end
34
36
35
- Base. unsafe_convert (:: Type{libgb.GrB_Descriptor} , d:: Descriptor ) = d. p
37
+ Base. unsafe_convert (:: Type{LibGraphBLAS.GrB_Descriptor} , d:: Descriptor ) = d. p
38
+
39
+ # Todo: improve these. They can't be wrapped by ccall because they're "generic"?
40
+ # Or at least not wrapped by Clang.jl
41
+ function GxB_Desc_get (desc, field)
42
+ if field ∈ [LibGraphBLAS. GrB_OUTP, LibGraphBLAS. GrB_MASK, LibGraphBLAS. GrB_INP0, LibGraphBLAS. GrB_INP1]
43
+ T = LibGraphBLAS. GrB_Desc_Value
44
+ elseif field ∈ [LibGraphBLAS. GxB_DESCRIPTOR_NTHREADS, LibGraphBLAS. GxB_AxB_METHOD, LibGraphBLAS. GxB_SORT]
45
+ T = Cint
46
+ elseif field ∈ [LibGraphBLAS. GxB_DESCRIPTOR_CHUNK]
47
+ T = Cdouble
48
+ else
49
+ error (" Not a valid Descriptor option." )
50
+ end
51
+ v = Ref {T} ()
52
+ @wraperror ccall (
53
+ (:GxB_Desc_get , libgraphblas),
54
+ LibGraphBLAS. GrB_Info,
55
+ (LibGraphBLAS. GrB_Descriptor, UInt32, Ptr{Cvoid}),
56
+ desc,
57
+ field,
58
+ v
59
+ )
60
+ return v[]
61
+ end
62
+
63
+ function GxB_Desc_set (d, field, value)
64
+ if field ∈ [LibGraphBLAS. GrB_OUTP, LibGraphBLAS. GrB_MASK, LibGraphBLAS. GrB_INP0, LibGraphBLAS. GrB_INP1]
65
+ @wraperror ccall (
66
+ (:GxB_Desc_set , libgraphblas),
67
+ LibGraphBLAS. GrB_Info,
68
+ (LibGraphBLAS. GrB_Descriptor, LibGraphBLAS. GrB_Desc_Field, LibGraphBLAS. GrB_Desc_Value),
69
+ d,
70
+ field,
71
+ value
72
+ )
73
+ elseif field ∈ [LibGraphBLAS. GxB_DESCRIPTOR_NTHREADS, LibGraphBLAS. GxB_AxB_METHOD, LibGraphBLAS. GxB_SORT]
74
+ @wraperror ccall (
75
+ (:GxB_Desc_set , libgraphblas),
76
+ LibGraphBLAS. GrB_Info,
77
+ (LibGraphBLAS. GrB_Descriptor, LibGraphBLAS. GrB_Desc_Field, Cint),
78
+ d,
79
+ field,
80
+ value
81
+ )
82
+ elseif field ∈ [LibGraphBLAS. GxB_DESCRIPTOR_CHUNK]
83
+ @wraperror ccall (
84
+ (:GxB_Desc_set , libgraphblas),
85
+ LibGraphBLAS. GrB_Info,
86
+ (LibGraphBLAS. GrB_Descriptor, LibGraphBLAS. GrB_Desc_Field, Cdouble),
87
+ d,
88
+ field,
89
+ value
90
+ )
91
+ end
92
+ end
36
93
37
94
function Base. getproperty (d:: Descriptor , s:: Symbol )
38
95
if s === :p
39
96
return getfield (d, s)
40
97
elseif s === :replace_output
41
- x = libgb . GxB_Desc_get (d, libgb . GrB_OUTP)
42
- if x == libgb . GrB_REPLACE
98
+ x = GxB_Desc_get (d, LibGraphBLAS . GrB_OUTP)
99
+ if x == LibGraphBLAS . GrB_REPLACE
43
100
return true
44
101
else
45
102
return false
46
103
end
47
104
elseif s === :complement_mask
48
- x = libgb . GxB_Desc_get (d, libgb . libgb . GrB_MASK)
49
- if x == libgb . GrB_COMP || x == libgb . GrB_STRUCT_COMP
105
+ x = GxB_Desc_get (d, LibGraphBLAS . GrB_MASK)
106
+ if x == LibGraphBLAS . GrB_COMP || x == LibGraphBLAS . GrB_STRUCT_COMP
50
107
return true
51
108
else
52
109
return false
53
110
end
54
111
elseif s === :structural_mask
55
- x = libgb . GxB_Desc_get (d, libgb . GrB_MASK)
56
- if x == libgb . GrB_STRUCTURE || x == libgb . GrB_STRUCT_COMP
112
+ x = GxB_Desc_get (d, LibGraphBLAS . GrB_MASK)
113
+ if x == LibGraphBLAS . GrB_STRUCTURE || x == LibGraphBLAS . GrB_STRUCT_COMP
57
114
return true
58
115
else
59
116
return false
60
117
end
61
118
elseif s === :transpose_input1
62
- x = libgb . GxB_Desc_get (d, libgb . GrB_INP0)
63
- if x == libgb . GrB_TRAN
119
+ x = GxB_Desc_get (d, LibGraphBLAS . GrB_INP0)
120
+ if x == LibGraphBLAS . GrB_TRAN
64
121
return true
65
122
else
66
123
return false
67
124
end
68
125
elseif s === :transpose_input2
69
- x = libgb . GxB_Desc_get (d, libgb . GrB_INP1)
70
- if x == libgb . GrB_TRAN
126
+ x = GxB_Desc_get (d, LibGraphBLAS . GrB_INP1)
127
+ if x == LibGraphBLAS . GrB_TRAN
71
128
return true
72
129
else
73
130
return false
74
131
end
75
132
elseif s === :nthreads
76
- return libgb . GxB_Desc_get (d, libgb . GxB_DESCRIPTOR_NTHREADS)
133
+ return GxB_Desc_get (d, LibGraphBLAS . GxB_DESCRIPTOR_NTHREADS)
77
134
elseif s === :chunk
78
- return libgb . GxB_Desc_get (d, libgb . GxB_DESCRIPTOR_CHUNK)
135
+ return GxB_Desc_get (d, LibGraphBLAS . GxB_DESCRIPTOR_CHUNK)
79
136
elseif s === :sort
80
- if libgb . GxB_Desc_get (d, libgb . GxB_SORT) == libgb . GxB_DEFAULT
137
+ if GxB_Desc_get (d, LibGraphBLAS . GxB_SORT) == LibGraphBLAS . GxB_DEFAULT
81
138
return false
82
139
else
83
140
return true
84
141
end
85
142
elseif s === :axb_method
86
- x = libgb . GxB_Desc_get (d, libgb . GxB_AxB_METHOD)
87
- if x == libgb . GxB_AxB_GUSTAVSON
143
+ x = GxB_Desc_get (d, LibGraphBLAS . GxB_AxB_METHOD)
144
+ if x == LibGraphBLAS . GxB_AxB_GUSTAVSON
88
145
return :gustavson
89
- elseif x == libgb . GxB_AxB_DOT
146
+ elseif x == LibGraphBLAS . GxB_AxB_DOT
90
147
return :dot
91
- elseif x == libgb . AxB_HASH
148
+ elseif x == LibGraphBLAS . AxB_HASH
92
149
return :hash
93
- elseif x == libgb . GxB_AxB_SAXPY
150
+ elseif x == LibGraphBLAS . GxB_AxB_SAXPY
94
151
return :saxpy
95
152
else
96
153
return :default
@@ -105,38 +162,38 @@ function Base.setproperty!(d::Descriptor, s::Symbol, x)
105
162
setfield! (d, s, x)
106
163
return nothing
107
164
elseif s === :replace_output
108
- x ? (y = libgb . GrB_REPLACE) : (y = libgb . GxB_DEFAULT)
109
- libgb . GxB_Desc_set (d, libgb . GrB_OUTP, y)
165
+ x ? (y = LibGraphBLAS . GrB_REPLACE) : (y = LibGraphBLAS . GxB_DEFAULT)
166
+ GxB_Desc_set (d, LibGraphBLAS . GrB_OUTP, y)
110
167
elseif s === :complement_mask
111
168
if x == false
112
169
if d. structural_mask
113
- libgb . GxB_Desc_set (d, libgb . GrB_MASK, libgb . GrB_STRUCTURE)
170
+ GxB_Desc_set (d, LibGraphBLAS . GrB_MASK, LibGraphBLAS . GrB_STRUCTURE)
114
171
else
115
- libgb . GxB_Desc_set (d, libgb . GrB_MASK, libgb . GxB_DEFAULT)
172
+ GxB_Desc_set (d, LibGraphBLAS . GrB_MASK, LibGraphBLAS . GxB_DEFAULT)
116
173
end
117
174
else
118
- libgb . GxB_Desc_set (d, libgb . GrB_MASK, libgb . GrB_COMP)
175
+ GxB_Desc_set (d, LibGraphBLAS . GrB_MASK, LibGraphBLAS . GrB_COMP)
119
176
end
120
177
elseif s === :structural_mask
121
178
if x == false
122
179
if d. complement_mask
123
- libgb . GxB_Desc_set (d, libgb . GrB_MASK, libgb . GrB_COMP)
180
+ GxB_Desc_set (d, LibGraphBLAS . GrB_MASK, LibGraphBLAS . GrB_COMP)
124
181
else
125
- libgb . GxB_Desc_set (d, libgb . GrB_MASK, libgb . GxB_DEFAULT)
182
+ GxB_Desc_set (d, LibGraphBLAS . GrB_MASK, LibGraphBLAS . GxB_DEFAULT)
126
183
end
127
184
else
128
- libgb . GxB_Desc_set (d, libgb . GrB_MASK, libgb . GrB_STRUCTURE)
185
+ GxB_Desc_set (d, LibGraphBLAS . GrB_MASK, LibGraphBLAS . GrB_STRUCTURE)
129
186
end
130
187
elseif s === :transpose_input1
131
- libgb . GxB_Desc_set (d, libgb . GrB_INP0, x ? libgb . GrB_TRAN : libgb . GxB_DEFAULT)
188
+ GxB_Desc_set (d, LibGraphBLAS . GrB_INP0, x ? LibGraphBLAS . GrB_TRAN : LibGraphBLAS . GxB_DEFAULT)
132
189
elseif s === :transpose_input2
133
- libgb . GxB_Desc_set (d, libgb . GrB_INP1, x ? libgb . GrB_TRAN : libgb . GxB_DEFAULT)
190
+ GxB_Desc_set (d, LibGraphBLAS . GrB_INP1, x ? LibGraphBLAS . GrB_TRAN : LibGraphBLAS . GxB_DEFAULT)
134
191
elseif s === :nthreads
135
- libgb . GxB_Desc_set (d, libgb . GxB_DESCRIPTOR_NTHREADS, x)
192
+ GxB_Desc_set (d, LibGraphBLAS . GxB_DESCRIPTOR_NTHREADS, x)
136
193
elseif s === :chunk
137
- libgb . GxB_Desc_set (d, libgb . GxB_DESCRIPTOR_CHUNK, x)
194
+ GxB_Desc_set (d, LibGraphBLAS . GxB_DESCRIPTOR_CHUNK, x)
138
195
elseif s === :sort
139
- libgb . GxB_Desc_set (d, libgb . GxB_SORT, x ? 3 : 0 )
196
+ GxB_Desc_set (d, LibGraphBLAS . GxB_SORT, x ? 3 : 0 )
140
197
end
141
198
end
142
199
function Base. propertynames (:: Descriptor )
0 commit comments