Skip to content

Commit 0b7a59d

Browse files
add GrB_NULL_type
1 parent c9fa486 commit 0b7a59d

File tree

5 files changed

+77
-91
lines changed

5 files changed

+77
-91
lines changed

src/Operations/Element_wise_multiplication.jl

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
function GrB_eWiseMult(C::T, mask::T, accum::GrB_BinaryOp, op::U, A::T, B::T,
2-
desc::GrB_Descriptor) where {T <: Union{GrB_Vector, GrB_Matrix}, U <: Union{GrB_BinaryOp, GrB_Monoid, GrB_Semiring}}
1+
function GrB_eWiseMult(C::T, mask::V, accum::W, op::U, A::T, B::T,
2+
desc::X) where {T <: Union{GrB_Vector, GrB_Matrix}, U <: Union{GrB_BinaryOp, GrB_Monoid, GrB_Semiring},
3+
V <: Union{GrB_Vector, GrB_Matrix, GrB_NULL_Type}, W <: valid_accum_types, X <: valid_desc_types}
34

45
T_name = get_struct_name(A)
56
U_name = get_struct_name(op)
@@ -18,13 +19,13 @@ end
1819

1920
function GrB_eWiseMult_Vector_Semiring( # w<Mask> = accum (w, u.*v)
2021
w::GrB_Vector, # input/output vector for results
21-
mask::GrB_Vector, # optional mask for w, unused if NULL
22-
accum::GrB_BinaryOp, # optional accum for z=accum(w,t)
22+
mask::T, # optional mask for w, unused if NULL
23+
accum::U, # optional accum for z=accum(w,t)
2324
semiring::GrB_Semiring, # defines '.*' for t=u.*v
2425
u::GrB_Vector, # first input: vector u
2526
v::GrB_Vector, # second input: vector v
26-
desc::GrB_Descriptor # descriptor for w and mask
27-
)
27+
desc::V # descriptor for w and mask
28+
) where {T <: valid_vector_mask_types, U <: valid_accum_types, V <: valid_desc_types}
2829

