def write_to_shared_memory(index, value, shared_memory, space): """Write the observation of a single environment into shared memory. Parameters ---------- index : int Index of the environment (must be in `[0, num_envs)`). value : sample from `space` Observation of the single environment to write to shared memory. shared_memory : dict, tuple, or `multiprocessing.Array` instance Shared object across processes. This contains the observations from the vectorized environment. This object is created with `create_shared_memory`. space : `gym.spaces.Space` instance Observation space of a single environment in the vectorized environment. Returns ------- `None` """ if isinstance(space, _BaseGymSpaces): write_base_to_shared_memory(index, value, shared_memory, space) elif isinstance(space, Tuple): write_tuple_to_shared_memory(index, value, shared_memory, space) elif isinstance(space, Dict): write_dict_to_shared_memory(index, value, shared_memory, space) else: raise CustomSpaceError( "Cannot write to a shared memory for space with " "type `{}`. Shared memory only supports " "default Gym spaces (e.g. `Box`, `Tuple`, " "`Dict`, etc...), and does not support custom " "Gym spaces.".format(type(space)))
def create_shared_memory(space, n=1, ctx=mp): """Create a shared memory object, to be shared across processes. This eventually contains the observations from the vectorized environment. Parameters ---------- space : `gym.spaces.Space` instance Observation space of a single environment in the vectorized environment. n : int Number of environments in the vectorized environment (i.e. the number of processes). ctx : `multiprocessing` context Context for multiprocessing. Returns ------- shared_memory : dict, tuple, or `multiprocessing.Array` instance Shared object across processes. """ if isinstance(space, _BaseGymSpaces): return create_base_shared_memory(space, n=n, ctx=ctx) elif isinstance(space, Tuple): return create_tuple_shared_memory(space, n=n, ctx=ctx) elif isinstance(space, Dict): return create_dict_shared_memory(space, n=n, ctx=ctx) else: raise CustomSpaceError("Cannot create a shared memory for space with " "type `{}`. Shared memory only supports " "default Gym spaces (e.g. `Box`, `Tuple`, " "`Dict`, etc...), and does not support custom " "Gym spaces.".format(type(space)))
def read_from_shared_memory(space: Space, shared_memory: Union[dict, tuple, mp.Array], n: int = 1) -> Union[dict, tuple, np.ndarray]: """Read the batch of observations from shared memory as a numpy array. ..notes:: The numpy array objects returned by `read_from_shared_memory` shares the memory of `shared_memory`. Any changes to `shared_memory` are forwarded to `observations`, and vice-versa. To avoid any side-effect, use `np.copy`. Args: space: Observation space of a single environment in the vectorized environment. shared_memory: Shared object across processes. This contains the observations from the vectorized environment. This object is created with `create_shared_memory`. n: Number of environments in the vectorized environment (i.e. the number of processes). Returns: Batch of observations as a (possibly nested) numpy array. """ raise CustomSpaceError( "Cannot read from a shared memory for space with " f"type `{type(space)}`. Shared memory only supports " "default Gym spaces (e.g. `Box`, `Tuple`, " "`Dict`, etc...), and does not support custom " "Gym spaces.")
def read_from_shared_memory(space, shared_memory, n=1): """Read the batch of observations from shared memory as a numpy array. Parameters ---------- shared_memory : dict, tuple, or `multiprocessing.Array` instance Shared object across processes. This contains the observations from the vectorized environment. This object is created with `create_shared_memory`. space : `gym.spaces.Space` instance Observation space of a single environment in the vectorized environment. n : int Number of environments in the vectorized environment (i.e. the number of processes). Returns ------- observations : dict, tuple or `np.ndarray` instance Batch of observations as a (possibly nested) numpy array. Notes ----- The numpy array objects returned by `read_from_shared_memory` shares the memory of `shared_memory`. Any changes to `shared_memory` are forwarded to `observations`, and vice-versa. To avoid any side-effect, use `np.copy`. """ raise CustomSpaceError("Cannot read from a shared memory for space with " "type `{}`. Shared memory only supports " "default Gym spaces (e.g. `Box`, `Tuple`, " "`Dict`, etc...), and does not support custom " "Gym spaces.".format(type(space)))
def write_to_shared_memory( space: Space, index: int, value: np.ndarray, shared_memory: Union[dict, tuple, mp.Array], ): """Write the observation of a single environment into shared memory. Args: space: Observation space of a single environment in the vectorized environment. index: Index of the environment (must be in `[0, num_envs)`). value: Observation of the single environment to write to shared memory. shared_memory: Shared object across processes. This contains the observations from the vectorized environment. This object is created with `create_shared_memory`. """ raise CustomSpaceError( "Cannot write to a shared memory for space with " f"type `{type(space)}`. Shared memory only supports " "default Gym spaces (e.g. `Box`, `Tuple`, " "`Dict`, etc...), and does not support custom " "Gym spaces.")
def create_shared_memory(space: Space, n: int = 1, ctx=mp) -> Union[dict, tuple, mp.Array]: """Create a shared memory object, to be shared across processes. This eventually contains the observations from the vectorized environment. Args: space: Observation space of a single environment in the vectorized environment. n: Number of environments in the vectorized environment (i.e. the number of processes). ctx: The multiprocess module Returns: shared_memory for the shared object across processes. """ raise CustomSpaceError( "Cannot create a shared memory for space with " f"type `{type(space)}`. Shared memory only supports " "default Gym spaces (e.g. `Box`, `Tuple`, " "`Dict`, etc...), and does not support custom " "Gym spaces.")
def _iterate_custom(space, items): raise CustomSpaceError(f"Unable to iterate over {items}, since {space} " "is a custom `gym.Space` instance (i.e. not one of " "`Box`, `Dict`, etc...).")