Source code for rstt.ranking.standard.successRanking

from rstt.stypes import SPlayer, Event
from rstt.ranking import Ranking
from rstt.ranking.datamodel import KeyModel
from rstt.ranking.inferer import EventScoring
from rstt.ranking.observer import PlayerChecker

import warnings

'''
    TODO: Redesign the ranking concepts
        - ratings as list of achievements
        - KeyModel.ordinal to compute the points (currently EventStanding.rate)
        - backend extracting the relevant achievements of players
        - where goes the  'EventDataSet' component ?
'''


[docs] class SuccessRanking(Ranking): def __init__(self, name: str, window_range: int = 1, tops: int = 1, buffer: int | None = None, nb: int | None = None, players: list[SPlayer] | None = None, default: dict[int, float] | None = None): """Merit Based Ranking Usefull to implement Ranking system like the one in `tennis <https://en.wikipedia.org/wiki/ATP_rankings>`_ for example. Attributes ---------- datamodel: :class:`rstt.ranking.datamodel.KeyModel` (int as rating) backend: :class:`rstt.ranking.inferer.EventScoring` handler: :class:`rstt.ranking.observer.PlayerChecker` Parameters ---------- name : str, optional A name to identify the ranking, by default '' buffer : int Backend parameter. The number of event to consider for the rating, starting from the last. nb : int Backend parameter. The actual number of event in the buffer to use for the ratings computation. default : Optional[Dict[int, float]], optional Backend Parameter. Mapping placement in event to points for the rating, by default None players : Optional[List[SPlayer]], optional Players to register in the ranking, by default None """ if buffer: window_range = buffer msg = "buffer and nb will be removed in version 1.0.0, use instead window_range and tops." warnings.warn(msg, DeprecationWarning) if nb: tops = nb msg = "buffer and nb will be removed in version 1.0.0, use instead window_range and tops." warnings.warn(msg, DeprecationWarning) super().__init__(name=name, datamodel=KeyModel(template=int), backend=EventScoring(window_range=window_range, tops=tops, default=default), handler=PlayerChecker(), players=players)
[docs] def forward(self, event: Event | None = None, events: list[Event] | None = None): new_events = [] if event: new_events.append(event) if events: new_events += events for new_event in new_events: self.backend.add_event(new_event) self.handler.handle_observations(infer=self.backend, datamodel=self.datamodel, players=self.players())