Revert "ENH: allow metadata["render_modes"] to be a set" (#251)

This commit is contained in:
Mark Towers
2023-01-09 13:12:07 +00:00
committed by GitHub
parent 3413b04534
commit 1dfdf45480
57 changed files with 103 additions and 103 deletions

View File

@@ -100,7 +100,7 @@ from gymnasium import spaces
class GridWorldEnv(gym.Env):
metadata = {"render_modes": {"human", "rgb_array"}, "render_fps": 4}
metadata = {"render_modes": ["human", "rgb_array"], "render_fps": 4}
def __init__(self, render_mode=None, size=5):
self.size = size # The size of the square grid
@@ -130,6 +130,7 @@ class GridWorldEnv(gym.Env):
3: np.array([0, -1]),
}
assert render_mode is None or render_mode in self.metadata["render_modes"]
self.render_mode = render_mode
"""

View File

@@ -47,7 +47,7 @@ class Env(Generic[ObsType, ActType]):
"""
# Set this in SOME subclasses
metadata: dict[str, Any] = {"render_modes": {}}
metadata: dict[str, Any] = {"render_modes": []}
# define render_mode if your environment supports rendering
render_mode: str | None = None
reward_range = (-float("inf"), float("inf"))

View File

@@ -166,7 +166,7 @@ class BipedalWalker(gym.Env, EzPickle):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": FPS,
}

View File

@@ -193,11 +193,11 @@ class CarRacing(gym.Env, EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"state_pixels",
},
],
"render_fps": FPS,
}

View File

@@ -190,7 +190,7 @@ class LunarLander(gym.Env, EzPickle):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": FPS,
}

View File

@@ -141,7 +141,7 @@ class AcrobotEnv(Env):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": 15,
}

View File

@@ -82,7 +82,7 @@ class CartPoleEnv(gym.Env[np.ndarray, Union[int, np.ndarray]]):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": 50,
}

View File

@@ -105,7 +105,7 @@ class Continuous_MountainCarEnv(gym.Env):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": 30,
}

View File

@@ -97,7 +97,7 @@ class MountainCarEnv(gym.Env):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": 30,
}

View File

@@ -93,7 +93,7 @@ class PendulumEnv(gym.Env):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": 30,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class AntEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -12,11 +12,11 @@ DEFAULT_CAMERA_CONFIG = {
class AntEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -182,11 +182,11 @@ class AntEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class HalfCheetahEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -14,11 +14,11 @@ DEFAULT_CAMERA_CONFIG = {
class HalfCheetahEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -136,11 +136,11 @@ class HalfCheetahEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class HopperEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 125,
}

View File

@@ -17,11 +17,11 @@ DEFAULT_CAMERA_CONFIG = {
class HopperEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 125,
}

View File

@@ -142,11 +142,11 @@ class HopperEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 125,
}

View File

@@ -13,11 +13,11 @@ def mass_center(model, sim):
class HumanoidEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 67,
}

View File

@@ -21,11 +21,11 @@ def mass_center(model, sim):
class HumanoidEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 67,
}

View File

@@ -216,11 +216,11 @@ class HumanoidEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 67,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class HumanoidStandupEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 67,
}

View File

@@ -192,11 +192,11 @@ class HumanoidStandupEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 67,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class InvertedDoublePendulumEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -125,11 +125,11 @@ class InvertedDoublePendulumEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class InvertedPendulumEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 25,
}

View File

@@ -94,11 +94,11 @@ class InvertedPendulumEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 25,
}

View File

@@ -56,11 +56,11 @@ class BaseMujocoEnv(gym.Env):
self.frame_skip = frame_skip
assert self.metadata["render_modes"] == {
assert self.metadata["render_modes"] == [
"human",
"rgb_array",
"depth_array",
}, self.metadata["render_modes"]
], self.metadata["render_modes"]
assert (
int(np.round(1.0 / self.dt)) == self.metadata["render_fps"]
), f'Expected value: {int(np.round(1.0 / self.dt))}, Actual value: {self.metadata["render_fps"]}'

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class PusherEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -140,11 +140,11 @@ class PusherEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 20,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class ReacherEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 50,
}

