|
5 | 5 | SemiringUnion = Union{AbstractSemiring, libgb.GrB_Semiring}
|
6 | 6 |
|
7 | 7 | 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 |
9 | 13 | simple = replace(simple, "_SEMIRING" => "")
|
10 |
| - containername = Symbol(simple, "_RIG_T") |
| 14 | + containername = Symbol(simple, "_T") |
11 | 15 | exportedname = Symbol(simple)
|
12 | 16 | return containername, exportedname
|
13 | 17 | end
|
@@ -229,22 +233,71 @@ function _createsemirings()
|
229 | 233 | ]
|
230 | 234 |
|
231 | 235 | 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) |
233 | 243 | structquote = quote
|
234 | 244 | struct $containername <: AbstractSemiring
|
235 | 245 | pointers::Dict{DataType, libgb.GrB_Semiring}
|
236 | 246 | name::String
|
237 | 247 | $containername() = new(Dict{DataType, libgb.GrB_Semiring}(), $name)
|
238 | 248 | end
|
239 | 249 | 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 |
244 | 266 | end
|
245 |
| - @eval(Semirings,$constquote) |
246 | 267 | 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) |
247 | 275 | 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 | + |
248 | 301 | function _load(rig::AbstractSemiring)
|
249 | 302 | booleans = ["GxB_LOR_FIRST",
|
250 | 303 | "GxB_LAND_FIRST",
|
|
0 commit comments