Skip to content

Commit 6361d78

Browse files
committed
feat: implement simple pagerank without teleportations
1 parent 6e068cd commit 6361d78

File tree

2 files changed

+92
-20
lines changed

2 files changed

+92
-20
lines changed

data/image.png

2.38 KB
Loading

src/main.c

Lines changed: 92 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ void exp_binop(double *z, const double *x)
111111

112112
void F_op(double *z, const EdgeTX *x)
113113
{
114-
*z = log(x->sum);
114+
*z = (x->sum/1000)/(x->count);
115115
}
116116
void divide(double *z, const double *x, const double *y)
117117
{
@@ -124,20 +124,20 @@ GrB_Type tx_edge;
124124
GrB_Info init_edges(GrB_Matrix *tx_mat, GrB_Matrix *owns_mat)
125125
{
126126
GrB_Info info;
127-
EdgeTX edge56 = {2223412.0, 56};
128-
EdgeTX edge59 = {6223412.0, 59};
129-
EdgeTX edge67 = {8913212.0, 67};
130-
EdgeTX edge69 = {92223412.0, 69};
131-
EdgeTX edge65 = {133214.1, 65};
132-
EdgeTX edge95 = {1267325.99, 95};
133-
EdgeTX edge611 = {1999999.1, 611};
134-
EdgeTX edge116 = {6999999.1, 116};
135-
EdgeTX edge511 = {9999999.1, 511};
136-
EdgeTX edge115 = {8999999.1, 115};
137-
EdgeTX edge127 = {8999999.1, 127};
138-
EdgeTX edge712 = {8999999.1, 712};
139-
EdgeTX edge912 = {899999999.1, 912};
140-
EdgeTX edge129 = {99999999.1, 129};
127+
EdgeTX edge56 = {23412.0, 6};
128+
EdgeTX edge59 = {62412.0, 9};
129+
EdgeTX edge67 = {81312.0, 7};
130+
EdgeTX edge69 = {92223.0, 9};
131+
EdgeTX edge65 = {13214.1, 5};
132+
EdgeTX edge95 = {16325.99, 9};
133+
EdgeTX edge611 = {19999.1, 6};
134+
EdgeTX edge116 = {69999.1, 16};
135+
EdgeTX edge511 = {99999.1, 5};
136+
EdgeTX edge115 = {79999.1, 15};
137+
EdgeTX edge127 = {59999.1, 12};
138+
EdgeTX edge712 = {8999.1, 7};
139+
EdgeTX edge912 = {49999.1, 12};
140+
EdgeTX edge129 = {999999.1, 9};
141141

142142
TRY(GrB_Matrix_setElement_UDT(*tx_mat, &edge56, 4, 5));
143143
TRY(GrB_Matrix_setElement_UDT(*tx_mat, &edge59, 4, 8));
@@ -207,7 +207,80 @@ GrB_Info init_vertices(GrB_Vector *users, GrB_Vector *cards)
207207
return GrB_SUCCESS;
208208
}
209209

210-
GrB_Info banking_page_rank(GrB_Matrix tx_edge_mat, GrB_Matrix owns_edge_mat, GrB_Vector users, GrB_Vector cards){
210+
int LAGr_PageRank_NoTeleport(
211+
GrB_Vector *centrality,
212+
int *iters,
213+
const LAGraph_Graph G,
214+
float tol,
215+
int itermax)
216+
{
217+
GrB_Vector r = NULL, t = NULL;
218+
GrB_Matrix AT = NULL;
219+
220+
// ------------------------------------------------------------------------
221+
// select adjacency matrix (use transpose if directed)
222+
// ------------------------------------------------------------------------
223+
if (G->kind == LAGraph_ADJACENCY_UNDIRECTED ||
224+
G->is_symmetric_structure == LAGraph_TRUE)
225+
{
226+
AT = G->A;
227+
}
228+
else
229+
{
230+
AT = G->AT;
231+
}
232+
233+
// ------------------------------------------------------------------------
234+
// initialization
235+
// ------------------------------------------------------------------------
236+
GrB_Index n;
237+
GrB_Matrix_nrows(&n, AT);
238+
239+
GrB_Vector_new(&t, GrB_FP64, n);
240+
GrB_Vector_new(&r, GrB_FP64, n);
241+
242+
double init = 1.0 / (double)n;
243+
GrB_assign(r, NULL, NULL, init, GrB_ALL, n, NULL);
244+
245+
double rdiff = 1.0;
246+
247+
// ------------------------------------------------------------------------
248+
// iterations
249+
// ------------------------------------------------------------------------
250+
for ((*iters) = 0; rdiff > tol && (*iters) < itermax; (*iters)++)
251+
{
252+
// swap
253+
GrB_Vector temp = t;
254+
t = r;
255+
r = temp;
256+
257+
// r = A' * t
258+
GrB_mxv(r, NULL, NULL, GxB_PLUS_TIMES_FP64, AT, t, NULL);
259+
260+
// normalize r so that sum(r) = 1
261+
double sum_r = 0.0;
262+
GrB_reduce(&sum_r, NULL, GrB_PLUS_MONOID_FP64, r, NULL);
263+
if (sum_r > 0.0)
264+
{
265+
GrB_apply(r, NULL, NULL, GrB_DIV_FP64, r, sum_r, NULL);
266+
}
267+
268+
// compute difference
269+
GrB_assign(t, NULL, GrB_MINUS_FP64, r, GrB_ALL, n, NULL);
270+
GrB_apply(t, NULL, NULL, GrB_ABS_FP64, t, NULL);
271+
GrB_reduce(&rdiff, NULL, GrB_PLUS_MONOID_FP64, t, NULL);
272+
}
273+
274+
// ------------------------------------------------------------------------
275+
// finalize
276+
// ------------------------------------------------------------------------
277+
*centrality = r;
278+
GrB_free(&t);
279+
return GrB_SUCCESS;
280+
}
281+
282+
GrB_Info banking_page_rank(GrB_Matrix tx_edge_mat, GrB_Matrix owns_edge_mat, GrB_Vector users, GrB_Vector cards)
283+
{
211284
// ------------------------------------------------------------------------
212285
// build user filters
213286
// ------------------------------------------------------------------------
@@ -337,7 +410,7 @@ GrB_Info banking_page_rank(GrB_Matrix tx_edge_mat, GrB_Matrix owns_edge_mat, GrB
337410

338411
GrB_Vector id_final;
339412
TRY(GrB_Vector_new(&id_final, GrB_FP64, VERTICES_NUMBER));
340-
TRY(GrB_Vector_assign_BOOL(id_final, NULL, NULL, 1.0, GrB_ALL, VERTICES_NUMBER, NULL));
413+
TRY(GrB_Vector_assign_BOOL(id_final, NULL, NULL, true, GrB_ALL, VERTICES_NUMBER, NULL));
341414
GrB_Matrix v_mat, id_mat;
342415
TRY(GrB_Matrix_new(&v_mat, GrB_FP64, VERTICES_NUMBER, 1));
343416
TRY(GrB_Col_assign(v_mat, NULL, NULL, EXPSUMvec, GrB_ALL, VERTICES_NUMBER, 0, NULL));
@@ -374,7 +447,7 @@ GrB_Info banking_page_rank(GrB_Matrix tx_edge_mat, GrB_Matrix owns_edge_mat, GrB
374447

375448
TRY(LAGraph_Cached_OutDegree(G, msg));
376449

377-
TRY(LAGr_PageRank(&pagerank_ans, &iteraions, G, 0.85, 1e-4, 100, msg));
450+
TRY(LAGr_PageRank_NoTeleport(&pagerank_ans, &iteraions, G, 1e-4, 100));
378451
GxB_print(pagerank_ans, GxB_COMPLETE);
379452
}
380453

@@ -416,6 +489,5 @@ int main()
416489
// run solver
417490
// ------------------------------------------------------------------------
418491

419-
TRY(banking_page_rank(tx_edge_mat,owns_edge_mat,users,cards));
420-
492+
TRY(banking_page_rank(tx_edge_mat, owns_edge_mat, users, cards));
421493
}

0 commit comments

Comments
 (0)