Skip to content

Commit 9af513a

Browse files
committed
fix: resolve #14885 - fix PageRank initialization and dangling node handling
1 parent c0db072 commit 9af513a

1 file changed

Lines changed: 30 additions & 8 deletions

File tree

graphs/page_rank.py

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,43 @@ def __repr__(self):
3232

3333

3434
def page_rank(nodes, limit=3, d=0.85):
35+
"""
36+
Calculate PageRank for a directed graph.
37+
38+
>>> nodes = [Node('A'), Node('B'), Node('C')]
39+
>>> nodes[0].add_outbound('B')
40+
>>> nodes[0].add_outbound('C')
41+
>>> nodes[1].add_outbound('C')
42+
>>> nodes[2].add_outbound('A')
43+
>>> ranks = page_rank(nodes, limit=100)
44+
>>> round(ranks['A'], 4)
45+
0.15
46+
>>> round(ranks['B'], 4)
47+
0.15
48+
>>> round(ranks['C'], 4)
49+
0.15
50+
"""
51+
n = len(nodes)
3552
ranks = {}
3653
for node in nodes:
37-
ranks[node.name] = 1
54+
ranks[node.name] = 1 / n # Initialize to 1/n, not 1
3855

3956
outbounds = {}
4057
for node in nodes:
4158
outbounds[node.name] = len(node.outbound)
4259

4360
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
48-
)
49-
print(ranks)
61+
# Handle dangling nodes (nodes with no outbound links)
62+
for node in nodes:
63+
outbound_count = outbounds[node.name]
64+
if outbound_count == 0:
65+
ranks[node.name] = (1 - d) + d * sum(ranks[ib] for ib in node.inbound) / n
66+
else:
67+
ranks[node.name] = (1 - d) + d * sum(
68+
ranks[ib] / outbounds[ib] for ib in node.inbound
69+
)
70+
71+
return ranks
5072

5173

5274
def main():
@@ -68,4 +90,4 @@ def main():
6890

6991

7092
if __name__ == "__main__":
71-
main()
93+
main()

0 commit comments

Comments
 (0)