/
test_page_rank.py
95 lines (72 loc) · 3.25 KB
/
test_page_rank.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from _page_rank import ffi, lib
import unittest
class TestPageRank(unittest.TestCase):
def test_graphCreation(self):
graph = lib.newGraph(4, -1, -1, -1, 1, 0)
ret = lib.addEdgeByIds(graph, 1, 2, 1)
self.assertEqual(ret, 0)
ret = lib.addEdgeByIds(graph, 2, 3, 1)
self.assertEqual(ret, 0)
ret = lib.addEdgeByIds(graph, 1, 3, 1)
self.assertEqual(ret, 0)
ret = lib.addEdgeByIds(graph, 0, 3, 1)
self.assertEqual(ret, 0)
# can't create more than 4 nodes
ret = lib.addEdgeByIds(graph, 3, 4, 1)
self.assertEqual(ret, -1)
self.assertEqual(lib.findNodeById(graph, 4), ffi.NULL)
# nodes have correct data
n = lib.findNodeById(graph, 1)
self.assertEqual(n.outDegree, 2)
self.assertLLValuesById(n.inNodes, [])
n = lib.findNodeById(graph, 2)
self.assertEqual(n.outDegree, 1)
self.assertLLValuesById(n.inNodes, [1])
n = lib.findNodeById(graph, 3)
self.assertEqual(n.outDegree, 0)
self.assertLLValuesById(n.inNodes, [2, 1, 0])
n = lib.findNodeById(graph, 0)
self.assertEqual(n.outDegree, 1)
self.assertLLValuesById(n.inNodes, [])
lib.cleanup(graph)
def test_computePageRank(self):
epsilon = 0.00001
nodeCount = 3
graph = lib.newGraph(nodeCount+10, 1, 0.5, epsilon, 2, 0)
lib.addEdgeByIds(graph, 1, 2, 1)
lib.addEdgeByIds(graph, 1, 3, 1)
lib.addEdgeByIds(graph, 2, 3, 1)
lib.addEdgeByIds(graph, 3, 1, 1)
lib.computeIteration(graph)
# initial pageRank
n = lib.findNodeById(graph, 1)
self.assertTrue(abs(n.pageRank_a - 1.0/graph.weightedSize) < epsilon)
n = lib.findNodeById(graph, 2)
self.assertTrue(abs(n.pageRank_a - 1.0/graph.weightedSize) < epsilon)
n = lib.findNodeById(graph, 3)
self.assertTrue(abs(n.pageRank_a - 1.0/graph.weightedSize) < epsilon)
while graph.converged == 0:
lib.computeIteration(graph)
# one more so both a and b have the converged page rank
lib.computeIteration(graph)
a = lib.findNodeById(graph, 1)
b = lib.findNodeById(graph, 2)
c = lib.findNodeById(graph, 3)
# the examples are not normalized so we must divide by nodeCount
# http://pr.efactory.de/e-pagerank-algorithm.shtml
self.assertTrue(abs(a.pageRank_a - 1.07692308 / nodeCount) < epsilon*10)
self.assertTrue(abs(a.pageRank_b - 1.07692308 / nodeCount) < epsilon*10)
self.assertTrue(abs(b.pageRank_a - 0.76923077 / nodeCount) < epsilon*10)
self.assertTrue(abs(b.pageRank_b - 0.76923077 / nodeCount) < epsilon*10)
self.assertTrue(abs(c.pageRank_a - 1.15384615 / nodeCount) < epsilon*10)
self.assertTrue(abs(c.pageRank_b - 1.15384615 / nodeCount) < epsilon*10)
lib.cleanup(graph)
def assertLLValuesById(self, lln, values):
lln = ffi.cast('LLNode*', lln)
for i in range(len(values)):
self.assertNodeById(lln.self, values[i])
lln = ffi.cast('LLNode*', lln.next)
self.assertEqual(lln, ffi.NULL)
def assertNodeById(self, node, id):
node = ffi.cast('Node*', node)
self.assertEqual(node.id, id)