View File

@@ -122,11 +122,11 @@ class ReacherEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 50,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class SwimmerEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 25,
}

View File

@@ -12,11 +12,11 @@ DEFAULT_CAMERA_CONFIG = {}
class SwimmerEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 25,
}

View File

@@ -125,11 +125,11 @@ class SwimmerEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 25,
}

View File

@@ -7,11 +7,11 @@ from gymnasium.spaces import Box
class Walker2dEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 125,
}

View File

@@ -15,11 +15,11 @@ DEFAULT_CAMERA_CONFIG = {
class Walker2dEnv(MuJocoPyEnv, utils.EzPickle):
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 125,
}

View File

@@ -147,11 +147,11 @@ class Walker2dEnv(MujocoEnv, utils.EzPickle):
"""
metadata = {
"render_modes": {
"render_modes": [
"human",
"rgb_array",
"depth_array",
},
],
"render_fps": 125,
}

View File

@@ -240,7 +240,7 @@ class CartPoleFunctional(
class CartPoleJaxEnv(FunctionalJaxEnv, EzPickle):
"""Jax-based implementation of the CartPole environment."""
metadata = {"render_modes": {"rgb_array"}, "render_fps": 50}
metadata = {"render_modes": ["rgb_array"], "render_fps": 50}
def __init__(self, render_mode: str | None = None, **kwargs: Any):
"""Constructor for the CartPole where the kwargs are applied to the functional environment."""

View File

@@ -192,7 +192,7 @@ class PendulumFunctional(
class PendulumJaxEnv(FunctionalJaxEnv, EzPickle):
"""Jax-based pendulum environment using the functional version as base."""
metadata = {"render_modes": {"rgb_array"}, "render_fps": 30}
metadata = {"render_modes": ["rgb_array"], "render_fps": 30}
def __init__(self, render_mode: str | None = None, **kwargs: Any):
"""Constructor where the kwargs are passed to the base environment to modify the parameters."""

View File

@@ -145,7 +145,7 @@ class BlackjackEnv(gym.Env):
"""
metadata = {
"render_modes": {"human", "rgb_array"},
"render_modes": ["human", "rgb_array"],
"render_fps": 4,
}

View File

@@ -91,7 +91,7 @@ class CliffWalkingEnv(Env):
"""
metadata = {
"render_modes": {"human", "rgb_array", "ansi"},
"render_modes": ["human", "rgb_array", "ansi"],
"render_fps": 4,
}

View File

@@ -211,7 +211,7 @@ class FrozenLakeEnv(Env):
"""
metadata = {
"render_modes": {"human", "ansi", "rgb_array"},
"render_modes": ["human", "ansi", "rgb_array"],
"render_fps": 4,
}

View File

