From f7c67ab2e8c719daa2c1cb3f8527d72127da6319 Mon Sep 17 00:00:00 2001 From: Meenaksh Singhania Date: Fri, 3 Jul 2026 16:35:45 +0530 Subject: [PATCH 1/2] fix: correct PageRank init, dangling-node handling, and convergence (#14885) --- graphs/page_rank.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/graphs/page_rank.py b/graphs/page_rank.py index c0ce3a94c76b..f7d182a03f01 100644 --- a/graphs/page_rank.py +++ b/graphs/page_rank.py @@ -31,22 +31,29 @@ def __repr__(self): return f"" -def page_rank(nodes, limit=3, d=0.85): - ranks = {} - for node in nodes: - ranks[node.name] = 1 +def page_rank(nodes, max_iter=100, d=0.85, tol=1e-8): + n = len(nodes) + ranks = {node.name: 1.0 / n for node in nodes} outbounds = {} for node in nodes: outbounds[node.name] = len(node.outbound) - for i in range(limit): - print(f"======= Iteration {i + 1} =======") - for _, node in enumerate(nodes): - ranks[node.name] = (1 - d) + d * sum( - ranks[ib] / outbounds[ib] for ib in node.inbound + for _ in range(max_iter): + dangling_sum = sum( + ranks[node.name] for node in nodes if outbounds[node.name] == 0 + ) + new_ranks = {} + for node in nodes: + new_ranks[node.name] = (1 - d) / n + d * ( + sum(ranks[ib] / outbounds[ib] for ib in node.inbound) + + dangling_sum / n ) - print(ranks) + if sum(abs(new_ranks[k] - ranks[k]) for k in ranks) < tol: + ranks = new_ranks + break + ranks = new_ranks + return ranks def main(): @@ -66,6 +73,10 @@ def main(): page_rank(nodes) + ranks = page_rank(nodes) + print("======= Ranks =======") + print(ranks) + if __name__ == "__main__": main() From 6e8e79a491fb47c7e85e4f2b6a9092c7de3cc334 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:09:44 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- graphs/page_rank.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/graphs/page_rank.py b/graphs/page_rank.py index f7d182a03f01..ed1cd9ef089a 100644 --- a/graphs/page_rank.py +++ b/graphs/page_rank.py @@ -46,8 +46,7 @@ def page_rank(nodes, max_iter=100, d=0.85, tol=1e-8): new_ranks = {} for node in nodes: new_ranks[node.name] = (1 - d) / n + d * ( - sum(ranks[ib] / outbounds[ib] for ib in node.inbound) - + dangling_sum / n + sum(ranks[ib] / outbounds[ib] for ib in node.inbound) + dangling_sum / n ) if sum(abs(new_ranks[k] - ranks[k]) for k in ranks) < tol: ranks = new_ranks