Skip to content

Instantly share code, notes, and snippets.

@Jan200101
Created November 24, 2023 08:28
Show Gist options
  • Save Jan200101/826188c21ee3c3eb69e16703a812683e to your computer and use it in GitHub Desktop.
Save Jan200101/826188c21ee3c3eb69e16703a812683e to your computer and use it in GitHub Desktop.
pagerank
from __future__ import annotations
class Page:
o = 0.5
def __init__(self, iid):
self.id = iid
self.references = []
self.referers = []
self.rank = 1
def __repr__(self):
return f"<Page {self.id} references={len(self.references)}, referers={len(self.referers)}>"
def add_reference(self, page: Page):
if page not in self.references:
self.references.append(page)
page.add_referer(self)
def add_referer(self, page: Page):
if page not in self.referers:
self.referers.append(page)
page.add_reference(self)
def rank_impl(self):
k = 0
for x in self.referers:
k += x.rank / len(x.references)
b = (1 - self.o) + self.o * k
return b
def calculate_rank(self, iterations):
if iterations > 0:
v = {}
# calculate the rank
for x in self.referers:
v[x.id] = x.calculate_rank(iterations-1)
# apply the rank later so we don't end up causing false results
for x in self.referers:
x.rank = v[x.id]
return round(self.rank_impl(), 10)
a = Page("a")
b = Page("b")
c = Page("c")
a.add_reference(b)
a.add_reference(c)
b.add_reference(c)
c.add_reference(a)
for x in range(10):
a.rank = 1
b.rank = 1
c.rank = 1
print(x, c.calculate_rank(x))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment