Source code for gameanalysis.reduction.twins

"""Twins reduction

This is the same as a deviation preserving reduction reduced to two for all
roles."""
import numpy as np

from gameanalysis import rsgame
from gameanalysis import utils
from gameanalysis.reduction import deviation_preserving as dpr


[docs]def reduce_game(full_game, red_players=None): """Reduce a game using twins reduction Parameters ---------- full_game : Game The game to reduce. red_players : ndarray-like, optional The reduced number of players for each role. This must be None or the reduced number of players for the twins reductions. """ exp_red_players = np.minimum(full_game.num_role_players, 2) utils.check( red_players is None or np.all(exp_red_players == red_players), "twins reduction didn't get expected reduced players", ) return dpr.reduce_game(full_game, exp_red_players)
[docs]def expand_profiles(full_game, profiles): """Expand profiles using twins reduction Parameters ---------- full_game : Game Game that expanded profiles will be valid for. profiles : ndarray-like The profiles to expand """ red_players = np.minimum(full_game.num_role_players, 2) profiles = np.asarray(profiles, int) red_game = rsgame.empty(red_players, full_game.num_role_strats) utils.check(red_game.is_profile(profiles).all(), "profiles must be valid") return dpr.expand_profiles(full_game, profiles)
[docs]def reduce_profiles(red_game, profiles): """Reduce profiles using twins Parameters ---------- red_game : Game Game that reduced profiles will be profiles for. This game must have the valid twins reduction number of players. profiles : ndarray-like The profiles to reduce. """ profiles = np.asarray(profiles, int) utils.check(np.all(red_game.num_role_players <= 2), "red game must be a twins game") return dpr.reduce_profiles(red_game, profiles)
[docs]def expand_deviation_profiles(full_game, rest, red_players=None, role_index=None): """Expand all deviation profiles from a restriction Parameters ---------- full_game : Game The game the deviations profiles will be valid for. rest : [bool] The restriction to get deviations from. red_players : [int], optional The number of players in each role in the reduced game.IF specified, it must match the expected number for twins reduction. role_index : int, optional If specified , only expand deviations for the role selected. """ exp_red_players = np.minimum(full_game.num_role_players, 2) utils.check( red_players is None or np.all(exp_red_players == red_players), "twins reduction didn't get expected reduced players", ) return dpr.expand_deviation_profiles(full_game, rest, exp_red_players, role_index)