Source code for egta.canonsched

"""Module for creating a canonical scheduler"""
import numpy as np

from egta import profsched


class _CanonScheduler(profsched._Scheduler):  # pylint: disable=protected-access
    """A scheduler that removes single strategy roles

    Parameters
    ----------
    sched : Scheduler
        The base scheduler that generates payoffs.
    """

    def __init__(self, sched):
        role_mask = sched.num_role_strats > 1
        super().__init__(
            tuple(r for r, m in zip(sched.role_names, role_mask) if m),
            tuple(s for s, m in zip(sched.strat_names, role_mask) if m),
            sched.num_role_players[role_mask],
        )
        self._sched = sched
        self._players = sched.num_role_players[~role_mask]
        self._inds = np.cumsum(role_mask * sched.num_role_strats)[~role_mask]
        self._mask = role_mask.repeat(sched.num_role_strats)

    async def sample_payoffs(self, profile):
        full_prof = np.insert(profile, self._inds, self._players)
        full_pay = await self._sched.sample_payoffs(full_prof)
        return full_pay[self._mask]

    def __str__(self):
        return str(self._sched)


[docs]def canon(sched): """Create a canon scheduler""" return _CanonScheduler(sched)