Skip to content

Commit 3206395

Browse files
meenaksh06pre-commit-ci[bot]cclauss
authored
fix: correct PageRank init, dangling-node handling, and convergence (… (#14894)
* fix: correct PageRank init, dangling-node handling, and convergence (#14885) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Apply suggestion from @cclauss --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
1 parent 3a82959 commit 3206395

1 file changed

Lines changed: 19 additions & 11 deletions

File tree

graphs/page_rank.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,28 @@ 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) + dangling_sum / n
4850
)
49-
print(ranks)
51+
if sum(abs(new_ranks[k] - ranks[k]) for k in ranks) < tol:
52+
ranks = new_ranks
53+
break
54+
ranks = new_ranks
55+
return ranks
5056

5157

5258
def main():
@@ -64,7 +70,9 @@ def main():
6470
for node in nodes:
6571
print(node)
6672

67-
page_rank(nodes)
73+
ranks = page_rank(nodes)
74+
print("======= Ranks =======")
75+
print(ranks)
6876

6977

7078
if __name__ == "__main__":

0 commit comments

Comments
 (0)