from rstt.stypes import SPlayer, Event
from rstt.ranking.datamodel import keydefaultdict
from rstt.utils import utils as uu
from typing import Optional
[docs]
class EventDataSet():
def __init__(self, window_range: int = 1):
self.events = []
self.window_range = window_range
[docs]
def add(self, event: Event):
if event.name() in [ev.name() for ev in self.events]:
msg = f"Event {event.name()} already in the dataset"
raise ValueError(msg)
else:
self.events.append(event)
[docs]
def window(self, window: Optional[int] = None):
nb = window if window else self.window_range
return self.events[-nb:]
[docs]
class EventScoring():
def __init__(self, window_range: int = 1, tops: int = 1, default: dict[int, float] = keydefaultdict(lambda x: 1/x * 100.0)) -> None:
self.dataset = EventDataSet(window_range=window_range)
self.tops = tops
self.relevance = {}
self.default = default
[docs]
def add_event(self, event: Event, relevance: Optional[dict[int, float]] = None):
self.dataset.add(event)
self.relevance[event.name()] = relevance if relevance else self.default
[docs]
def rate(self, player: SPlayer) -> float:
points = [self.relevance[event.name()][event.standing()[player]]
for event in self.dataset.window()]
if points == []:
return 0
else:
return sum(uu.nmax(points, self.tops))