コード例 #1
0
def subproc_mpi():
    # this is necessary for the MPI test to fail
    from mpi4py import MPI

    env = SubprocEnv(env_fn=create_test_env_mpi,
                     env_kwargs=dict(episode_len=2))
    rew, obs, first = env.observe()
コード例 #2
0
def test_subproc_cloudpickle():
    def make_env():
        env = IdentityEnv()
        env.square = lambda x: x**2
        return env

    env = SubprocEnv(env_fn=make_env)
    assert env.callmethod("square", 2) == 4
コード例 #3
0
def test_subproc():
    env = SubprocEnv(env_fn=create_test_env, env_kwargs=dict(episode_len=2))
    rew, obs, first = env.observe()
    assert first
    assert rew == 0.0
    env.act(obs)
    env.act(obs)
    env.act(obs)
    infos = env.get_info()
    assert infos[0]["step"] == 3
コード例 #4
0
def test_subproc_exception():
    with pytest.raises(SubprocError):
        env = SubprocEnv(env_fn=create_test_env_exception_on_create)

    env = SubprocEnv(env_fn=create_test_env_exception_on_act)
    rew, obs, first = env.observe()
    env.act(obs)
    with pytest.raises(SubprocError):
        # because act does not get the return value, the error actually appears during the
        # next call to observe()
        env.observe()

    with pytest.raises(SubprocError):
        env = SubprocEnv(env_fn=create_test_env_exit_on_create)

    env = SubprocEnv(env_fn=create_test_env_exit_on_act)
    rew, obs, first = env.observe()
    env.act(obs)
    with pytest.raises(SubprocError):
        env.observe()
コード例 #5
0
def test_subproc_retro():
    env = retro.make("Airstriker-Genesis")
    with pytest.raises(RuntimeError):
        env = retro.make("Airstriker-Genesis")

    envs = [
        SubprocEnv(env_fn=make_retro_env,
                   env_kwargs=dict(game="Airstriker-Genesis"))
        for _ in range(2)
    ]
    env = ConcatEnv(envs)
    rew, ob, first = env.observe()
    assert np.array_equal(ob[0], ob[1])
コード例 #6
0
def vectorize_gym(num,
                  env_fn=None,
                  env_kwargs=None,
                  use_subproc=True,
                  render_mode=None,
                  seed=None):
    """
    Given a function that creates a gym environment and a number of environments to create,
    create the environments in subprocesses and combine them into a single gym3 Env.

    This is meant as a replacement for baselines' SubprocVecEnv and DummyVecEnv

    If you want to use this for a registered gym env, the default is to use gym.make as the function
    to call:

        env = vectorize_gym(num=2, env_kwargs={"id": "Pendulum-v0"})
    
    :param num: number of gym environments to create
    :param env_fn: function to call to create the gym environment, defaults to `gym.make` 
    :param env_kwargs: keyword arguments to pass to env_fn
    :param use_subproc: if set to False, create the environment in the current process
    :param render_mode: if set, this will be passed to the `FromGymEnv` adapter,
        see the documentation for `FromGymEnv` for more information
    """
    if env_fn is None:
        import gym

        env_fn = gym.make
    if env_kwargs is None:
        env_kwargs = {}
    if use_subproc:
        envs = [
            SubprocEnv(
                env_fn=_make_gym_env,
                env_kwargs=dict(
                    env_fn=env_fn,
                    env_kwargs=env_kwargs,
                    render_mode=render_mode,
                    seed=seed,
                ),
            ) for _ in range(num)
        ]
    else:
        envs = [
            _make_gym_env(env_fn=env_fn,
                          env_kwargs=env_kwargs,
                          render_mode=render_mode,
                          seed=seed) for _ in range(num)
        ]
    return ConcatEnv(envs)
コード例 #7
0
def test_subproc_callmethod():
    env = SubprocEnv(env_fn=create_callmethod_test_env)
    assert env.callmethod("square", 2) == 4