44from cfpq_add_context .intersection import intersection
55from cfpq_add_context .gen_automata import generate
66from graphblas .core .dtypes import BOOL , UINT64
7- from graphblas .core .matrix import Matrix
7+ from graphblas .core .matrix import Matrix , Vector
8+ from graphblas import op
89
910from cfpq_matrix .block .block_matrix_space_impl import BlockMatrixSpaceImpl
1011from cfpq_model .cnf_grammar_template import Symbol
@@ -24,6 +25,21 @@ def indexed_to_boolean_decomposition(graph, block_count):
2425 ncols = vertex_count , name = "boolean_decomposition_of_indexed" )
2526 return result
2627
28+ def transitive_reduction (assigns , mask ):
29+ result = Matrix (BOOL , assigns .ncols , assigns .ncols , name = "reduced_assigns" )
30+ result << Matrix .mxm (mask , assigns , "land_lor" )
31+ count = 1
32+ closure = Matrix (BOOL , assigns .ncols , assigns .ncols , name = "closure" )
33+ unused_assigns = Matrix (BOOL , assigns .ncols , assigns .ncols , name = "unused_assigns" )
34+ unused_assigns (~ result .S ) << assigns
35+ closure << unused_assigns
36+ while closure .nvals > 0 :
37+ print ("Closure nvals = " , closure .nvals )
38+ closure << Matrix .mxm (closure , unused_assigns , "land_lor" )
39+ result ("lor" ) << Matrix .mxm (closure , mask , "land_lor" )
40+ closure (~ result ) << closure
41+ return result
42+
2743def to_label_decomposed_graph (graph ):
2844 vertex_count = graph .nrows
2945 alloc = Matrix (BOOL , graph .ncols , graph .nrows , name = "alloc_after_intersection" )
@@ -34,16 +50,6 @@ def to_label_decomposed_graph(graph):
3450 alloc_r << alloc .T
3551 print ("Boolean matrix for alloc_r nvals: " , alloc_r .nvals )
3652
37- assign = Matrix (BOOL , graph .ncols , graph .nrows , name = "assign_after_intersection" )
38- assign << graph .select (graphblas .select .select_assign )
39- print ("Boolean matrix for assign nvals: " , assign .nvals )
40-
41- assign_r = Matrix (BOOL , graph .ncols , graph .nrows , name = "assign_r_after_intersection" )
42- assign_r << assign .T
43- print ("Boolean matrix for assign_r nvals: " , assign_r .nvals )
44-
45- #print_matrix_to_dot(assign_r,"assign_r.dot")
46-
4753 load_i = Matrix (UINT64 , graph .ncols , graph .nrows , name = "load_i_after_intersection" )
4854 load_i << graph .select (graphblas .select .select_load ).apply (graphblas .unary .decode_load )
4955
@@ -56,6 +62,50 @@ def to_label_decomposed_graph(graph):
5662 store_r_i = Matrix (UINT64 , graph .ncols , graph .nrows , name = "store_r_i_after_intersection" )
5763 store_r_i << store_i .T
5864
65+ mask_v = Vector (BOOL , graph .ncols , name = "mask_vector" )
66+ mask_v (op .lor ) << alloc .reduce_columnwise ("lor" )
67+ mask_v (op .lor ) << alloc .reduce_rowwise ("lor" )
68+
69+ mask_v (op .lor ) << load_i .reduce_columnwise ("lor" )
70+ mask_v (op .lor ) << load_i .reduce_rowwise ("lor" )
71+
72+ mask_v (op .lor ) << store_i .reduce_columnwise ("lor" )
73+ mask_v (op .lor ) << store_i .reduce_rowwise ("lor" )
74+
75+ entrypoints = Vector (bool ,graph .nrows , name = "entrypoints" )
76+ entrypoints << graph .reduce_columnwise (op .lor )
77+ mask_v (op .lor ) << Vector .from_coo (list (set (range (0 ,graph .nrows )).difference (entrypoints .to_coo (values = False )[0 ])), values = True , dtype = BOOL )
78+
79+ assign_mask = mask_v .diag (name = "assign_mask" )
80+
81+
82+ assign = Matrix (BOOL , graph .ncols , graph .nrows , name = "assign_after_intersection" )
83+ assign << graph .select (graphblas .select .select_assign )
84+ print ("Boolean matrix for assign nvals: " , assign .nvals )
85+
86+
87+ assign << transitive_reduction (assign , assign_mask )
88+
89+ #assign_res = Matrix(BOOL, graph.ncols, graph.nrows, name = "assign_after_transitive_reduction")
90+ #assign_1 = Matrix.mxm(assign_mask, assign, "land_lor")
91+ #print("Boolean matrix for assign of length 1 nvals: ", assign_1.nvals)
92+ #assign_to_use(~assign_1) << assign
93+ #_continue = True
94+ #while _continue:
95+ # assign_i = Matrix.mxm(assign_to_use, assign_to_use, "land_lor")
96+ # print("Boolean matrix for assign of length 1 nvals: ", assign_i.nvals)
97+ # assign_i_use = Matrix.mxm(assign_mask, assign_i, "land_lor")
98+ # assign_res("lor") << assign_i_use
99+
100+
101+ assign_r = Matrix (BOOL , graph .ncols , graph .nrows , name = "assign_r_after_intersection" )
102+ assign_r << assign .T
103+ print ("Boolean matrix for assign_r nvals: " , assign_r .nvals )
104+
105+ #print_matrix_to_dot(assign_r,"assign_r.dot")
106+
107+
108+
59109 store_block_count = store_i .reduce_scalar ("max" ).get (0 ) + 1
60110 load_block_count = load_i .reduce_scalar ("max" ).get (0 ) + 1
61111 block_count = max (store_block_count , load_block_count )
0 commit comments