Skip to content

Commit c015451

Browse files
author
Wimmerer
committed
unary, binary, monoid udf first pass
1 parent 0b76d1f commit c015451

File tree

6 files changed

+281
-55
lines changed

6 files changed

+281
-55
lines changed

src/lib/LibGraphBLAS.jl

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -256,118 +256,122 @@ end
256256
mutable struct GB_Monoid_opaque end
257257

258258
const GrB_Monoid = Ptr{GB_Monoid_opaque}
259+
const monoididnew = Dict{DataType, Function}()
259260

260261
function GrB_Monoid_new_BOOL(monoid, op, identity)
261262
@wraperror ccall((:GrB_Monoid_new_BOOL, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Bool), monoid, op, identity)
262263
end
263-
264+
monoididnew[Bool] = GrB_Monoid_new_BOOL
264265
function GrB_Monoid_new_INT8(monoid, op, identity)
265266
@wraperror ccall((:GrB_Monoid_new_INT8, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int8), monoid, op, identity)
266267
end
267-
268+
monoididnew[Int8] = GrB_Monoid_new_INT8
268269
function GrB_Monoid_new_UINT8(monoid, op, identity)
269270
@wraperror ccall((:GrB_Monoid_new_UINT8, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt8), monoid, op, identity)
270271
end
271-
272+
monoididnew[UInt8] = GrB_Monoid_new_UINT8
272273
function GrB_Monoid_new_INT16(monoid, op, identity)
273274
@wraperror ccall((:GrB_Monoid_new_INT16, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int16), monoid, op, identity)
274275
end
275-
276+
monoididnew[Int16] = GrB_Monoid_new_INT16
276277
function GrB_Monoid_new_UINT16(monoid, op, identity)
277278
@wraperror ccall((:GrB_Monoid_new_UINT16, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt16), monoid, op, identity)
278279
end
279-
280+
monoididnew[UInt16] = GrB_Monoid_new_UINT16
280281
function GrB_Monoid_new_INT32(monoid, op, identity)
281282
@wraperror ccall((:GrB_Monoid_new_INT32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int32), monoid, op, identity)
282283
end
283-
284+
monoididnew[Int32] = GrB_Monoid_new_INT32
284285
function GrB_Monoid_new_UINT32(monoid, op, identity)
285286
@wraperror ccall((:GrB_Monoid_new_UINT32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt32), monoid, op, identity)
286287
end
287-
288+
monoididnew[UInt32] = GrB_Monoid_new_UINT32
288289
function GrB_Monoid_new_INT64(monoid, op, identity)
289290
@wraperror ccall((:GrB_Monoid_new_INT64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int64), monoid, op, identity)
290291
end
291-
292+
monoididnew[Int64] = GrB_Monoid_new_INT64
292293
function GrB_Monoid_new_UINT64(monoid, op, identity)
293294
@wraperror ccall((:GrB_Monoid_new_UINT64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt64), monoid, op, identity)
294295
end
295-
296+
monoididnew[UInt64] = GrB_Monoid_new_UINT64
296297
function GrB_Monoid_new_FP32(monoid, op, identity)
297298
@wraperror ccall((:GrB_Monoid_new_FP32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Cfloat), monoid, op, identity)
298299
end
299-
300+
monoididnew[Float32] = GrB_Monoid_new_FP32
300301
function GrB_Monoid_new_FP64(monoid, op, identity)
301302
@wraperror ccall((:GrB_Monoid_new_FP64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Cdouble), monoid, op, identity)
302303
end
303-
304+
monoididnew[Float64] = GrB_Monoid_new_FP64
304305
function GxB_Monoid_new_FC32(monoid, op, identity)
305306
@wraperror ccall((:GxB_Monoid_new_FC32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, GxB_FC32_t), monoid, op, identity)
306307
end
307-
308+
monoididnew[ComplexF32] = GxB_Monoid_new_FC32
308309
function GxB_Monoid_new_FC64(monoid, op, identity)
309310
@wraperror ccall((:GxB_Monoid_new_FC64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, GxB_FC64_t), monoid, op, identity)
310311
end
311-
312+
monoididnew[ComplexF64] = GxB_Monoid_new_FC64
312313
function GrB_Monoid_new_UDT(monoid, op, identity)
313314
@wraperror ccall((:GrB_Monoid_new_UDT, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Ptr{Cvoid}), monoid, op, identity)
314315
end
316+
monoididnew[Any] = GrB_Monoid_new_UDT
315317

