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
    ]
Exemple #3
0
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)
Exemple #5
0
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)