run_tests.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #!/usr/bin/env python3
  2. from pydoc import render_doc
  3. import random
  4. import numpy as np
  5. import gym
  6. import gym_minigrid
  7. from gym_minigrid.register import env_list
  8. from gym_minigrid.minigrid import Grid, OBJECT_TO_IDX
  9. # Test specifically importing a specific environment
  10. from gym_minigrid.envs import DoorKeyEnv
  11. # Test importing wrappers
  12. from gym_minigrid.wrappers import *
  13. ##############################################################################
  14. print('%d environments registered' % len(env_list))
  15. for env_idx, env_name in enumerate(env_list):
  16. print('testing {} ({}/{})'.format(env_name, env_idx+1, len(env_list)))
  17. # Load the gym environment
  18. env = gym.make(env_name, render_mode='rgb_array')
  19. env.max_steps = min(env.max_steps, 200)
  20. env.reset()
  21. env.render()
  22. # Verify that the same seed always produces the same environment
  23. for i in range(0, 5):
  24. seed = 1337 + i
  25. _ = env.reset(seed=seed)
  26. grid1 = env.grid
  27. _ = env.reset(seed=seed)
  28. grid2 = env.grid
  29. assert grid1 == grid2
  30. env.reset()
  31. # Run for a few episodes
  32. num_episodes = 0
  33. while num_episodes < 5:
  34. # Pick a random action
  35. action = random.randint(0, env.action_space.n - 1)
  36. obs, reward, done, info = env.step(action)
  37. # Validate the agent position
  38. assert env.agent_pos[0] < env.width
  39. assert env.agent_pos[1] < env.height
  40. # Test observation encode/decode roundtrip
  41. img = obs['image']
  42. grid, vis_mask = Grid.decode(img)
  43. img2 = grid.encode(vis_mask=vis_mask)
  44. assert np.array_equal(img, img2)
  45. # Test the env to string function
  46. str(env)
  47. # Check that the reward is within the specified range
  48. assert reward >= env.reward_range[0], reward
  49. assert reward <= env.reward_range[1], reward
  50. if done:
  51. num_episodes += 1
  52. env.reset()
  53. env.render()
  54. # Test the close method
  55. env.close()
  56. env = gym.make(env_name)
  57. env = ReseedWrapper(env)
  58. for _ in range(10):
  59. env.reset()
  60. env.step(0)
  61. env.close()
  62. env = gym.make(env_name)
  63. env = ImgObsWrapper(env)
  64. env.reset()
  65. env.step(0)
  66. env.close()
  67. # Test the fully observable wrapper
  68. env = gym.make(env_name)
  69. env = FullyObsWrapper(env)
  70. env.reset()
  71. obs, _, _, _ = env.step(0)
  72. assert obs['image'].shape == env.observation_space.spaces['image'].shape
  73. env.close()
  74. # RGB image observation wrapper
  75. env = gym.make(env_name)
  76. env = RGBImgPartialObsWrapper(env)
  77. env.reset()
  78. obs, _, _, _ = env.step(0)
  79. assert obs['image'].mean() > 0
  80. env.close()
  81. env = gym.make(env_name)
  82. env = FlatObsWrapper(env)
  83. env.reset()
  84. env.step(0)
  85. env.close()
  86. env = gym.make(env_name)
  87. env = ViewSizeWrapper(env, 5)
  88. env.reset()
  89. env.step(0)
  90. env.close()
  91. # Test the DictObservationSpaceWrapper
  92. env = gym.make(env_name)
  93. env = DictObservationSpaceWrapper(env)
  94. env.reset()
  95. mission = env.mission
  96. obs, _, _, _ = env.step(0)
  97. assert env.string_to_indices(mission) == [
  98. value for value in obs['mission'] if value != 0]
  99. env.close()
  100. # Test the wrappers return proper observation spaces.
  101. wrappers = [
  102. RGBImgObsWrapper,
  103. RGBImgPartialObsWrapper,
  104. OneHotPartialObsWrapper
  105. ]
  106. for wrapper in wrappers:
  107. env = wrapper(gym.make(env_name, render_mode='rgb_array'))
  108. obs_space, wrapper_name = env.observation_space, wrapper.__name__
  109. assert isinstance(
  110. obs_space, spaces.Dict
  111. ), "Observation space for {0} is not a Dict: {1}.".format(
  112. wrapper_name, obs_space
  113. )
  114. # This should not fail either
  115. ImgObsWrapper(env)
  116. env.reset()
  117. env.step(0)
  118. env.close()
  119. ##############################################################################
  120. print('testing extra observations')
  121. class EmptyEnvWithExtraObs(gym_minigrid.envs.EmptyEnv5x5):
  122. """
  123. Custom environment with an extra observation
  124. """
  125. def __init__(self, **kwargs) -> None:
  126. super().__init__(**kwargs)
  127. self.observation_space['size'] = spaces.Box(
  128. low=0,
  129. high=1000, # gym does not like np.iinfo(np.uint).max,
  130. shape=(2,),
  131. dtype=np.uint
  132. )
  133. def reset(self, **kwargs):
  134. obs = super().reset(**kwargs)
  135. obs['size'] = np.array([self.width, self.height], dtype=np.uint)
  136. return obs
  137. def step(self, action):
  138. obs, reward, done, info = super().step(action)
  139. obs['size'] = np.array([self.width, self.height], dtype=np.uint)
  140. return obs, reward, done, info
  141. wrappers = [
  142. OneHotPartialObsWrapper,
  143. RGBImgObsWrapper,
  144. RGBImgPartialObsWrapper,
  145. FullyObsWrapper,
  146. ]
  147. for wrapper in wrappers:
  148. env1 = wrapper(EmptyEnvWithExtraObs(render_mode='rgb_array'))
  149. env2 = wrapper(gym.make('MiniGrid-Empty-5x5-v0', render_mode='rgb_array'))
  150. obs1 = env1.reset(seed=0)
  151. obs2 = env2.reset(seed=0)
  152. assert 'size' in obs1
  153. assert obs1['size'].shape == (2,)
  154. assert (obs1['size'] == [5, 5]).all()
  155. for key in obs2:
  156. assert np.array_equal(obs1[key], obs2[key])
  157. obs1, reward1, done1, _ = env1.step(0)
  158. obs2, reward2, done2, _ = env2.step(0)
  159. assert 'size' in obs1
  160. assert obs1['size'].shape == (2,)
  161. assert (obs1['size'] == [5, 5]).all()
  162. for key in obs2:
  163. assert np.array_equal(obs1[key], obs2[key])
  164. ##############################################################################
  165. print('testing agent_sees method')
  166. env = gym.make('MiniGrid-DoorKey-6x6-v0')
  167. goal_pos = (env.grid.width - 2, env.grid.height - 2)
  168. # Test the "in" operator on grid objects
  169. assert ('green', 'goal') in env.grid
  170. assert ('blue', 'key') not in env.grid
  171. # Test the env.agent_sees() function
  172. env.reset()
  173. for i in range(0, 500):
  174. action = random.randint(0, env.action_space.n - 1)
  175. obs, reward, done, info = env.step(action)
  176. grid, _ = Grid.decode(obs['image'])
  177. goal_visible = ('green', 'goal') in grid
  178. agent_sees_goal = env.agent_sees(*goal_pos)
  179. assert agent_sees_goal == goal_visible
  180. if done:
  181. env.reset()