async def test_sparse_trace(): """Test that tracing sparsely samples profiles""" base = rsgame.empty(4, 3) game1 = paygame.game_replace(base, base.all_profiles(), (base.all_profiles() > 0) * [1, 0, 0]) game2 = paygame.game_replace(base, base.all_profiles(), (base.all_profiles() > 0) * [-0.5, 1.5, 0]) save1 = savesched.savesched(gamesched.gamesched(game1)) save2 = savesched.savesched(gamesched.gamesched(game2)) sgame1 = schedgame.schedgame(save1) sgame2 = schedgame.schedgame(save2) await asyncio.gather(innerloop.inner_loop(sgame1), innerloop.inner_loop(sgame2)) # Assert that innerloop doesn't scheduler all profiles assert save1.get_game().num_profiles == 11 assert save2.get_game().num_profiles == 11 ((st1, *_, en1), _), ((st2, *_, en2), _) = ( # pylint: disable=too-many-star-expressions await trace.trace_all_equilibria(sgame1, sgame2)) # Assert that trace found the expected equilibria assert np.isclose(st1, 0) assert np.isclose(en1, 1 / 3, atol=1e-3) assert np.isclose(st2, 1 / 3, atol=1e-3) assert np.isclose(en2, 1) # Assert that trace didn't need many extra profiles assert save1.get_game().num_profiles == 12 assert save2.get_game().num_profiles == 12
async def test_basic_profile(_): """Test that profiles are saved""" sgame = gamegen.samplegame([4, 3], [3, 4], 0) profs = sgame.all_profiles() basesched = gamesched.samplegamesched(sgame) sched = savesched.savesched(basesched) assert str(sched) == str(basesched) assert rsgame.empty_copy(sgame) == rsgame.empty_copy(sched) await asyncio.gather(*[sched.sample_payoffs(p) for p in profs[:10]]) sched.get_game() sched = savesched.savesched(gamesched.samplegamesched(sgame)) await asyncio.gather(*[sched.sample_payoffs(p) for p in profs]) savegame = sched.get_game() assert sgame == savegame assert sgame == sched.get_game()
async def test_basic_profile(): """Test that basic profiles are sampled twice""" sgame = gamegen.samplegame([4, 3], [3, 4]) profs = utils.axis_from_elem( np.unique(utils.axis_to_elem(sgame.random_profiles(20)))) save = savesched.savesched(gamesched.samplegamesched(sgame)) sched = countsched.countsched(save, 10) assert str(sched) is not None paylist = await asyncio.gather(*[sched.sample_payoffs(p) for p in profs]) pays = np.stack(paylist) assert np.allclose(pays[profs == 0], 0) savegame = save.get_game() assert list(savegame.num_samples) == [10]