An API standard for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym)
MIT License
Bot releases are hidden (Show)
Over the last few years, the volunteer team behind Gym and Gymnasium has worked to fix bugs, improve the documentation, add new features, and change the API where appropriate such that the benefits outweigh the costs. This is the first alpha release of v1.0.0
, which aims to be the end of this road of changing the project's API along with containing many new features and improved documentation.
To install v1.0.0a1, you must use pip install gymnasium==1.0.0a1
or pip install --pre gymnasium
otherwise, v0.29.1
will be installed. Similarly, the website will default to v0.29.1's documentation, which can be changed with the pop-up in the bottom right.
We are really interested in projects testing with these v1.0.0 alphas to find any bugs, missing documentation, or issues with the API changes before we release v1.0 in full.
Within Gym v0.23+ and Gymnasium v0.26 to v0.29, an undocumented feature that has existed for registering external environments behind the scenes has been removed. For users of Atari (ALE), Minigrid or HighwayEnv, then users could use the following code:
import gymnasium as gym
env = gym.make("ALE/Pong-v5")
such that despite Atari never being imported (i.e., import ale_py
), users can still load an Atari environment. This feature has been removed in v1.0.0, which will require users to update to
import gymnasium as gym
import ale_py
gym.register_envs(ale_py) # optional
env = gym.make("ALE/Pong-v5")
Alternatively, users can do the following where the ale_py
within the environment id will import the module
import gymnasium as gym
env = gym.make("ale_py:ALE/Pong-v5") # `module_name:env_id`
For users with IDEs (i.e., VSCode, PyCharm), then import ale_py
can cause the IDE (and pre-commit isort / black / flake8) to believe that the import statement does nothing. Therefore, we have introduced gymnasium.register_envs
as a no-op function (the function literally does nothing) to make the IDE believe that something is happening and the import statement is required.
Note: ALE-py, Minigrid, and HighwayEnv must be updated to work with Gymnasium v1.0.0, which we hope to complete for all projects affected by alpha 2.
To increase the sample speed of an environment, vectorizing is one of the easiest ways to sample multiple instances of the same environment simultaneously. Gym and Gymnasium provide the VectorEnv
as a base class for this, but one of its issues has been that it inherited Env
. This can cause particular issues with type checking (the return type of step
is different for Env
and VectorEnv
), testing the environment type (isinstance(env, Env)
can be true for vector environments despite the two actings differently) and finally wrappers (some Gym and Gymnasium wrappers supported Vector environments but there are no clear or consistent API for determining which did or didn’t). Therefore, we have separated out Env
and VectorEnv
to not inherit from each other.
In implementing the new separate VectorEnv
class, we have tried to minimize the difference between code using Env
and VectorEnv
along with making it more generic in places. The class contains the same attributes and methods as Env
along with num_envs: int
, single_action_space: gymnasium.Space
and single_observation_space: gymnasium.Space
. Additionally, we have removed several functions from VectorEnv
that are not needed for all vector implementations: step_async
, step_wait
, reset_async
, reset_wait
, call_async
and call_wait
. This change now allows users to write their own custom vector environments, v1.0.0a1 includes an example vector cartpole environment that runs thousands of times faster than using Gymnasium’s Sync vector environment.
To allow users to create vectorized environments easily, we provide gymnasium.make_vec
as a vectorized equivalent of gymnasium.make
. As there are multiple different vectorization options (“sync”, “async”, and a custom class referred to as “vector_entry_point”), the argument vectorization_mode
selects how the environment is vectorized. This defaults to None
such that if the environment has a vector entry point for a custom vector environment implementation, this will be utilized first (currently, Cartpole is the only environment with a vector entry point built into Gymnasium). Otherwise, the synchronous vectorizer is used (previously, the Gym and Gymnasium vector.make
used asynchronous vectorizer as default). For more information, see the function docstring.
env = gym.make("CartPole-v1")
env = gym.wrappers.ClipReward(env, min_reward=-1, max_reward=3)
envs = gym.make_vec("CartPole-v1", num_envs=3)
envs = gym.wrappers.vector.ClipReward(envs, min_reward=-1, max_reward=3)
Due to this split of Env
and VectorEnv
, there are now Env
only wrappers and VectorEnv
only wrappers in gymnasium.wrappers
and gymnasium.wrappers.vector
respectively. Furthermore, we updated the names of the base vector wrappers from VectorEnvWrapper
to VectorWrapper
and added VectorObservationWrapper
, VectorRewardWrapper
and VectorActionWrapper
classes. See the vector wrapper page for new information.
To increase the efficiency of vector environment, autoreset is a common feature that allows sub-environments to reset without requiring all sub-environments to finish before resetting them all. Previously in Gym and Gymnasium, auto-resetting was done on the same step as the environment episode ends, such that the final observation and info would be stored in the step’s info, i.e., info["final_observation"]
and info[“final_info”]
and standard obs and info containing the sub-environment’s reset observation and info. This required similar general sampling for vectorized environments.
replay_buffer = []
obs, _ = envs.reset()
for _ in range(total_timesteps):
next_obs, rewards, terminations, truncations, infos = envs.step(envs.action_space.sample())
for j in range(envs.num_envs):
if not (terminations[j] or truncations[j]):
replay_buffer.append((
obs[j], rewards[j], terminations[j], truncations[j], next_obs[j]
))
else:
replay_buffer.append((
obs[j], rewards[j], terminations[j], truncations[j], infos["next_obs"][j]
))
obs = next_obs
However, over time, the development team has recognized the inefficiency of this approach (primarily due to the extensive use of a Python dictionary) and the annoyance of having to extract the final observation to train agents correctly, for example. Therefore, in v1.0.0, we are modifying autoreset to align with specialized vector-only projects like EnvPool and SampleFactory such that the sub-environment’s doesn’t reset until the next step. As a result, this requires the following changes when sampling. For environments with more complex observation spaces (and action actions) then
replay_buffer = []
obs, _ = envs.reset()
autoreset = np.zeros(envs.num_envs)
for _ in range(total_timesteps):
next_obs, rewards, terminations, truncations, _ = envs.step(envs.action_space.sample())
for j in range(envs.num_envs):
if not autoreset[j]:
replay_buffer.append((
obs[j], rewards[j], terminations[j], truncations[j], next_obs[j]
))
obs = next_obs
autoreset = np.logical_or(terminations, truncations)
``
Finally, we have improved `AsyncVectorEnv.set_attr` and `SyncVectorEnv.set_attr` functions to use the `Wrapper.set_wrapper_attr` to allow users to set variables anywhere in the environment stack if it already exists. Previously, this was not possible and users could only modify the variable in the “top” wrapper on the environment stack, importantly not the actual environment its self.
## Wrappers
Previously, some wrappers could support both environment and vector environments, however, this was not standardized, and was unclear which wrapper did and didn't support vector environments. For v1.0.0, with separating `Env` and `VectorEnv` to no longer inherit from each other (read more in the vector section), the wrappers in `gymnasium.wrappers` will only support standard environments and wrappers in `gymnasium.wrappers.vector` contains the provided specialized vector wrappers (most but not all wrappers are supported, please raise a feature request if you require it).
In v0.29, we deprecated the `Wrapper.__getattr__` function to be replaced by `Wrapper.get_wrapper_attr`, providing access to variables anywhere in the environment stack. In v1.0.0, we have added `Wrapper.set_wrapper_attr` as an equivalent function for setting a variable anywhere in the environment stack if it already exists; only the variable is set in the top wrapper (or environment).
Most significantly, we have removed, renamed, and added several wrappers listed below.
* Removed wrappers
- `monitoring.VideoRecorder` - The replacement wrapper is `RecordVideo`
- `StepAPICompatibility` - We expect all Gymnasium environments to use the terminated / truncated step API, therefore, user shouldn't need the `StepAPICompatibility` wrapper. [Shimmy](https://shimmy.farama.org/) includes a compatibility environments to convert gym-api environment's for gymnasium.
* Renamed wrappers (We wished to make wrappers consistent in naming. Therefore, we have removed "Wrapper" from all wrappers and included "Observation", "Action" and "Reward" within wrapper names where appropriate)
- `AutoResetWrapper` -> `Autoreset`
- `FrameStack` -> `FrameStackObservation`
- `PixelObservationWrapper` -> `AddRenderObservation`
* Moved wrappers (All vector wrappers are in `gymnasium.wrappers.vector`)
- `VectorListInfo` -> `vector.DictInfoToList`
* Added wrappers
- `DelayObservation` - Adds a delay to the next observation and reward
- `DtypeObservation` - Modifies the dtype of an environment’s observation space
- `MaxAndSkipObservation` - Will skip `n` observations and will max over the last 2 observations, inspired by the Atari environment heuristic for other environments
- `StickyAction` - Random repeats actions with a probability for a step returning the final observation and sum of rewards over steps. Inspired by Atari environment heuristics
- `JaxToNumpy` - Converts a Jax-based environment to use Numpy-based input and output data for `reset`, `step`, etc
- `JaxToTorch` - Converts a Jax-based environment to use PyTorch-based input and output data for `reset`, `step`, etc
- `NumpyToTorch` - Converts a Numpy-based environment to use PyTorch-based input and output data for `reset`, `step`, etc
For all wrappers, we have added example code documentation and a changelog to help future researchers understand any changes made. See the following [page](https://gymnasium.farama.org/main/api/wrappers/misc_wrappers/#gymnasium.wrappers.TimeLimit) for an example.
## Functional environments
One of the substantial advantages of Gymnasium's `Env` is it generally requires minimal information about the underlying environment specifications however, this can make applying such environments to planning, search algorithms, and theoretical investigations more difficult. We are proposing `FuncEnv` as an alternative definition to `Env` which is closer to a Markov Decision Process definition, exposing more functions to the user, including the observation, reward, and termination functions along with the environment’s raw state as a single object.
```python
from typing import Any
import gymnasium as gym
from gymnasium.functional import StateType, ObsType, ActType, RewardType, TerminalType, Params
class ExampleFuncEnv(gym.functional.FuncEnv):
def initial(rng: Any, params: Params | None = None) → StateType
…K
def transition(state: StateType, action: ActType, rng: Any, params: Params | None = None) → StateType
…
def observation(state: StateType, params: Params | None = None) → ObsType
…
def reward(
state: StateType, action: ActType, next_state: StateType, params: Params | None = None
) → RewardType
…
def terminal(state: StateType, params: Params | None = None) → TerminalType
…
FuncEnv
requires that initial
and transition
functions to return a new state given its inputs as a partial implementation of Env.step
and Env.reset
. As a result, users can sample (and save) the next state for a range of inputs to use with planning, searching, etc. Given a state, observation
, reward
, and terminal
provide users explicit definitions to understand how each can affect the environment's output.
gymnasium[mujoco-py]
due to cython==3 issues by @pseudo-rnd-thoughts (https://github.com/Farama-Foundation/Gymnasium/pull/616)MuJoCo
environment type issues by @Kallinteris-Andreas (https://github.com/Farama-Foundation/Gymnasium/pull/612)register(kwargs)
from **kwargs
to kwargs: dict | None = None
by @younik (https://github.com/Farama-Foundation/Gymnasium/pull/788)CartPoleVectorEnv
step counter to be set back to zero on reset
by @TimSchneider42 (https://github.com/Farama-Foundation/Gymnasium/pull/886)NamedTuples
in JaxToNumpy
, JaxToTorch
and NumpyToTorch
by @RogerJL (https://github.com/Farama-Foundation/Gymnasium/pull/789) and @pseudo-rnd-thoughts (https://github.com/Farama-Foundation/Gymnasium/pull/811)padding_type
parameter to FrameSkipObservation
to select the padding observation by @jamartinh (https://github.com/Farama-Foundation/Gymnasium/pull/830)check_environments_match
by @Kallinteris-Andreas (https://github.com/Farama-Foundation/Gymnasium/pull/748)gymnasium.envs.mujoco
by @Kallinteris-Andreas (https://github.com/Farama-Foundation/Gymnasium/pull/827)Gymnasium/MuJoCo/Ant-v5
framework by @Kallinteris-Andreas (https://github.com/Farama-Foundation/Gymnasium/pull/838)__init__
and reset
arguments by @pseudo-rnd-thoughts (https://github.com/Farama-Foundation/Gymnasium/pull/898)Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.29.0...v1.0.0a1
Published by pseudo-rnd-thoughts about 1 year ago
A minimal release that fixes a warning produced by Wrapper.__getattr__
.
In particular, this function will be removed in v1.0.0 however the reported solution for this was incorrect and the updated solution still caused the warning to show (due to technical python reasons).
Wrapper.__getattr__
warning reports the incorrect new function, get_attr
rather than get_wrapper_attr
get_wrapper_attr
, the __getattr__
warning is still be raised due to get_wrapper_attr
using hasattr
which under the hood uses __getattr__.
Therefore, updated to remove the unintended warning.VectorEnvWrapper.__getattr__
to specify that it also is deprecated in v1.0.0Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.29.0...v0.29.1
Published by pseudo-rnd-thoughts over 1 year ago
We finally have a software citation for Gymnasium with the plan to release an associated paper after v1.0, thank you to all the contributors over the last 3 years who have made helped Gym and Gymnasium (https://github.com/Farama-Foundation/Gymnasium/pull/590)
@misc{towers_gymnasium_2023,
title = {Gymnasium},
url = {https://zenodo.org/record/8127025},
abstract = {An API standard for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym)},
urldate = {2023-07-08},
publisher = {Zenodo},
author = {Towers, Mark and Terry, Jordan K. and Kwiatkowski, Ariel and Balis, John U. and Cola, Gianluca de and Deleu, Tristan and Goulão, Manuel and Kallinteris, Andreas and KG, Arjun and Krimmel, Markus and Perez-Vicente, Rodrigo and Pierré, Andrea and Schulhoff, Sander and Tai, Jun Jet and Shen, Andrew Tan Jin and Younis, Omar G.},
month = mar,
year = {2023},
doi = {10.5281/zenodo.8127026},
}
Gymnasium has a conda package, conda install gymnasium
. Thanks to @ChristofKaufmann for completing this
Wrapper.__get_attr__
, gymnasium.make(..., autoreset=True)
, gymnasium.make(..., apply_api_compatibility=True)
, Env.reward_range
and gymnasium.vector.make
. For their proposed replacement, see https://github.com/Farama-Foundation/Gymnasium/pull/535
Box
bounds of low > high
, low == inf
and high == -inf
by @jjshoots in https://github.com/Farama-Foundation/Gymnasium/pull/495
data_equivalence()
by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/515
jax>=0.4
by @charraut in https://github.com/Farama-Foundation/Gymnasium/pull/373
pygame>=2.1.3
by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/558
start
parameter to MultiDiscrete
space, similar to the Discrete(..., start)
parameter by @Rayerdyne in https://github.com/Farama-Foundation/Gymnasium/pull/557
check_env
that closing a closed environment doesn't raise an error by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/564
wrapper.RecordVideo
throws an error if the environment has an invalid render mode (None, "human", "ansi")
by @robertoschiavone in https://github.com/Farama-Foundation/Gymnasium/pull/580
MaxAndSkipObservation
wrapper by @LucasAlegre in https://github.com/Farama-Foundation/Gymnasium/pull/561
check_environments_match
function for checking if two environments are identical by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/576
utils/performance.py
by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/583
xml_file
arguments by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/536
info
in reset
by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/540
metadata["render_fps"]
, the value is determined on __init__
using dt
by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/525
gymnasium.experimental.wrappers
by @charraut in https://github.com/Farama-Foundation/Gymnasium/pull/341
fps
argument to RecordVideoV0
for custom fps value that overrides an environment's internal render_fps
value by @younik in https://github.com/Farama-Foundation/Gymnasium/pull/503
spaces.Dict.keys()
as key in keys
was False by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/608
wrappers.RescaleAction
based on the bounds by @mmcaulif in https://github.com/Farama-Foundation/Gymnasium/pull/569
check_env
by @robertoschiavone in https://github.com/Farama-Foundation/Gymnasium/pull/554
shimmy[gym]
to shimmy[gym-v21]
or shimmy[gym-v26]
by @elliottower in https://github.com/Farama-Foundation/Gymnasium/pull/433
VideoRecorder
on reset
to empty recorded_frames
rather than frames
by @voidflight in https://github.com/Farama-Foundation/Gymnasium/pull/518
Env.close
in VideoRecorder.close
by @qgallouedec in https://github.com/Farama-Foundation/Gymnasium/pull/533
VideoRecorder
and RecordVideoV0
to move import moviepy
such that __del__
doesn't raise AttributeErrors
by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/553
nstep
in _step_mujoco_simulation
function of MujocoEnv
by @xuanhien070594 in https://github.com/Farama-Foundation/Gymnasium/pull/424
FrozenLake4x4
and FrozenLake8x8
environments by @yaniv-peretz in https://github.com/Farama-Foundation/Gymnasium/pull/459
Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.28.1...v0.29.0
Published by pseudo-rnd-thoughts over 1 year ago
Small emergency release to fix several issues
gymnasium.vector
as the gymnasium/__init__.py
as it isn't imported https://github.com/Farama-Foundation/Gymnasium/pull/403
Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.28.0...v0.28.1
Published by pseudo-rnd-thoughts over 1 year ago
This release introduces improved support for the reproducibility of Gymnasium environments, particularly for offline reinforcement learning. gym.make
can now create the entire environment stack, including wrappers, such that training libraries or offline datasets can specify all of the arguments and wrappers used for an environment. For a majority of standard usage (gym.make(”EnvironmentName-v0”)
), this will be backwards compatible except for certain fairly uncommon cases (i.e. env.spec
and env.unwrapped.spec
return different specs) this is a breaking change. See the reproducibility details section for more info.
In v0.27, we added the experimental
folder to allow us to develop several new features (wrappers and hardware accelerated environments). We’ve introduced a new experimental VectorEnv
class. This class does not inherit from the standard Env
class, and will allow for dramatically more efficient parallelization features. We plan to improve the implementation and add vector based wrappers in several minor releases over the next few months.
Additionally, we have optimized module loading so that PyTorch or Jax are only loaded when users import wrappers that require them, not on import gymnasium
.
In previous versions, Gymnasium supported gym.make(spec)
where the spec
is an EnvSpec
from gym.spec(str)
or env.spec
and worked identically to the string based gym.make(“”)
. In both cases, there was no way to specify additional wrappers that should be applied to an environment. With this release, we added additional_wrappers
to EnvSpec
for specifying wrappers applied to the base environment (TimeLimit
, PassiveEnvChecker
, Autoreset
and ApiCompatibility
are not included as they are specify in other fields).
This additional field will allow users to accurately save or reproduce an environment used in training for a policy or to generate an offline RL dataset. We provide a json converter function (EnvSpec.to_json
) for saving the EnvSpec
to a “safe” file type however there are several cases (NumPy data, functions) which cannot be saved to json. In these cases, we recommend pickle but be warned that this can allow remote users to include malicious data in the spec.
import gymnasium as gym
env = gym.make("CartPole-v0")
env = gym.wrappers.TimeAwareObservation(env)
print(env)
# <TimeAwareObservation<TimeLimit<OrderEnforcing<PassiveEnvChecker<CartPoleEnv<CartPole-v0>>>>>>
env_spec = env.spec
env_spec.pprint()
# id=CartPole-v0
# reward_threshold=195.0
# max_episode_steps=200
# additional_wrappers=[
# name=TimeAwareObservation, kwargs={}
# ]
import json
import pickle
json_env_spec = json.loads(env_spec.to_json())
pickled_env_spec = pickle.loads(pickle.dumps(env_spec))
recreated_env = gym.make(json_env_spec)
print(recreated_env)
# <TimeAwareObservation<TimeLimit<OrderEnforcing<PassiveEnvChecker<CartPoleEnv<CartPole-v0>>>>>>
# Be aware that the `TimeAwareObservation` was included by `make`
To support this type of recreation, wrappers must inherit from gym.utils.RecordConstructorUtils
to allow gym.make
to know what arguments to create the wrapper with. Gymnasium has implemented this for all built-in wrappers but for external projects, should be added to each wrapper. To do this, call gym.utils.RecordConstructorUtils.__init__(self, …)
in the first line of the wrapper’s constructor with identical l keyword arguments as passed to the wrapper’s constructor, except for env
. As an example see the Atari Preprocessing wrapper
For a more detailed discussion, see the original PRs - https://github.com/Farama-Foundation/Gymnasium/pull/292 and https://github.com/Farama-Foundation/Gymnasium/pull/355
GymV22Compatibility
environment was added to support Gym-based environments in Gymnasium. However, the name was incorrect as the env supported Gym’s v0.21 API, not v0.22, therefore, we have updated it to GymV21Compatibility
to accurately reflect the API supported. https://github.com/Farama-Foundation/Gymnasium/pull/282
Sequence
space allows for a dynamic number of elements in an observation or action space sample. To make this more efficient, we added a stack
argument which can support which can support a more efficient representation of an element than a tuple
, which was what was previously supported. https://github.com/Farama-Foundation/Gymnasium/pull/284
Box.sample
previously would clip incorrectly for up-bounded spaces such that 0 could never be sampled if the dtype was discrete or boolean. This is fixed such that 0 can be sampled in these cases. https://github.com/Farama-Foundation/Gymnasium/pull/249
jax
or pytorch
was installed then on import gymnasium
both of these modules would also be loaded causing significant slow downs in load time. This is now fixed such that jax
and torch
are only loaded when particular wrappers is loaded by the user. https://github.com/Farama-Foundation/Gymnasium/pull/323
Wrapper
to allow different observation and action types to be specified for the wrapper and its sub-environment. However, this raised type issues with pyright and mypy, this is now fixed through Wrapper having four generic arguments, [ObsType, ActType, WrappedEnvObsType, WrappedEnvActType]
. https://github.com/Farama-Foundation/Gymnasium/pull/337
Text
, Graph
and Sequence
however the vector utility functions were not updated to support these spaces. Support for these spaces has been added to the experimental vector space utility functions: batch_space
, concatenate
, iterate
and create_empty_array
. https://github.com/Farama-Foundation/Gymnasium/pull/223
FrameStackObservation
, DelayObservation
and TimeAwareObservation
) did not work as expected. These wrappers are now fixed and testing has been added. https://github.com/Farama-Foundation/Gymnasium/pull/224
__all__
dunder by @howardh in https://github.com/Farama-Foundation/Gymnasium/pull/321
MuJoCo/Ant
clarify the lack of use_contact_forces
on v3 (and older) by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/342
Thank you to our new contributors in this release: @Matyasch, @DrRyanHuang, @nerdyespresso, @khoda81, @howardh, @mihaic, and @keyb0ardninja.
Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.27.1...v0.28.0
Published by pseudo-rnd-thoughts over 1 year ago
np.bool8
with np.bool_
for numpy 1.24 deprecation warning by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/221
make
error when render mode is used without metadata render modes by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/216
AsyncVectorEnv.reset
by @younik in https://github.com/Farama-Foundation/Gymnasium/pull/252
callable
to Callable
by @ianyfan in https://github.com/Farama-Foundation/Gymnasium/pull/259
step
performance by >1.5x by @PaulMest in https://github.com/Farama-Foundation/Gymnasium/pull/235
MuJoCo.Humanoid
action description by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/206
Ant
use_contact_forces
obs and reward DOC by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/218
MuJoCo.Reacher-v4
doc fixes by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/219
Mujoco/Hooper
doc minor typo fix by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/247
Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.27.0...v0.27.1
Published by pseudo-rnd-thoughts almost 2 years ago
Gymnasium 0.27.0 is our first major release of Gymnasium. It has several significant new features, and numerous small bug fixes and code quality improvements as we work through our backlog. There should be no breaking changes beyond dropping Python 3.6 support and remove the mujoco Viewer
class in favor of a MujocoRendering
class. You should be able to upgrade your code that's using Gymnasium 0.26.x to 0.27.0 with little-to-no-effort.
Like always, our development roadmap is publicly available here so you can follow our future plans. The only large breaking changes that are still planned are switching selected environments to use hardware accelerated physics engines and our long standing plans for overhauling the vector API and built-in wrappers.
This release notably includes an entirely new part of the library: gymnasium.experimental
. We are adding new features, wrappers and functional environment API discussed below for users to test and try out to find bugs and provide feedback.
These new wrappers, accessible in gymnasium.experimental.wrappers
, see the full list in https://gymnasium.farama.org/main/api/experimental/ are aimed to replace the wrappers in gymnasium v0.30.0 and contain several improvements
LambaActionV0
. We don't expect these version numbers to change regularly and will act similarly to environment version numbers. This should ensure that all users know when significant changes could affect your agent's performance for environments and wrappers. Additionally, we hope that this will improve reproducibility of RL in the future, which is critical for academia.Core developers: @gianlucadecola, @RedTachyon, @pseudo-rnd-thoughts
The Env
class provides a very generic structure for environments to be written in allowing high flexibility in the program structure. However, this limits the ability to efficiently vectorize environments, compartmentalize the environment code, etc. Therefore, the gymnasium.experimental.FuncEnv
provides a much more strict structure for environment implementation with stateless functions, for every stage of the environment implementation. This class does not inherit from Env
and requires a translation / compatibility class for doing this. We already provide a FuncJaxEnv
for converting jax-based FuncEnv
to Env
. We hope this will help improve the readability of environment implementations along with potential speed-ups for users that vectorize their code.
This API is very experimental so open to changes in the future. We are interested in feedback from users who try to use the API which we believe will be in particular interest to users exploring RL planning, model-based RL and modifying environment functions like the rewards.
Core developers: @RedTachyon, @pseudo-rnd-thoughts, @balisujohn
Viewer
in favor of MujocoRenderer
which offscreen, human and other render mode can use by @rodrigodelazcano in https://github.com/Farama-Foundation/Gymnasium/pull/112
gym.make(..., apply_env_compatibility=True)
in favour of gym.make("GymV22Environment", env_id="...")
by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/125
gymnasium.pprint_registry()
for pretty printing the gymnasium registry by @kad99kev in https://github.com/Farama-Foundation/Gymnasium/pull/124
Discrete.dtype
to np.int64
such that samples are np.int64
not python ints. by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/141
core.py
for Env
, Wrapper
and more by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/39
gymnasium.spaces
by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/37
play()
resizable by @Markus28 in https://github.com/Farama-Foundation/Gymnasium/pull/190
VideoRecorder
wrapper by @younik in https://github.com/Farama-Foundation/Gymnasium/pull/42
seeding.np_random
error message to report seed type by @theo-brown in https://github.com/Farama-Foundation/Gymnasium/pull/74
check_env
and PassiveEnvChecker
by @Markus28 in https://github.com/Farama-Foundation/Gymnasium/pull/117
__all__
in root __init__.py
to specify the correct folders by @pseudo-rnd-thoughts in https://github.com/Farama-Foundation/Gymnasium/pull/130
play()
assertion error by @Markus28 in https://github.com/Farama-Foundation/Gymnasium/pull/132
is_slippy
by @MarionJS in https://github.com/Farama-Foundation/Gymnasium/pull/136
render_mode
is None by @younik in https://github.com/Farama-Foundation/Gymnasium/pull/143
is_np_flattenable
property to documentation by @Markus28 in https://github.com/Farama-Foundation/Gymnasium/pull/172
AsyncVectorEnv
for success before splitting result in step_wait
by @aaronwalsman in https://github.com/Farama-Foundation/Gymnasium/pull/178
MuJoCo.Ant-v4.use_contact_forces
by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/183
MuJoCo.Ant
v4 changelog by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/186
MuJoCo.Ant
action order in documentation by @Kallinteris-Andreas in https://github.com/Farama-Foundation/Gymnasium/pull/208
raise-from
exception for the whole codebase by @cool-RR in https://github.com/Farama-Foundation/Gymnasium/pull/205
pre-commit
hooks for better code quality by @XuehaiPan in https://github.com/Farama-Foundation/Gymnasium/pull/179
Published by pseudo-rnd-thoughts almost 2 years ago
Note: ale-py (atari) has not updated to Gymnasium yet. Therefore pip install gymnasium[atari]
will fail, this will be fixed in v0.27
. In the meantime, use pip install shimmy[atari]
for the fix.
HumanRendering
and RenderCollection
wrappers to have the correct metadata by @RedTachyon in https://github.com/Farama-Foundation/Gymnasium/pull/35
EpisodeStatisticsRecorder
wrapper by @DavidSlayback in https://github.com/Farama-Foundation/Gymnasium/pull/31
Full Changelog: https://github.com/Farama-Foundation/Gymnasium/compare/v0.26.2...v0.26.3
Published by pseudo-rnd-thoughts about 2 years ago
This Release is an upstreamed version of Gym v26.2
Published by pseudo-rnd-thoughts about 2 years ago
This Release is an upstreamed version of Gym v26.1
In addition, the gym docs repo has been merged in with the new website https://gymnasium.farama.org/
Published by pseudo-rnd-thoughts about 2 years ago
This is the first release of Gymnasium, a maintained fork of OpenAI Gym
This release is identical to the Gym v0.26.0 except for the project name (Gymnasium) and Code of Conduct
Read https://github.com/Farama-Foundation/Gymnasium/issues/12 for the roadmap of changes