55from graphblas .core .operator import Semiring , Monoid , SelectOp
66from graphblas .core .dtypes import UINT64
77from graphblas import op , semiring
8- from numba import njit , jit
98import gen_automata
109
1110import labels
@@ -41,15 +40,6 @@ def bfs (matrix, sources):
4140
4241 return reachable
4342
44-
45- def filter_reachable_op (reachable_vertices ):
46- _reachable_vertices = set (reachable_vertices )
47- def inner (x ,i ,j ,k ):
48- return i in _reachable_vertices and j in _reachable_vertices
49- return inner
50-
51- SelectOp .register_new ("filter_reachable" , filter_reachable_op , parameterized = True , is_udt = True )
52-
5343def filter_not_zero_op (x ,i ,j ,k ):
5444 return x > 0
5545
@@ -63,25 +53,10 @@ def intersection (graph, automata) :
6353 print_matrix_to_dot (intersection , "kron.dot" )
6454
6555 sources = [i * automata .nrows for i in range (0 ,graph .nrows )]
66- #reachable = frozenset(bfs(intersection, sources).to_coo(values=False)[0])
67- #reachable_vertices = set(bfs(intersection, sources).to_coo(values=False)[0])
6856
6957 reachable_vertices_mask = bfs (intersection , sources ).diag (name = "reachable_vertices_mask" )
7058
71- #def filter_reachable_op(x,i,j,k):
72- # return i in reachable_vertices and j in reachable_vertices
73-
74- #SelectOp.register_new("filter_reachable", filter_reachable_op, is_udt=True)
75-
76- #print("reachable = ", reachable_vertices)
77- #print("num of reachable = ", len(reachable_vertices))
78- #edges = intersection.to_edgelist()
79- #edges = zip(edges[0],edges[1])
80- #new_edges = [(_edg[0],_edg[1],_lbl) for (_edg,_lbl) in edges if _edg[0] in reachable_vertices and _edg[1] in reachable_vertices]
81- #result = Matrix.from_edgelist(new_edges, dtype=intersection.dtype, nrows=intersection.nrows, ncols=intersection.ncols, name = "filtered intersection")
8259 result = Matrix (intersection .dtype , intersection .nrows , intersection .ncols , name = "filtered intersection" )
83- #result << intersection.select(graphblas.select.filter_reachable(reachable_vertices=reachable_vertices))
84- #result << intersection.select(graphblas.select.filter_reachable)
8560 result << reachable_vertices_mask @ intersection
8661 print_matrix_to_dot (result , "kron_filtered.dot" )
8762 return result
@@ -95,7 +70,6 @@ def test():
9570
9671 i = intersection (graph , automata )
9772
98- #print_matrix_to_dot(intersection, "kron.dot")
9973
10074def test2 ():
10175 graph_edges = [(0 ,0 ,(labels .mk_open_context (1 ))),(0 ,1 ,(labels .mk_open_context (1 ))),(1 ,1 ,(labels .mk_close_context (1 )))]
@@ -146,6 +120,10 @@ def test7():
146120 i = intersection (graph , automata )
147121
148122def test8 ():
149- automata1 = gen_automata .generate (1 )
150- automata2 = gen_automata .generate (1 )
151- i = intersection (automata1 , automata2 )
123+ graph_edges = [(0 ,0 ,1 ),(0 ,1 ,2 ),(1 ,1 ,3 ),(0 ,2 ,4 ),(2 ,0 ,5 ),(2 ,2 ,3 )]
124+
125+ graph1 = Matrix .from_edgelist (graph_edges ,dtype = UINT64 , nrows = 6 , ncols = 6 , name = "graph1" )
126+ graph2 = Matrix .from_edgelist (graph_edges ,dtype = UINT64 , nrows = 6 , ncols = 6 , name = "graph2" )
127+
128+ i = graph1 .kronecker (graph2 )
129+ print_matrix_to_dot (i , "kron_build.dot" )
0 commit comments