-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathtg_eigenvector_cent.gsql
105 lines (88 loc) · 3.49 KB
/
tg_eigenvector_cent.gsql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
CREATE DISTRIBUTED QUERY tg_eigenvector_cent(SET<STRING> v_type_set, SET<STRING> e_type_set, INT maximum_iteration = 100, FLOAT conv_limit = 0.000001,
INT top_k = 100, BOOL print_results = True, STRING result_attribute = "",STRING file_path = ""
) SYNTAX V1 {
/*
First Author: <First Author Name>
First Commit Date: <First Commit Date>
Recent Author: <Recent Commit Author Name>
Recent Commit Date: <Recent Commit Date>
Repository:
https://github.com/tigergraph/gsql-graph-algorithms/tree/master/algorithms/Centrality
Maturity:
Production
Description:
Compute eigenvector Centrality for each VERTEX.
Publications:
NA
TigerGraph Documentation:
https://docs.tigergraph.com/graph-ml/current/centrality-algorithms/eigenvector-centrality
Parameters:
v_type_set:
vertex types to traverse
e_type_set:
edge types to traverse
maximum_iteration:
max iteration
conv_limit:
convergence limitation
top_k:
report only this many top scores
print_results:
If True, print the results
result_attribute:
attribute to write result to
file_path:
file to write CSV output to
*/
TYPEDEF TUPLE<VERTEX Vertex_ID, FLOAT score> Vertex_Score;
HeapAccum<Vertex_Score>(top_k, score DESC) @@top_scores_heap;
SumAccum<FLOAT> @@sum_squares_eigen_values;
SumAccum<FLOAT> @sum_received_value;
SumAccum<FLOAT> @sum_eigen_value = 1.0;
SumAccum<FLOAT> @@sum_cur_norm_values;
SumAccum<FLOAT> @@sum_prev_norm_values;
FLOAT conv_value = 9999;
FILE f (file_path);
Start = {v_type_set};
WHILE conv_value > conv_limit LIMIT maximum_iteration DO
@@sum_squares_eigen_values = 0;
@@sum_cur_norm_values = 0;
V = SELECT s
FROM Start:s - (e_type_set:e) - v_type_set:t
ACCUM t.@sum_received_value += s.@sum_eigen_value;
V = SELECT s
FROM Start:s
POST-ACCUM s.@sum_eigen_value = s.@sum_received_value,
@@sum_squares_eigen_values += s.@sum_eigen_value * s.@sum_eigen_value,
s.@sum_received_value = 0;
V = SELECT s
FROM V:s
POST-ACCUM s.@sum_eigen_value = s.@sum_eigen_value / sqrt(@@sum_squares_eigen_values),
@@sum_cur_norm_values += s.@sum_eigen_value;
conv_value = abs(@@sum_cur_norm_values - @@sum_prev_norm_values);
@@sum_prev_norm_values = @@sum_cur_norm_values;
END;
#Output
IF file_path != "" THEN
f.println("Vertex_ID", "egien vector");
END;
Start = SELECT s
FROM Start:s
ACCUM
IF s.@sum_eigen_value==1.0 THEN
s.@sum_eigen_value+=-1
END
POST-ACCUM
IF result_attribute != "" THEN
s.setAttr(result_attribute, s.@sum_eigen_value)
END,
IF print_results THEN
@@top_scores_heap += Vertex_Score(s, s.@sum_eigen_value)
END,
IF file_path != "" THEN
f.println(s, s.@sum_eigen_value)
END;
IF print_results THEN
PRINT @@top_scores_heap AS top_scores;
END;
}