Example #1
0
def exact_dev_reps(game):
    """Uses python ints to compute dev reps. Much slower"""
    counts = game.profiles
    dev_reps = np.empty_like(counts, float)
    fcount = [math.factorial(x) for x in game.num_players]
    for dev_prof, count_prof in zip(dev_reps, counts):
        total = utils.prod(fc // utils.prod(math.factorial(x) for x in cs)
                           for fc, cs
                           in zip(fcount, game.role_split(count_prof)))
        for dev_role, counts_role, player_count \
                in zip(game.role_split(dev_prof), game.role_split(count_prof),
                       game.num_players):
            for s, count in enumerate(counts_role):
                rep = total * int(count) // player_count
                dev_role[s] = math.log(rep) if rep > 0 else -np.inf
    return dev_reps
Example #2
0
def test_random_con_bitmask(_):
    ndim = random.randint(2, 4)
    shape = tuple(random.randint(1, 5) for _ in range(ndim))
    total = utils.prod(shape)
    mins = tuple(random.randint(1, total // d) for d in shape)
    mask = utils.random_con_bitmask(.2, shape, mins)

    for dim, min_in in enumerate(mins):
        assert np.all(np.rollaxis(mask, dim).reshape(
            mask.shape[dim], -1).sum(1) >= min_in)
Example #3
0
def test_basegame_function(players, strategies):
    game = rsgame.basegame(players, strategies)
    assert game.num_players is not None, "num players was None"
    assert game.num_strategies is not None, "num strategies was None"

    # Test copy constructor
    game2 = rsgame.basegame_copy(game)
    assert game == game2
    assert np.all(game.num_players == game2.num_players)
    assert np.all(game.num_strategies == game2.num_strategies)

    # Test role indices
    expected = game.role_repeat(np.arange(game.num_roles))
    actual = game.role_indices[np.arange(game.num_role_strats)]
    assert np.all(expected == actual)

    # Test that all profiles returns the correct number of things
    all_profs = game.all_profiles()
    assert all_profs.shape[0] == game.num_all_profiles, \
        "size of all profile generation is wrong"

    # Test that all subgames returns the correct number
    all_subs = game.all_subgames()
    assert all_subs.shape[0] == game.num_all_subgames
    assert game.role_reduce(all_subs, ufunc=np.bitwise_or).all()
    uniques = np.unique(utils.axis_to_elem(all_subs))
    assert uniques.size == all_subs.shape[0]

    pure_subs = game.pure_subgames()
    assert pure_subs.shape[0] == game.num_pure_subgames
    assert game.role_reduce(pure_subs, ufunc=np.bitwise_or).all()
    uniques = np.unique(utils.axis_to_elem(pure_subs))
    assert uniques.size == pure_subs.shape[0]

    # Assert that mixture calculations do the right thing
    # Uniform
    mix = game.uniform_mixture()
    assert np.allclose(game.role_reduce(mix), 1), \
        "uniform mixture wasn't a mixture"
    if game.num_strategies.max() == 1:
        assert (mix == 1).all(), "uniform mixtures wasn't uniform"
    else:
        diff = np.diff(mix)
        changes = game.num_strategies[:-1].cumsum() - 1
        diff[changes] = 0
        assert np.allclose(diff, 0), \
            "uniform mixture wasn't uniform"
        one_strats = (game.num_strategies.cumsum() - 1)[game.num_strategies
                                                        == 1]
        assert np.allclose(mix[one_strats], 1), \
            "uniform mixture wasn't uniform"

    # Random Subgames
    assert game.verify_subgame(game.random_subgames())
    assert game.verify_subgame(game.random_subgames(20)).all()

    # Random
    assert np.allclose(game.role_reduce(game.random_mixtures()), 1)
    mixes = game.random_mixtures(20)
    assert np.allclose(game.role_reduce(mixes, axis=1), 1), \
        "random mixtures weren't mixtures"

    # Random Sparse
    assert np.allclose(game.role_reduce(game.random_sparse_mixtures()), 1)
    mixes = game.random_sparse_mixtures(20)
    assert np.allclose(game.role_reduce(mixes, axis=1), 1), \
        "random mixtures weren't mixtures"

    # Biased
    bias = 0.6
    mixes = game.biased_mixtures(bias)
    assert np.prod(game.num_strategies[game.num_strategies > 1]) == \
        mixes.shape[0], \
        "Didn't generate the proper number of biased mixtures"
    saw_bias = (mixes == bias).any(0)
    saw_all_biases = (game.role_reduce(saw_bias, ufunc=np.logical_and) |
                      (game.num_strategies == 1)).all()
    assert saw_all_biases, "Didn't bias every strategy"
    assert np.allclose(game.role_reduce(mixes, axis=1), 1), \
        "biased mixtures weren't mixtures"

    # Role Biased
    mixes = game.role_biased_mixtures(bias)
    assert (game.num_strategies[game.num_strategies > 1].sum()
            == mixes.shape[0]), \
        "Didn't generate the proper number of role biased mixtures"
    saw_bias = (mixes == bias).any(0)
    saw_all_biases = (game.role_reduce(saw_bias, ufunc=np.logical_and)
                      | (game.num_strategies == 1)).all()
    assert saw_all_biases, "Didn't bias every strategy"
    assert np.allclose(game.role_reduce(mixes, axis=1), 1), \
        "biased mixtures weren't mixtures"

    # Grid
    points = 3
    mixes = game.grid_mixtures(points)
    expected_num = utils.prod(spm.comb(s, points - 1, repetition=True,
                                       exact=True)
                              for s in game.num_strategies)
    assert expected_num == mixes.shape[0], \
        "didn't create the right number of grid mixtures"
    assert np.allclose(game.role_reduce(mixes, 1), 1), \
        "grid mixtures weren't mixtures"

    # Pure
    mixes = game.pure_mixtures()
    assert np.allclose(game.role_reduce(mixes), 1), \
        "pure mixtures weren't mixtures"
    assert np.all(game.role_reduce(np.isclose(mixes, 1)) == 1), \
        "not all roles in pure mixture had an assignment"

    profs = game.pure_profiles()
    assert np.all(game.role_reduce(profs > 0) == 1), \
        "pure profiles weren't pure"

    # Test that various methods can be called
    assert repr(game) is not None
    assert hash(game) is not None
Example #4
0
def num_profiles(subgame, role_counts, **_):
    """Number of profiles in a subgame"""
    return utils.prod(utils.game_size(role_counts[role], len(strats)) for role, strats in subgame.items())