Skip to content

Commit f7c67ab

Browse files
committed
fix: correct PageRank init, dangling-node handling, and convergence (#14885)
1 parent 791deb4 commit f7c67ab

1 file changed

Lines changed: 21 additions & 10 deletions

File tree

graphs/page_rank.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,29 @@ def __repr__(self):
3131
return f"<node={self.name} inbound={self.inbound} outbound={self.outbound}>"
3232

3333

34-
def page_rank(nodes, limit=3, d=0.85):
35-
ranks = {}
36-
for node in nodes:
37-
ranks[node.name] = 1
34+
def page_rank(nodes, max_iter=100, d=0.85, tol=1e-8):
35+
n = len(nodes)
36+
ranks = {node.name: 1.0 / n for node in nodes}
3837

3938
outbounds = {}
4039
for node in nodes:
4140
outbounds[node.name] = len(node.outbound)
4241

43-
for i in range(limit):
44-
print(f"======= Iteration {i + 1} =======")
45-
for _, node in enumerate(nodes):
46-
ranks[node.name] = (1 - d) + d * sum(
47-
ranks[ib] / outbounds[ib] for ib in node.inbound
42+
for _ in range(max_iter):
43+
dangling_sum = sum(
44+
ranks[node.name] for node in nodes if outbounds[node.name] == 0
45+
)
46+
new_ranks = {}
47+
for node in nodes:
48+
new_ranks[node.name] = (1 - d) / n + d * (
49+
sum(ranks[ib] / outbounds[ib] for ib in node.inbound)
50+
+ dangling_sum / n
4851
)
49-
print(ranks)
52+
if sum(abs(new_ranks[k] - ranks[k]) for k in ranks) < tol:
53+
ranks = new_ranks
54+
break
55+
ranks = new_ranks
56+
return ranks
5057

5158

5259
def main():
@@ -66,6 +73,10 @@ def main():
6673

6774
page_rank(nodes)
6875

76+
ranks = page_rank(nodes)
77+
print("======= Ranks =======")
78+
print(ranks)
79+
6980

7081
if __name__ == "__main__":
7182
main()

0 commit comments

Comments
 (0)