318+
const monoidtermnew = Dict{DataType, Function}()
316319
function GxB_Monoid_terminal_new_BOOL(monoid, op, identity, terminal)
317320
@wraperror ccall((:GxB_Monoid_terminal_new_BOOL, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Bool, Bool), monoid, op, identity, terminal)
318321
end
319-
322+
monoidtermnew[Bool] = GxB_Monoid_terminal_new_BOOL
320323
function GxB_Monoid_terminal_new_INT8(monoid, op, identity, terminal)
321324
@wraperror ccall((:GxB_Monoid_terminal_new_INT8, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int8, Int8), monoid, op, identity, terminal)
322325
end
323-
326+
monoidtermnew[Int8] = GxB_Monoid_terminal_new_INT8
324327
function GxB_Monoid_terminal_new_UINT8(monoid, op, identity, terminal)
325328
@wraperror ccall((:GxB_Monoid_terminal_new_UINT8, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt8, UInt8), monoid, op, identity, terminal)
326329
end
327-
330+
monoidtermnew[UInt8] = GxB_Monoid_terminal_new_UINT8
328331
function GxB_Monoid_terminal_new_INT16(monoid, op, identity, terminal)
329332
@wraperror ccall((:GxB_Monoid_terminal_new_INT16, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int16, Int16), monoid, op, identity, terminal)
330333
end
331-
334+
monoidtermnew[Int16] = GxB_Monoid_terminal_new_INT16
332335
function GxB_Monoid_terminal_new_UINT16(monoid, op, identity, terminal)
333336
@wraperror ccall((:GxB_Monoid_terminal_new_UINT16, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt16, UInt16), monoid, op, identity, terminal)
334337
end
335-
338+
monoidtermnew[UInt16] = GxB_Monoid_terminal_new_UINT16
336339
function GxB_Monoid_terminal_new_INT32(monoid, op, identity, terminal)
337340
@wraperror ccall((:GxB_Monoid_terminal_new_INT32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int32, Int32), monoid, op, identity, terminal)
338341
end
339-
342+
monoidtermnew[Int32] = GxB_Monoid_terminal_new_INT32
340343
function GxB_Monoid_terminal_new_UINT32(monoid, op, identity, terminal)
341344
@wraperror ccall((:GxB_Monoid_terminal_new_UINT32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt32, UInt32), monoid, op, identity, terminal)
342345
end
343-
346+
monoidtermnew[UInt32] = GxB_Monoid_terminal_new_UINT32
344347
function GxB_Monoid_terminal_new_INT64(monoid, op, identity, terminal)
345348
@wraperror ccall((:GxB_Monoid_terminal_new_INT64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Int64, Int64), monoid, op, identity, terminal)
346349
end
347-
350+
monoidtermnew[Int64] = GxB_Monoid_terminal_new_INT64
348351
function GxB_Monoid_terminal_new_UINT64(monoid, op, identity, terminal)
349352
@wraperror ccall((:GxB_Monoid_terminal_new_UINT64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, UInt64, UInt64), monoid, op, identity, terminal)
350353
end
351-
354+
monoidtermnew[UInt64] = GxB_Monoid_terminal_new_UINT64
352355
function GxB_Monoid_terminal_new_FP32(monoid, op, identity, terminal)
353356
@wraperror ccall((:GxB_Monoid_terminal_new_FP32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Cfloat, Cfloat), monoid, op, identity, terminal)
354357
end
355-
358+
monoidtermnew[Float32] = GxB_Monoid_terminal_new_FP32
356359
function GxB_Monoid_terminal_new_FP64(monoid, op, identity, terminal)
357360
@wraperror ccall((:GxB_Monoid_terminal_new_FP64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Cdouble, Cdouble), monoid, op, identity, terminal)
358361
end
359-
362+
monoidtermnew[Float64] = GxB_Monoid_terminal_new_FP64
360363
function GxB_Monoid_terminal_new_FC32(monoid, op, identity, terminal)
361364
@wraperror ccall((:GxB_Monoid_terminal_new_FC32, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, GxB_FC32_t, GxB_FC32_t), monoid, op, identity, terminal)
362365
end
363-
366+
monoidtermnew[ComplexF32] = GxB_Monoid_terminal_new_FC32
364367
function GxB_Monoid_terminal_new_FC64(monoid, op, identity, terminal)
365368
@wraperror ccall((:GxB_Monoid_terminal_new_FC64, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, GxB_FC64_t, GxB_FC64_t), monoid, op, identity, terminal)
366369
end
367-
370+
monoidtermnew[ComplexF64] = GxB_Monoid_terminal_new_FC64
368371
function GxB_Monoid_terminal_new_UDT(monoid, op, identity, terminal)
369372
@wraperror ccall((:GxB_Monoid_terminal_new_UDT, libgraphblas), GrB_Info, (Ptr{GrB_Monoid}, GrB_BinaryOp, Ptr{Cvoid}, Ptr{Cvoid}), monoid, op, identity, terminal)
370373
end
374+
monoidtermnew[Any] = GxB_Monoid_terminal_new_UDT
371375

