"""A collection of functions for evaluating strategies given a game.
"""
from typing import Sequence, Type
import numpy as np
from imperfecto.algos.player import FixedPolicyPlayer
from imperfecto.games.game import ExtensiveFormGame
[docs]def evaluate_strategies(Game: Type[ExtensiveFormGame], strategies: Sequence[dict],
                        n_iters: int) -> Sequence[float]:
    """Evaluates a set of strategies on a game.
    Args:
        Game: The game class to evaluate the strategies on (e.g., ``RockPaperScissorGame``).
        strategies: A list of strategies, one strategy per each player in the game.
                        Example::
                            player0_strat = {"P0": [1/3, 1/3, 1/3]} # equally likely rock-paper-scissor
                            player1_strat = {"P1": [0.4, 0.4, 0.2]}
                            strategies = [player0_strat, player1_strat]
        n_iters: The number of iterations to run the game for.
    Returns:
        A list of the average payoffs of each strategy.
    """
    players = [FixedPolicyPlayer(str(i), strategy)
               for i, strategy in enumerate(strategies)]
    game = Game(players)
    avg_payoffs = []
    for _ in range(n_iters):
        _, payoffs = game.play()
        avg_payoffs.append(payoffs)
    return np.mean(avg_payoffs, axis=0)