2930
return GrB_Info(
3031
ccall(
@@ -38,13 +39,13 @@ end
3839

3940
function GrB_eWiseMult_Vector_Monoid( # w<Mask> = accum (w, u.*v)
4041
w::GrB_Vector, # input/output vector for results
41-
mask::GrB_Vector, # optional mask for w, unused if NULL
42-
accum::GrB_BinaryOp, # optional accum for z=accum(w,t)
42+
mask::T, # optional mask for w, unused if NULL
43+
accum::U, # optional accum for z=accum(w,t)
4344
monoid::GrB_Monoid, # defines '.*' for t=u.*v
4445
u::GrB_Vector, # first input: vector u
4546
v::GrB_Vector, # second input: vector v
46-
desc::GrB_Descriptor # descriptor for w and mask
47-
)
47+
desc::V # descriptor for w and mask
48+
) where {T <: valid_vector_mask_types, U <: valid_accum_types, V <: valid_desc_types}
4849

4950
return GrB_Info(
5051
ccall(
@@ -58,13 +59,13 @@ end
5859

5960
function GrB_eWiseMult_Vector_BinaryOp( # w<Mask> = accum (w, u.*v)
6061
w::GrB_Vector, # input/output vector for results
61-
mask::GrB_Vector, # optional mask for w, unused if NULL
62-
accum::GrB_BinaryOp, # optional accum for z=accum(w,t)
62+
mask::T, # optional mask for w, unused if NULL
63+
accum::U, # optional accum for z=accum(w,t)
6364
mult::GrB_BinaryOp, # defines '.*' for t=u.*v
6465
u::GrB_Vector, # first input: vector u
6566
v::GrB_Vector, # second input: vector v
66-
desc::GrB_Descriptor # descriptor for w and mask
67-
)
67+
desc::V # descriptor for w and mask
68+
) where {T <: valid_vector_mask_types, U <: valid_accum_types, V <: valid_desc_types}
6869

6970
return GrB_Info(
7071
ccall(
@@ -78,13 +79,13 @@ end
7879

7980
function GrB_eWiseMult_Matrix_Semiring( # C<Mask> = accum (C, A.*B)
8081
C::GrB_Matrix, # input/output matrix for results
81-
Mask::GrB_Matrix, # optional mask for C, unused if NULL
82-
accum::GrB_BinaryOp, # optional accum for Z=accum(C,T)
82+
Mask::T, # optional mask for C, unused if NULL
83+
accum::U, # optional accum for Z=accum(C,T)
8384
semiring::GrB_Semiring, # defines '.*' for T=A.*B
8485
A::GrB_Matrix, # first input: matrix A
8586
B::GrB_Matrix, # second input: matrix B
86-
desc::GrB_Descriptor # descriptor for C, Mask, A, and B
87-
)
87+
desc::V # descriptor for C, Mask, A, and B
88+
) where {T <: valid_matrix_mask_types, U <: valid_accum_types, V <: valid_desc_types}
8889

8990
return GrB_Info(
9091
ccall(
@@ -98,13 +99,13 @@ end
9899

99100
function GrB_eWiseMult_Matrix_Monoid( # C<Mask> = accum (C, A.*B)
100101
C::GrB_Matrix, # input/output matrix for results
101-
Mask::GrB_Matrix, # optional mask for C, unused if NULL
102-
accum::GrB_BinaryOp, # optional accum for Z=accum(C,T)
102+
Mask::T, # optional mask for C, unused if NULL
103+
accum::U, # optional accum for Z=accum(C,T)
103104
monoid::GrB_Monoid, # defines '.*' for T=A.*B
104105
A::GrB_Matrix, # first input: matrix A
105106
B::GrB_Matrix, # second input: matrix B
106-
desc::GrB_Descriptor # descriptor for C, Mask, A, and B
107-
)
107+
desc::V # descriptor for C, Mask, A, and B
108+
) where {T <: valid_matrix_mask_types, U <: valid_accum_types, V <: valid_desc_types}
108109

109110
return GrB_Info(
110111
ccall(
@@ -118,13 +119,13 @@ end
118119

119120
function GrB_eWiseMult_Matrix_BinaryOp( # C<Mask> = accum (C, A.*B)
120121
C::GrB_Matrix, # input/output matrix for results
121-
Mask::GrB_Matrix, # optional mask for C, unused if NULL
122-
accum::GrB_BinaryOp, # optional accum for Z=accum(C,T)
122+
Mask::T, # optional mask for C, unused if NULL
123+
accum::U, # optional accum for Z=accum(C,T)
123124
mult::GrB_BinaryOp, # defines '.*' for T=A.*B
124125
A::GrB_Matrix, # first input: matrix A
125126
B::GrB_Matrix, # second input: matrix B
126-
desc::GrB_Descriptor # descriptor for C, Mask, A, and B
127-
)
127+
desc::V # descriptor for C, Mask, A, and B
128+
) where {T <: valid_matrix_mask_types, U <: valid_accum_types, V <: valid_desc_types}
128129

129130
return GrB_Info(
130131
ccall(

src/Operations/Extract.jl

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,20 @@ julia> GrB_Vector_extractTuples(W)[2]
5353
"""
5454
function GrB_Vector_extract( # w<mask> = accum (w, u(I))
5555
w::GrB_Vector, # input/output vector for results
56-
mask, # optional mask for w, unused if NULL
57-
accum, # optional accum for z=accum(w,t)
56+
mask::T, # optional mask for w, unused if NULL
57+
accum::U, # optional accum for z=accum(w,t)
5858
u::GrB_Vector, # first input: vector u
59-
I::Vector{T}, # row indices
60-
ni::T, # number of row indices
61-
desc # descriptor for w and mask
62-
) where T <: GrB_Index
63-
64-
mask_ptr = mask == GrB_NULL ? C_NULL : mask.p
65-
accum_ptr = accum == GrB_NULL ? C_NULL : accum.p
66-
desc_ptr = desc == GrB_NULL ? C_NULL : desc.p
59+
I::Vector{X}, # row indices
60+
ni::X, # number of row indices
61+
desc::V # descriptor for w and mask
62+
) where {T <: valid_vector_mask_types, U <: valid_accum_types, V <: valid_desc_types, X <: GrB_Index}
6763

6864
return GrB_Info(
6965
ccall(
7066
dlsym(graphblas_lib, "GrB_Vector_extract"),
7167
Cint,
7268
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cintmax_t}, Cintmax_t, Ptr{Cvoid}),
73-
w.p, mask_ptr, accum_ptr, u.p, pointer(I), ni, desc_ptr
69+
w.p, mask.p, accum.p, u.p, pointer(I), ni, desc.p
7470
)
7571
)
7672
end
@@ -135,26 +131,22 @@ julia> GrB_Matrix_extractTuples(OUT)[3]
135131
"""
136132
function GrB_Matrix_extract( # C<Mask> = accum (C, A(I,J))
137133
C::GrB_Matrix, # input/output matrix for results
138-
Mask, # optional mask for C, unused if NULL
139-
accum, # optional accum for Z=accum(C,T)
134+
Mask::T, # optional mask for C, unused if NULL
135+
accum::U, # optional accum for Z=accum(C,T)
140136
A::GrB_Matrix, # first input: matrix A
141-
I::Vector{T}, # row indices
142-
ni::T, # number of row indices
143-
J::Vector{T}, # column indices
144-
nj::T, # number of column indices
145-
desc # descriptor for C, Mask, and A
146-
) where T <: GrB_Index
147-
148-
Mask_ptr = Mask == GrB_NULL ? C_NULL : Mask.p
149-
accum_ptr = accum == GrB_NULL ? C_NULL : accum.p
150-
desc_ptr = desc == GrB_NULL ? C_NULL : desc.p
137+
I::Vector{X}, # row indices
138+
ni::X, # number of row indices
139+
J::Vector{X}, # column indices
140+
nj::X, # number of column indices
141+
desc::V # descriptor for C, Mask, and A
142+
) where {T <: valid_matrix_mask_types, U <: valid_accum_types, V <: valid_desc_types, X <: GrB_Index}
151143

152144
return GrB_Info(
153145
ccall(
154146
dlsym(graphblas_lib, "GrB_Matrix_extract"),
155147
Cint,
156148
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cintmax_t}, Cintmax_t, Ptr{Cintmax_t}, Cintmax_t, Ptr{Cvoid}),
157-
C.p, Mask_ptr, accum_ptr, A.p, pointer(I), ni, pointer(J), nj, desc_ptr
149+
C.p, Mask.p, accum.p, A.p, pointer(I), ni, pointer(J), nj, desc.p
158150
)
159151
)
160152
end
@@ -228,25 +220,21 @@ julia> GrB_Vector_extractTuples(out)[2]
228220
"""
229221
function GrB_Col_extract( # w<mask> = accum (w, A(I,j))
230222
w::GrB_Vector, # input/output matrix for results
231-
mask, # optional mask for w, unused if NULL
232-
accum, # optional accum for z=accum(w,t)
223+
mask::T, # optional mask for w, unused if NULL
224+
accum::U, # optional accum for z=accum(w,t)
233225
A::GrB_Matrix, # first input: matrix A
234-
I::Vector{T}, # row indices
235-
ni::T, # number of row indices
236-
j::T, # column index
237-
desc # descriptor for w, mask, and A
238-
) where T <: GrB_Index
239-
240-
mask_ptr = mask == GrB_NULL ? C_NULL : mask.p
241-
accum_ptr = accum == GrB_NULL ? C_NULL : accum.p
242-
desc_ptr = desc == GrB_NULL ? C_NULL : desc.p
226+
I::Vector{X}, # row indices
227+
ni::X, # number of row indices
228+
j::X, # column index
229+
desc::V # descriptor for w, mask, and A
230+
) where {T <: valid_vector_mask_types, U <: valid_accum_types, V <: valid_desc_types, X <: GrB_Index}
243231

244232
return GrB_Info(
245233
ccall(
246234
dlsym(graphblas_lib, "GrB_Col_extract"),
247235
Cint,
248236
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cintmax_t}, Cintmax_t, Cintmax_t, Ptr{Cvoid}),
249-
w.p, mask_ptr, accum_ptr, A.p, pointer(I), ni, j, desc_ptr
237+
w.p, mask.p, accum.p, A.p, pointer(I), ni, j, desc.p
250238
)
251239
)
252240
end

src/Operations/Multiplication.jl

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,20 @@ julia> GrB_Matrix_extractTuples(C)
4747
"""
4848
function GrB_mxm( # C<Mask> = accum (C, A*B)
4949
C::GrB_Matrix, # input/output matrix for results
50-
Mask, # optional mask for C, unused if NULL
51-
accum, # optional accum for Z=accum(C,T)
50+
Mask::T, # optional mask for C, unused if NULL
51+
accum::U, # optional accum for Z=accum(C,T)
5252
semiring::GrB_Semiring, # defines '+' and '*' for A*B
5353
A::GrB_Matrix, # first input: matrix A
5454
B::GrB_Matrix, # second input: matrix B
55-
desc # descriptor for C, Mask, A, and B
56-
)
57-
58-
Mask_ptr = Mask == GrB_NULL ? C_NULL : Mask.p
59-
accum_ptr = accum == GrB_NULL ? C_NULL : accum.p
60-
desc_ptr = desc == GrB_NULL ? C_NULL : desc.p
55+
desc::V # descriptor for C, Mask, A, and B
56+
) where {T <: valid_matrix_mask_types, U <: valid_accum_types, V <: valid_desc_types}
6157

6258
return GrB_Info(
6359
ccall(
6460
dlsym(graphblas_lib, "GrB_mxm"),
6561
Cint,
6662
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
67-
C.p, Mask_ptr, accum_ptr, semiring.p, A.p, B.p, desc_ptr
63+
C.p, Mask.p, accum.p, semiring.p, A.p, B.p, desc.p
6864
)
6965
)
7066
end
@@ -118,24 +114,20 @@ julia> GrB_Vector_extractTuples(w)
118114
"""
119115
function GrB_vxm( # w'<Mask> = accum (w, u'*A)
120116
w::GrB_Vector, # input/output vector for results
121-
mask, # optional mask for w, unused if NULL
122-
accum, # optional accum for z=accum(w,t)
117+
mask::T, # optional mask for w, unused if NULL
118+
accum::U, # optional accum for z=accum(w,t)
123119
semiring::GrB_Semiring, # defines '+' and '*' for u'*A
124120
u::GrB_Vector, # first input: vector u
125121
A::GrB_Matrix, # second input: matrix A
126-
desc # descriptor for w, mask, and A
127-
)
128-
129-
mask_ptr = mask == GrB_NULL ? C_NULL : mask.p
130-
accum_ptr = accum == GrB_NULL ? C_NULL : accum.p
131-
desc_ptr = desc == GrB_NULL ? C_NULL : desc.p
122+
desc::V # descriptor for w, mask, and A
123+
) where {T <: valid_vector_mask_types, U <: valid_accum_types, V <: valid_desc_types}
132124

133125
return GrB_Info(
134126
ccall(
135127
dlsym(graphblas_lib, "GrB_vxm"),
136128
Cint,
137129
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
138-
w.p, mask_ptr, accum_ptr, semiring.p, u.p, A.p, desc_ptr
130+
w.p, mask.p, accum.p, semiring.p, u.p, A.p, desc.p
139131
)
140132
)
141133
end
@@ -189,24 +181,20 @@ julia> GrB_Vector_extractTuples(w)
189181
"""
190182
function GrB_mxv( # w<Mask> = accum (w, A*u)
191183
w::GrB_Vector, # input/output vector for results
192-
mask, # optional mask for w, unused if NULL
193-
accum, # optional accum for z=accum(w,t)
184+
mask::T, # optional mask for w, unused if NULL
185+
accum::U, # optional accum for z=accum(w,t)
194186
semiring::GrB_Semiring, # defines '+' and '*' for A*B
195187
A::GrB_Matrix, # first input: matrix A
196188
u::GrB_Vector, # second input: vector u
197-
desc # descriptor for w, mask, and A
198-
)
199-
200-
mask_ptr = mask == GrB_NULL ? C_NULL : mask.p
201-
accum_ptr = accum == GrB_NULL ? C_NULL : accum.p
202-
desc_ptr = desc == GrB_NULL ? C_NULL : desc.p
189+
desc::V # descriptor for w, mask, and A
190+
) where {T <: valid_matrix_mask_types, U <: valid_accum_types, V <: valid_desc_types}
203191

204192
return GrB_Info(
205193
ccall(
206194
dlsym(graphblas_lib, "GrB_mxv"),
207195
Cint,
208196
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
209-
w.p, mask_ptr, accum_ptr, semiring.p, A.p, u.p, desc_ptr
197+
w.p, mask.p, accum.p, semiring.p, A.p, u.p, desc.p
210198
)
211199
)
212200
end

src/Structures.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,8 @@ mutable struct GrB_Descriptor <: GrB_Struct
5252
end
5353
GrB_Descriptor() = GrB_Descriptor(Ptr{Cvoid}(0))
5454
Base.show(io::IO, ::GrB_Descriptor) = print("GrB_Descriptor")
55+
56+
struct GrB_NULL_Type
57+
p::Ptr{Cvoid}
58+
end
59+
Base.show(io::IO, ::GrB_NULL_Type) = print("NULL")

src/SuiteSparseGraphBLAS.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ const GrB_Index = Union{Int64, UInt64}
1414
const valid_types = Union{Bool, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float32, Float64}
1515
const valid_int_types = Union{Bool, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64}
1616

17-
const GrB_NULL = C_NULL
18-
1917
built_in_unary_operators = ["IDENTITY", "AINV", "MINV"]
2018

2119
built_in_binary_operators = ["EQ", "NE", "GT", "LT", "GE", "LE", "FIRST", "SECOND", "MIN", "MAX",
@@ -56,6 +54,12 @@ include(depsjl_path)
5654
include("Structures.jl")
5755
include("Utils.jl")
5856

57+
valid_matrix_mask_types = Union{GrB_Matrix, GrB_NULL_Type}
58+
valid_vector_mask_types = Union{GrB_Vector, GrB_NULL_Type}
59+
valid_accum_types = Union{GrB_BinaryOp, GrB_NULL_Type}
60+
valid_desc_types = Union{GrB_Descriptor, GrB_NULL_Type}
61+
62+
const GrB_NULL = GrB_NULL_Type(C_NULL)
5963
const GrB_LNOT = GrB_UnaryOp()
6064
const GrB_LOR = GrB_BinaryOp(); const GrB_LAND = GrB_BinaryOp(); const GrB_LXOR = GrB_BinaryOp()
6165
const GxB_LOR_BOOL_MONOID = GrB_Monoid(); const GxB_LAND_BOOL_MONOID = GrB_Monoid()

0 commit comments

Comments
 (0)