372376
function GxB_Monoid_operator(op, monoid)
373377
@wraperror ccall((:GxB_Monoid_operator, libgraphblas), GrB_Info, (Ptr{GrB_BinaryOp}, GrB_Monoid), op, monoid)
@@ -381,8 +385,18 @@ function GxB_Monoid_identity(identity, monoid)
381385
@wraperror ccall((:GxB_Monoid_identity, libgraphblas), GrB_Info, (Ptr{Cvoid}, GrB_Monoid), identity, monoid)
382386
end
383387

384-
function GxB_Monoid_terminal(has_terminal, terminal, monoid)
385-
@wraperror ccall((:GxB_Monoid_terminal, libgraphblas), GrB_Info, (Ptr{Bool}, Ptr{Cvoid}, GrB_Monoid), has_terminal, terminal, monoid)
388+
function GxB_Monoid_terminal(T, monoid)
389+
390+
has_terminal = Ref{Bool}()
391+
terminal = Ref{T}()
392+
ccall((:GxB_Monoid_terminal, libgraphblas), GrB_Info, (Ptr{Bool}, Ptr{Cvoid}, GrB_Monoid), has_terminal, terminal, monoid)
393+
has_terminal = has_terminal[]
394+
println(has_terminal)
395+
if has_terminal
396+
return terminal[]
397+
else
398+
return nothing
399+
end
386400
end
387401

388402
function GrB_Monoid_free(monoid)

src/libutils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function load_global(str, type = Cvoid)
7777
end
7878

