@@ -32,21 +32,43 @@ def __repr__(self):
3232
3333
3434def 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
5274def main ():
@@ -68,4 +90,4 @@ def main():
6890
6991
7092if __name__ == "__main__" :
71- main ()
93+ main ()
0 commit comments