Skip to content

Commit 2565a0e

Browse files
added Louvain Iset, not complete
1 parent fb582c2 commit 2565a0e

File tree

9 files changed

+120
-95
lines changed

9 files changed

+120
-95
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"files.associations": {
33
"lg_internal.h": "c",
4-
"lagraphx.h": "c"
4+
"lagraphx.h": "c",
5+
"random": "c"
56
},
67
"C_Cpp.errorSquiggles": "enabled"
78
}

experimental/algorithm/LAGraph_IsolateSets.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
GrB_free(&Seed) ; \
1818
GrB_free(&degree) ; \
1919
}
20-
#define DEBUG 1
20+
#define DEBUG 0
2121
#define dbg(x) if (DEBUG) GxB_print(x,5)
2222
typedef GrB_Matrix mat;
2323
typedef GrB_Vector vec ;
@@ -49,7 +49,7 @@ int LAGraph_IsolateSets(
4949
GrB_Vector degree = NULL ; // (float) G->out_degree
5050
GrB_Matrix A ; // G->A, the adjacency matrix
5151
GrB_Index n ; // # of nodes
52-
printf("in Isolate set algorithm");
52+
// printf("in Isolate set algorithm");
5353
LG_TRY (LAGraph_CheckGraph (G, msg)) ;
5454
LG_ASSERT(isolate_set != NULL, GrB_NULL_POINTER);
5555
A = G->A;
@@ -69,8 +69,8 @@ int LAGraph_IsolateSets(
6969
GRB_TRY (GrB_Vector_new (&scoreA, GrB_FP32, n)) ;
7070

7171
//rand
72-
seed = 123;
73-
printf("%ld",seed);
72+
// seed = 6247;
73+
// printf("%ld",seed);
7474
GRB_TRY (GrB_assign (Seed, NULL, NULL, 1, GrB_ALL, n, NULL));
7575
GRB_TRY (LAGraph_Random_Seed (Seed, seed, msg)) ;
7676
dbg(Seed);
@@ -101,7 +101,7 @@ int LAGraph_IsolateSets(
101101
dbg(new_members);
102102
GRB_TRY (GrB_assign (iset, new_members, NULL,true,GrB_ALL,n,NULL)) ;
103103
(*isolate_set) = iset;
104-
printf("done iset");
104+
// printf("done iset");
105105
iset = NULL;
106106
LG_FREE_ALL;
107107
return 0;

experimental/algorithm/LAGraph_Louvain.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ int LAGraph_Louvain(
5353
)
5454
{
5555
char MATRIX_TYPE[LAGRAPH_MSG_LEN];
56-
GrB_set (GrB_GLOBAL, true, GxB_BURBLE);
56+
GrB_set (GrB_GLOBAL, false, GxB_BURBLE);
5757
//assignment of monoids, bops, and semis
5858
GrB_Monoid plusmon = GrB_PLUS_MONOID_FP64;
5959
GrB_Monoid maxmon = GrB_MAX_MONOID_FP64;
@@ -103,6 +103,8 @@ int LAGraph_Louvain(
103103
GRB_TRY(GrB_assign (x, NULL, NULL, 1, GrB_ALL, n, NULL)) ;
104104
// GxB_print(i,5);
105105
GRB_TRY(GrB_Matrix_diag(&S,x,0));
106+
GRB_TRY(GrB_set(S,false,GxB_ISO));
107+
GrB_set (S, GxB_SPARSE, GxB_SPARSITY_CONTROL);
106108
GxB_print(S,5);
107109

108110
//var used in for loop
@@ -116,6 +118,7 @@ int LAGraph_Louvain(
116118
GRB_TRY(GrB_Vector_new(&q1, GrB_FP64, n));
117119
GRB_TRY(GrB_Vector_new(&t, GrB_BOOL, n));
118120
GRB_TRY(GrB_Vector_new(&p,GrB_FP64,n));
121+
GRB_TRY(GxB_Container_new(&S_container));
119122

120123
// int64_t vc = vertices_changed;
121124
bool changed = true;
@@ -127,7 +130,7 @@ int LAGraph_Louvain(
127130
for(int i=0;i<n;i++){//extract tuples
128131
// v = A(i,:)
129132
GRB_TRY (GrB_Col_extract (v, NULL, NULL, A, GrB_ALL, b, i,GrB_DESC_T0));
130-
// GxB_print(v,5);
133+
GxB_print(v,5);
131134

132135
// -- extract k_i
133136
GRB_TRY(GrB_Vector_extractElement_FP64(&k_i,k,i));
@@ -139,7 +142,7 @@ int LAGraph_Louvain(
139142
// sr = S(i,:)
140143

141144
GRB_TRY(GrB_Col_extract(sr,NULL,NULL,S,GrB_ALL,1,i,GrB_DESC_T0));
142-
// GxB_print(sr,5);
145+
GxB_print(sr,5);
143146

144147
//S(i,:) = empty
145148
GRB_TRY(GxB_unload_Matrix_into_Container(S,S_container,NULL));
@@ -159,18 +162,19 @@ int LAGraph_Louvain(
159162

160163
//q += v
161164
GRB_TRY(GrB_eWiseAdd(q,NULL,NULL,plusf64,q,v,NULL));
162-
// GxB_print(q,5);
165+
GxB_print(q,5);
163166

164167
//q_1<t_q> = q +.x S O(n)
165168
GRB_TRY(GrB_Vector_clear(q1));
166-
GRB_TRY(GrB_vxm(q1,t_q,NULL,stdmxm,q,S,GrB_DESC_R));
167-
// GxB_print(q1,5);
168-
169+
GxB_print(S,5);
170+
GRB_TRY(GrB_vxm(q1,t_q,NULL,stdmxm,q,S,GrB_DESC_S));
171+
GxB_print(q1,5);
169172
//t = (q1 == [max_i q_1(i)])
170-
double max_q1;
171-
GRB_TRY(GrB_Vector_reduce_FP64(&max_q1,NULL,maxmon,q1,NULL));
173+
double max_q1=0;
174+
GRB_TRY(GrB_Vector_reduce_FP64(&max_q1,NULL,GrB_MAX_MONOID_FP64,q1,NULL));
175+
printf("%ld",max_q1);
172176
GRB_TRY(GrB_Vector_select_FP64(t,NULL,NULL,GrB_VALUEEQ_FP64,q1,max_q1,NULL));
173-
// GxB_print(t,5);
177+
GxB_print(t,5);
174178

175179

176180
GRB_TRY(GrB_Vector_nvals(&nvals_t,t));
@@ -185,13 +189,13 @@ int LAGraph_Louvain(
185189
double y = rd();
186190
GRB_TRY(GrB_Vector_setElement_FP64(p,y*p_vals[j],p_cs[j]));
187191
}
188-
// GxB_print(p,5);
192+
GxB_print(p,5);
189193
//t = (p== [max_i p_1(i)])
190194
double max_p;
191195
GRB_TRY(GrB_Vector_reduce_FP64(&max_p,NULL,maxmon,p,NULL));
192196
// printf("max_p:%f\n",max_p);
193197
GRB_TRY(GrB_Vector_select_FP64(t,NULL,NULL,GrB_VALUEEQ_FP64,p,max_p,NULL));
194-
// GxB_print(t,5);
198+
GxB_print(t,5);
195199
GRB_TRY(GrB_Vector_nvals(&nvals_t,t));
196200
free(p_cs);
197201
free(p_vals);

experimental/algorithm/LAGraph_Louvain2.c

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
GrB_free (&t) ; \
3939
GrB_free (&t_q) ; \
4040
GrB_free (&Theta) ; \
41-
GrB_free (&Semiring) ; \
42-
GrB_free (&Mon) ; \
41+
GrB_free (&IBop_MAX) ; \
42+
GrB_free (&MAXFP64_mon) ; \
4343
GrB_free (&Tuple) ; \
4444
GrB_free (&dS) ; \
4545
GrB_free (&dSTk) ; \
@@ -49,12 +49,8 @@
4949
GrB_free (&max_q1) ; \
5050
GrB_free (&za) ; \
5151
GrB_free (&z_dSTk) ; \
52-
LAGraph_Free ((void *) &Sp, NULL) ; \
53-
LAGraph_Free ((void *) &Sj, NULL) ; \
54-
LAGraph_Free ((void *) &dSp, NULL) ; \
55-
LAGraph_Free ((void *) &dSj, NULL) ; \
5652
}
57-
#define DEBUG 0
53+
#define DEBUG 1
5854
#define dbg(x) if (DEBUG) GxB_print(x,5)
5955
// uint64_t seed = 213;
6056
typedef struct tuple_fp64{
@@ -71,8 +67,10 @@ void make_fp64(tuple_fp64 *z,
7167
z->k = (int64_t)jx;
7268
z->v = (*x);
7369
uint64_t seed = (*y + ix + iy + jy);
74-
uint64_t tb = LG_Random64(&seed);
75-
z->tb = tb;
70+
seed ^= seed << 13 ;
71+
seed ^= seed >> 7 ;
72+
seed ^= seed << 17 ;
73+
z->tb = seed;
7674
}
7775
void max_fp64(tuple_fp64 *z, const tuple_fp64 *x, const tuple_fp64 *y){
7876

@@ -100,16 +98,18 @@ void max_fp64(tuple_fp64 *z, const tuple_fp64 *x, const tuple_fp64 *y){
10098
" } \n" \
10199
"}"
102100
#define MAKE_FP64 \
103-
"void make_fp64(tuple_fp64 *z, \n" \
104-
" const double *x, GrB_Index ix, GrB_Index jx, \n" \
105-
" const uint64_t *y, GrB_Index iy, GrB_Index jy, \n" \
106-
" const void *theta) \n" \
107-
"{ \n" \
108-
" z->k = (int64_t)jx; \n" \
109-
" z->v = (*x); \n" \
101+
"void make_fp64(tuple_fp64 *z, \n"\
102+
" const double *x, GrB_Index ix, GrB_Index jx, \n"\
103+
" const uint64_t *y, GrB_Index iy, GrB_Index jy, \n"\
104+
" const void *theta) \n"\
105+
"{ \n"\
106+
" z->k = (int64_t)jx; \n"\
107+
" z->v = (*x); \n"\
110108
" uint64_t seed = (*y + ix + iy + jy); \n"\
111-
" uint64_t tb = LG_Random64(&seed);\n"\
112-
" z->tb = tb;\n"\
109+
" seed ^= seed << 13 ; \n"\
110+
" seed ^= seed >> 7 ;\n"\
111+
" seed ^= seed << 17 ;\n"\
112+
" z->tb = seed; \n"\
113113
"}"
114114

115115

@@ -126,7 +126,7 @@ int LAGraph_Louvain2(
126126

127127
char MATRIX_TYPE[LAGRAPH_MSG_LEN];
128128
if (DEBUG)
129-
GrB_set (GrB_GLOBAL, true, GxB_BURBLE);
129+
GrB_set (GrB_GLOBAL, false, GxB_BURBLE);
130130

131131
//assignment of monoids, bops, and semis
132132
GrB_Monoid plusmon = GrB_PLUS_MONOID_FP64;
@@ -140,9 +140,6 @@ int LAGraph_Louvain2(
140140
GrB_Semiring stdmxm = GrB_PLUS_TIMES_SEMIRING_FP64;
141141
GrB_Semiring anypB = GxB_ANY_PAIR_FP64 ;
142142

143-
double *Sx = NULL ; //try S as double not bool
144-
GrB_Index *Sp = NULL , *Sj = NULL, Sp_size = 0, Sj_size = 0, Sx_size = 0 ;
145-
bool S_jumbled = false, S_iso = false;
146143
GrB_Vector t_q = NULL, q1=NULL, t=NULL,v=NULL;
147144
GrB_Vector k = NULL ;
148145
GrB_Vector x = NULL ;
@@ -151,24 +148,26 @@ int LAGraph_Louvain2(
151148
GrB_Vector z_dSTk = NULL;
152149
GrB_Index n,b;
153150
GrB_Matrix S = NULL;
151+
GrB_Matrix dS= NULL;
154152
GrB_Vector sr = NULL;
155-
GrB_Semiring Semiring = NULL ;
156153
GrB_Vector srxq = NULL;
157154
GrB_Index vals_srxq;
158155
GrB_Matrix dS = NULL ;
159156
GrB_Vector dSTk = NULL, vtS = NULL ;
160157
GrB_Vector temp = NULL ;
161158
GrB_Vector y_rand = NULL ;
162159
GrB_Vector max_q1 = NULL ;
163-
GxB_IndexBinaryOp Iop = NULL ;
164-
GrB_BinaryOp Bop = NULL, MonOp = NULL ;
160+
161+
GrB_Semiring IBop_MAX = NULL ;
162+
GxB_IndexBinaryOp MAKEFP64_op = NULL ;
163+
GrB_BinaryOp MAKEFP64_Bop = NULL, MAXFP64_op = NULL ;
165164
GrB_Scalar Theta = NULL ;
166165
GrB_Type Tuple = NULL ;
167-
GrB_Monoid Mon = NULL ;
166+
GrB_Monoid MAXFP64_mon = NULL ;
167+
168+
168169
GxB_Container S_container = NULL;
169-
double *dSx = NULL ;
170-
GrB_Index *dSp = NULL, *dSj = NULL, dSp_size, dSj_size, dSx_size ;
171-
bool dS_jumbled = false, dS_iso = false ;
170+
GxB_Container dS_container = NULL;
172171
GrB_Index q1_size;
173172
//GrB_Container
174173
tuple_fp64 o;
@@ -187,15 +186,15 @@ int LAGraph_Louvain2(
187186
GRB_TRY(GrB_Scalar_new(&Theta, GrB_BOOL));
188187
GRB_TRY(GrB_Scalar_setElement_BOOL(Theta, 0));
189188
GRB_TRY(GxB_Type_new(&Tuple, sizeof(tuple_fp64), "tuple_fp64", FP64_K));
190-
GRB_TRY(GxB_IndexBinaryOp_new(&Iop,(GxB_index_binary_function)make_fp64, Tuple, GrB_FP64, GrB_UINT64, GrB_BOOL,"make_fp64", MAKE_FP64));
191-
GRB_TRY(GxB_BinaryOp_new_IndexOp(&Bop, Iop, Theta));
189+
GRB_TRY(GxB_IndexBinaryOp_new(&MAKEFP64_op,(GxB_index_binary_function)make_fp64, Tuple, GrB_FP64, GrB_UINT64, GrB_BOOL,"make_fp64", MAKE_FP64));
190+
GRB_TRY(GxB_BinaryOp_new_IndexOp(&MAKEFP64_Bop, MAKEFP64_op, Theta));
192191
tuple_fp64 id;
193192
memset(&id, 0, sizeof(tuple_fp64));
194193
id.k = INT64_MAX;
195194
id.v = (double)(-INFINITY);
196-
GRB_TRY(GxB_BinaryOp_new(&MonOp,(GxB_binary_function)max_fp64, Tuple, Tuple, Tuple, "max_fp64", MAX_FP64));
197-
GRB_TRY(GrB_Monoid_new_UDT(&Mon, MonOp, &id));
198-
GRB_TRY(GrB_Semiring_new(&Semiring, Mon, Bop));
195+
GRB_TRY(GxB_BinaryOp_new(&MAXFP64_op,(GxB_binary_function)max_fp64, Tuple, Tuple, Tuple, "max_fp64", MAX_FP64));
196+
GRB_TRY(GrB_Monoid_new_UDT(&MAXFP64_mon, MAXFP64_op, &id));
197+
GRB_TRY(GrB_Semiring_new(&IBop_MAX, MAXFP64_mon, MAKEFP64_Bop));
199198
//------------------------------------------------------------------------------------------------------------------
200199

201200

@@ -245,7 +244,7 @@ int LAGraph_Louvain2(
245244
bool changed = true;
246245
int max_iter = 20;
247246
int iter =0;
248-
uint64_t seed = 231;
247+
uint64_t seed = 12314;
249248

250249
// GxB_print(y_rand,5);
251250
GRB_TRY(GrB_mxv(z,NULL,NULL,stdmxm,S,k,NULL));
@@ -269,28 +268,29 @@ int LAGraph_Louvain2(
269268

270269
//sr = S(i,:)
271270
GRB_TRY(GrB_Col_extract(sr,NULL,NULL,S,GrB_ALL,1,i,GrB_DESC_T0));
272-
// GxB_print(sr,5);
271+
GxB_print(sr,5);
273272

274-
//S(i,:) = empty
273+
//S(i,:) = 0/false
275274
GRB_TRY(GxB_unload_Matrix_into_Container(S,S_container,NULL));
276275
GRB_TRY(GrB_Vector_setElement_BOOL(S_container->x,false,i));
277276
GRB_TRY(GxB_load_Matrix_from_Container(S,S_container,NULL));
278-
277+
dbg(S);
279278

280279

281280
////////////////////////////////////////////////////////////
282281
//-------------q1<t_q> = a(kTS)+vTS----------- -----------//
282+
//-------------q1<t_q> = z+vTS----------------------------//
283283
// double alpha_p = 1;
284284
double alpha = -k_i/m;
285285

286286
GRB_TRY(GrB_Vector_apply_BinaryOp2nd_FP64(za,NULL,NULL,timesf64,z,alpha,GrB_DESC_T0));
287-
287+
dbg(za);
288288

289289
GRB_TRY(GrB_eWiseAdd(za,NULL,NULL,plusf64,za,v,NULL));
290290
// printf("z*alpha + v\n");
291-
// GxB_print(za,5);
291+
dbg(za);
292292
GRB_TRY(GrB_vxm(q1,t_q,NULL,stdmxm,za,S,GrB_DESC_R));
293-
// dbg(q1);
293+
dbg(q1);
294294
///////////////////////////////////////////////////////////
295295

296296
///////////////////////////////////////////////////////////
@@ -303,7 +303,7 @@ int LAGraph_Louvain2(
303303
GRB_TRY (GrB_assign (y_rand, t_q, NULL, seed, GrB_ALL, n, GrB_DESC_S));
304304

305305
// GxB_print(q1,5);
306-
GRB_TRY(GrB_mxv(max_q1,NULL,NULL,Semiring,(GrB_Matrix)q1,y_rand,GrB_DESC_T0));
306+
GRB_TRY(GrB_mxv(max_q1,NULL,NULL,IBop_MAX,(GrB_Matrix)q1,y_rand,GrB_DESC_T0));
307307
// GxB_print(q1,5);
308308

309309
GRB_TRY(GrB_Vector_extractElement_UDT((void*)&o,max_q1,0));
@@ -327,14 +327,14 @@ int LAGraph_Louvain2(
327327
if(vals_srxq==0){
328328
changed = true;
329329
}
330-
// if(i==0)break;
330+
// if(i==3)break;
331331

332332
}
333333
iter++;
334334
// break;
335335
// printf("changed: %i\n", changed);
336336
}
337-
// GxB_print(S,5);
337+
GxB_print(S,5);
338338
double Q;
339339
double gamma = 1;
340340
GRB_TRY(LAGr_Modularity2(&Q,gamma,A,S,msg));

0 commit comments

Comments
 (0)