mirror of
https://github.com/saymrwulf/stable-baselines3.git
synced 2026-05-19 21:40:19 +00:00
* Fix failing set_env test * Fix test failiing due to deprectation of env.seed * Adjust mean reward threshold in failing test * Fix her test failing due to rng * Change seed and revert reward threshold to 90 * Pin gym version * Make VecEnv compatible with gym seeding change * Revert change to VecEnv reset signature * Change subprocenv seed cmd to call reset instead * Fix type check * Add backward compat * Add `compat_gym_seed` helper * Add goal env checks in env_checker * Add docs on HER requirements for envs * Capture user warning in test with inverted box space * Update ale-py version * Fix randint * Allow noop_max to be zero * Update changelog * Update docker image * Update doc conda env and dockerfile * Custom envs should not have any warnings * Fix test for numpy >= 1.21 * Add check for vectorized compute reward * Bump to gym 0.24 * Fix gym default step docstring * Test downgrading gym * Revert "Test downgrading gym" This reverts commit 0072b77156c006ada8a1d6e26ce347ed85a83eeb. * Fix protobuf error * Fix in dependencies * Fix protobuf dep * Use newest version of cartpole * Update gym * Fix warning * Loosen required scipy version * Scipy no longer needed * Try gym 0.25 * Silence warnings from gym * Filter warnings during tests * Update doc * Update requirements * Add gym 26 compat in vec env * Fixes in envs and tests for gym 0.26+ * Enforce gym 0.26 api * format * Fix formatting * Fix dependencies * Fix syntax * Cleanup doc and warnings * Faster tests * Higher budget for HER perf test (revert prev change) * Fixes and update doc * Fix doc build * Fix breaking change * Fixes for rendering * Rename variables in monitor * update render method for gym 0.26 API backwards compatible (mode argument is allowed) while using the gym 0.26 API (render mode is determined at environment creation) * update tests and docs to new gym render API * undo removal of render modes metatadata check * set rgb_array as default render mode for gym.make * undo changes & raise warning if not 'rgb_array' * Fix type check * Remove recursion and fix type checking * Remove hacks for protobuf and gym 0.24 * Fix type annotations * reuse existing render_mode attribute * return tiled images for 'human' render mode * Allow to use opencv for human render, fix typos * Add warning when using non-zero start with Discrete (fixes #1197) * Fix type checking * Bug fixes and handle more cases * Throw proper warnings * Update test * Fix new metadata name * Ignore numpy warnings * Fixes in vec recorder * Global ignore * Filter local warning too * Monkey patch not needed for gym 26 * Add doc of VecEnv vs Gym API * Add render test * Fix return type * Update VecEnv vs Gym API doc * Fix for custom render mode * Fix return type * Fix type checking * check test env test_buffer * skip render check * check env test_dict_env * test_env test_gae * check envs in remaining tests * Update tests * Add warning for Discrete action space with non-zero (#1295) * Fix atari annotation * ignore get_action_meanings [attr-defined] * Fix mypy issues * Add patch for gym/gymnasium transition * Switch to gymnasium * Rely on signature instead of version * More patches * Type ignore because of https://github.com/Farama-Foundation/Gymnasium/pull/39 * Fix doc build * Fix pytype errors * Fix atari requirement * Update env checker due to change in dtype for Discrete * Fix type hint * Convert spaces for saved models * Ignore pytype * Remove gitlab CI * Disable pytype for convert space * Fix undefined info * Fix undefined info * Upgrade shimmy * Fix wrappers type annotation (need PR from Gymnasium) * Fix gymnasium dependency * Fix dependency declaration * Cap pygame version for python 3.7 * Point to master branch (v0.28.0) * Fix: use main not master branch * Rename done to terminated * Fix pygame dependency for python 3.7 * Rename gym to gymnasium * Update Gymnasium * Fix test * Fix tests * Forks don't have access to private variables * Fix linter warnings * Update read the doc env * Fix env checker for GoalEnv * Fix import * Update env checker (more info) and fix dtype * Use micromamab for Docker * Update dependencies * Clarify VecEnv doc * Fix Gymnasium version * Copy file only after mamba install * [ci skip] Update docker doc * Polish code * Reformat * Remove deprecated features * Ignore warning * Update doc * Update examples and changelog * Fix type annotation bundle (SAC, TD3, A2C, PPO, base class) (#1436) * Fix SAC type hints, improve DQN ones * Fix A2C and TD3 type hints * Fix PPO type hints * Fix on-policy type hints * Fix base class type annotation, do not use defaults * Update version * Disable mypy for python 3.7 * Rename Gym26StepReturn * Update continuous critic type annotation * Fix pytype complain --------- Co-authored-by: Carlos Luis <carlos.luisgonc@gmail.com> Co-authored-by: Quentin Gallouédec <45557362+qgallouedec@users.noreply.github.com> Co-authored-by: Thomas Lips <37955681+tlpss@users.noreply.github.com> Co-authored-by: tlips <thomas.lips@ugent.be> Co-authored-by: tlpss <thomas17.lips@gmail.com> Co-authored-by: Quentin GALLOUÉDEC <gallouedec.quentin@gmail.com>
113 lines
4.1 KiB
Python
113 lines
4.1 KiB
Python
from copy import deepcopy
|
|
from typing import Dict, Union
|
|
|
|
import numpy as np
|
|
from gymnasium import spaces
|
|
|
|
from stable_baselines3.common.preprocessing import is_image_space, is_image_space_channels_first
|
|
from stable_baselines3.common.vec_env.base_vec_env import VecEnv, VecEnvStepReturn, VecEnvWrapper
|
|
|
|
|
|
class VecTransposeImage(VecEnvWrapper):
|
|
"""
|
|
Re-order channels, from HxWxC to CxHxW.
|
|
It is required for PyTorch convolution layers.
|
|
|
|
:param venv:
|
|
:param skip: Skip this wrapper if needed as we rely on heuristic to apply it or not,
|
|
which may result in unwanted behavior, see GH issue #671.
|
|
"""
|
|
|
|
def __init__(self, venv: VecEnv, skip: bool = False):
|
|
assert is_image_space(venv.observation_space) or isinstance(
|
|
venv.observation_space, spaces.dict.Dict
|
|
), "The observation space must be an image or dictionary observation space"
|
|
|
|
self.skip = skip
|
|
# Do nothing
|
|
if skip:
|
|
super().__init__(venv)
|
|
return
|
|
|
|
if isinstance(venv.observation_space, spaces.dict.Dict):
|
|
self.image_space_keys = []
|
|
observation_space = deepcopy(venv.observation_space)
|
|
for key, space in observation_space.spaces.items():
|
|
if is_image_space(space):
|
|
# Keep track of which keys should be transposed later
|
|
self.image_space_keys.append(key)
|
|
observation_space.spaces[key] = self.transpose_space(space, key)
|
|
else:
|
|
observation_space = self.transpose_space(venv.observation_space)
|
|
super().__init__(venv, observation_space=observation_space)
|
|
|
|
@staticmethod
|
|
def transpose_space(observation_space: spaces.Box, key: str = "") -> spaces.Box:
|
|
"""
|
|
Transpose an observation space (re-order channels).
|
|
|
|
:param observation_space:
|
|
:param key: In case of dictionary space, the key of the observation space.
|
|
:return:
|
|
"""
|
|
# Sanity checks
|
|
assert is_image_space(observation_space), "The observation space must be an image"
|
|
assert not is_image_space_channels_first(
|
|
observation_space
|
|
), f"The observation space {key} must follow the channel last convention"
|
|
height, width, channels = observation_space.shape
|
|
new_shape = (channels, height, width)
|
|
return spaces.Box(low=0, high=255, shape=new_shape, dtype=observation_space.dtype)
|
|
|
|
@staticmethod
|
|
def transpose_image(image: np.ndarray) -> np.ndarray:
|
|
"""
|
|
Transpose an image or batch of images (re-order channels).
|
|
|
|
:param image:
|
|
:return:
|
|
"""
|
|
if len(image.shape) == 3:
|
|
return np.transpose(image, (2, 0, 1))
|
|
return np.transpose(image, (0, 3, 1, 2))
|
|
|
|
def transpose_observations(self, observations: Union[np.ndarray, Dict]) -> Union[np.ndarray, Dict]:
|
|
"""
|
|
Transpose (if needed) and return new observations.
|
|
|
|
:param observations:
|
|
:return: Transposed observations
|
|
"""
|
|
# Do nothing
|
|
if self.skip:
|
|
return observations
|
|
|
|
if isinstance(observations, dict):
|
|
# Avoid modifying the original object in place
|
|
observations = deepcopy(observations)
|
|
for k in self.image_space_keys:
|
|
observations[k] = self.transpose_image(observations[k])
|
|
else:
|
|
observations = self.transpose_image(observations)
|
|
return observations
|
|
|
|
def step_wait(self) -> VecEnvStepReturn:
|
|
observations, rewards, dones, infos = self.venv.step_wait()
|
|
|
|
# Transpose the terminal observations
|
|
for idx, done in enumerate(dones):
|
|
if not done:
|
|
continue
|
|
if "terminal_observation" in infos[idx]:
|
|
infos[idx]["terminal_observation"] = self.transpose_observations(infos[idx]["terminal_observation"])
|
|
|
|
return self.transpose_observations(observations), rewards, dones, infos
|
|
|
|
def reset(self) -> Union[np.ndarray, Dict]:
|
|
"""
|
|
Reset all environments
|
|
"""
|
|
return self.transpose_observations(self.venv.reset())
|
|
|
|
def close(self) -> None:
|
|
self.venv.close()
|