def test_rl_track_setting_is_correct(): setting = SettingProxy( IncrementalRLSetting, "rl_track", ) assert setting.nb_tasks == 8 assert setting.dataset == "MetaMonsterKong-v0" assert setting.observation_space == NamedTupleSpace( x=Image(0, 1, (3, 64, 64), dtype=np.float32), task_labels=Sparse(spaces.Discrete(8)), ) assert setting.action_space == spaces.Discrete(6) # TODO: The reward range of the MetaMonsterKongEnv is (0, 50), which seems wrong. # This isn't really a big deal though. # assert setting.reward_space == spaces.Box(0, 100, shape=(), dtype=np.float32) assert setting.steps_per_task == 200_000 assert setting.test_steps_per_task == 10_000 assert setting.known_task_boundaries_at_train_time is True assert setting.known_task_boundaries_at_test_time is False assert setting.monitor_training_performance is True assert setting.train_transforms == [ Transforms.to_tensor, Transforms.three_channels ] assert setting.val_transforms == [ Transforms.to_tensor, Transforms.three_channels ] assert setting.test_transforms == [ Transforms.to_tensor, Transforms.three_channels ] train_env = setting.train_dataloader() assert train_env.observation_space == NamedTupleSpace( x=Image(0, 1, (3, 64, 64), dtype=np.float32), task_labels=spaces.Discrete(8), ) assert train_env.reset() in train_env.observation_space valid_env = setting.val_dataloader() assert valid_env.observation_space == NamedTupleSpace( x=Image(0, 1, (3, 64, 64), dtype=np.float32), task_labels=spaces.Discrete(8), ) # IDEA: Prevent submissions from calling the test_dataloader method or accessing the # test_env / test_dataset property? with pytest.raises(RuntimeError): test_env = setting.test_dataloader() test_env.reset() with pytest.raises(RuntimeError): test_env = setting.test_env test_env.reset()
def test_sl_track_setting_is_correct(): setting = SettingProxy( ClassIncrementalSetting, "sl_track", ) assert setting.nb_tasks == 12 assert setting.dataset == "synbols" assert setting.observation_space == NamedTupleSpace( x=Image(0, 1, (3, 32, 32), dtype=np.float32), task_labels=spaces.Discrete(12), ) assert setting.n_classes_per_task == 4 assert setting.action_space == spaces.Discrete(48) assert setting.reward_space == spaces.Discrete(48) assert setting.known_task_boundaries_at_train_time is True assert setting.known_task_boundaries_at_test_time is False assert setting.monitor_training_performance is True assert setting.train_transforms == [ Transforms.to_tensor, Transforms.three_channels ] assert setting.val_transforms == [ Transforms.to_tensor, Transforms.three_channels ] assert setting.test_transforms == [ Transforms.to_tensor, Transforms.three_channels ]
def test_preserves_dtype_of_namedtuple_space(): input_space = NamedTupleSpace( x=spaces.Box(0, 1, [32, 123, 123, 3]), task_labels=spaces.MultiDiscrete([5 for _ in range(32)]), dtype=Foo, ) output_space = add_tensor_support(input_space) assert output_space.dtype is input_space.dtype
def test_multitask_setting_test_env(): setting = MultiTaskSetting(dataset="mnist") assert setting.phases == 1 assert setting.nb_tasks == 5 assert setting.observation_space == NamedTupleSpace( x=Image(0.0, 1.0, (3, 28, 28), np.float32), task_labels=Discrete(5) ) assert setting.action_space == Discrete(10) # FIXME: Wait, actually, this test environment, will it be shuffled, or not? with setting.test_dataloader(batch_size=32, num_workers=0) as test_env: check_is_multitask_env(test_env, has_rewards=False)
def test_dqn_monsterkong_adds_channel_first_transform(): method = DQNMethod() setting = IncrementalRLSetting( dataset="monsterkong", nb_tasks=2, steps_per_task=1_000, test_steps_per_task=1_000, ) assert setting.max_steps == 2_000 assert setting.test_steps == 2_000 assert setting.nb_tasks == 2 assert setting.observation_space == NamedTupleSpace( spaces={ "x": Image(0, 1, shape=(3, 64, 64), dtype=np.float32), "task_labels": Sparse(spaces.Discrete(2)), }, dtype=setting.Observations, ) assert setting.action_space == spaces.Discrete( 6) # monsterkong has 6 actions. # (Before the method gets to change the Setting): # By default the setting gives the same shape of obs as the underlying env. for env_method in [ setting.train_dataloader, setting.val_dataloader, setting.test_dataloader, ]: print(f"Testing method {env_method.__name__}") with env_method() as env: reset_obs = env.reset() # TODO: Fix this so the 'x' space actually gets tensor support. # assert reset_obs in env.observation_space assert reset_obs.numpy() in env.observation_space assert reset_obs.x.shape == (3, 64, 64) # Let the Method configure itself on the Setting: method.configure(setting) # (After the method gets to change the Setting): for env_method in [ setting.train_dataloader, setting.val_dataloader, setting.test_dataloader, ]: with env_method() as env: reset_obs = env.reset() # Fix this numpy bug. assert reset_obs.numpy() in env.observation_space assert reset_obs.x.shape == (64, 64, 3)
def test_domain_incremental_mnist_setup(): setting = DomainIncrementalSetting( dataset="mnist", increment=2, ) setting.prepare_data(data_dir="data") setting.setup() assert setting.observation_space == NamedTupleSpace( x=Image(0.0, 1.0, (3, 28, 28), np.float32), task_labels=Discrete(5)) for i in range(setting.nb_tasks): setting.current_task_id = i batch_size = 5 train_loader = setting.train_dataloader(batch_size=batch_size) for j, (observations, rewards) in enumerate(itertools.islice(train_loader, 100)): x = observations.x t = observations.task_labels y = rewards.y print(i, j, y, t) assert x.shape == (batch_size, 3, 28, 28) assert ((0 <= y) & (y < setting.n_classes_per_task)).all() assert all(t == i) x = x.permute(0, 2, 3, 1)[0] assert x.shape == (28, 28, 3) reward = train_loader.send([4 for _ in range(batch_size)]) # TODO: Why are we fine with getting `None` as the reward here? Is it # because we're somehow setting it to be `` assert reward is None train_loader.close() test_loader = setting.test_dataloader(batch_size=batch_size) for j, (observations, rewards) in enumerate(itertools.islice(test_loader, 100)): assert rewards is None x = observations.x t = observations.task_labels assert t is None assert x.shape == (batch_size, 3, 28, 28) x = x.permute(0, 2, 3, 1)[0] assert x.shape == (28, 28, 3) rewards = test_loader.send([4 for _ in range(batch_size)]) assert rewards is not None y = rewards.y assert ((0 <= y) & (y < setting.n_classes_per_task)).all()
def test_multitask_setting(): setting = MultiTaskSetting(dataset="mnist") assert setting.phases == 1 assert setting.nb_tasks == 5 assert setting.observation_space == NamedTupleSpace( x=Image(0.0, 1.0, (3, 28, 28), np.float32), task_labels=Discrete(5) ) assert setting.action_space == Discrete(10) with setting.train_dataloader(batch_size=32, num_workers=0) as train_env: check_is_multitask_env(train_env, has_rewards=True) with setting.val_dataloader(batch_size=32, num_workers=0) as val_env: check_is_multitask_env(val_env, has_rewards=True)