"""Wrapper for clipping actions within a valid bound.""" import numpy as np import gym from gym import ActionWrapper from gym.spaces import Box class ClipAction(ActionWrapper): """Clip the continuous action within the valid :class:`Box` observation space bound. Example: >>> import gym >>> env = gym.make('Bipedal-Walker-v3') >>> env = ClipAction(env) >>> env.action_space Box(-1.0, 1.0, (4,), float32) >>> env.step(np.array([5.0, 2.0, -10.0, 0.0])) # Executes the action np.array([1.0, 1.0, -1.0, 0]) in the base environment """ def __init__(self, env: gym.Env): """A wrapper for clipping continuous actions within the valid bound. Args: env: The environment to apply the wrapper """ assert isinstance(env.action_space, Box) super().__init__(env) def action(self, action): """Clips the action within the valid bounds. Args: action: The action to clip Returns: The clipped action """ return np.clip(action, self.action_space.low, self.action_space.high)