7979
isGxB(name) = name[1:3] == "GxB"
80-
80+
isGrB(name) = name[1:3] == "GrB"
8181
"""
8282
_print_unsigned_as_signed()
8383

src/operators/binaryops.jl

Lines changed: 85 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ end
44
const BinaryUnion = Union{AbstractBinaryOp, libgb.GrB_BinaryOp}
55

66
function _binarynames(name)
7-
simple = splitconstant(name)[2]
8-
containername = Symbol(simple, "_BINARY_T")
9-
exportedname = Symbol(simple)
10-
return containername, exportedname
7+
118
end
129

1310
#TODO: Rewrite
@@ -66,23 +63,101 @@ function _createbinaryops()
6663
"GxB_SECONDJ1",
6764
]
6865
for name builtins
69-
containername, exportedname = _binarynames(name)
66+
BinaryOp(name)
67+
end
68+
end
69+
70+
function BinaryOp(name)
71+
if isGxB(name) || isGrB(name)
72+
simplifiedname = name[5:end]
73+
else
74+
simplifiedname = name
75+
end
76+
containername = Symbol(simplifiedname, "_T")
77+
exportedname = Symbol(simplifiedname)
78+
if isGxB(name) || isGrB(name)
7079
structquote = quote
7180
struct $containername <: AbstractBinaryOp
7281
pointers::Dict{DataType, libgb.GrB_BinaryOp}
7382
name::String
7483
$containername() = new(Dict{DataType, libgb.GrB_BinaryOp}(), $name)
7584
end
7685
end
77-
@eval(Types, $structquote)
78-
constquote = quote
79-
const $exportedname = Types.$containername()
80-
export $exportedname
86+
else
87+
structquote = quote
88+
mutable struct $containername <: AbstractBinaryOp
89+
pointers::Dict{DataType, libgb.GrB_BinaryOp}
90+
name::String
91+
function $containername()
92+
b = new(Dict{DataType, libgb.GrB_BinaryOp}(), $name)
93+
function f(binaryop)
94+
for k keys(binaryop.pointers)
95+
libgb.GrB_BinaryOp_free(Ref(binaryop.pointers[k]))
96+
delete!(binaryop.pointers, k)
97+
end
98+
end
99+
return finalizer(f, b)
100+
end
101+
end
81102
end
82-
@eval(BinaryOps,$constquote)
83103
end
104+
@eval(Types, $structquote)
105+
constquote = quote
106+
const $exportedname = Types.$containername()
107+
export $exportedname
108+
end
109+
@eval(BinaryOps, $constquote)
110+
return getproperty(BinaryOps, exportedname)
84111
end
85112

113+
#This is adapted from the fork by cvdlab.
114+
function _addbinaryop(
115+
op::AbstractBinaryOp,
116+
fn::Function,
117+
ztype::GBType{T},
118+
xtype::GBType{U},
119+
ytype::GBType{V}
120+
) where {T,U,V}
121+
function binaryopfn(z, x, y)
122+
unsafe_store!(z, fn(x, y))
123+
return nothing
124+
end
125+
opref = Ref{libgb.GrB_BinaryOp}()
126+
binaryopfn_C = @cfunction($binaryopfn, Cvoid, (Ptr{T}, Ref{U}, Ref{V}))
127+
libgb.GrB_BinaryOp_new(opref, binaryopfn_C, ztype, xtype, ytype, op.name)
128+
op.pointers[U] = opref[]
129+
return nothing
130+
end
131+
132+
function BinaryOp(name::String, fn::Function, ztype, xtype, ytype)
133+
op = BinaryOp(name)
134+
_addbinaryop(op, fn, toGBType(ztype), toGBType(xtype), toGBType(ytype))
135+
return op
136+
end
137+
function BinaryOp(name::String, fn::Function, type::DataType)
138+
return BinaryOp(name, fn, type, type, type)
139+
end
140+
function BinaryOp(
141+
name::String,
142+
fn::Function,
143+
ztype::Vector{DataType},
144+
xtype::Vector{DataType},
145+
ytype::Vector{DataType}
146+
)
147+
op = BinaryOp(name)
148+
length(ztype) == length(xtype) == length(ytype) ||
149+
error("Lengths of ztype, xtype, and ytype must match")
150+
for i 1:length(ztype)
151+
_addbinaryop(op, fn, toGBType(ztype[i]), toGBType(xtype[i]), toGBType(ytype[i]))
152+
end
153+
return op
154+
end
155+
function BinaryOp(name::String, fn::Function, type::Vector{DataType})
156+
return BinaryOp(name, fn, type, type, type)
157+
end
158+
function BinaryOp(name::String, fn::Function)
159+
return BinaryOp(name, fn, valid_vec)
160+
end
86161
function _load(binary::AbstractBinaryOp)
87162
booleans = [
88163
"GrB_FIRST",

0 commit comments

Comments
 (0)