Skip to content

Commit 8a2b0b7

Browse files
author
Wimmerer
committed
Semiring udfs
1 parent 6dbdf9f commit 8a2b0b7

File tree

3 files changed

+62
-9
lines changed

3 files changed

+62
-9
lines changed

src/operators/binaryops.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ function _addbinaryop(
118118
xtype::GBType{U},
119119
ytype::GBType{V}
120120
) where {T,U,V}
121+
println(T)
121122
function binaryopfn(z, x, y)
122123
unsafe_store!(z, fn(x, y))
123124
return nothing

src/operators/monoids.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ function _createmonoids()
3737
end
3838
end
3939
function Monoid(name)
40-
println(name)
4140
containername, exportedname = _monoidnames(name)
4241
if isGxB(name) || isGrB(name)
4342
structquote = quote

src/operators/semirings.jl

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ end
55
SemiringUnion = Union{AbstractSemiring, libgb.GrB_Semiring}
66

77
function _semiringnames(name)
8-
simple = name[5:end]
8+
if isGxB(name) || isGrB(name)
9+
simple = name[5:end]
10+
else
11+
simple = name
12+
end
913
simple = replace(simple, "_SEMIRING" => "")
10-
containername = Symbol(simple, "_RIG_T")
14+
containername = Symbol(simple, "_T")
1115
exportedname = Symbol(simple)
1216
return containername, exportedname
1317
end
@@ -229,22 +233,71 @@ function _createsemirings()
229233
]
230234

231235
for name builtins
232-
containername, exportedname = _semiringnames(name)
236+
Semiring(name)
237+
end
238+
end
239+
240+
function Semiring(name)
241+
containername, exportedname = _semiringnames(name)
242+
if isGxB(name) || isGrB(name)
233243
structquote = quote
234244
struct $containername <: AbstractSemiring
235245
pointers::Dict{DataType, libgb.GrB_Semiring}
236246
name::String
237247
$containername() = new(Dict{DataType, libgb.GrB_Semiring}(), $name)
238248
end
239249
end
240-
@eval(Types, $structquote)
241-
constquote = quote
242-
const $exportedname = Types.$containername()
243-
export $exportedname
250+
else
251+
structquote = quote
252+
mutable struct $containername <: AbstractSemiring
253+
pointers::Dict{DataType, libgb.GrB_Semiring}
254+
name::String
255+
function $containername()
256+
r = new(Dict{DataType, libgb.GrB_Semiring}(), $name)
257+
function f(rig)
258+
for k keys(rig.pointers)
259+
libgb.GrB_Semiring_free(Ref(rig.pointers[k]))
260+
delete!(rig.pointers, k)
261+
end
262+
end
263+
return finalizer(f, r)
264+
end
265+
end
244266
end
245-
@eval(Semirings,$constquote)
246267
end
268+
@eval(Types, $structquote)
269+
constquote = quote
270+
const $exportedname = Types.$containername()
271+
export $exportedname
272+
end
273+
@eval(Semirings,$constquote)
274+
return getproperty(Semirings, exportedname)
247275
end
276+
277+
function _addsemiring(rig::AbstractSemiring, add::libgb.GrB_Monoid, mul::libgb.GrB_BinaryOp)
278+
rigref = Ref{libgb.GrB_Semiring}()
279+
libgb.GrB_Semiring_new(rigref, add, mul)
280+
rig.pointers[xtype(add)] = rigref[]
281+
return nothing
282+
end
283+
284+
function Semiring(name::String, add::libgb.GrB_Monoid, mul::libgb.GrB_BinaryOp)
285+
rig = Semiring(name)
286+
_addsemiring(rig, add, mul)
287+
return rig
288+
end
289+
290+
function Semiring(name::String, add::AbstractMonoid, mul::AbstractBinaryOp)
291+
tadd = validtypes(add)
292+
tmul = validtypes(mul)
293+
trig = intersect(tadd, tmul)
294+
rig = Semiring(name)
295+
for t trig
296+
_addsemiring(rig, add[t], mul[t])
297+
end
298+
return rig
299+
end
300+
248301
function _load(rig::AbstractSemiring)
249302
booleans = ["GxB_LOR_FIRST",
250303
"GxB_LAND_FIRST",

0 commit comments

Comments
 (0)