/
sybil_rank.py
34 lines (29 loc) · 1.24 KB
/
sybil_rank.py
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
import math
class SybilRank():
def __init__(self, graph, options=None):
self.graph = graph
self.options = options if options else {}
def rank(self):
num_iterations = max(3, int(math.ceil(math.log10(self.graph.order()))))
nodes_rank = {node: node.init_rank for node in self.graph}
for i in range(num_iterations):
nodes_rank = self.spread_nodes_rank(nodes_rank)
for node in self.graph:
node.rank = nodes_rank[node]
node_degree = self.graph.degree(node, weight='weight')
if node_degree > 0:
node.rank /= node_degree
return self.graph
def spread_nodes_rank(self, nodes_rank):
new_nodes_rank = {}
for node in nodes_rank:
new_trust = 0
neighbors = self.graph.neighbors(node)
for neighbor in neighbors:
neighbor_degree = self.graph.degree(neighbor, weight='weight')
edge_weight = self.graph[node][neighbor].get('weight', 1)
if neighbor_degree > 0:
new_trust += nodes_rank[neighbor] * \
edge_weight / neighbor_degree
new_nodes_rank[node] = new_trust
return new_nodes_rank