From 9af513a531d100b1f1b85a334d2fd92007959e8d Mon Sep 17 00:00:00 2001 From: mithunbabbira Date: Mon, 20 Jul 2026 10:47:35 +0530 Subject: [PATCH 1/2] fix: resolve #14885 - fix PageRank initialization and dangling node handling --- graphs/page_rank.py | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/graphs/page_rank.py b/graphs/page_rank.py index c0ce3a94c76b..d0baebe31a08 100644 --- a/graphs/page_rank.py +++ b/graphs/page_rank.py @@ -32,21 +32,43 @@ def __repr__(self): def page_rank(nodes, limit=3, d=0.85): + """ + Calculate PageRank for a directed graph. + + >>> nodes = [Node('A'), Node('B'), Node('C')] + >>> nodes[0].add_outbound('B') + >>> nodes[0].add_outbound('C') + >>> nodes[1].add_outbound('C') + >>> nodes[2].add_outbound('A') + >>> ranks = page_rank(nodes, limit=100) + >>> round(ranks['A'], 4) + 0.15 + >>> round(ranks['B'], 4) + 0.15 + >>> round(ranks['C'], 4) + 0.15 + """ + n = len(nodes) ranks = {} for node in nodes: - ranks[node.name] = 1 + ranks[node.name] = 1 / n # Initialize to 1/n, not 1 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 - ) - print(ranks) + # Handle dangling nodes (nodes with no outbound links) + for node in nodes: + outbound_count = outbounds[node.name] + if outbound_count == 0: + ranks[node.name] = (1 - d) + d * sum(ranks[ib] for ib in node.inbound) / n + else: + ranks[node.name] = (1 - d) + d * sum( + ranks[ib] / outbounds[ib] for ib in node.inbound + ) + + return ranks def main(): @@ -68,4 +90,4 @@ def main(): if __name__ == "__main__": - main() + main() \ No newline at end of file From d8b24e9ddbf08dde23972555cc46dacb980a9050 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 05:17:55 +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 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/graphs/page_rank.py b/graphs/page_rank.py index d0baebe31a08..2714b0b554b2 100644 --- a/graphs/page_rank.py +++ b/graphs/page_rank.py @@ -62,7 +62,9 @@ def page_rank(nodes, limit=3, d=0.85): for node in nodes: outbound_count = outbounds[node.name] if outbound_count == 0: - ranks[node.name] = (1 - d) + d * sum(ranks[ib] for ib in node.inbound) / n + ranks[node.name] = (1 - d) + d * sum( + ranks[ib] for ib in node.inbound + ) / n else: ranks[node.name] = (1 - d) + d * sum( ranks[ib] / outbounds[ib] for ib in node.inbound @@ -90,4 +92,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main()