mirror of
https://github.com/Farama-Foundation/Gymnasium.git
synced 2025-08-31 10:09:53 +00:00
* add pygame GUI for frozen_lake.py env * add new line at EOF * pre-commit reformat * improve graphics * new images and dynamic window size * darker tile borders and fix ICC profile * pre-commit hook * adjust elf and stool size * Update frozen_lake.py * reformat * fix #2600 * #2600 * add rgb_array support * reformat * test render api change on FrozenLake * add render support for reset on frozenlake * add clock on pygame render * new render api for blackjack * new render api for cliffwalking * new render api for Env class * update reset method, lunar and Env * fix wrapper * fix reset lunar * new render api for box2d envs * new render api for mujoco envs * fix bug * new render api for classic control envs * fix tests * add render_mode None for CartPole * new render api for test fake envs * pre-commit hook * fix FrozenLake * fix FrozenLake * more render_mode to super - frozenlake * remove kwargs from frozen_lake new * pre-commit hook * add deprecated render method * add backwards compatibility * fix test * add _render * move pygame.init() (avoid pygame dependency on init) * fix pygame dependencies * remove collect_render() maintain multi-behaviours .render() * add type hints * fix renderer * don't call .render() with None * improve docstring * add single_rgb_array to all envs * remove None from metadata["render_modes"] * add type hints to test_env_checkers * fix lint * add comments to renderer * add comments to single_depth_array and single_state_pixels * reformat * add deprecation warnings and env.render_mode declaration * fix lint * reformat * fix tests * add docs * fix car racing determinism * remove warning test envs, customizable modes on renderer * remove commments and add todo for env_checker * fix car racing * replace render mode check with assert * update new mujoco * reformat * reformat * change metaclass definition * fix tests * implement mark suggestions (test, docs, sets) * check_render Co-authored-by: J K Terry <jkterry0@gmail.com>
101 lines
3.3 KiB
Python
101 lines
3.3 KiB
Python
import numpy as np
|
|
import pytest
|
|
|
|
import gym
|
|
from gym.wrappers import RecordEpisodeStatistics, VectorListInfo
|
|
from gym.wrappers.record_episode_statistics import add_vector_episode_statistics
|
|
|
|
|
|
@pytest.mark.parametrize("env_id", ["CartPole-v1", "Pendulum-v1"])
|
|
@pytest.mark.parametrize("deque_size", [2, 5])
|
|
def test_record_episode_statistics(env_id, deque_size):
|
|
env = gym.make(env_id)
|
|
env = RecordEpisodeStatistics(env, deque_size)
|
|
|
|
for n in range(5):
|
|
env.reset()
|
|
assert env.episode_returns[0] == 0.0
|
|
assert env.episode_lengths[0] == 0
|
|
for t in range(env.spec.max_episode_steps):
|
|
_, _, done, info = env.step(env.action_space.sample())
|
|
if done:
|
|
assert "episode" in info
|
|
assert all([item in info["episode"] for item in ["r", "l", "t"]])
|
|
break
|
|
assert len(env.return_queue) == deque_size
|
|
assert len(env.length_queue) == deque_size
|
|
|
|
|
|
def test_record_episode_statistics_reset_info():
|
|
env = gym.make("CartPole-v1")
|
|
env = RecordEpisodeStatistics(env)
|
|
ob_space = env.observation_space
|
|
obs = env.reset()
|
|
assert ob_space.contains(obs)
|
|
del obs
|
|
obs, info = env.reset(return_info=True)
|
|
assert ob_space.contains(obs)
|
|
assert isinstance(info, dict)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("num_envs", "asynchronous"), [(1, False), (1, True), (4, False), (4, True)]
|
|
)
|
|
def test_record_episode_statistics_with_vectorenv(num_envs, asynchronous):
|
|
envs = gym.vector.make(
|
|
"CartPole-v1", render_mode=None, num_envs=num_envs, asynchronous=asynchronous
|
|
)
|
|
envs = RecordEpisodeStatistics(envs)
|
|
max_episode_step = (
|
|
envs.env_fns[0]().spec.max_episode_steps
|
|
if asynchronous
|
|
else envs.env.envs[0].spec.max_episode_steps
|
|
)
|
|
envs.reset()
|
|
for _ in range(max_episode_step + 1):
|
|
_, _, dones, infos = envs.step(envs.action_space.sample())
|
|
if any(dones):
|
|
assert "episode" in infos
|
|
assert "_episode" in infos
|
|
assert all(infos["_episode"] == dones)
|
|
assert all([item in infos["episode"] for item in ["r", "l", "t"]])
|
|
break
|
|
else:
|
|
assert "episode" not in infos
|
|
assert "_episode" not in infos
|
|
|
|
|
|
def test_wrong_wrapping_order():
|
|
envs = gym.vector.make("CartPole-v1", num_envs=3)
|
|
wrapped_env = RecordEpisodeStatistics(VectorListInfo(envs))
|
|
wrapped_env.reset()
|
|
|
|
with pytest.raises(AssertionError):
|
|
wrapped_env.step(wrapped_env.action_space.sample())
|
|
|
|
|
|
def test_add_vector_episode_statistics():
|
|
NUM_ENVS = 5
|
|
|
|
info = {}
|
|
for i in range(NUM_ENVS):
|
|
episode_info = {
|
|
"episode": {
|
|
"r": i,
|
|
"l": i,
|
|
"t": i,
|
|
}
|
|
}
|
|
info = add_vector_episode_statistics(info, episode_info["episode"], NUM_ENVS, i)
|
|
assert np.alltrue(info["_episode"][: i + 1])
|
|
|
|
for j in range(NUM_ENVS):
|
|
if j <= i:
|
|
assert info["episode"]["r"][j] == j
|
|
assert info["episode"]["l"][j] == j
|
|
assert info["episode"]["t"][j] == j
|
|
else:
|
|
assert info["episode"]["r"][j] == 0
|
|
assert info["episode"]["l"][j] == 0
|
|
assert info["episode"]["t"][j] == 0
|