Source code for egta.countsched
"""Module for a scheduler that summarizes several samples"""
import asyncio
import numpy as np
from gameanalysis import utils
from egta import profsched
class _CountScheduler(profsched._Scheduler):  # pylint: disable=protected-access
    """A scheduler that wraps each profile in the mean of n profiles
    Parameters
    ----------
    sched : Scheduler
        The base scheduler that generates payoffs.
    count : int > 0
        The number of times a scheduler in the base scheduler should be sampled
        for each payoff returned by this scheduler.
    """
    def __init__(self, sched, count):
        super().__init__(sched.role_names, sched.strat_names, sched.num_role_players)
        utils.check(count > 0, "count must be positive {:d}", count)
        self._sched = sched
        self._count = count
    async def sample_payoffs(self, profile):
        payoffs = await asyncio.gather(
            *[self._sched.sample_payoffs(profile) for _ in range(self._count)]
        )
        payoff = np.zeros(self.num_strats)
        for i, pay in enumerate(payoffs, 1):
            payoff += (pay - payoff) / i
        return payoff
    def __str__(self):
        return str(self._sched)
[docs]def countsched(sched, count):
    """create a count scheduler"""
    return _CountScheduler(sched, count)