def test_sample_regret(players, strategies): n = 100 game = gamegen.role_symmetric_game(players, strategies) max_regret = np.max(game.max_payoffs() - game.min_payoffs()) mix = game.random_mixtures()[0] dev_profs = game.random_deviator_profiles(mix, n) dev_profs.shape = (-1, game.num_role_strats) inds = np.broadcast_to(np.arange(game.num_role_strats), (n, game.num_role_strats)).flat dev_payoffs = np.fromiter( (game.get_payoffs(p)[i] for p, i in zip(dev_profs, inds)), float, n * game.num_role_strats) dev_payoffs.shape = (n, game.num_role_strats) mix_payoffs = game.role_reduce(dev_payoffs * mix) boots = bootstrap.sample_regret(game, mix_payoffs, dev_payoffs, 200) assert boots.shape == (200,) assert np.all(boots <= max_regret) assert np.all(boots >= 0) perc_boots = bootstrap.sample_regret(game, mix_payoffs, dev_payoffs, 200, [2.5, 97.5]) assert perc_boots.shape == (2,) assert np.all(perc_boots <= max_regret) assert np.all(perc_boots >= 0)
def main(args): data = json.load(args.input) if args.regret is not None: game, serial = gameio.read_base_game(json.load(args.regret[0])) mix = serial.from_prof_json(json.load(args.regret[1])) devs = load_devs(game, serial, data) expect = game.role_reduce(devs * mix) result = bootstrap.sample_regret(game, expect, devs, args.num_bootstraps, args.percentiles) if args.mean: mdevs = devs.mean(0) mexpect = game.role_reduce(mdevs * mix, keepdims=True) mean = np.max(mdevs - mexpect) elif args.dev_surplus is not None: game, serial = gameio.read_base_game(json.load(args.dev_surplus[0])) mix = serial.from_prof_json(json.load(args.dev_surplus[1])) devs = load_devs(game, serial, data) surpluses = np.sum(devs * mix * game.role_repeat(game.num_players), 1) result = bootstrap.mean(surpluses, args.num_bootstraps, args.percentiles) if args.mean: mean = surpluses.mean() else: data = np.asarray(data, float) result = bootstrap.mean(data, args.num_bootstraps, args.percentiles) if args.mean: mean = data.mean() if args.percentiles is None: args.percentiles = np.linspace(0, 100, args.num_bootstraps) jresult = {str(p).rstrip("0").rstrip("."): v.item() for p, v in zip(args.percentiles, result)} if args.mean: jresult["mean"] = mean json.dump(jresult, args.output) args.output.write("\n")