mirror of
https://github.com/Farama-Foundation/Gymnasium.git
synced 2025-08-16 19:49:13 +00:00
* Updated cartpole-v0 to v1 to prevent warning and added pytest.mark.filterwarnings for tests where warnings are unavoidable * Change np.bool to bool as numpy raises a warning and bool is the suggested solution * Seeding randint is deprecated in the future, integers is new solution * Fixed errors thrown when the video recorder is deleted but not closed * spaces.Box expects a floating array, updated all cases where this was not true and modified float32 to float64 as float array default to float64. Otherwise space.Box raises warning that dtype precision (float32) is lower than array precision (float64). * Added pytest.mark.filterwarnings to preventing the raising of an intended warning * Added comment to explain why a warning is raised that can't be prevented without version update to the environment * Added comment to explain why warning is raised * Changed values to float as expected by the box which default to float64 * Removed --forked from pytest as the pytest-forked project is no being maintained and was not raising warnings as expected * When AsyncVectorEnv has shared_memory=True then a ValueError is raised before _state is initialised. Therefore, on the destruction on the env an error is thrown in .close_extra as _state does not exist * Possible fix that was causing an error in test_call_async_vector_env by ensuring that pygame resources are released * Pygame throws an error with ALSA when closed, using a fix from PettingZoo (https://github.com/Farama-Foundation/PettingZoo/blob/master/pettingzoo/__init__.py). We use the dsp audiodriver to prevent this issue * Modification due to running pre-commit locally * Updated cartpole-v0 to v1 to prevent warning and added pytest.mark.filterwarnings for tests where warnings are unavoidable * Change np.bool to bool as numpy raises a warning and bool is the suggested solution * Seeding randint is deprecated in the future, integers is new solution * Fixed errors thrown when the video recorder is deleted but not closed * spaces.Box expects a floating array, updated all cases where this was not true and modified float32 to float64 as float array default to float64. Otherwise space.Box raises warning that dtype precision (float32) is lower than array precision (float64). * Added pytest.mark.filterwarnings to preventing the raising of an intended warning * Added comment to explain why a warning is raised that can't be prevented without version update to the environment * Added comment to explain why warning is raised * Changed values to float as expected by the box which default to float64 * Removed --forked from pytest as the pytest-forked project is no being maintained and was not raising warnings as expected * When AsyncVectorEnv has shared_memory=True then a ValueError is raised before _state is initialised. Therefore, on the destruction on the env an error is thrown in .close_extra as _state does not exist * Possible fix that was causing an error in test_call_async_vector_env by ensuring that pygame resources are released * Pygame throws an error with ALSA when closed, using a fix from PettingZoo (https://github.com/Farama-Foundation/PettingZoo/blob/master/pettingzoo/__init__.py). We use the dsp audiodriver to prevent this issue * Modification due to running pre-commit locally
66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
from typing import Optional
|
|
|
|
import numpy as np
|
|
from .space import Space
|
|
|
|
|
|
class Discrete(Space[int]):
|
|
r"""A discrete space in :math:`\{ 0, 1, \\dots, n-1 \}`.
|
|
|
|
A start value can be optionally specified to shift the range
|
|
to :math:`\{ a, a+1, \\dots, a+n-1 \}`.
|
|
|
|
Example::
|
|
|
|
>>> Discrete(2) # {0, 1}
|
|
>>> Discrete(3, start=-1) # {-1, 0, 1}
|
|
|
|
"""
|
|
|
|
def __init__(self, n: int, seed: Optional[int] = None, start: int = 0):
|
|
assert n > 0, "n (counts) have to be positive"
|
|
assert isinstance(start, (int, np.integer))
|
|
self.n = int(n)
|
|
self.start = int(start)
|
|
super().__init__((), np.int64, seed)
|
|
|
|
def sample(self) -> int:
|
|
return int(self.start + self.np_random.integers(self.n))
|
|
|
|
def contains(self, x) -> bool:
|
|
if isinstance(x, int):
|
|
as_int = x
|
|
elif isinstance(x, (np.generic, np.ndarray)) and (
|
|
x.dtype.char in np.typecodes["AllInteger"] and x.shape == ()
|
|
):
|
|
as_int = int(x) # type: ignore
|
|
else:
|
|
return False
|
|
return self.start <= as_int < self.start + self.n
|
|
|
|
def __repr__(self) -> str:
|
|
if self.start != 0:
|
|
return "Discrete(%d, start=%d)" % (self.n, self.start)
|
|
return "Discrete(%d)" % self.n
|
|
|
|
def __eq__(self, other) -> bool:
|
|
return (
|
|
isinstance(other, Discrete)
|
|
and self.n == other.n
|
|
and self.start == other.start
|
|
)
|
|
|
|
def __setstate__(self, state):
|
|
super().__setstate__(state)
|
|
|
|
# Don't mutate the original state
|
|
state = dict(state)
|
|
|
|
# Allow for loading of legacy states.
|
|
# See https://github.com/openai/gym/pull/2470
|
|
if "start" not in state:
|
|
state["start"] = 0
|
|
|
|
# Update our state
|
|
self.__dict__.update(state)
|