def test_deviation_profile_count(players, strategies): game = rsgame.BaseGame(players, strategies) sup = (rand.random(game.num_roles) * game.num_strategies).astype(int) + 1 inds = np.concatenate([rand.choice(s, x) + o for s, x, o in zip(game.num_strategies, sup, game.role_starts)]) mask = np.zeros(game.num_role_strats, bool) mask[inds] = True devs = subgame.deviation_profiles(game, mask) assert devs.shape[0] == subgame.num_deviation_profiles(game, mask), \ "num_deviation_profiles didn't return correct number" assert np.sum(devs > 0) == subgame.num_deviation_payoffs(game, mask), \ "num_deviation_profiles didn't return correct number" assert np.all(np.sum(devs * ~mask, 1) == 1) count = 0 for r_ind in range(game.num_roles): r_devs = subgame.deviation_profiles(game, mask, r_ind) assert np.all(np.sum(r_devs * ~mask, 1) == 1) count += r_devs.shape[0] assert count == subgame.num_deviation_profiles(game, mask) red = reduction.DeviationPreserving( game.num_strategies, game.num_players ** 2, game.num_players) dpr_devs = red.expand_profiles(subgame.deviation_profiles( game, mask)).shape[0] num = subgame.num_dpr_deviation_profiles(game, mask) assert dpr_devs == num, \ "num_dpr_deviation_profiles didn't return correct number"
def test_deviation_profile_count(players, strategies, _): game = rsgame.basegame(players, strategies) mask = game.random_subgames() devs = subgame.deviation_profiles(game, mask) assert devs.shape[0] == subgame.num_deviation_profiles(game, mask), \ "num_deviation_profiles didn't return correct number" assert np.sum(devs > 0) == subgame.num_deviation_payoffs(game, mask), \ "num_deviation_profiles didn't return correct number" assert np.all(np.sum(devs * ~mask, 1) == 1) count = 0 for r_ind in range(game.num_roles): r_devs = subgame.deviation_profiles(game, mask, r_ind) assert np.all(np.sum(r_devs * ~mask, 1) == 1) count += r_devs.shape[0] assert count == subgame.num_deviation_profiles(game, mask) red = reduction.DeviationPreserving( game.num_strategies, game.num_players ** 2, game.num_players) dpr_devs = red.expand_profiles(subgame.deviation_profiles( game, mask)).shape[0] num = subgame.num_dpr_deviation_profiles(game, mask) assert dpr_devs == num, \ "num_dpr_deviation_profiles didn't return correct number"
def test_subgame(): game = rsgame.BaseGame([3, 4], [3, 2]) subg = np.asarray([1, 0, 1, 0, 1], bool) devs = subgame.deviation_profiles(game, subg) assert devs.shape[0] == 7, \ "didn't generate the right number of deviating profiles" adds = subgame.additional_strategy_profiles(game, subg, 1).shape[0] assert adds == 6, \ "didn't generate the right number of additional profiles" subg2 = subg.copy() subg2[1] = True assert (subgame.subgame(game, subg2).num_all_profiles == adds + subgame.subgame(game, subg).num_all_profiles), \ "additional profiles didn't return the proper amount" serial = gamegen.game_serializer(game) sub_serial = subgame.subserializer(serial, subg) assert (subgame.subgame(game, subg).num_role_strats == sub_serial.num_role_strats)
def expand_deviation_profiles(self, subgame_mask, role_index=None): """Expand profiles that contribute to deviation payoffs""" return subgame.deviation_profiles(self.full_game, subgame_mask, role_index)