From 9af513a531d100b1f1b85a334d2fd92007959e8d Mon Sep 17 00:00:00 2001 From: mithunbabbira Date: Mon, 20 Jul 2026 10:47:35 +0530 Subject: [PATCH 1/3] 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 9395ddd8997c700620b4072fcb046f2774280de1 Mon Sep 17 00:00:00 2001 From: mithunbabbira Date: Mon, 20 Jul 2026 12:18:33 +0530 Subject: [PATCH 2/3] fix: resolve #14886 - add validation for non-power-of-2 scores in minimax --- backtracking/minimax.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backtracking/minimax.py b/backtracking/minimax.py index 4eef90b75483..9a7e2f167eaf 100644 --- a/backtracking/minimax.py +++ b/backtracking/minimax.py @@ -57,6 +57,10 @@ def minimax( if len(scores) == 0: raise ValueError("Scores cannot be empty") + # Validate that scores length is a power of 2 + if len(scores) & (len(scores) - 1) != 0: + raise ValueError("Number of scores must be a power of 2") + # Base case: If the current depth equals the height of the tree, # return the score of the current node. if depth == height: @@ -92,4 +96,4 @@ def main() -> None: import doctest doctest.testmod() - main() + main() \ No newline at end of file From bd9849086aa7a804d09be6f2219612f44652718e 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 06:48:56 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/minimax.py | 2 +- graphs/page_rank.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backtracking/minimax.py b/backtracking/minimax.py index 9a7e2f167eaf..7e5e6330a5a8 100644 --- a/backtracking/minimax.py +++ b/backtracking/minimax.py @@ -96,4 +96,4 @@ def main() -> None: import doctest doctest.testmod() - main() \ No newline at end of file + main() 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()