Merge branch '26-sequencingreplanning-feature-for-episode-based-environments'

Conflicts:
	fancy_gym/dmc/README.MD
	fancy_gym/dmc/manipulation/__init__.py
	fancy_gym/dmc/manipulation/reach_site/__init__.py
	fancy_gym/dmc/manipulation/reach_site/mp_wrapper.py
	fancy_gym/dmc/suite/__init__.py
	fancy_gym/dmc/suite/ball_in_cup/__init__.py
	fancy_gym/dmc/suite/ball_in_cup/mp_wrapper.py
	fancy_gym/dmc/suite/cartpole/__init__.py
	fancy_gym/dmc/suite/cartpole/mp_wrapper.py
	fancy_gym/dmc/suite/reacher/__init__.py
	fancy_gym/dmc/suite/reacher/mp_wrapper.py
	fancy_gym/envs/classic_control/README.MD
	fancy_gym/envs/classic_control/__init__.py
	fancy_gym/envs/classic_control/base_reacher/base_reacher.py
	fancy_gym/envs/classic_control/base_reacher/base_reacher_direct.py
	fancy_gym/envs/classic_control/base_reacher/base_reacher_torque.py
	fancy_gym/envs/classic_control/hole_reacher/__init__.py
	fancy_gym/envs/classic_control/hole_reacher/hole_reacher.py
	fancy_gym/envs/classic_control/hole_reacher/hr_dist_vel_acc_reward.py
	fancy_gym/envs/classic_control/hole_reacher/hr_simple_reward.py
	fancy_gym/envs/classic_control/hole_reacher/mp_wrapper.py
	fancy_gym/envs/classic_control/simple_reacher/__init__.py
	fancy_gym/envs/classic_control/simple_reacher/simple_reacher.py
	fancy_gym/envs/classic_control/utils.py
	fancy_gym/envs/classic_control/viapoint_reacher/__init__.py
	fancy_gym/envs/classic_control/viapoint_reacher/mp_wrapper.py
	fancy_gym/envs/classic_control/viapoint_reacher/viapoint_reacher.py
	fancy_gym/envs/mujoco/README.MD
	fancy_gym/envs/mujoco/beerpong/assets/beerpong.xml
	fancy_gym/envs/mujoco/beerpong/assets/beerpong_wo_cup.xml
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/base_link_convex.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/base_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_dist_link_convex.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_dist_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_med_link_convex.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_med_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_prox_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_prox_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_prox_link_convex_decomposition_p3.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_finger_prox_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_palm_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_palm_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_palm_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_palm_link_convex_decomposition_p3.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/bhand_palm_link_convex_decomposition_p4.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split10.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split11.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split12.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split13.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split14.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split15.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split16.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split17.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split18.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split3.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split4.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split5.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split6.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split7.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split8.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/cup_split9.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/elbow_link_convex.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/elbow_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/forearm_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/forearm_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/forearm_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/shoulder_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/shoulder_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/shoulder_link_convex_decomposition_p3.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/shoulder_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/shoulder_pitch_link_convex.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/shoulder_pitch_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/upper_arm_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/upper_arm_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/upper_arm_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_palm_link_convex.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_palm_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_pitch_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_pitch_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_pitch_link_convex_decomposition_p3.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_pitch_link_fine.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_yaw_link_convex_decomposition_p1.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_yaw_link_convex_decomposition_p2.stl
	fancy_gym/envs/mujoco/beerpong/assets/meshes/wam/wrist_yaw_link_fine.stl
	fancy_gym/envs/mujoco/hopper_throw/__init__.py
	fancy_gym/envs/mujoco/reacher/assets/reacher_5links.xml
	fancy_gym/envs/mujoco/reacher/assets/reacher_7links.xml
	fancy_gym/examples/examples_dmc.py
	fancy_gym/examples/examples_general.py
	fancy_gym/examples/examples_metaworld.py
	fancy_gym/meta/README.MD
	fancy_gym/meta/__init__.py
	fancy_gym/meta/goal_change_mp_wrapper.py
	fancy_gym/meta/goal_endeffector_change_mp_wrapper.py
	fancy_gym/meta/goal_object_change_mp_wrapper.py
	fancy_gym/meta/object_change_mp_wrapper.py
	fancy_gym/open_ai/README.MD
	fancy_gym/open_ai/deprecated_needs_gym_robotics/robotics/__init__.py
	fancy_gym/open_ai/deprecated_needs_gym_robotics/robotics/fetch/__init__.py
	fancy_gym/open_ai/deprecated_needs_gym_robotics/robotics/fetch/mp_wrapper.py
	fancy_gym/open_ai/mujoco/__init__.py
	fancy_gym/open_ai/mujoco/reacher_v2/__init__.py
	fancy_gym/utils/__init__.py
	test/test_dmc.py