@@ -152,7 +152,7 @@ class TaxiEnv(Env):
"""
metadata = {
"render_modes": {"human", "ansi", "rgb_array"},
"render_modes": ["human", "ansi", "rgb_array"],
"render_fps": 4,
}

View File

@@ -341,9 +341,9 @@ def env_render_passive_checker(env):
"No render modes was declared in the environment (env.metadata['render_modes'] is None or not defined), you may have trouble when calling `.render()`."
)
else:
if not isinstance(render_modes, (set, list, tuple)):
if not isinstance(render_modes, (list, tuple)):
logger.warn(
f"Expects the render_modes to be a set, list or tuple, actual type: {type(render_modes)}"
f"Expects the render_modes to be a sequence (i.e. list, tuple), actual type: {type(render_modes)}"
)
elif not all(isinstance(mode, str) for mode in render_modes):
logger.warn(

View File

@@ -68,7 +68,7 @@ class EnvCompatibility(gym.Env):
"The `gymnasium.make(..., apply_api_compatibility=...)` parameter is deprecated and will be removed in v28. "
"Instead use `gym.make('GymV22Environment-v0', env_name=...)` or `from shimmy import GymV26CompatibilityV0`"
)
self.metadata = getattr(old_env, "metadata", {"render_modes": {}})
self.metadata = getattr(old_env, "metadata", {"render_modes": []})
self.render_mode = render_mode
self.reward_range = getattr(old_env, "reward_range", None)
self.spec = getattr(old_env, "spec", None)

View File

@@ -62,9 +62,7 @@ class HumanRendering(gym.Wrapper):
self.metadata = copy.deepcopy(self.env.metadata)
if "human" not in self.metadata["render_modes"]:
self.metadata["render_modes"] = set(self.metadata["render_modes"]).add(
"human"
)
self.metadata["render_modes"].append("human")
@property
def render_mode(self):

View File

@@ -26,7 +26,7 @@ class RenderCollection(gym.Wrapper):
self.metadata = copy.deepcopy(self.env.metadata)
if f"{self.env.render_mode}_list" not in self.metadata["render_modes"]:
set(self.metadata["render_modes"]).add(f"{self.env.render_mode}_list")
self.metadata["render_modes"].append(f"{self.env.render_mode}_list")
@property
def render_mode(self):

View File

@@ -250,10 +250,11 @@ def test_make_render_mode(register_make_testing_envs):
env.close()
assert len(valid_render_modes) > 0
valid_mode = next(iter(valid_render_modes))
with warnings.catch_warnings(record=True) as caught_warnings:
env = gym.make("CartPole-v1", render_mode=valid_mode, disable_env_checker=True)
assert env.render_mode == valid_mode
env = gym.make(
"CartPole-v1", render_mode=valid_render_modes[0], disable_env_checker=True
)
assert env.render_mode == valid_render_modes[0]
env.close()
for warning in caught_warnings:
@@ -313,7 +314,7 @@ def test_make_render_mode(register_make_testing_envs):
with pytest.warns(
UserWarning,
match=re.escape(
"\x1b[33mWARN: The environment is being initialised with render_mode='rgb_array' that is not in the possible render_modes ({}).\x1b[0m"
"\x1b[33mWARN: The environment is being initialised with render_mode='rgb_array' that is not in the possible render_modes ([]).\x1b[0m"
),
):
gym.make("test/NoRenderModesMetadata-v0", render_mode="rgb_array")

View File

@@ -23,7 +23,7 @@ class ArgumentEnv(gym.Env):
class NoHuman(gym.Env):
"""Environment that does not have human-rendering."""
metadata = {"render_modes": {"rgb_array_list"}, "render_fps": 4}
metadata = {"render_modes": ["rgb_array_list"], "render_fps": 4}
def __init__(self, render_mode=None):
assert render_mode in self.metadata["render_modes"]
@@ -33,7 +33,7 @@ class NoHuman(gym.Env):
class NoHumanOldAPI(gym.Env):
"""Environment that does not have human-rendering."""
metadata = {"render_modes": {"rgb_array_list"}, "render_fps": 4}
metadata = {"render_modes": ["rgb_array_list"], "render_fps": 4}
def __init__(self):
pass
@@ -42,7 +42,7 @@ class NoHumanOldAPI(gym.Env):
class NoHumanNoRGB(gym.Env):
"""Environment that has neither human- nor rgb-rendering"""
metadata = {"render_modes": {"ascii"}, "render_fps": 4}
metadata = {"render_modes": ["ascii"], "render_fps": 4}
def __init__(self, render_mode=None):
assert render_mode in self.metadata["render_modes"]

View File

@@ -136,7 +136,7 @@ properties = [
},
{"action_space": spaces.Discrete(2)},
{"reward_range": (-1.0, 1.0)},
{"metadata": {"render_modes": {"human", "rgb_array_list"}}},
{"metadata": {"render_modes": ["human", "rgb_array_list"]}},
{
"observation_space": spaces.Box(
low=0.0, high=1.0, shape=(64, 64, 3), dtype=np.float32
@@ -207,7 +207,7 @@ def test_gymnasium_env():
"""Tests a gymnasium environment."""
env = ExampleEnv()
assert env.metadata == {"render_modes": {}}
assert env.metadata == {"render_modes": []}
assert env.render_mode is None
assert env.reward_range == (-float("inf"), float("inf"))
assert env.spec is None
@@ -247,7 +247,7 @@ def test_gymnasium_wrapper():
wrapper_env = ExampleWrapper(env)
assert env.metadata == wrapper_env.metadata
wrapper_env.metadata = {"render_modes": {"rgb_array"}}
wrapper_env.metadata = {"render_modes": ["rgb_array"]}
assert env.metadata != wrapper_env.metadata
assert env.render_mode == wrapper_env.render_mode

View File

@@ -48,7 +48,7 @@ class GenericTestEnv(gym.Env):
reset_func: callable = basic_reset_func,
step_func: callable = new_step_func,
render_func: callable = basic_render_func,
metadata: dict[str, Any] = {"render_modes": {}},
metadata: dict[str, Any] = {"render_modes": []},
render_mode: str | None = None,
spec: EnvSpec = EnvSpec(
"TestingEnv-v0", "testing-env-no-entry-point", max_episode_steps=100

View File

@@ -402,7 +402,7 @@ def test_passive_env_step_checker(
[
UserWarning,
GenericTestEnv(metadata={"render_modes": "Testing mode"}),
"Expects the render_modes to be a set, list or tuple, actual type: <class 'str'>",
"Expects the render_modes to be a sequence (i.e. list, tuple), actual type: <class 'str'>",
],
[
UserWarning,
@@ -414,7 +414,7 @@ def test_passive_env_step_checker(
[
UserWarning,
GenericTestEnv(
metadata={"render_modes": {"Testing mode"}, "render_fps": None},
metadata={"render_modes": ["Testing mode"], "render_fps": None},
render_mode="Testing mode",
render_func=lambda self: 0,
),
@@ -423,24 +423,24 @@ def test_passive_env_step_checker(
[
UserWarning,
GenericTestEnv(
metadata={"render_modes": {"Testing mode"}, "render_fps": "fps"}
metadata={"render_modes": ["Testing mode"], "render_fps": "fps"}
),
"Expects the `env.metadata['render_fps']` to be an integer or a float, actual type: <class 'str'>",
],
[
AssertionError,
GenericTestEnv(
metadata={"render_modes": set(), "render_fps": 30}, render_mode="Test"
metadata={"render_modes": [], "render_fps": 30}, render_mode="Test"
),
"With no render_modes, expects the Env.render_mode to be None, actual value: Test",
],
[
AssertionError,
GenericTestEnv(
metadata={"render_modes": {"Testing mode"}, "render_fps": 30},
metadata={"render_modes": ["Testing mode"], "render_fps": 30},
render_mode="Non mode",
),
"The environment was initialized successfully however with an unsupported render mode. Render mode: Non mode, modes: {'Testing mode'}",
"The environment was initialized successfully however with an unsupported render mode. Render mode: Non mode, modes: ['Testing mode']",
],
],
)

View File

@@ -20,7 +20,7 @@ IRRELEVANT_KEY = 1
PlayableEnv = partial(
GenericTestEnv,
metadata={"render_modes": {"rgb_array"}},
metadata={"render_modes": ["rgb_array"]},
render_func=lambda self: np.ones((10, 10, 3)),
)

View File

@@ -95,7 +95,7 @@ def test_api_failures():
with pytest.warns(
UserWarning,
match=r"Expects the render_modes to be a set, list or tuple, actual type: <class 'str'>",
match=r"Expects the render_modes to be a sequence \(i\.e\. list, tuple\), actual type: <class 'str'>",
):
env.render()
assert env.checked_render

View File

@@ -8,7 +8,7 @@ from gymnasium.wrappers.monitoring.video_recorder import VideoRecorder
class BrokenRecordableEnv(gym.Env):
metadata = {"render_modes": {"rgb_array_list"}}
metadata = {"render_modes": ["rgb_array_list"]}
def __init__(self, render_mode="rgb_array_list"):
self.render_mode = render_mode
@@ -18,7 +18,7 @@ class BrokenRecordableEnv(gym.Env):
class UnrecordableEnv(gym.Env):
metadata = {"render_modes": {}}
metadata = {"render_modes": [None]}
def __init__(self, render_mode=None):
self.render_mode = render_mode