This commit is contained in:
Fabian
2022-09-26 08:43:43 +02:00
179 changed files with 8309 additions and 212 deletions
+130
View File
@@ -0,0 +1,130 @@
import unittest
import gym
import numpy as np
from dm_control import suite, manipulation
import fancy_gym
from fancy_gym import make
SUITE_IDS = [f'dmc:{env}-{task}' for env, task in suite.ALL_TASKS if env != "lqr"]
MANIPULATION_IDS = [f'dmc:manipulation-{task}' for task in manipulation.ALL if task.endswith('_features')]
SEED = 1
class TestDMCEnvironments(unittest.TestCase):
def _run_env(self, env_id, iterations=None, seed=SEED, render=False):
"""
Example for running a DMC based env in the step based setting.
The env_id has to be specified as `dmc:domain_name-task_name` or
for manipulation tasks as `manipulation-environment_name`
Args:
env_id: Either `dmc:domain_name-task_name` or `dmc:manipulation-environment_name`
iterations: Number of rollout steps to run
seed: random seeding
render: Render the episode
Returns: observations, rewards, dones, actions
"""
env: gym.Env = make(env_id, seed=seed)
rewards = []
observations = []
actions = []
dones = []
obs = env.reset()
self._verify_observations(obs, env.observation_space, "reset()")
iterations = iterations or (env.spec.max_episode_steps or 1)
# number of samples(multiple environment steps)
for i in range(iterations):
observations.append(obs)
ac = env.action_space.sample()
actions.append(ac)
# ac = np.random.uniform(env.action_space.low, env.action_space.high, env.action_space.shape)
obs, reward, done, info = env.step(ac)
self._verify_observations(obs, env.observation_space, "step()")
self._verify_reward(reward)
self._verify_done(done)
rewards.append(reward)
dones.append(done)
if render:
env.render("human")
if done:
break
assert done, "Done flag is not True after end of episode."
observations.append(obs)
env.close()
del env
return np.array(observations), np.array(rewards), np.array(dones), np.array(actions)
def _run_env_determinism(self, ids):
seed = 0
for env_id in ids:
with self.subTest(msg=env_id):
traj1 = self._run_env(env_id, seed=seed)
traj2 = self._run_env(env_id, seed=seed)
for i, time_step in enumerate(zip(*traj1, *traj2)):
obs1, rwd1, done1, ac1, obs2, rwd2, done2, ac2 = time_step
self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] delta {obs1 - obs2} is not zero.")
self.assertTrue(np.array_equal(ac1, ac2), f"Actions [{i}] delta {ac1 - ac2} is not zero.")
self.assertEqual(done1, done2, f"Dones [{i}] {done1} and {done2} do not match.")
self.assertEqual(rwd1, rwd2, f"Rewards [{i}] {rwd1} and {rwd2} do not match.")
def _verify_observations(self, obs, observation_space, obs_type="reset()"):
self.assertTrue(observation_space.contains(obs),
f"Observation {obs} received from {obs_type} "
f"not contained in observation space {observation_space}.")
def _verify_reward(self, reward):
self.assertIsInstance(reward, (float, int), f"Returned type {type(reward)} as reward, expected float or int.")
def _verify_done(self, done):
self.assertIsInstance(done, bool, f"Returned {done} as done flag, expected bool.")
def test_suite_functionality(self):
"""Tests that suite step environments run without errors using random actions."""
for env_id in SUITE_IDS:
with self.subTest(msg=env_id):
self._run_env(env_id)
def test_suite_determinism(self):
"""Tests that for step environments identical seeds produce identical trajectories."""
self._run_env_determinism(SUITE_IDS)
def test_manipulation_functionality(self):
"""Tests that manipulation step environments run without errors using random actions."""
for env_id in MANIPULATION_IDS:
with self.subTest(msg=env_id):
self._run_env(env_id)
def test_manipulation_determinism(self):
"""Tests that for step environments identical seeds produce identical trajectories."""
self._run_env_determinism(MANIPULATION_IDS)
def test_bb_functionality(self):
"""Tests that black box environments run without errors using random actions."""
for traj_gen, env_ids in fancy_gym.ALL_DMC_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
for id in env_ids:
with self.subTest(msg=id):
self._run_env(id)
def test_bb_determinism(self):
"""Tests that for black box environment identical seeds produce identical trajectories."""
for traj_gen, env_ids in fancy_gym.ALL_DMC_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
self._run_env_determinism(env_ids)
if __name__ == '__main__':
unittest.main()
-49
View File
@@ -1,49 +0,0 @@
from typing import Tuple
import fancy_gym
import pytest
from dm_control import suite, manipulation
from test.utils import run_env_determinism, run_env
SUITE_IDS = [f'dmc:{env}-{task}' for env, task in suite.ALL_TASKS if env != "lqr"]
MANIPULATION_IDS = [f'dmc:manipulation-{task}' for task in manipulation.ALL if task.endswith('_features')]
SEED = 1
@pytest.mark.parametrize('env_id', SUITE_IDS)
def test_step_suite_functionality(env_id: str):
"""Tests that suite step environments run without errors using random actions."""
run_env(env_id)
@pytest.mark.parametrize('env_id', SUITE_IDS)
def test_step_suite_determinism(env_id: str):
"""Tests that for step environments identical seeds produce identical trajectories."""
seed = 0
run_env_determinism(env_id, seed)
@pytest.mark.parametrize('env_id', MANIPULATION_IDS)
def test_step_manipulation_functionality(env_id: str):
"""Tests that manipulation step environments run without errors using random actions."""
run_env(env_id)
@pytest.mark.parametrize('env_id', MANIPULATION_IDS)
def test_step_manipulation_determinism(env_id: str):
"""Tests that for step environments identical seeds produce identical trajectories."""
seed = 0
run_env_determinism(env_id, seed)
@pytest.mark.parametrize('env_id', [fancy_gym.ALL_DMC_MOVEMENT_PRIMITIVE_ENVIRONMENTS.values()])
def test_bb_dmc_functionality(env_id: str):
"""Tests that black box environments run without errors using random actions."""
run_env(env_id)
@pytest.mark.parametrize('env_id', [fancy_gym.ALL_DMC_MOVEMENT_PRIMITIVE_ENVIRONMENTS.values()])
def test_bb_dmc_determinism(env_id: str):
"""Tests that for black box environment identical seeds produce identical trajectories."""
run_env_determinism(env_id)
@@ -3,14 +3,15 @@ import unittest
import gym
import numpy as np
from alr_envs import make
from metaworld.envs import ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE
import fancy_gym # noqa
from fancy_gym.utils.make_env_helpers import make
ALL_ENVS = [env.split("-goal-observable")[0] for env, _ in ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE.items()]
CUSTOM_IDS = [spec.id for spec in gym.envs.registry.all() if
"fancy_gym" in spec.entry_point and 'make_bb_env_helper' not in spec.entry_point]
SEED = 1
class TestStepMetaWorlEnvironments(unittest.TestCase):
class TestCustomEnvironments(unittest.TestCase):
def _run_env(self, env_id, iterations=None, seed=SEED, render=False):
"""
@@ -21,26 +22,21 @@ class TestStepMetaWorlEnvironments(unittest.TestCase):
Args:
env_id: Either `domain_name-task_name` or `manipulation-environment_name`
iterations: Number of rollout steps to run
seed= random seeding
seed: random seeding
render: Render the episode
Returns:
Returns: observations, rewards, dones, actions
"""
env: gym.Env = make(env_id, seed=seed)
rewards = []
observations = []
actions = []
observations = []
dones = []
obs = env.reset()
self._verify_observations(obs, env.observation_space, "reset()")
length = env.max_path_length
if iterations is None:
if length is None:
iterations = 1
else:
iterations = length
iterations = iterations or (env.spec.max_episode_steps or 1)
# number of samples(multiple environment steps)
for i in range(iterations):
@@ -48,7 +44,6 @@ class TestStepMetaWorlEnvironments(unittest.TestCase):
ac = env.action_space.sample()
actions.append(ac)
# ac = np.random.uniform(env.action_space.low, env.action_space.high, env.action_space.shape)
obs, reward, done, info = env.step(ac)
self._verify_observations(obs, env.observation_space, "step()")
@@ -62,36 +57,17 @@ class TestStepMetaWorlEnvironments(unittest.TestCase):
env.render("human")
if done:
obs = env.reset()
break
assert done, "Done flag is not True after max episode length."
assert done, "Done flag is not True after end of episode."
observations.append(obs)
env.close()
del env
return np.array(observations), np.array(rewards), np.array(dones), np.array(actions)
def _verify_observations(self, obs, observation_space, obs_type="reset()"):
self.assertTrue(observation_space.contains(obs),
f"Observation {obs} received from {obs_type} "
f"not contained in observation space {observation_space}.")
def _verify_reward(self, reward):
self.assertIsInstance(reward, float, f"Returned {reward} as reward, expected float.")
def _verify_done(self, done):
self.assertIsInstance(done, bool, f"Returned {done} as done flag, expected bool.")
def test_metaworld_functionality(self):
"""Tests that environments runs without errors using random actions."""
for env_id in ALL_ENVS:
with self.subTest(msg=env_id):
self._run_env(env_id)
def test_metaworld_determinism(self):
"""Tests that identical seeds produce identical trajectories."""
def _run_env_determinism(self, ids):
seed = 0
# Iterate over two trajectories, which should have the same state and action sequence
for env_id in ALL_ENVS:
for env_id in ids:
with self.subTest(msg=env_id):
traj1 = self._run_env(env_id, seed=seed)
traj2 = self._run_env(env_id, seed=seed)
@@ -99,9 +75,44 @@ class TestStepMetaWorlEnvironments(unittest.TestCase):
obs1, rwd1, done1, ac1, obs2, rwd2, done2, ac2 = time_step
self.assertTrue(np.array_equal(ac1, ac2), f"Actions [{i}] delta {ac1 - ac2} is not zero.")
self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] delta {obs1 - obs2} is not zero.")
self.assertAlmostEqual(rwd1, rwd2, f"Rewards [{i}] {rwd1} and {rwd2} do not match.")
self.assertEqual(rwd1, rwd2, f"Rewards [{i}] {rwd1} and {rwd2} do not match.")
self.assertEqual(done1, done2, f"Dones [{i}] {done1} and {done2} do not match.")
def _verify_observations(self, obs, observation_space, obs_type="reset()"):
self.assertTrue(observation_space.contains(obs),
f"Observation {obs} received from {obs_type} "
f"not contained in observation space {observation_space}.")
def _verify_reward(self, reward):
self.assertIsInstance(reward, (float, int), f"Returned type {type(reward)} as reward, expected float or int.")
def _verify_done(self, done):
self.assertIsInstance(done, bool, f"Returned {done} as done flag, expected bool.")
def test_step_functionality(self):
"""Tests that step environments run without errors using random actions."""
for env_id in CUSTOM_IDS:
with self.subTest(msg=env_id):
self._run_env(env_id)
def test_step_determinism(self):
"""Tests that for step environments identical seeds produce identical trajectories."""
self._run_env_determinism(CUSTOM_IDS)
def test_bb_functionality(self):
"""Tests that black box environments run without errors using random actions."""
for traj_gen, env_ids in fancy_gym.ALL_FANCY_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
for id in env_ids:
with self.subTest(msg=id):
self._run_env(id)
def test_bb_determinism(self):
"""Tests that for black box environment identical seeds produce identical trajectories."""
for traj_gen, env_ids in fancy_gym.ALL_FANCY_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
self._run_env_determinism(env_ids)
if __name__ == '__main__':
unittest.main()
+118
View File
@@ -0,0 +1,118 @@
import unittest
import gym
import numpy as np
import fancy_gym
from fancy_gym import make
GYM_IDS = [spec.id for spec in gym.envs.registry.all() if
"fancy_gym" not in spec.entry_point and 'make_bb_env_helper' not in spec.entry_point]
SEED = 1
class TestGymEnvironments(unittest.TestCase):
def _run_env(self, env_id, iterations=None, seed=SEED, render=False):
"""
Example for running a openai gym env in the step based setting.
The env_id has to be specified as `env_id-vX`.
Args:
env_id: env id in the form `env_id-vX`
iterations: Number of rollout steps to run
seed: random seeding
render: Render the episode
Returns:
"""
env: gym.Env = make(env_id, seed=seed)
rewards = []
observations = []
actions = []
dones = []
obs = env.reset()
self._verify_observations(obs, env.observation_space, "reset()")
iterations = iterations or (env.spec.max_episode_steps or 1)
# number of samples(multiple environment steps)
for i in range(iterations):
observations.append(obs)
ac = env.action_space.sample()
actions.append(ac)
# ac = np.random.uniform(env.action_space.low, env.action_space.high, env.action_space.shape)
obs, reward, done, info = env.step(ac)
self._verify_observations(obs, env.observation_space, "step()")
self._verify_reward(reward)
self._verify_done(done)
rewards.append(reward)
dones.append(done)
if render:
env.render("human")
if done:
break
assert done or env.spec.max_episode_steps is None, "Done flag is not True after end of episode."
observations.append(obs)
env.close()
del env
return np.array(observations), np.array(rewards), np.array(dones), np.array(actions)
def _run_env_determinism(self, ids):
seed = 0
for env_id in ids:
with self.subTest(msg=env_id):
traj1 = self._run_env(env_id, seed=seed)
traj2 = self._run_env(env_id, seed=seed)
for i, time_step in enumerate(zip(*traj1, *traj2)):
obs1, rwd1, done1, ac1, obs2, rwd2, done2, ac2 = time_step
self.assertTrue(np.array_equal(ac1, ac2), f"Actions [{i}] delta {ac1 - ac2} is not zero.")
self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] delta {obs1 - obs2} is not zero.")
self.assertEqual(rwd1, rwd2, f"Rewards [{i}] {rwd1} and {rwd2} do not match.")
self.assertEqual(done1, done2, f"Dones [{i}] {done1} and {done2} do not match.")
def _verify_observations(self, obs, observation_space, obs_type="reset()"):
self.assertTrue(observation_space.contains(obs),
f"Observation {obs} received from {obs_type} "
f"not contained in observation space {observation_space}.")
def _verify_reward(self, reward):
self.assertIsInstance(reward, (float, int), f"Returned type {type(reward)} as reward, expected float or int.")
def _verify_done(self, done):
self.assertIsInstance(done, bool, f"Returned {done} as done flag, expected bool.")
def test_step_functionality(self):
"""Tests that step environments run without errors using random actions."""
for env_id in GYM_IDS:
with self.subTest(msg=env_id):
self._run_env(env_id)
def test_step_determinism(self):
"""Tests that for step environments identical seeds produce identical trajectories."""
self._run_env_determinism(GYM_IDS)
def test_bb_functionality(self):
"""Tests that black box environments run without errors using random actions."""
for traj_gen, env_ids in fancy_gym.ALL_GYM_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
for id in env_ids:
with self.subTest(msg=id):
self._run_env(id)
def test_bb_determinism(self):
"""Tests that for black box environment identical seeds produce identical trajectories."""
for traj_gen, env_ids in fancy_gym.ALL_GYM_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
self._run_env_determinism(env_ids)
if __name__ == '__main__':
unittest.main()
+119
View File
@@ -0,0 +1,119 @@
import unittest
import gym
import numpy as np
from metaworld.envs import ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE
import fancy_gym
from fancy_gym import make
METAWORLD_IDS = [f'metaworld:{env.split("-goal-observable")[0]}' for env, _ in
ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE.items()]
SEED = 1
class TestMetaWorldEnvironments(unittest.TestCase):
def _run_env(self, env_id, iterations=None, seed=SEED, render=False):
"""
Example for running a metaworld based env in the step based setting.
The env_id has to be specified as `metaworld:env_id-vX`.
Args:
env_id: env id in the form `metaworld:env_id-vX`
iterations: Number of rollout steps to run
seed: random seeding
render: Render the episode
Returns:
"""
env: gym.Env = make(env_id, seed=seed)
rewards = []
observations = []
actions = []
dones = []
obs = env.reset()
self._verify_observations(obs, env.observation_space, "reset()")
iterations = iterations or (env.spec.max_episode_steps or 1)
# number of samples(multiple environment steps)
for i in range(iterations):
observations.append(obs)
ac = env.action_space.sample()
actions.append(ac)
# ac = np.random.uniform(env.action_space.low, env.action_space.high, env.action_space.shape)
obs, reward, done, info = env.step(ac)
self._verify_observations(obs, env.observation_space, "step()")
self._verify_reward(reward)
self._verify_done(done)
rewards.append(reward)
dones.append(done)
if render:
env.render("human")
if done:
break
assert done, "Done flag is not True after end of episode."
observations.append(obs)
env.close()
del env
return np.array(observations), np.array(rewards), np.array(dones), np.array(actions)
def _run_env_determinism(self, ids):
seed = 0
for env_id in ids:
with self.subTest(msg=env_id):
traj1 = self._run_env(env_id, seed=seed)
traj2 = self._run_env(env_id, seed=seed)
for i, time_step in enumerate(zip(*traj1, *traj2)):
obs1, rwd1, done1, ac1, obs2, rwd2, done2, ac2 = time_step
self.assertTrue(np.array_equal(ac1, ac2), f"Actions [{i}] delta {ac1 - ac2} is not zero.")
self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] delta {obs1 - obs2} is not zero.")
self.assertEqual(rwd1, rwd2, f"Rewards [{i}] {rwd1} and {rwd2} do not match.")
self.assertEqual(done1, done2, f"Dones [{i}] {done1} and {done2} do not match.")
def _verify_observations(self, obs, observation_space, obs_type="reset()"):
self.assertTrue(observation_space.contains(obs),
f"Observation {obs} received from {obs_type} "
f"not contained in observation space {observation_space}.")
def _verify_reward(self, reward):
self.assertIsInstance(reward, (float, int), f"Returned type {type(reward)} as reward, expected float or int.")
def _verify_done(self, done):
self.assertIsInstance(done, bool, f"Returned {done} as done flag, expected bool.")
def test_step_functionality(self):
"""Tests that step environments run without errors using random actions."""
for env_id in METAWORLD_IDS:
with self.subTest(msg=env_id):
self._run_env(env_id)
def test_step_determinism(self):
"""Tests that for step environments identical seeds produce identical trajectories."""
self._run_env_determinism(METAWORLD_IDS)
def test_bb_functionality(self):
"""Tests that black box environments run without errors using random actions."""
for traj_gen, env_ids in fancy_gym.ALL_METAWORLD_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
for id in env_ids:
with self.subTest(msg=id):
self._run_env(id)
def test_bb_determinism(self):
"""Tests that for black box environment identical seeds produce identical trajectories."""
for traj_gen, env_ids in fancy_gym.ALL_METAWORLD_MOVEMENT_PRIMITIVE_ENVIRONMENTS.items():
with self.subTest(msg=traj_gen):
self._run_env_determinism(env_ids)
if __name__ == '__main__':
unittest.main()