From a0a9c9c7fb27559b5d185d9db561930f479ff952 Mon Sep 17 00:00:00 2001 From: Maximilian Huettenrauch Date: Tue, 1 Jun 2021 16:52:54 +0200 Subject: [PATCH 01/56] wip --- alr_envs/__init__.py | 2 +- alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py | 4 ++++ .../ball_in_a_cup/ball_in_a_cup_reward_simple.py | 15 ++++++++++----- example.py | 6 +++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 986265c..24353b2 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -210,7 +210,7 @@ register( "hole_width": 0.25, "hole_depth": 1, "hole_x": 2, - "collision_penalty": 100, + "collision_penalty": 2, } ) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index 345b3ce..bfd7940 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -68,6 +68,10 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): def current_vel(self): return self.sim.data.qvel[0:7].copy() + def reset(self): + self.reward_function.reset(None) + return super().reset() + def reset_model(self): init_pos_all = self.init_qpos.copy() init_pos_robot = self._start_pos diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py index 79987d6..0bc0fd2 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py @@ -37,6 +37,7 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.dists_final = [] self.costs = [] self.action_costs = [] + self.angle_costs = [] self.cup_angles = [] def compute_reward(self, action, env): @@ -56,8 +57,11 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.dists_final.append(np.linalg.norm(goal_final_pos - ball_pos)) self.ball_traj[env._steps, :] = ball_pos cup_quat = np.copy(env.sim.data.body_xquat[env.sim.model._body_name2id["cup"]]) - self.cup_angles.append(np.arctan2(2 * (cup_quat[0] * cup_quat[1] + cup_quat[2] * cup_quat[3]), - 1 - 2 * (cup_quat[1]**2 + cup_quat[2]**2))) + cup_angle = np.arctan2(2 * (cup_quat[0] * cup_quat[1] + cup_quat[2] * cup_quat[3]), + 1 - 2 * (cup_quat[1]**2 + cup_quat[2]**2)) + cost_angle = (cup_angle - np.pi / 2) ** 2 + self.angle_costs.append(cost_angle) + self.cup_angles.append(cup_angle) action_cost = np.sum(np.square(action)) self.action_costs.append(action_cost) @@ -67,7 +71,8 @@ class BallInACupReward(alr_reward_fct.AlrReward): if env._steps == env.sim_steps - 1 or self._is_collided: t_min_dist = np.argmin(self.dists) angle_min_dist = self.cup_angles[t_min_dist] - cost_angle = (angle_min_dist - np.pi / 2)**2 + # cost_angle = (angle_min_dist - np.pi / 2)**2 + min_dist = self.dists[t_min_dist] dist_final = self.dists_final[-1] @@ -76,11 +81,11 @@ class BallInACupReward(alr_reward_fct.AlrReward): cost = 0.5 * dist_final + 0.05 * cost_angle # TODO: Increase cost_angle weight # 0.5 * min_dist + # reward = np.exp(-2 * cost) - 1e-2 * action_cost - self.collision_penalty * int(self._is_collided) # reward = - dist_final**2 - 1e-4 * cost_angle - 1e-5 * action_cost - self.collision_penalty * int(self._is_collided) - reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 1e-5 * action_cost - self.collision_penalty * int(self._is_collided) + reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 5e-4 * action_cost - self.collision_penalty * int(self._is_collided) success = dist_final < 0.05 and ball_in_cup and not self._is_collided crash = self._is_collided else: - reward = - 1e-5 * action_cost # TODO: increase action_cost weight + reward = - 5e-4 * action_cost - 1e-4 * cost_angle # TODO: increase action_cost weight success = False crash = False diff --git a/example.py b/example.py index af30138..a8ae649 100644 --- a/example.py +++ b/example.py @@ -106,10 +106,10 @@ def example_async_contextual_sampler(env_name="alr_envs:SimpleReacherDMP-v1", n_ if __name__ == '__main__': # example_mujoco() - # example_dmp("alr_envs:SimpleReacherDMP-v1") + example_mp("alr_envs:SimpleReacherDMP-v1") # example_async("alr_envs:LongSimpleReacherDMP-v0", 4) # example_async_contextual_sampler() # env = gym.make("alr_envs:HoleReacherDetPMP-v1") - env_name = "alr_envs:ALRBallInACupSimpleDetPMP-v0" + # env_name = "alr_envs:ALRBallInACupSimpleDetPMP-v0" # example_async_sampler(env_name) - example_mp(env_name) + # example_mp(env_name) From 3876478b962a43698773c8976fadd266db7c57b1 Mon Sep 17 00:00:00 2001 From: Maximilian Huettenrauch Date: Wed, 16 Jun 2021 10:29:38 +0200 Subject: [PATCH 02/56] updates --- alr_envs/__init__.py | 4 ++-- .../mujoco/ball_in_a_cup/ball_in_a_cup.py | 20 +++++++++++++++++-- .../ball_in_a_cup_reward_simple.py | 6 +++--- example.py | 6 +++--- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 24353b2..a308852 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -178,7 +178,7 @@ register( "hole_width": None, "hole_depth": 1, "hole_x": None, - "collision_penalty": 100, + "collision_penalty": 1000, } ) @@ -210,7 +210,7 @@ register( "hole_width": 0.25, "hole_depth": 1, "hole_x": 2, - "collision_penalty": 2, + "collision_penalty": 1000, } ) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index bfd7940..fdd299e 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -43,7 +43,7 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward reward_function = BallInACupReward else: - raise ValueError("Unknown reward type") + raise ValueError("Unknown reward type: {}".format(reward_type)) self.reward_function = reward_function(self.sim_steps) @property @@ -106,7 +106,7 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): done = success or self._steps == self.sim_steps - 1 or is_collided self._steps += 1 else: - reward = -2 + reward = -2000 success = False is_collided = False done = True @@ -154,6 +154,22 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): des_vel_full[5] = des_vel[2] return des_vel_full + def render(self, render_mode, **render_kwargs): + if render_mode == "plot_trajectory": + if self._steps == 1: + import matplotlib.pyplot as plt + # plt.ion() + self.fig, self.axs = plt.subplots(3, 1) + + if self._steps <= 1750: + for ax, cp in zip(self.axs, self.current_pos[1::2]): + ax.scatter(self._steps, cp, s=2, marker=".") + + # self.fig.show() + + else: + super().render(render_mode, **render_kwargs) + if __name__ == "__main__": env = ALRBallInACupEnv() diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py index 0bc0fd2..8f0c588 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py @@ -22,7 +22,7 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.goal_final_id = None self.collision_ids = None self._is_collided = False - self.collision_penalty = 1 + self.collision_penalty = 1000 self.ball_traj = None self.dists = None @@ -74,11 +74,11 @@ class BallInACupReward(alr_reward_fct.AlrReward): # cost_angle = (angle_min_dist - np.pi / 2)**2 - min_dist = self.dists[t_min_dist] + # min_dist = self.dists[t_min_dist] dist_final = self.dists_final[-1] min_dist_final = np.min(self.dists_final) - cost = 0.5 * dist_final + 0.05 * cost_angle # TODO: Increase cost_angle weight # 0.5 * min_dist + + # cost = 0.5 * dist_final + 0.05 * cost_angle # TODO: Increase cost_angle weight # 0.5 * min_dist + # reward = np.exp(-2 * cost) - 1e-2 * action_cost - self.collision_penalty * int(self._is_collided) # reward = - dist_final**2 - 1e-4 * cost_angle - 1e-5 * action_cost - self.collision_penalty * int(self._is_collided) reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 5e-4 * action_cost - self.collision_penalty * int(self._is_collided) diff --git a/example.py b/example.py index a8ae649..20fd165 100644 --- a/example.py +++ b/example.py @@ -106,10 +106,10 @@ def example_async_contextual_sampler(env_name="alr_envs:SimpleReacherDMP-v1", n_ if __name__ == '__main__': # example_mujoco() - example_mp("alr_envs:SimpleReacherDMP-v1") + # example_mp("alr_envs:SimpleReacherDMP-v1") # example_async("alr_envs:LongSimpleReacherDMP-v0", 4) # example_async_contextual_sampler() # env = gym.make("alr_envs:HoleReacherDetPMP-v1") - # env_name = "alr_envs:ALRBallInACupSimpleDetPMP-v0" - # example_async_sampler(env_name) + env_name = "alr_envs:ALRBallInACupSimpleDetPMP-v0" + example_async_sampler(env_name) # example_mp(env_name) From 427941465620a4393c8f24484a1de986ca049034 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 11 May 2021 06:19:30 +0200 Subject: [PATCH 03/56] Add interface for envs controlable by a PD Controller and add more infos to mp_wrapper info return value --- alr_envs/__init__.py | 21 ++++-- alr_envs/classic_control/hole_reacher.py | 2 +- alr_envs/classic_control/simple_reacher.py | 2 +- alr_envs/classic_control/viapoint_reacher.py | 2 +- alr_envs/mujoco/alr_mujoco_env.py | 14 ++-- .../mujoco/ball_in_a_cup/ball_in_a_cup.py | 2 - .../mps/{mp_environments.py => alr_env.py} | 13 +++- alr_envs/utils/mps/detpmp_wrapper.py | 48 ++++++++----- alr_envs/utils/mps/dmp_wrapper.py | 14 ++-- alr_envs/utils/mps/mp_wrapper.py | 72 ++++++++++++------- alr_envs/utils/policies.py | 43 +++++++---- alr_envs/utils/positional_env.py | 22 ++++++ 12 files changed, 169 insertions(+), 86 deletions(-) rename alr_envs/utils/mps/{mp_environments.py => alr_env.py} (78%) create mode 100644 alr_envs/utils/positional_env.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 986265c..708852a 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -1,3 +1,4 @@ +import numpy as np from gym.envs.registration import register from alr_envs.stochastic_search.functions.f_rosenbrock import Rosenbrock @@ -321,7 +322,9 @@ register( "bandwidth_factor": 2.5, "policy_type": "motor", "weights_scale": 100, - "return_to_start": True + "return_to_start": True, + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } ) @@ -339,7 +342,9 @@ register( "bandwidth_factor": 2.5, "policy_type": "motor", "weights_scale": 100, - "return_to_start": True + "return_to_start": True, + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } ) @@ -357,7 +362,9 @@ register( "policy_type": "motor", "weights_scale": 0.2, "zero_start": True, - "zero_goal": True + "zero_goal": True, + "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } ) @@ -374,7 +381,9 @@ register( "policy_type": "motor", "weights_scale": 0.2, "zero_start": True, - "zero_goal": True + "zero_goal": True, + "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } ) @@ -392,7 +401,9 @@ register( "bandwidth_factor": 2.5, "policy_type": "motor", "weights_scale": 50, - "goal_scale": 0.1 + "goal_scale": 0.1, + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } ) diff --git a/alr_envs/classic_control/hole_reacher.py b/alr_envs/classic_control/hole_reacher.py index 730e7bf..281a771 100644 --- a/alr_envs/classic_control/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher.py @@ -7,7 +7,7 @@ from gym.utils import seeding from matplotlib import patches from alr_envs.classic_control.utils import check_self_collision -from alr_envs.utils.mps.mp_environments import AlrEnv +from alr_envs.utils.mps.alr_env import AlrEnv class HoleReacherEnv(AlrEnv): diff --git a/alr_envs/classic_control/simple_reacher.py b/alr_envs/classic_control/simple_reacher.py index 5b04aad..43b0381 100644 --- a/alr_envs/classic_control/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher.py @@ -5,7 +5,7 @@ import numpy as np from gym import spaces from gym.utils import seeding -from alr_envs.utils.mps.mp_environments import AlrEnv +from alr_envs.utils.mps.alr_env import AlrEnv class SimpleReacherEnv(AlrEnv): diff --git a/alr_envs/classic_control/viapoint_reacher.py b/alr_envs/classic_control/viapoint_reacher.py index 8edcc69..afaa26e 100644 --- a/alr_envs/classic_control/viapoint_reacher.py +++ b/alr_envs/classic_control/viapoint_reacher.py @@ -6,7 +6,7 @@ import numpy as np from gym.utils import seeding from alr_envs.classic_control.utils import check_self_collision -from alr_envs.utils.mps.mp_environments import AlrEnv +from alr_envs.utils.mps.alr_env import AlrEnv class ViaPointReacher(AlrEnv): diff --git a/alr_envs/mujoco/alr_mujoco_env.py b/alr_envs/mujoco/alr_mujoco_env.py index 8dbdabb..a95165c 100644 --- a/alr_envs/mujoco/alr_mujoco_env.py +++ b/alr_envs/mujoco/alr_mujoco_env.py @@ -7,7 +7,9 @@ from gym import error, spaces from gym.utils import seeding import numpy as np from os import path -import gym + +from alr_envs.utils.mps.alr_env import AlrEnv +from alr_envs.utils.positional_env import PositionalEnv try: import mujoco_py @@ -33,7 +35,7 @@ def convert_observation_to_space(observation): return space -class AlrMujocoEnv(gym.Env): +class AlrMujocoEnv(PositionalEnv, AlrEnv): """ Superclass for all MuJoCo environments. """ @@ -44,7 +46,7 @@ class AlrMujocoEnv(gym.Env): Args: model_path: path to xml file n_substeps: how many steps mujoco does per call to env.step - use_servo: use actuator defined in xml, use False for direct torque control + apply_gravity_comp: Whether gravity compensation should be active """ if model_path.startswith("/"): fullpath = model_path @@ -73,10 +75,6 @@ class AlrMujocoEnv(gym.Env): self._set_action_space() - # action = self.action_space.sample() - # observation, _reward, done, _info = self.step(action) - # assert not done - observation = self._get_obs() # TODO: is calling get_obs enough? should we call reset, or even step? self._set_observation_space(observation) @@ -204,7 +202,7 @@ class AlrMujocoEnv(gym.Env): try: self.sim.step() - except mujoco_py.builder.MujocoException as e: + except mujoco_py.builder.MujocoException: error_in_sim = True return error_in_sim diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index 345b3ce..a7816c9 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -16,8 +16,6 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): self._q_vel = [] # self.weight_matrix_scale = 50 self.max_ctrl = np.array([150., 125., 40., 60., 5., 5., 2.]) - self.p_gains = 1 / self.max_ctrl * np.array([200, 300, 100, 100, 10, 10, 2.5]) - self.d_gains = 1 / self.max_ctrl * np.array([7, 15, 5, 2.5, 0.3, 0.3, 0.05]) self.j_min = np.array([-2.6, -1.985, -2.8, -0.9, -4.55, -1.5707, -2.7]) self.j_max = np.array([2.6, 1.985, 2.8, 3.14159, 1.25, 1.5707, 2.7]) diff --git a/alr_envs/utils/mps/mp_environments.py b/alr_envs/utils/mps/alr_env.py similarity index 78% rename from alr_envs/utils/mps/mp_environments.py rename to alr_envs/utils/mps/alr_env.py index 60db99b..fca02b9 100644 --- a/alr_envs/utils/mps/mp_environments.py +++ b/alr_envs/utils/mps/alr_env.py @@ -1,14 +1,13 @@ -from abc import abstractmethod +from abc import abstractmethod, ABC from typing import Union import gym import numpy as np -class AlrEnv(gym.Env): +class AlrEnv(gym.Env, ABC): @property - @abstractmethod def active_obs(self): """Returns boolean mask for each observation entry whether the observation is returned for the contextual case or not. @@ -31,3 +30,11 @@ class AlrEnv(gym.Env): By default this returns the starting position. """ return self.start_pos + + @property + @abstractmethod + def dt(self) -> Union[float, int]: + """ + Returns the time between two simulated steps of the environment + """ + raise NotImplementedError() \ No newline at end of file diff --git a/alr_envs/utils/mps/detpmp_wrapper.py b/alr_envs/utils/mps/detpmp_wrapper.py index 8661781..724a50c 100644 --- a/alr_envs/utils/mps/detpmp_wrapper.py +++ b/alr_envs/utils/mps/detpmp_wrapper.py @@ -2,29 +2,36 @@ import gym import numpy as np from mp_lib import det_promp -from alr_envs.utils.mps.mp_environments import AlrEnv +from alr_envs.utils.mps.alr_env import AlrEnv from alr_envs.utils.mps.mp_wrapper import MPWrapper class DetPMPWrapper(MPWrapper): - def __init__(self, env: AlrEnv, num_dof: int, num_basis: int, width: float, duration: float = 1, dt: float = 0.01, - post_traj_time: float = 0., policy_type: str = None, weights_scale: float = 1., - zero_start: bool = False, zero_goal: bool = False, **mp_kwargs): + def __init__(self, env: AlrEnv, num_dof, num_basis, width, start_pos=None, duration=1, post_traj_time=0., + policy_type=None, weights_scale=1, zero_start=False, zero_goal=False, learn_mp_length: bool =True, + **mp_kwargs): self.duration = duration # seconds - dt = env.dt if hasattr(env, "dt") else dt - assert dt is not None - self.dt = dt + super().__init__(env=env, num_dof=num_dof, duration=duration, post_traj_time=post_traj_time, + policy_type=policy_type, weights_scale=weights_scale, num_basis=num_basis, + width=width, zero_start=zero_start, zero_goal=zero_goal, + **mp_kwargs) - super().__init__(env, num_dof, dt, duration, post_traj_time, policy_type, weights_scale, num_basis=num_basis, - width=width, zero_start=zero_start, zero_goal=zero_goal, **mp_kwargs) + self.learn_mp_length = learn_mp_length + if self.learn_mp_length: + parameter_space_shape = (1+num_basis*num_dof,) + else: + parameter_space_shape = (num_basis * num_dof,) + self.min_param = -np.inf + self.max_param = np.inf + self.parameterization_space = gym.spaces.Box(low=self.min_param, high=self.max_param, + shape=parameter_space_shape, dtype=np.float32) - action_bounds = np.inf * np.ones((self.mp.n_basis * self.mp.n_dof)) - self.action_space = gym.spaces.Box(low=-action_bounds, high=action_bounds, dtype=np.float32) + self.start_pos = start_pos - def initialize_mp(self, num_dof: int, duration: int, dt: float, num_basis: int = 5, width: float = None, - off: float = 0.01, zero_start: bool = False, zero_goal: bool = False): - pmp = det_promp.DeterministicProMP(n_basis=num_basis, n_dof=num_dof, width=width, off=off, + def initialize_mp(self, num_dof: int, duration: int, num_basis: int = 5, width: float = None, + zero_start: bool = False, zero_goal: bool = False, **kwargs): + pmp = det_promp.DeterministicProMP(n_basis=num_basis, n_dof=num_dof, width=width, off=0.01, zero_start=zero_start, zero_goal=zero_goal) weights = np.zeros(shape=(num_basis, num_dof)) @@ -33,10 +40,15 @@ class DetPMPWrapper(MPWrapper): return pmp def mp_rollout(self, action): - params = np.reshape(action, newshape=(self.mp.n_basis, self.mp.n_dof)) * self.weights_scale - self.mp.set_weights(self.duration, params) - _, des_pos, des_vel, _ = self.mp.compute_trajectory(1 / self.dt, 1.) + if self.learn_mp_length: + duration = max(1, self.duration*abs(action[0])) + params = np.reshape(action[1:], (self.mp.n_basis, -1)) * self.weights_scale # TODO: Fix Bug when zero_start is true + else: + duration = self.duration + params = np.reshape(action, (self.mp.n_basis, -1)) * self.weights_scale # TODO: Fix Bug when zero_start is true + self.mp.set_weights(1., params) + _, des_pos, des_vel, _ = self.mp.compute_trajectory(frequency=max(1, duration)) if self.mp.zero_start: - des_pos += self.env.start_pos[None, :] + des_pos += self.start_pos return des_pos, des_vel diff --git a/alr_envs/utils/mps/dmp_wrapper.py b/alr_envs/utils/mps/dmp_wrapper.py index 4958a98..8dbd26d 100644 --- a/alr_envs/utils/mps/dmp_wrapper.py +++ b/alr_envs/utils/mps/dmp_wrapper.py @@ -4,7 +4,7 @@ from mp_lib import dmps from mp_lib.basis import DMPBasisGenerator from mp_lib.phase import ExpDecayPhaseGenerator -from alr_envs.utils.mps.mp_environments import AlrEnv +from alr_envs.utils.mps.alr_env import AlrEnv from alr_envs.utils.mps.mp_wrapper import MPWrapper @@ -32,26 +32,26 @@ class DmpWrapper(MPWrapper): goal_scale: """ self.learn_goal = learn_goal - dt = env.dt if hasattr(env, "dt") else dt - assert dt is not None + self.t = np.linspace(0, duration, int(duration / dt)) self.goal_scale = goal_scale - super().__init__(env, num_dof, dt, duration, post_traj_time, policy_type, weights_scale, render_mode, + super().__init__(env=env, num_dof=num_dof, duration=duration, post_traj_time=post_traj_time, + policy_type=policy_type, weights_scale=weights_scale, render_mode=render_mode, num_basis=num_basis, alpha_phase=alpha_phase, bandwidth_factor=bandwidth_factor) action_bounds = np.inf * np.ones((np.prod(self.mp.weights.shape) + (num_dof if learn_goal else 0))) self.action_space = gym.spaces.Box(low=-action_bounds, high=action_bounds, dtype=np.float32) - def initialize_mp(self, num_dof: int, duration: int, dt: float, num_basis: int = 5, alpha_phase: float = 2., - bandwidth_factor: int = 3): + def initialize_mp(self, num_dof: int, duration: int, num_basis: int, alpha_phase: float = 2., + bandwidth_factor: int = 3, **kwargs): phase_generator = ExpDecayPhaseGenerator(alpha_phase=alpha_phase, duration=duration) basis_generator = DMPBasisGenerator(phase_generator, duration=duration, num_basis=num_basis, basis_bandwidth_factor=bandwidth_factor) dmp = dmps.DMP(num_dof=num_dof, basis_generator=basis_generator, phase_generator=phase_generator, - duration=duration, dt=dt) + dt=self.dt) return dmp diff --git a/alr_envs/utils/mps/mp_wrapper.py b/alr_envs/utils/mps/mp_wrapper.py index c31072f..84bffd1 100644 --- a/alr_envs/utils/mps/mp_wrapper.py +++ b/alr_envs/utils/mps/mp_wrapper.py @@ -1,16 +1,36 @@ from abc import ABC, abstractmethod +from typing import Union import gym import numpy as np -from alr_envs.utils.mps.mp_environments import AlrEnv -from alr_envs.utils.policies import get_policy_class +from alr_envs.utils.mps.alr_env import AlrEnv +from alr_envs.utils.policies import get_policy_class, BaseController class MPWrapper(gym.Wrapper, ABC): + """ + Base class for movement primitive based gym.Wrapper implementations. - def __init__(self, env: AlrEnv, num_dof: int, dt: float, duration: float = 1, post_traj_time: float = 0., - policy_type: str = None, weights_scale: float = 1., render_mode: str = None, **mp_kwargs): + :param env: The (wrapped) environment this wrapper is applied on + :param num_dof: Dimension of the action space of the wrapped env + :param duration: Number of timesteps in the trajectory of the movement primitive + :param post_traj_time: Time for which the last position of the trajectory is fed to the environment to continue + simulation + :param policy_type: Type or object defining the policy that is used to generate action based on the trajectory + :param weight_scale: Scaling parameter for the actions given to this wrapper + :param render_mode: Equivalent to gym render mode + """ + def __init__(self, + env: AlrEnv, + num_dof: int, + duration: int = 1, + post_traj_time: float = 0., + policy_type: Union[str, BaseController] = None, + weights_scale: float = 1., + render_mode: str = None, + **mp_kwargs + ): super().__init__(env) # adjust observation space to reduce version @@ -19,14 +39,15 @@ class MPWrapper(gym.Wrapper, ABC): high=obs_sp.high[self.env.active_obs], dtype=obs_sp.dtype) - assert dt is not None # this should never happen as MPWrapper is a base class - self.post_traj_steps = int(post_traj_time / dt) + self.post_traj_steps = int(post_traj_time / env.dt) - self.mp = self.initialize_mp(num_dof, duration, dt, **mp_kwargs) + self.mp = self.initialize_mp(num_dof=num_dof, duration=duration, **mp_kwargs) self.weights_scale = weights_scale - policy_class = get_policy_class(policy_type) - self.policy = policy_class(env) + if type(policy_type) is str: + self.policy = get_policy_class(policy_type, env, mp_kwargs) + else: + self.policy = policy_type # rendering self.render_mode = render_mode @@ -62,29 +83,30 @@ class MPWrapper(gym.Wrapper, ABC): if self.post_traj_steps > 0: trajectory = np.vstack([trajectory, np.tile(trajectory[-1, :], [self.post_traj_steps, 1])]) - velocity = np.vstack([velocity, np.zeros(shape=(self.post_traj_steps, self.mp.n_dof))]) - - # self._trajectory = trajectory - # self._velocity = velocity - - rewards = 0 - info = {} - # create random obs as the reset function is called externally - obs = self.env.observation_space.sample() + velocity = np.vstack([velocity, np.zeros(shape=(self.post_traj_steps, self.mp.num_dimensions))]) + trajectory_length = len(trajectory) + actions = np.zeros(shape=(trajectory_length, self.mp.num_dimensions)) + observations= np.zeros(shape=(trajectory_length,) + self.env.observation_space.shape) + rewards = np.zeros(shape=(trajectory_length,)) + trajectory_return = 0 + infos = dict(step_infos =[]) for t, pos_vel in enumerate(zip(trajectory, velocity)): - ac = self.policy.get_action(pos_vel[0], pos_vel[1]) - obs, rew, done, info = self.env.step(ac) - rewards += rew - # TODO return all dicts? - # [infos[k].append(v) for k, v in info.items()] + actions[t,:] = self.policy.get_action(pos_vel[0], pos_vel[1]) + observations[t,:], rewards[t], done, info = self.env.step(actions[t,:]) + trajectory_return += rewards[t] + infos['step_infos'].append(info) if self.render_mode: self.env.render(mode=self.render_mode, **self.render_kwargs) if done: break + infos['step_actions'] = actions[:t+1] + infos['step_observations'] = observations[:t+1] + infos['step_rewards'] = rewards[:t+1] + infos['trajectory_length'] = t+1 done = True - return obs[self.env.active_obs], rewards, done, info + return observations[t][self.env.active_obs], trajectory_return, done, infos def render(self, mode='human', **kwargs): """Only set render options here, such that they can be used during the rollout. @@ -102,7 +124,7 @@ class MPWrapper(gym.Wrapper, ABC): raise NotImplementedError() @abstractmethod - def initialize_mp(self, num_dof: int, duration: float, dt: float, **kwargs): + def initialize_mp(self, num_dof: int, duration: float, **kwargs): """ Create respective instance of MP Returns: diff --git a/alr_envs/utils/policies.py b/alr_envs/utils/policies.py index e8874d6..3c0dbf8 100644 --- a/alr_envs/utils/policies.py +++ b/alr_envs/utils/policies.py @@ -1,10 +1,12 @@ +from typing import Tuple, Union + from gym import Env -from alr_envs.mujoco.alr_mujoco_env import AlrMujocoEnv +from alr_envs.utils.positional_env import PositionalEnv class BaseController: - def __init__(self, env: Env): + def __init__(self, env: Env, **kwargs): self.env = env def get_action(self, des_pos, des_vel): @@ -22,27 +24,38 @@ class VelController(BaseController): class PDController(BaseController): - def __init__(self, env: AlrMujocoEnv): - self.p_gains = env.p_gains - self.d_gains = env.d_gains - super(PDController, self).__init__(env) + """ + A PD-Controller. Using position and velocity information from a provided positional environment, + the controller calculates a response based on the desired position and velocity + + :param env: A position environment + :param p_gains: Factors for the proportional gains + :param d_gains: Factors for the differential gains + """ + def __init__(self, + env: PositionalEnv, + p_gains: Union[float, Tuple], + d_gains: Union[float, Tuple]): + self.p_gains = p_gains + self.d_gains = d_gains + super(PDController, self).__init__(env, ) def get_action(self, des_pos, des_vel): - # TODO: make standardized ALRenv such that all of them have current_pos/vel attributes cur_pos = self.env.current_pos cur_vel = self.env.current_vel - if len(des_pos) != len(cur_pos): - des_pos = self.env.extend_des_pos(des_pos) - if len(des_vel) != len(cur_vel): - des_vel = self.env.extend_des_vel(des_vel) + assert des_pos.shape != cur_pos.shape, \ + "Mismatch in dimension between desired position {} and current position {}".format(des_pos.shape, cur_pos.shape) + assert des_vel.shape != cur_vel.shape, \ + "Mismatch in dimension between desired velocity {} and current velocity {}".format(des_vel.shape, + cur_vel.shape) trq = self.p_gains * (des_pos - cur_pos) + self.d_gains * (des_vel - cur_vel) return trq -def get_policy_class(policy_type): +def get_policy_class(policy_type, env, mp_kwargs, **kwargs): if policy_type == "motor": - return PDController + return PDController(env, p_gains=mp_kwargs['p_gains'], d_gains=mp_kwargs['d_gains']) elif policy_type == "velocity": - return VelController + return VelController(env) elif policy_type == "position": - return PosController + return PosController(env) diff --git a/alr_envs/utils/positional_env.py b/alr_envs/utils/positional_env.py new file mode 100644 index 0000000..37473df --- /dev/null +++ b/alr_envs/utils/positional_env.py @@ -0,0 +1,22 @@ +from abc import abstractmethod +from typing import Union, Tuple + +import numpy as np +from gym import Env + +class PositionalEnv(Env): + """A position and velocity based environment. It functions just as any regular OpenAI Gym + environment but it provides position, velocity and acceleration information. This usually means that the + corresponding information from the agent is forwarded via the properties. + PD-Controller based policies require this environment to calculate the state dependent actions for example. + """ + + @property + @abstractmethod + def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise NotImplementedError + + @property + @abstractmethod + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + raise NotImplementedError From 80756553010d2493218c11bfb7ebd2172429377c Mon Sep 17 00:00:00 2001 From: Maximilian Huettenrauch Date: Tue, 22 Jun 2021 10:27:25 +0200 Subject: [PATCH 04/56] update --- alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py | 6 +++++- .../mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py | 4 ++-- alr_envs/utils/mps/mp_wrapper.py | 9 +++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index fdd299e..e7da171 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -113,7 +113,11 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): return ob, reward, done, dict(reward_dist=reward_dist, reward_ctrl=reward_ctrl, velocity=angular_vel, - traj=self._q_pos, is_success=success, + # traj=self._q_pos, + action=a, + q_pos=self.sim.data.qpos[0:7].ravel().copy(), + q_vel=self.sim.data.qvel[0:7].ravel().copy(), + is_success=success, is_collided=is_collided, sim_crash=crash) def check_traj_in_joint_limits(self): diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py index 8f0c588..daee289 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py @@ -81,11 +81,11 @@ class BallInACupReward(alr_reward_fct.AlrReward): # cost = 0.5 * dist_final + 0.05 * cost_angle # TODO: Increase cost_angle weight # 0.5 * min_dist + # reward = np.exp(-2 * cost) - 1e-2 * action_cost - self.collision_penalty * int(self._is_collided) # reward = - dist_final**2 - 1e-4 * cost_angle - 1e-5 * action_cost - self.collision_penalty * int(self._is_collided) - reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 5e-4 * action_cost - self.collision_penalty * int(self._is_collided) + reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 1e-3 * action_cost - self.collision_penalty * int(self._is_collided) success = dist_final < 0.05 and ball_in_cup and not self._is_collided crash = self._is_collided else: - reward = - 5e-4 * action_cost - 1e-4 * cost_angle # TODO: increase action_cost weight + reward = - 1e-3 * action_cost - 1e-4 * cost_angle # TODO: increase action_cost weight success = False crash = False diff --git a/alr_envs/utils/mps/mp_wrapper.py b/alr_envs/utils/mps/mp_wrapper.py index c31072f..9ec1cbc 100644 --- a/alr_envs/utils/mps/mp_wrapper.py +++ b/alr_envs/utils/mps/mp_wrapper.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from collections import defaultdict import gym import numpy as np @@ -64,11 +65,11 @@ class MPWrapper(gym.Wrapper, ABC): trajectory = np.vstack([trajectory, np.tile(trajectory[-1, :], [self.post_traj_steps, 1])]) velocity = np.vstack([velocity, np.zeros(shape=(self.post_traj_steps, self.mp.n_dof))]) - # self._trajectory = trajectory + self._trajectory = trajectory # self._velocity = velocity rewards = 0 - info = {} + infos = defaultdict(list) # create random obs as the reset function is called externally obs = self.env.observation_space.sample() @@ -77,14 +78,14 @@ class MPWrapper(gym.Wrapper, ABC): obs, rew, done, info = self.env.step(ac) rewards += rew # TODO return all dicts? - # [infos[k].append(v) for k, v in info.items()] + [infos[k].append(v) for k, v in info.items()] if self.render_mode: self.env.render(mode=self.render_mode, **self.render_kwargs) if done: break done = True - return obs[self.env.active_obs], rewards, done, info + return obs[self.env.active_obs], rewards, done, infos def render(self, mode='human', **kwargs): """Only set render options here, such that they can be used during the rollout. From 9b9b09234941916adef63c465cd30f9a570710cc Mon Sep 17 00:00:00 2001 From: Maximilian Huettenrauch Date: Tue, 22 Jun 2021 14:19:42 +0200 Subject: [PATCH 05/56] start refactor and biac dev merge --- .gitignore | 2 + MUJOCO_LOG.TXT | 15 -- .../mujoco/ball_in_a_cup/ball_in_a_cup.py | 30 +++- .../ball_in_a_cup_reward_simple.py | 21 +-- alr_envs/utils/make_env_helpers.py | 4 +- alr_envs/utils/mp_env_async_sampler.py | 11 +- alr_envs/utils/mps/__init__.py | 0 alr_envs/utils/mps/alr_env.py | 40 ------ alr_envs/utils/mps/detpmp_wrapper.py | 54 ------- alr_envs/utils/mps/dmp_wrapper.py | 76 ---------- alr_envs/utils/mps/mp_wrapper.py | 134 ------------------ alr_envs/utils/policies.py | 61 -------- alr_envs/utils/positional_env.py | 22 --- 13 files changed, 50 insertions(+), 420 deletions(-) delete mode 100644 MUJOCO_LOG.TXT delete mode 100644 alr_envs/utils/mps/__init__.py delete mode 100644 alr_envs/utils/mps/alr_env.py delete mode 100644 alr_envs/utils/mps/detpmp_wrapper.py delete mode 100644 alr_envs/utils/mps/dmp_wrapper.py delete mode 100644 alr_envs/utils/mps/mp_wrapper.py delete mode 100644 alr_envs/utils/policies.py delete mode 100644 alr_envs/utils/positional_env.py diff --git a/.gitignore b/.gitignore index 79c652b..ec01816 100644 --- a/.gitignore +++ b/.gitignore @@ -109,3 +109,5 @@ venv.bak/ #configs /configs/db.cfg +legacy/ +MUJOCO_LOG.TXT diff --git a/MUJOCO_LOG.TXT b/MUJOCO_LOG.TXT deleted file mode 100644 index d398e34..0000000 --- a/MUJOCO_LOG.TXT +++ /dev/null @@ -1,15 +0,0 @@ -Fri Aug 28 14:41:56 2020 -ERROR: GLEW initalization error: Missing GL version - -Fri Aug 28 14:59:14 2020 -ERROR: GLEW initalization error: Missing GL version - -Fri Aug 28 15:03:43 2020 -ERROR: GLEW initalization error: Missing GL version - -Fri Aug 28 15:07:03 2020 -ERROR: GLEW initalization error: Missing GL version - -Fri Aug 28 15:15:01 2020 -ERROR: GLEW initalization error: Missing GL version - diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index a7816c9..8ca948b 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -41,7 +41,7 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward reward_function = BallInACupReward else: - raise ValueError("Unknown reward type") + raise ValueError("Unknown reward type: {}".format(reward_type)) self.reward_function = reward_function(self.sim_steps) @property @@ -66,6 +66,10 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): def current_vel(self): return self.sim.data.qvel[0:7].copy() + def reset(self): + self.reward_function.reset(None) + return super().reset() + def reset_model(self): init_pos_all = self.init_qpos.copy() init_pos_robot = self._start_pos @@ -100,14 +104,18 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): done = success or self._steps == self.sim_steps - 1 or is_collided self._steps += 1 else: - reward = -2 + reward = -2000 success = False is_collided = False done = True return ob, reward, done, dict(reward_dist=reward_dist, reward_ctrl=reward_ctrl, velocity=angular_vel, - traj=self._q_pos, is_success=success, + # traj=self._q_pos, + action=a, + q_pos=self.sim.data.qpos[0:7].ravel().copy(), + q_vel=self.sim.data.qvel[0:7].ravel().copy(), + is_success=success, is_collided=is_collided, sim_crash=crash) def check_traj_in_joint_limits(self): @@ -148,6 +156,22 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): des_vel_full[5] = des_vel[2] return des_vel_full + def render(self, render_mode, **render_kwargs): + if render_mode == "plot_trajectory": + if self._steps == 1: + import matplotlib.pyplot as plt + # plt.ion() + self.fig, self.axs = plt.subplots(3, 1) + + if self._steps <= 1750: + for ax, cp in zip(self.axs, self.current_pos[1::2]): + ax.scatter(self._steps, cp, s=2, marker=".") + + # self.fig.show() + + else: + super().render(render_mode, **render_kwargs) + if __name__ == "__main__": env = ALRBallInACupEnv() diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py index 79987d6..daee289 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py @@ -22,7 +22,7 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.goal_final_id = None self.collision_ids = None self._is_collided = False - self.collision_penalty = 1 + self.collision_penalty = 1000 self.ball_traj = None self.dists = None @@ -37,6 +37,7 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.dists_final = [] self.costs = [] self.action_costs = [] + self.angle_costs = [] self.cup_angles = [] def compute_reward(self, action, env): @@ -56,8 +57,11 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.dists_final.append(np.linalg.norm(goal_final_pos - ball_pos)) self.ball_traj[env._steps, :] = ball_pos cup_quat = np.copy(env.sim.data.body_xquat[env.sim.model._body_name2id["cup"]]) - self.cup_angles.append(np.arctan2(2 * (cup_quat[0] * cup_quat[1] + cup_quat[2] * cup_quat[3]), - 1 - 2 * (cup_quat[1]**2 + cup_quat[2]**2))) + cup_angle = np.arctan2(2 * (cup_quat[0] * cup_quat[1] + cup_quat[2] * cup_quat[3]), + 1 - 2 * (cup_quat[1]**2 + cup_quat[2]**2)) + cost_angle = (cup_angle - np.pi / 2) ** 2 + self.angle_costs.append(cost_angle) + self.cup_angles.append(cup_angle) action_cost = np.sum(np.square(action)) self.action_costs.append(action_cost) @@ -67,20 +71,21 @@ class BallInACupReward(alr_reward_fct.AlrReward): if env._steps == env.sim_steps - 1 or self._is_collided: t_min_dist = np.argmin(self.dists) angle_min_dist = self.cup_angles[t_min_dist] - cost_angle = (angle_min_dist - np.pi / 2)**2 + # cost_angle = (angle_min_dist - np.pi / 2)**2 - min_dist = self.dists[t_min_dist] + + # min_dist = self.dists[t_min_dist] dist_final = self.dists_final[-1] min_dist_final = np.min(self.dists_final) - cost = 0.5 * dist_final + 0.05 * cost_angle # TODO: Increase cost_angle weight # 0.5 * min_dist + + # cost = 0.5 * dist_final + 0.05 * cost_angle # TODO: Increase cost_angle weight # 0.5 * min_dist + # reward = np.exp(-2 * cost) - 1e-2 * action_cost - self.collision_penalty * int(self._is_collided) # reward = - dist_final**2 - 1e-4 * cost_angle - 1e-5 * action_cost - self.collision_penalty * int(self._is_collided) - reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 1e-5 * action_cost - self.collision_penalty * int(self._is_collided) + reward = - dist_final**2 - min_dist_final**2 - 1e-4 * cost_angle - 1e-3 * action_cost - self.collision_penalty * int(self._is_collided) success = dist_final < 0.05 and ball_in_cup and not self._is_collided crash = self._is_collided else: - reward = - 1e-5 * action_cost # TODO: increase action_cost weight + reward = - 1e-3 * action_cost - 1e-4 * cost_angle # TODO: increase action_cost weight success = False crash = False diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index d455496..e876ee8 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -1,5 +1,5 @@ -from alr_envs.utils.mps.dmp_wrapper import DmpWrapper -from alr_envs.utils.mps.detpmp_wrapper import DetPMPWrapper +from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper +from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper import gym from gym.vector.utils import write_to_shared_memory import sys diff --git a/alr_envs/utils/mp_env_async_sampler.py b/alr_envs/utils/mp_env_async_sampler.py index 5cda41f..30f23c5 100644 --- a/alr_envs/utils/mp_env_async_sampler.py +++ b/alr_envs/utils/mp_env_async_sampler.py @@ -91,20 +91,21 @@ class AlrContextualMpEnvSampler: repeat = int(np.ceil(n_samples / self.env.num_envs)) vals = defaultdict(list) + + obs = self.env.reset() for i in range(repeat): - new_contexts = self.env.reset() - vals['new_contexts'].append(new_contexts) - new_samples, new_contexts = dist.sample(new_contexts) + vals['obs'].append(obs) + new_samples, new_contexts = dist.sample(obs) vals['new_samples'].append(new_samples) obs, reward, done, info = self.env.step(new_samples) - vals['obs'].append(obs) + vals['reward'].append(reward) vals['done'].append(done) vals['info'].append(info) # do not return values above threshold - return np.vstack(vals['new_samples'])[:n_samples], np.vstack(vals['new_contexts'])[:n_samples], \ + return np.vstack(vals['new_samples'])[:n_samples], \ np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples], \ _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] diff --git a/alr_envs/utils/mps/__init__.py b/alr_envs/utils/mps/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/alr_envs/utils/mps/alr_env.py b/alr_envs/utils/mps/alr_env.py deleted file mode 100644 index fca02b9..0000000 --- a/alr_envs/utils/mps/alr_env.py +++ /dev/null @@ -1,40 +0,0 @@ -from abc import abstractmethod, ABC -from typing import Union - -import gym -import numpy as np - - -class AlrEnv(gym.Env, ABC): - - @property - def active_obs(self): - """Returns boolean mask for each observation entry - whether the observation is returned for the contextual case or not. - This effectively allows to filter unwanted or unnecessary observations from the full step-based case. - """ - return np.ones(self.observation_space.shape, dtype=bool) - - @property - @abstractmethod - def start_pos(self) -> Union[float, int, np.ndarray]: - """ - Returns the starting position of the joints - """ - raise NotImplementedError() - - @property - def goal_pos(self) -> Union[float, int, np.ndarray]: - """ - Returns the current final position of the joints for the MP. - By default this returns the starting position. - """ - return self.start_pos - - @property - @abstractmethod - def dt(self) -> Union[float, int]: - """ - Returns the time between two simulated steps of the environment - """ - raise NotImplementedError() \ No newline at end of file diff --git a/alr_envs/utils/mps/detpmp_wrapper.py b/alr_envs/utils/mps/detpmp_wrapper.py deleted file mode 100644 index 724a50c..0000000 --- a/alr_envs/utils/mps/detpmp_wrapper.py +++ /dev/null @@ -1,54 +0,0 @@ -import gym -import numpy as np -from mp_lib import det_promp - -from alr_envs.utils.mps.alr_env import AlrEnv -from alr_envs.utils.mps.mp_wrapper import MPWrapper - - -class DetPMPWrapper(MPWrapper): - def __init__(self, env: AlrEnv, num_dof, num_basis, width, start_pos=None, duration=1, post_traj_time=0., - policy_type=None, weights_scale=1, zero_start=False, zero_goal=False, learn_mp_length: bool =True, - **mp_kwargs): - self.duration = duration # seconds - - super().__init__(env=env, num_dof=num_dof, duration=duration, post_traj_time=post_traj_time, - policy_type=policy_type, weights_scale=weights_scale, num_basis=num_basis, - width=width, zero_start=zero_start, zero_goal=zero_goal, - **mp_kwargs) - - self.learn_mp_length = learn_mp_length - if self.learn_mp_length: - parameter_space_shape = (1+num_basis*num_dof,) - else: - parameter_space_shape = (num_basis * num_dof,) - self.min_param = -np.inf - self.max_param = np.inf - self.parameterization_space = gym.spaces.Box(low=self.min_param, high=self.max_param, - shape=parameter_space_shape, dtype=np.float32) - - self.start_pos = start_pos - - def initialize_mp(self, num_dof: int, duration: int, num_basis: int = 5, width: float = None, - zero_start: bool = False, zero_goal: bool = False, **kwargs): - pmp = det_promp.DeterministicProMP(n_basis=num_basis, n_dof=num_dof, width=width, off=0.01, - zero_start=zero_start, zero_goal=zero_goal) - - weights = np.zeros(shape=(num_basis, num_dof)) - pmp.set_weights(duration, weights) - - return pmp - - def mp_rollout(self, action): - if self.learn_mp_length: - duration = max(1, self.duration*abs(action[0])) - params = np.reshape(action[1:], (self.mp.n_basis, -1)) * self.weights_scale # TODO: Fix Bug when zero_start is true - else: - duration = self.duration - params = np.reshape(action, (self.mp.n_basis, -1)) * self.weights_scale # TODO: Fix Bug when zero_start is true - self.mp.set_weights(1., params) - _, des_pos, des_vel, _ = self.mp.compute_trajectory(frequency=max(1, duration)) - if self.mp.zero_start: - des_pos += self.start_pos - - return des_pos, des_vel diff --git a/alr_envs/utils/mps/dmp_wrapper.py b/alr_envs/utils/mps/dmp_wrapper.py deleted file mode 100644 index 8dbd26d..0000000 --- a/alr_envs/utils/mps/dmp_wrapper.py +++ /dev/null @@ -1,76 +0,0 @@ -import gym -import numpy as np -from mp_lib import dmps -from mp_lib.basis import DMPBasisGenerator -from mp_lib.phase import ExpDecayPhaseGenerator - -from alr_envs.utils.mps.alr_env import AlrEnv -from alr_envs.utils.mps.mp_wrapper import MPWrapper - - -class DmpWrapper(MPWrapper): - - def __init__(self, env: AlrEnv, num_dof: int, num_basis: int, - duration: int = 1, alpha_phase: float = 2., dt: float = None, - learn_goal: bool = False, post_traj_time: float = 0., - weights_scale: float = 1., goal_scale: float = 1., bandwidth_factor: float = 3., - policy_type: str = None, render_mode: str = None): - - """ - This Wrapper generates a trajectory based on a DMP and will only return episodic performances. - Args: - env: - num_dof: - num_basis: - duration: - alpha_phase: - dt: - learn_goal: - post_traj_time: - policy_type: - weights_scale: - goal_scale: - """ - self.learn_goal = learn_goal - - self.t = np.linspace(0, duration, int(duration / dt)) - self.goal_scale = goal_scale - - super().__init__(env=env, num_dof=num_dof, duration=duration, post_traj_time=post_traj_time, - policy_type=policy_type, weights_scale=weights_scale, render_mode=render_mode, - num_basis=num_basis, alpha_phase=alpha_phase, bandwidth_factor=bandwidth_factor) - - action_bounds = np.inf * np.ones((np.prod(self.mp.weights.shape) + (num_dof if learn_goal else 0))) - self.action_space = gym.spaces.Box(low=-action_bounds, high=action_bounds, dtype=np.float32) - - def initialize_mp(self, num_dof: int, duration: int, num_basis: int, alpha_phase: float = 2., - bandwidth_factor: int = 3, **kwargs): - - phase_generator = ExpDecayPhaseGenerator(alpha_phase=alpha_phase, duration=duration) - basis_generator = DMPBasisGenerator(phase_generator, duration=duration, num_basis=num_basis, - basis_bandwidth_factor=bandwidth_factor) - - dmp = dmps.DMP(num_dof=num_dof, basis_generator=basis_generator, phase_generator=phase_generator, - dt=self.dt) - - return dmp - - def goal_and_weights(self, params): - assert params.shape[-1] == self.action_space.shape[0] - params = np.atleast_2d(params) - - if self.learn_goal: - goal_pos = params[0, -self.mp.num_dimensions:] # [num_dof] - params = params[:, :-self.mp.num_dimensions] # [1,num_dof] - else: - goal_pos = self.env.goal_pos - assert goal_pos is not None - - weight_matrix = np.reshape(params, self.mp.weights.shape) # [num_basis, num_dof] - return goal_pos * self.goal_scale, weight_matrix * self.weights_scale - - def mp_rollout(self, action): - self.mp.dmp_start_pos = self.env.start_pos - goal_pos, weight_matrix = self.goal_and_weights(action) - self.mp.set_weights(weight_matrix, goal_pos) - return self.mp.reference_trajectory(self.t) diff --git a/alr_envs/utils/mps/mp_wrapper.py b/alr_envs/utils/mps/mp_wrapper.py deleted file mode 100644 index 84bffd1..0000000 --- a/alr_envs/utils/mps/mp_wrapper.py +++ /dev/null @@ -1,134 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Union - -import gym -import numpy as np - -from alr_envs.utils.mps.alr_env import AlrEnv -from alr_envs.utils.policies import get_policy_class, BaseController - - -class MPWrapper(gym.Wrapper, ABC): - """ - Base class for movement primitive based gym.Wrapper implementations. - - :param env: The (wrapped) environment this wrapper is applied on - :param num_dof: Dimension of the action space of the wrapped env - :param duration: Number of timesteps in the trajectory of the movement primitive - :param post_traj_time: Time for which the last position of the trajectory is fed to the environment to continue - simulation - :param policy_type: Type or object defining the policy that is used to generate action based on the trajectory - :param weight_scale: Scaling parameter for the actions given to this wrapper - :param render_mode: Equivalent to gym render mode - """ - def __init__(self, - env: AlrEnv, - num_dof: int, - duration: int = 1, - post_traj_time: float = 0., - policy_type: Union[str, BaseController] = None, - weights_scale: float = 1., - render_mode: str = None, - **mp_kwargs - ): - super().__init__(env) - - # adjust observation space to reduce version - obs_sp = self.env.observation_space - self.observation_space = gym.spaces.Box(low=obs_sp.low[self.env.active_obs], - high=obs_sp.high[self.env.active_obs], - dtype=obs_sp.dtype) - - self.post_traj_steps = int(post_traj_time / env.dt) - - self.mp = self.initialize_mp(num_dof=num_dof, duration=duration, **mp_kwargs) - self.weights_scale = weights_scale - - if type(policy_type) is str: - self.policy = get_policy_class(policy_type, env, mp_kwargs) - else: - self.policy = policy_type - - # rendering - self.render_mode = render_mode - self.render_kwargs = {} - - # TODO: @Max I think this should not be in this class, this functionality should be part of your sampler. - def __call__(self, params, contexts=None): - """ - Can be used to provide a batch of parameter sets - """ - params = np.atleast_2d(params) - obs = [] - rewards = [] - dones = [] - infos = [] - # for p, c in zip(params, contexts): - for p in params: - # self.configure(c) - ob, reward, done, info = self.step(p) - obs.append(ob) - rewards.append(reward) - dones.append(done) - infos.append(info) - - return obs, np.array(rewards), dones, infos - - def reset(self): - return self.env.reset()[self.env.active_obs] - - def step(self, action: np.ndarray): - """ This function generates a trajectory based on a DMP and then does the usual loop over reset and step""" - trajectory, velocity = self.mp_rollout(action) - - if self.post_traj_steps > 0: - trajectory = np.vstack([trajectory, np.tile(trajectory[-1, :], [self.post_traj_steps, 1])]) - velocity = np.vstack([velocity, np.zeros(shape=(self.post_traj_steps, self.mp.num_dimensions))]) - - trajectory_length = len(trajectory) - actions = np.zeros(shape=(trajectory_length, self.mp.num_dimensions)) - observations= np.zeros(shape=(trajectory_length,) + self.env.observation_space.shape) - rewards = np.zeros(shape=(trajectory_length,)) - trajectory_return = 0 - infos = dict(step_infos =[]) - for t, pos_vel in enumerate(zip(trajectory, velocity)): - actions[t,:] = self.policy.get_action(pos_vel[0], pos_vel[1]) - observations[t,:], rewards[t], done, info = self.env.step(actions[t,:]) - trajectory_return += rewards[t] - infos['step_infos'].append(info) - if self.render_mode: - self.env.render(mode=self.render_mode, **self.render_kwargs) - if done: - break - - infos['step_actions'] = actions[:t+1] - infos['step_observations'] = observations[:t+1] - infos['step_rewards'] = rewards[:t+1] - infos['trajectory_length'] = t+1 - done = True - return observations[t][self.env.active_obs], trajectory_return, done, infos - - def render(self, mode='human', **kwargs): - """Only set render options here, such that they can be used during the rollout. - This only needs to be called once""" - self.render_mode = mode - self.render_kwargs = kwargs - - @abstractmethod - def mp_rollout(self, action): - """ - Generate trajectory and velocity based on the MP - Returns: - trajectory/positions, velocity - """ - raise NotImplementedError() - - @abstractmethod - def initialize_mp(self, num_dof: int, duration: float, **kwargs): - """ - Create respective instance of MP - Returns: - MP instance - """ - - raise NotImplementedError diff --git a/alr_envs/utils/policies.py b/alr_envs/utils/policies.py deleted file mode 100644 index 3c0dbf8..0000000 --- a/alr_envs/utils/policies.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import Tuple, Union - -from gym import Env - -from alr_envs.utils.positional_env import PositionalEnv - - -class BaseController: - def __init__(self, env: Env, **kwargs): - self.env = env - - def get_action(self, des_pos, des_vel): - raise NotImplementedError - - -class PosController(BaseController): - def get_action(self, des_pos, des_vel): - return des_pos - - -class VelController(BaseController): - def get_action(self, des_pos, des_vel): - return des_vel - - -class PDController(BaseController): - """ - A PD-Controller. Using position and velocity information from a provided positional environment, - the controller calculates a response based on the desired position and velocity - - :param env: A position environment - :param p_gains: Factors for the proportional gains - :param d_gains: Factors for the differential gains - """ - def __init__(self, - env: PositionalEnv, - p_gains: Union[float, Tuple], - d_gains: Union[float, Tuple]): - self.p_gains = p_gains - self.d_gains = d_gains - super(PDController, self).__init__(env, ) - - def get_action(self, des_pos, des_vel): - cur_pos = self.env.current_pos - cur_vel = self.env.current_vel - assert des_pos.shape != cur_pos.shape, \ - "Mismatch in dimension between desired position {} and current position {}".format(des_pos.shape, cur_pos.shape) - assert des_vel.shape != cur_vel.shape, \ - "Mismatch in dimension between desired velocity {} and current velocity {}".format(des_vel.shape, - cur_vel.shape) - trq = self.p_gains * (des_pos - cur_pos) + self.d_gains * (des_vel - cur_vel) - return trq - - -def get_policy_class(policy_type, env, mp_kwargs, **kwargs): - if policy_type == "motor": - return PDController(env, p_gains=mp_kwargs['p_gains'], d_gains=mp_kwargs['d_gains']) - elif policy_type == "velocity": - return VelController(env) - elif policy_type == "position": - return PosController(env) diff --git a/alr_envs/utils/positional_env.py b/alr_envs/utils/positional_env.py deleted file mode 100644 index 37473df..0000000 --- a/alr_envs/utils/positional_env.py +++ /dev/null @@ -1,22 +0,0 @@ -from abc import abstractmethod -from typing import Union, Tuple - -import numpy as np -from gym import Env - -class PositionalEnv(Env): - """A position and velocity based environment. It functions just as any regular OpenAI Gym - environment but it provides position, velocity and acceleration information. This usually means that the - corresponding information from the agent is forwarded via the properties. - PD-Controller based policies require this environment to calculate the state dependent actions for example. - """ - - @property - @abstractmethod - def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: - raise NotImplementedError - - @property - @abstractmethod - def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: - raise NotImplementedError From c4a698b1bc56c0c4db1b7c17e8e95a2221a4db78 Mon Sep 17 00:00:00 2001 From: Maximilian Huettenrauch Date: Wed, 23 Jun 2021 18:23:37 +0200 Subject: [PATCH 06/56] use mp api --- alr_envs/__init__.py | 30 +++ alr_envs/classic_control/hole_reacher.py | 10 +- alr_envs/classic_control/simple_reacher.py | 4 +- alr_envs/classic_control/viapoint_reacher.py | 4 +- alr_envs/mujoco/__init__.py | 3 +- .../ball_in_a_cup_reward_simple.py | 37 +-- alr_envs/mujoco/ball_in_a_cup/biac_pd.py | 225 ++++++++++++++++++ example.py | 2 +- 8 files changed, 288 insertions(+), 27 deletions(-) create mode 100644 alr_envs/mujoco/ball_in_a_cup/biac_pd.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index da4204e..3d221b4 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -88,6 +88,16 @@ register( id='ALRBallInACupSimple-v0', entry_point='alr_envs.mujoco:ALRBallInACupEnv', max_episode_steps=4000, + kwargs={ + "simplified": True, + "reward_type": "no_context", + } +) + +register( + id='ALRBallInACupPDSimple-v0', + entry_point='alr_envs.mujoco:ALRBallInACupPDEnv', + max_episode_steps=4000, kwargs={ "simplified": True, "reward_type": "no_context" @@ -368,6 +378,26 @@ register( } ) +register( + id='ALRBallInACupPDSimpleDetPMP-v0', + entry_point='alr_envs.mujoco.ball_in_a_cup.biac_pd:make_detpmp_env', + kwargs={ + "name": "alr_envs:ALRBallInACupPDSimple-v0", + "num_dof": 3, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "width": 0.0035, + # "off": -0.05, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "zero_goal": True, + "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } +) + register( id='ALRBallInACupDetPMP-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', diff --git a/alr_envs/classic_control/hole_reacher.py b/alr_envs/classic_control/hole_reacher.py index 281a771..d5be111 100644 --- a/alr_envs/classic_control/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher.py @@ -7,10 +7,10 @@ from gym.utils import seeding from matplotlib import patches from alr_envs.classic_control.utils import check_self_collision -from alr_envs.utils.mps.alr_env import AlrEnv +from mp_env_api.envs.mp_env import MpEnv -class HoleReacherEnv(AlrEnv): +class HoleReacherEnv(MpEnv): def __init__(self, n_links: int, hole_x: Union[None, float] = None, hole_depth: Union[None, float] = None, hole_width: float = 1., random_start: bool = False, allow_self_collision: bool = False, @@ -44,7 +44,7 @@ class HoleReacherEnv(AlrEnv): self._start_pos = np.hstack([[np.pi / 2], np.zeros(self.n_links - 1)]) self._start_vel = np.zeros(self.n_links) - self.dt = 0.01 + self._dt = 0.01 action_bound = np.pi * np.ones((self.n_links,)) state_bound = np.hstack([ @@ -66,6 +66,10 @@ class HoleReacherEnv(AlrEnv): self._steps = 0 self.seed() + @property + def dt(self) -> Union[float, int]: + return self._dt + def step(self, action: np.ndarray): """ A single step with an action in joint velocity space diff --git a/alr_envs/classic_control/simple_reacher.py b/alr_envs/classic_control/simple_reacher.py index 43b0381..f564f89 100644 --- a/alr_envs/classic_control/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher.py @@ -5,10 +5,10 @@ import numpy as np from gym import spaces from gym.utils import seeding -from alr_envs.utils.mps.alr_env import AlrEnv +from mp_env_api.envs.mp_env import MpEnv -class SimpleReacherEnv(AlrEnv): +class SimpleReacherEnv(MpEnv): """ Simple Reaching Task without any physics simulation. Returns no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions diff --git a/alr_envs/classic_control/viapoint_reacher.py b/alr_envs/classic_control/viapoint_reacher.py index afaa26e..15934a8 100644 --- a/alr_envs/classic_control/viapoint_reacher.py +++ b/alr_envs/classic_control/viapoint_reacher.py @@ -6,10 +6,10 @@ import numpy as np from gym.utils import seeding from alr_envs.classic_control.utils import check_self_collision -from alr_envs.utils.mps.alr_env import AlrEnv +from mp_env_api.envs.mp_env import MpEnv -class ViaPointReacher(AlrEnv): +class ViaPointReacher(MpEnv): def __init__(self, n_links, random_start: bool = True, via_target: Union[None, Iterable] = None, target: Union[None, Iterable] = None, allow_self_collision=False, collision_penalty=1000): diff --git a/alr_envs/mujoco/__init__.py b/alr_envs/mujoco/__init__.py index eb7b41f..82f3784 100644 --- a/alr_envs/mujoco/__init__.py +++ b/alr_envs/mujoco/__init__.py @@ -1,3 +1,4 @@ from alr_envs.mujoco.reacher.alr_reacher import ALRReacherEnv from alr_envs.mujoco.balancing import BalancingEnv -from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +# from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +from alr_envs.mujoco.ball_in_a_cup.biac_pd import ALRBallInACupPDEnv diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py index daee289..295dcf9 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py @@ -3,9 +3,8 @@ from alr_envs.mujoco import alr_reward_fct class BallInACupReward(alr_reward_fct.AlrReward): - def __init__(self, sim_time): - self.sim_time = sim_time - + def __init__(self, env): + self.env = env self.collision_objects = ["cup_geom1", "cup_geom2", "cup_base_contact_below", "wrist_palm_link_convex_geom", "wrist_pitch_link_convex_decomposition_p1_geom", @@ -32,7 +31,8 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.reset(None) def reset(self, context): - self.ball_traj = np.zeros(shape=(self.sim_time, 3)) + # self.sim_time = self.env.sim.dtsim_time + self.ball_traj = [] # np.zeros(shape=(self.sim_time, 3)) self.dists = [] self.dists_final = [] self.costs = [] @@ -40,23 +40,24 @@ class BallInACupReward(alr_reward_fct.AlrReward): self.angle_costs = [] self.cup_angles = [] - def compute_reward(self, action, env): - self.ball_id = env.sim.model._body_name2id["ball"] - self.ball_collision_id = env.sim.model._geom_name2id["ball_geom"] - self.goal_id = env.sim.model._site_name2id["cup_goal"] - self.goal_final_id = env.sim.model._site_name2id["cup_goal_final"] - self.collision_ids = [env.sim.model._geom_name2id[name] for name in self.collision_objects] + def compute_reward(self, action): + self.ball_id = self.env.sim.model._body_name2id["ball"] + self.ball_collision_id = self.env.sim.model._geom_name2id["ball_geom"] + self.goal_id = self.env.sim.model._site_name2id["cup_goal"] + self.goal_final_id = self.env.sim.model._site_name2id["cup_goal_final"] + self.collision_ids = [self.env.sim.model._geom_name2id[name] for name in self.collision_objects] - ball_in_cup = self.check_ball_in_cup(env.sim, self.ball_collision_id) + ball_in_cup = self.check_ball_in_cup(self.env.sim, self.ball_collision_id) # Compute the current distance from the ball to the inner part of the cup - goal_pos = env.sim.data.site_xpos[self.goal_id] - ball_pos = env.sim.data.body_xpos[self.ball_id] - goal_final_pos = env.sim.data.site_xpos[self.goal_final_id] + goal_pos = self.env.sim.data.site_xpos[self.goal_id] + ball_pos = self.env.sim.data.body_xpos[self.ball_id] + goal_final_pos = self.env.sim.data.site_xpos[self.goal_final_id] self.dists.append(np.linalg.norm(goal_pos - ball_pos)) self.dists_final.append(np.linalg.norm(goal_final_pos - ball_pos)) - self.ball_traj[env._steps, :] = ball_pos - cup_quat = np.copy(env.sim.data.body_xquat[env.sim.model._body_name2id["cup"]]) + # self.ball_traj[self.env._steps, :] = ball_pos + self.ball_traj.append(ball_pos) + cup_quat = np.copy(self.env.sim.data.body_xquat[self.env.sim.model._body_name2id["cup"]]) cup_angle = np.arctan2(2 * (cup_quat[0] * cup_quat[1] + cup_quat[2] * cup_quat[3]), 1 - 2 * (cup_quat[1]**2 + cup_quat[2]**2)) cost_angle = (cup_angle - np.pi / 2) ** 2 @@ -66,9 +67,9 @@ class BallInACupReward(alr_reward_fct.AlrReward): action_cost = np.sum(np.square(action)) self.action_costs.append(action_cost) - self._is_collided = self.check_collision(env.sim) or env.check_traj_in_joint_limits() + self._is_collided = self.check_collision(self.env.sim) or self.env.check_traj_in_joint_limits() - if env._steps == env.sim_steps - 1 or self._is_collided: + if self.env._steps == self.env.ep_length - 1 or self._is_collided: t_min_dist = np.argmin(self.dists) angle_min_dist = self.cup_angles[t_min_dist] # cost_angle = (angle_min_dist - np.pi / 2)**2 diff --git a/alr_envs/mujoco/ball_in_a_cup/biac_pd.py b/alr_envs/mujoco/ball_in_a_cup/biac_pd.py new file mode 100644 index 0000000..1990b33 --- /dev/null +++ b/alr_envs/mujoco/ball_in_a_cup/biac_pd.py @@ -0,0 +1,225 @@ +import gym.envs.mujoco +import mujoco_py.builder +from gym import utils, spaces +import os +import numpy as np +import gym.envs.mujoco as mujoco_env +from mp_env_api.envs.mp_env import MpEnv +from mp_env_api.envs.positional_env import PositionalEnv +from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper +from mp_env_api.utils.policies import PDControllerExtend + + +def make_detpmp_env(**kwargs): + name = kwargs.pop("name") + _env = gym.make(name) + policy = PDControllerExtend(_env, p_gains=kwargs.pop('p_gains'), d_gains=kwargs.pop('d_gains')) + kwargs['policy_type'] = policy + return DetPMPWrapper(_env, **kwargs) + + +class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPickle): + def __init__(self, frame_skip=4, apply_gravity_comp=True, simplified: bool = False, + reward_type: str = None, context: np.ndarray = None): + self._steps = 0 + + self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", + "biac_base" + ".xml") + + self.max_ctrl = np.array([150., 125., 40., 60., 5., 5., 2.]) + + self.j_min = np.array([-2.6, -1.985, -2.8, -0.9, -4.55, -1.5707, -2.7]) + self.j_max = np.array([2.6, 1.985, 2.8, 3.14159, 1.25, 1.5707, 2.7]) + + self.context = context + self.apply_gravity_comp = apply_gravity_comp + self.simplified = simplified + + self._start_pos = np.array([0.0, 0.58760536, 0.0, 1.36004913, 0.0, -0.32072943, -1.57]) + self._start_vel = np.zeros(7) + + self.sim_time = 8 # seconds + self.ep_length = 4000 # based on 8 seconds with dt = 0.02 int(self.sim_time / self.dt) + if reward_type == "no_context": + from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward_simple import BallInACupReward + reward_function = BallInACupReward + elif reward_type == "contextual_goal": + from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward + reward_function = BallInACupReward + else: + raise ValueError("Unknown reward type: {}".format(reward_type)) + self.reward_function = reward_function(self) + + mujoco_env.MujocoEnv.__init__(self, self.xml_path, frame_skip) + utils.EzPickle.__init__(self) + + @property + def start_pos(self): + if self.simplified: + return self._start_pos[1::2] + else: + return self._start_pos + + @property + def start_vel(self): + if self.simplified: + return self._start_vel[1::2] + else: + return self._start_vel + + @property + def current_pos(self): + return self.sim.data.qpos[0:7].copy() + + @property + def current_vel(self): + return self.sim.data.qvel[0:7].copy() + + # def _set_action_space(self): + # if self.simplified: + # bounds = self.model.actuator_ctrlrange.copy().astype(np.float32)[1::2] + # else: + # bounds = self.model.actuator_ctrlrange.copy().astype(np.float32) + # low, high = bounds.T + # self.action_space = spaces.Box(low=low, high=high, dtype=np.float32) + # return self.action_space + + def reset(self): + self.reward_function.reset(None) + return super().reset() + + def reset_model(self): + init_pos_all = self.init_qpos.copy() + init_pos_robot = self._start_pos + init_vel = np.zeros_like(init_pos_all) + + self._steps = 0 + self._q_pos = [] + self._q_vel = [] + + start_pos = init_pos_all + start_pos[0:7] = init_pos_robot + + self.set_state(start_pos, init_vel) + + return self._get_obs() + + def step(self, a): + reward_dist = 0.0 + angular_vel = 0.0 + reward_ctrl = - np.square(a).sum() + + # if self.simplified: + # tmp = np.zeros(7) + # tmp[1::2] = a + # a = tmp + + if self.apply_gravity_comp: + a = a + self.sim.data.qfrc_bias[:len(a)].copy() / self.model.actuator_gear[:, 0] + try: + self.do_simulation(a, self.frame_skip) + crash = False + except mujoco_py.builder.MujocoException: + crash = True + # joint_cons_viol = self.check_traj_in_joint_limits() + + ob = self._get_obs() + + if not crash: + reward, success, is_collided = self.reward_function.compute_reward(a) + done = success or is_collided # self._steps == self.sim_steps - 1 + self._steps += 1 + else: + reward = -2000 + success = False + is_collided = False + done = True + + return ob, reward, done, dict(reward_dist=reward_dist, + reward_ctrl=reward_ctrl, + velocity=angular_vel, + # traj=self._q_pos, + action=a, + q_pos=self.sim.data.qpos[0:7].ravel().copy(), + q_vel=self.sim.data.qvel[0:7].ravel().copy(), + is_success=success, + is_collided=is_collided, sim_crash=crash) + + def check_traj_in_joint_limits(self): + return any(self.current_pos > self.j_max) or any(self.current_pos < self.j_min) + + # TODO: extend observation space + def _get_obs(self): + theta = self.sim.data.qpos.flat[:7] + return np.concatenate([ + np.cos(theta), + np.sin(theta), + # self.get_body_com("target"), # only return target to make problem harder + [self._steps], + ]) + + # TODO + @property + def active_obs(self): + return np.hstack([ + [False] * 7, # cos + [False] * 7, # sin + # [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) + + # These functions are for the task with 3 joint actuations + def extend_des_pos(self, des_pos): + des_pos_full = self._start_pos.copy() + des_pos_full[1] = des_pos[0] + des_pos_full[3] = des_pos[1] + des_pos_full[5] = des_pos[2] + return des_pos_full + + def extend_des_vel(self, des_vel): + des_vel_full = self._start_vel.copy() + des_vel_full[1] = des_vel[0] + des_vel_full[3] = des_vel[1] + des_vel_full[5] = des_vel[2] + return des_vel_full + + def render(self, render_mode, **render_kwargs): + if render_mode == "plot_trajectory": + if self._steps == 1: + import matplotlib.pyplot as plt + # plt.ion() + self.fig, self.axs = plt.subplots(3, 1) + + if self._steps <= 1750: + for ax, cp in zip(self.axs, self.current_pos[1::2]): + ax.scatter(self._steps, cp, s=2, marker=".") + + # self.fig.show() + + else: + super().render(render_mode, **render_kwargs) + + +if __name__ == "__main__": + env = ALRBallInACupPDEnv(reward_type="no_context", simplified=True) + # env = gym.make("alr_envs:ALRBallInACupPDSimpleDetPMP-v0") + # ctxt = np.array([-0.20869846, -0.66376693, 1.18088501]) + + # env.configure(ctxt) + env.reset() + env.render("human") + for i in range(16000): + # test with random actions + ac = 0.02 * env.action_space.sample()[0:7] + # ac = env.start_pos + # ac[0] += np.pi/2 + obs, rew, d, info = env.step(ac) + env.render("human") + + print(rew) + + if d: + break + + env.close() + diff --git a/example.py b/example.py index 20fd165..abf69c9 100644 --- a/example.py +++ b/example.py @@ -110,6 +110,6 @@ if __name__ == '__main__': # example_async("alr_envs:LongSimpleReacherDMP-v0", 4) # example_async_contextual_sampler() # env = gym.make("alr_envs:HoleReacherDetPMP-v1") - env_name = "alr_envs:ALRBallInACupSimpleDetPMP-v0" + env_name = "alr_envs:ALRBallInACupPDSimpleDetPMP-v0" example_async_sampler(env_name) # example_mp(env_name) From e7525f61aa0bcd77c6409de2e4e831833bea2130 Mon Sep 17 00:00:00 2001 From: Maximilian Huettenrauch Date: Thu, 24 Jun 2021 18:34:39 +0200 Subject: [PATCH 07/56] wip --- alr_envs/__init__.py | 30 ++++++++++++++++++++++++++++++ alr_envs/utils/mps/mp_wrapper.py | 0 2 files changed, 30 insertions(+) delete mode 100644 alr_envs/utils/mps/mp_wrapper.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 3d221b4..207c625 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -104,6 +104,16 @@ register( } ) +register( + id='ALRBallInACupPD-v0', + entry_point='alr_envs.mujoco:ALRBallInACupPDEnv', + max_episode_steps=4000, + kwargs={ + "simplified": False, + "reward_type": "no_context" + } +) + register( id='ALRBallInACup-v0', entry_point='alr_envs.mujoco:ALRBallInACupEnv', @@ -398,6 +408,26 @@ register( } ) +register( + id='ALRBallInACupPDDetPMP-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', + kwargs={ + "name": "alr_envs:ALRBallInACupPD-v0", + "num_dof": 7, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "width": 0.0035, + # "off": -0.05, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "zero_goal": True, + "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } +) + register( id='ALRBallInACupDetPMP-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', diff --git a/alr_envs/utils/mps/mp_wrapper.py b/alr_envs/utils/mps/mp_wrapper.py deleted file mode 100644 index e69de29..0000000 From c5109ec2e7c9ed98f807f07bfa6231d5b2f580c9 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 15:06:25 +0200 Subject: [PATCH 08/56] updated hole reacher example to new structure --- alr_envs/classic_control/hole_reacher.py | 30 +++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/alr_envs/classic_control/hole_reacher.py b/alr_envs/classic_control/hole_reacher.py index d5be111..d71c6d1 100644 --- a/alr_envs/classic_control/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher.py @@ -8,6 +8,7 @@ from matplotlib import patches from alr_envs.classic_control.utils import check_self_collision from mp_env_api.envs.mp_env import MpEnv +from mp_env_api.envs.mp_env_wrapper import MpEnvWrapper class HoleReacherEnv(MpEnv): @@ -92,7 +93,7 @@ class HoleReacherEnv(MpEnv): def reset(self): if self.random_start: - # Maybe change more than dirst seed + # Maybe change more than first seed first_joint = self.np_random.uniform(np.pi / 4, 3 * np.pi / 4) self._joint_angles = np.hstack([[first_joint], np.zeros(self.n_links - 1)]) self._start_pos = self._joint_angles.copy() @@ -276,6 +277,21 @@ class HoleReacherEnv(MpEnv): self.fig.gca().add_patch(right_block) self.fig.gca().add_patch(hole_floor) + def seed(self, seed=None): + self.np_random, seed = seeding.np_random(seed) + return [seed] + + @property + def end_effector(self): + return self._joints[self.n_links].T + + def close(self): + super().close() + if self.fig is not None: + plt.close(self.fig) + + +class HoleReacherMPWrapper(MpEnvWrapper): @property def active_obs(self): return np.hstack([ @@ -296,17 +312,9 @@ class HoleReacherEnv(MpEnv): def goal_pos(self) -> Union[float, int, np.ndarray]: raise ValueError("Goal position is not available and has to be learnt based on the environment.") - def seed(self, seed=None): - self.np_random, seed = seeding.np_random(seed) - return [seed] - @property - def end_effector(self): - return self._joints[self.n_links].T - - def close(self): - if self.fig is not None: - plt.close(self.fig) + def dt(self) -> Union[float, int]: + return self.env.dt if __name__ == '__main__': From fa7dfdc0813ec12e31883fd7d18270ac9469af9e Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 15:19:05 +0200 Subject: [PATCH 09/56] updated hole reacher example to new structure --- alr_envs/classic_control/hole_reacher.py | 55 +++++++----------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/alr_envs/classic_control/hole_reacher.py b/alr_envs/classic_control/hole_reacher.py index d71c6d1..9100686 100644 --- a/alr_envs/classic_control/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher.py @@ -8,10 +8,10 @@ from matplotlib import patches from alr_envs.classic_control.utils import check_self_collision from mp_env_api.envs.mp_env import MpEnv -from mp_env_api.envs.mp_env_wrapper import MpEnvWrapper +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper -class HoleReacherEnv(MpEnv): +class HoleReacherEnv(gym.Env): def __init__(self, n_links: int, hole_x: Union[None, float] = None, hole_depth: Union[None, float] = None, hole_width: float = 1., random_start: bool = False, allow_self_collision: bool = False, @@ -23,9 +23,9 @@ class HoleReacherEnv(MpEnv): self.random_start = random_start # provided initial parameters - self._hole_x = hole_x # x-position of center of hole - self._hole_width = hole_width # width of hole - self._hole_depth = hole_depth # depth of hole + self.hole_x = hole_x # x-position of center of hole + self.hole_width = hole_width # width of hole + self.hole_depth = hole_depth # depth of hole # temp container for current env state self._tmp_hole_x = None @@ -112,12 +112,12 @@ class HoleReacherEnv(MpEnv): return self._get_obs().copy() def _generate_hole(self): - self._tmp_hole_x = self.np_random.uniform(1, 3.5, 1) if self._hole_x is None else np.copy(self._hole_x) - self._tmp_hole_width = self.np_random.uniform(0.15, 0.5, 1) if self._hole_width is None else np.copy( - self._hole_width) + self._tmp_hole_x = self.np_random.uniform(1, 3.5, 1) if self.hole_x is None else np.copy(self.hole_x) + self._tmp_hole_width = self.np_random.uniform(0.15, 0.5, 1) if self.hole_width is None else np.copy( + self.hole_width) # TODO we do not want this right now. - self._tmp_hole_depth = self.np_random.uniform(1, 1, 1) if self._hole_depth is None else np.copy( - self._hole_depth) + self._tmp_hole_depth = self.np_random.uniform(1, 1, 1) if self.hole_depth is None else np.copy( + self.hole_depth) self._goal = np.hstack([self._tmp_hole_x, -self._tmp_hole_depth]) def _update_joints(self): @@ -291,15 +291,15 @@ class HoleReacherEnv(MpEnv): plt.close(self.fig) -class HoleReacherMPWrapper(MpEnvWrapper): +class HoleReacherMPWrapper(MPEnvWrapper): @property def active_obs(self): return np.hstack([ - [self.random_start] * self.n_links, # cos - [self.random_start] * self.n_links, # sin - [self.random_start] * self.n_links, # velocity - [self._hole_width is None], # hole width - # [self._hole_depth is None], # hole depth + [self.env.random_start] * self.env.n_links, # cos + [self.env.random_start] * self.env.n_links, # sin + [self.env.random_start] * self.env.n_links, # velocity + [self.env.hole_width is None], # hole width + # [self.env.hole_depth is None], # hole depth [True] * 2, # x-y coordinates of target distance [False] # env steps ]) @@ -315,26 +315,3 @@ class HoleReacherMPWrapper(MpEnvWrapper): @property def dt(self) -> Union[float, int]: return self.env.dt - - -if __name__ == '__main__': - nl = 5 - render_mode = "human" # "human" or "partial" or "final" - env = HoleReacherEnv(n_links=nl, allow_self_collision=False, allow_wall_collision=False, hole_width=None, - hole_depth=1, hole_x=None) - obs = env.reset() - - for i in range(2000): - # objective.load_result("/tmp/cma") - # test with random actions - ac = 2 * env.action_space.sample() - obs, rew, d, info = env.step(ac) - if i % 10 == 0: - env.render(mode=render_mode) - - print(rew) - - if d: - env.reset() - - env.close() From f3d837349a0baa82212c69c2a310f5187fcd9d66 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 15:19:40 +0200 Subject: [PATCH 10/56] updated via point reacher example to new structure --- alr_envs/classic_control/viapoint_reacher.py | 79 ++++++++------------ 1 file changed, 33 insertions(+), 46 deletions(-) diff --git a/alr_envs/classic_control/viapoint_reacher.py b/alr_envs/classic_control/viapoint_reacher.py index 15934a8..2965df4 100644 --- a/alr_envs/classic_control/viapoint_reacher.py +++ b/alr_envs/classic_control/viapoint_reacher.py @@ -7,9 +7,10 @@ from gym.utils import seeding from alr_envs.classic_control.utils import check_self_collision from mp_env_api.envs.mp_env import MpEnv +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper -class ViaPointReacher(MpEnv): +class ViaPointReacher(gym.Env): def __init__(self, n_links, random_start: bool = True, via_target: Union[None, Iterable] = None, target: Union[None, Iterable] = None, allow_self_collision=False, collision_penalty=1000): @@ -20,8 +21,8 @@ class ViaPointReacher(MpEnv): self.random_start = random_start # provided initial parameters - self._target = target # provided target value - self._via_target = via_target # provided via point target value + self.target = target # provided target value + self.via_target = via_target # provided via point target value # temp container for current env state self._via_point = np.ones(2) @@ -39,7 +40,7 @@ class ViaPointReacher(MpEnv): self._start_vel = np.zeros(self.n_links) self.weight_matrix_scale = 1 - self.dt = 0.01 + self._dt = 0.01 action_bound = np.pi * np.ones((self.n_links,)) state_bound = np.hstack([ @@ -60,6 +61,10 @@ class ViaPointReacher(MpEnv): self._steps = 0 self.seed() + @property + def dt(self): + return self._dt + def step(self, action: np.ndarray): """ a single step with an action in joint velocity space @@ -104,22 +109,22 @@ class ViaPointReacher(MpEnv): total_length = np.sum(self.link_lengths) # rejection sampled point in inner circle with 0.5*Radius - if self._via_target is None: + if self.via_target is None: via_target = np.array([total_length, total_length]) while np.linalg.norm(via_target) >= 0.5 * total_length: via_target = self.np_random.uniform(low=-0.5 * total_length, high=0.5 * total_length, size=2) else: - via_target = np.copy(self._via_target) + via_target = np.copy(self.via_target) # rejection sampled point in outer circle - if self._target is None: + if self.target is None: goal = np.array([total_length, total_length]) while np.linalg.norm(goal) >= total_length or np.linalg.norm(goal) <= 0.5 * total_length: goal = self.np_random.uniform(low=-total_length, high=total_length, size=2) else: - goal = np.copy(self._target) + goal = np.copy(self.target) - self._via_target = via_target + self.via_target = via_target self._goal = goal def _update_joints(self): @@ -266,25 +271,6 @@ class ViaPointReacher(MpEnv): plt.pause(0.01) - @property - def active_obs(self): - return np.hstack([ - [self.random_start] * self.n_links, # cos - [self.random_start] * self.n_links, # sin - [self.random_start] * self.n_links, # velocity - [self._via_target is None] * 2, # x-y coordinates of via point distance - [True] * 2, # x-y coordinates of target distance - [False] # env steps - ]) - - @property - def start_pos(self) -> Union[float, int, np.ndarray]: - return self._start_pos - - @property - def goal_pos(self) -> Union[float, int, np.ndarray]: - raise ValueError("Goal position is not available and has to be learnt based on the environment.") - def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed] @@ -298,24 +284,25 @@ class ViaPointReacher(MpEnv): plt.close(self.fig) -if __name__ == '__main__': - nl = 5 - render_mode = "human" # "human" or "partial" or "final" - env = ViaPointReacher(n_links=nl, allow_self_collision=False) - env.reset() - env.render(mode=render_mode) +class ViaPointReacherMPWrapper(MPEnvWrapper): + @property + def active_obs(self): + return np.hstack([ + [self.env.random_start] * self.env.n_links, # cos + [self.env.random_start] * self.env.n_links, # sin + [self.env.random_start] * self.env.n_links, # velocity + [self.env.via_target is None] * 2, # x-y coordinates of via point distance + [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) - for i in range(300): - # objective.load_result("/tmp/cma") - # test with random actions - ac = env.action_space.sample() - # ac[0] += np.pi/2 - obs, rew, d, info = env.step(ac) - env.render(mode=render_mode) + @property + def start_pos(self) -> Union[float, int, np.ndarray]: + return self._start_pos - print(rew) + @property + def goal_pos(self) -> Union[float, int, np.ndarray]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") - if d: - break - - env.close() + def dt(self) -> Union[float, int]: + return self.env.dt From e1dc3eeddf64f2e3768165766fcb97419f4ce5d6 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 15:24:54 +0200 Subject: [PATCH 11/56] updated simple reacher example to new structure --- alr_envs/classic_control/simple_reacher.py | 62 +++++++++------------- 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/alr_envs/classic_control/simple_reacher.py b/alr_envs/classic_control/simple_reacher.py index f564f89..04a1110 100644 --- a/alr_envs/classic_control/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher.py @@ -6,6 +6,7 @@ from gym import spaces from gym.utils import seeding from mp_env_api.envs.mp_env import MpEnv +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper class SimpleReacherEnv(MpEnv): @@ -19,7 +20,7 @@ class SimpleReacherEnv(MpEnv): super().__init__() self.link_lengths = np.ones(n_links) self.n_links = n_links - self.dt = 0.1 + self._dt = 0.1 self.random_start = random_start @@ -53,6 +54,10 @@ class SimpleReacherEnv(MpEnv): self._steps = 0 self.seed() + @property + def dt(self) -> Union[float, int]: + return self._dt + def step(self, action: np.ndarray): """ A single step with action in torque space @@ -172,24 +177,6 @@ class SimpleReacherEnv(MpEnv): self.fig.canvas.draw() self.fig.canvas.flush_events() - @property - def active_obs(self): - return np.hstack([ - [self.random_start] * self.n_links, # cos - [self.random_start] * self.n_links, # sin - [self.random_start] * self.n_links, # velocity - [True] * 2, # x-y coordinates of target distance - [False] # env steps - ]) - - @property - def start_pos(self): - return self._start_pos - - @property - def goal_pos(self): - raise ValueError("Goal position is not available and has to be learnt based on the environment.") - def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed] @@ -202,24 +189,25 @@ class SimpleReacherEnv(MpEnv): return self._joints[self.n_links].T -if __name__ == '__main__': - nl = 5 - render_mode = "human" # "human" or "partial" or "final" - env = SimpleReacherEnv(n_links=nl) - obs = env.reset() - print("First", obs) +class SimpleReacherMPWrapper(MPEnvWrapper): + @property + def active_obs(self): + return np.hstack([ + [self.env.random_start] * self.env.n_links, # cos + [self.env.random_start] * self.env.n_links, # sin + [self.env.random_start] * self.env.n_links, # velocity + [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) - for i in range(2000): - # objective.load_result("/tmp/cma") - # test with random actions - ac = 2 * env.action_space.sample() - # ac = np.ones(env.action_space.shape) - obs, rew, d, info = env.step(ac) - env.render(mode=render_mode) + @property + def start_pos(self): + return self._start_pos - print(obs[env.active_obs].shape) + @property + def goal_pos(self): + raise ValueError("Goal position is not available and has to be learnt based on the environment.") - if d or i % 200 == 0: - env.reset() - - env.close() + @property + def dt(self) -> Union[float, int]: + return self.env.dt From a30bdb8ce54a699dd00447e7b79ecc4c0f85858b Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 15:26:20 +0200 Subject: [PATCH 12/56] updated simple reacher example to new structure --- alr_envs/classic_control/simple_reacher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alr_envs/classic_control/simple_reacher.py b/alr_envs/classic_control/simple_reacher.py index 04a1110..b61266f 100644 --- a/alr_envs/classic_control/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher.py @@ -1,15 +1,15 @@ from typing import Iterable, Union +import gym import matplotlib.pyplot as plt import numpy as np from gym import spaces from gym.utils import seeding -from mp_env_api.envs.mp_env import MpEnv from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper -class SimpleReacherEnv(MpEnv): +class SimpleReacherEnv(gym.Env): """ Simple Reaching Task without any physics simulation. Returns no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions From dffa3e3682bf48dd3059c4cb4a03a5c67244a15a Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 15:52:21 +0200 Subject: [PATCH 13/56] matched file structure of classic control with other tasks --- alr_envs/classic_control/__init__.py | 6 ++-- .../classic_control/hole_reacher/__init__.py | 0 .../{ => hole_reacher}/hole_reacher.py | 28 ----------------- .../hole_reacher/hole_reacher_mp_wrapper.py | 31 +++++++++++++++++++ .../simple_reacher/__init__.py | 0 .../{ => simple_reacher}/simple_reacher.py | 26 ---------------- .../simple_reacher_mp_wrapper.py | 29 +++++++++++++++++ alr_envs/classic_control/utils.py | 2 +- .../viapoint_reacher/__init__.py | 0 .../viapoint_reacher.py | 26 ---------------- .../viapoint_reacher_mp_wrapper.py | 29 +++++++++++++++++ alr_envs/mujoco/alr_mujoco_env.py | 4 +-- .../mujoco/gym_table_tennis/utils/util.py | 2 +- 13 files changed, 96 insertions(+), 87 deletions(-) create mode 100644 alr_envs/classic_control/hole_reacher/__init__.py rename alr_envs/classic_control/{ => hole_reacher}/hole_reacher.py (91%) create mode 100644 alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py create mode 100644 alr_envs/classic_control/simple_reacher/__init__.py rename alr_envs/classic_control/{ => simple_reacher}/simple_reacher.py (89%) create mode 100644 alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py create mode 100644 alr_envs/classic_control/viapoint_reacher/__init__.py rename alr_envs/classic_control/{ => viapoint_reacher}/viapoint_reacher.py (91%) create mode 100644 alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py diff --git a/alr_envs/classic_control/__init__.py b/alr_envs/classic_control/__init__.py index 4a26eaa..1397e41 100644 --- a/alr_envs/classic_control/__init__.py +++ b/alr_envs/classic_control/__init__.py @@ -1,3 +1,3 @@ -from alr_envs.classic_control.simple_reacher import SimpleReacherEnv -from alr_envs.classic_control.viapoint_reacher import ViaPointReacher -from alr_envs.classic_control.hole_reacher import HoleReacherEnv +from alr_envs.classic_control.viapoint_reacher.viapoint_reacher import ViaPointReacher +from alr_envs.classic_control.simple_reacher.simple_reacher import SimpleReacherEnv +from alr_envs.classic_control.hole_reacher.hole_reacher import HoleReacherEnv diff --git a/alr_envs/classic_control/hole_reacher/__init__.py b/alr_envs/classic_control/hole_reacher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/classic_control/hole_reacher.py b/alr_envs/classic_control/hole_reacher/hole_reacher.py similarity index 91% rename from alr_envs/classic_control/hole_reacher.py rename to alr_envs/classic_control/hole_reacher/hole_reacher.py index 9100686..04065f2 100644 --- a/alr_envs/classic_control/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher.py @@ -7,8 +7,6 @@ from gym.utils import seeding from matplotlib import patches from alr_envs.classic_control.utils import check_self_collision -from mp_env_api.envs.mp_env import MpEnv -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper class HoleReacherEnv(gym.Env): @@ -289,29 +287,3 @@ class HoleReacherEnv(gym.Env): super().close() if self.fig is not None: plt.close(self.fig) - - -class HoleReacherMPWrapper(MPEnvWrapper): - @property - def active_obs(self): - return np.hstack([ - [self.env.random_start] * self.env.n_links, # cos - [self.env.random_start] * self.env.n_links, # sin - [self.env.random_start] * self.env.n_links, # velocity - [self.env.hole_width is None], # hole width - # [self.env.hole_depth is None], # hole depth - [True] * 2, # x-y coordinates of target distance - [False] # env steps - ]) - - @property - def start_pos(self) -> Union[float, int, np.ndarray]: - return self._start_pos - - @property - def goal_pos(self) -> Union[float, int, np.ndarray]: - raise ValueError("Goal position is not available and has to be learnt based on the environment.") - - @property - def dt(self) -> Union[float, int]: - return self.env.dt diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py new file mode 100644 index 0000000..3d95b8c --- /dev/null +++ b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py @@ -0,0 +1,31 @@ +from typing import Union + +import numpy as np + +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper + + +class HoleReacherMPWrapper(MPEnvWrapper): + @property + def active_obs(self): + return np.hstack([ + [self.env.random_start] * self.env.n_links, # cos + [self.env.random_start] * self.env.n_links, # sin + [self.env.random_start] * self.env.n_links, # velocity + [self.env.hole_width is None], # hole width + # [self.env.hole_depth is None], # hole depth + [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) + + @property + def start_pos(self) -> Union[float, int, np.ndarray]: + return self._start_pos + + @property + def goal_pos(self) -> Union[float, int, np.ndarray]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt \ No newline at end of file diff --git a/alr_envs/classic_control/simple_reacher/__init__.py b/alr_envs/classic_control/simple_reacher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/classic_control/simple_reacher.py b/alr_envs/classic_control/simple_reacher/simple_reacher.py similarity index 89% rename from alr_envs/classic_control/simple_reacher.py rename to alr_envs/classic_control/simple_reacher/simple_reacher.py index b61266f..4b65daf 100644 --- a/alr_envs/classic_control/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher/simple_reacher.py @@ -6,8 +6,6 @@ import numpy as np from gym import spaces from gym.utils import seeding -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper - class SimpleReacherEnv(gym.Env): """ @@ -187,27 +185,3 @@ class SimpleReacherEnv(gym.Env): @property def end_effector(self): return self._joints[self.n_links].T - - -class SimpleReacherMPWrapper(MPEnvWrapper): - @property - def active_obs(self): - return np.hstack([ - [self.env.random_start] * self.env.n_links, # cos - [self.env.random_start] * self.env.n_links, # sin - [self.env.random_start] * self.env.n_links, # velocity - [True] * 2, # x-y coordinates of target distance - [False] # env steps - ]) - - @property - def start_pos(self): - return self._start_pos - - @property - def goal_pos(self): - raise ValueError("Goal position is not available and has to be learnt based on the environment.") - - @property - def dt(self) -> Union[float, int]: - return self.env.dt diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py new file mode 100644 index 0000000..613f30d --- /dev/null +++ b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py @@ -0,0 +1,29 @@ +from typing import Union + +import numpy as np + +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper + + +class SimpleReacherMPWrapper(MPEnvWrapper): + @property + def active_obs(self): + return np.hstack([ + [self.env.random_start] * self.env.n_links, # cos + [self.env.random_start] * self.env.n_links, # sin + [self.env.random_start] * self.env.n_links, # velocity + [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) + + @property + def start_pos(self): + return self._start_pos + + @property + def goal_pos(self): + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/classic_control/utils.py b/alr_envs/classic_control/utils.py index dbaa88e..fa8176a 100644 --- a/alr_envs/classic_control/utils.py +++ b/alr_envs/classic_control/utils.py @@ -10,7 +10,7 @@ def intersect(A, B, C, D): def check_self_collision(line_points): - "Checks whether line segments and intersect" + """Checks whether line segments and intersect""" for i, line1 in enumerate(line_points): for line2 in line_points[i + 2:, :, :]: if intersect(line1[0], line1[-1], line2[0], line2[-1]): diff --git a/alr_envs/classic_control/viapoint_reacher/__init__.py b/alr_envs/classic_control/viapoint_reacher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/classic_control/viapoint_reacher.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py similarity index 91% rename from alr_envs/classic_control/viapoint_reacher.py rename to alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py index 2965df4..fc3264d 100644 --- a/alr_envs/classic_control/viapoint_reacher.py +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py @@ -6,8 +6,6 @@ import numpy as np from gym.utils import seeding from alr_envs.classic_control.utils import check_self_collision -from mp_env_api.envs.mp_env import MpEnv -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper class ViaPointReacher(gym.Env): @@ -282,27 +280,3 @@ class ViaPointReacher(gym.Env): def close(self): if self.fig is not None: plt.close(self.fig) - - -class ViaPointReacherMPWrapper(MPEnvWrapper): - @property - def active_obs(self): - return np.hstack([ - [self.env.random_start] * self.env.n_links, # cos - [self.env.random_start] * self.env.n_links, # sin - [self.env.random_start] * self.env.n_links, # velocity - [self.env.via_target is None] * 2, # x-y coordinates of via point distance - [True] * 2, # x-y coordinates of target distance - [False] # env steps - ]) - - @property - def start_pos(self) -> Union[float, int, np.ndarray]: - return self._start_pos - - @property - def goal_pos(self) -> Union[float, int, np.ndarray]: - raise ValueError("Goal position is not available and has to be learnt based on the environment.") - - def dt(self) -> Union[float, int]: - return self.env.dt diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py new file mode 100644 index 0000000..57aff1b --- /dev/null +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py @@ -0,0 +1,29 @@ +from typing import Union + +import numpy as np + +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper + + +class ViaPointReacherMPWrapper(MPEnvWrapper): + @property + def active_obs(self): + return np.hstack([ + [self.env.random_start] * self.env.n_links, # cos + [self.env.random_start] * self.env.n_links, # sin + [self.env.random_start] * self.env.n_links, # velocity + [self.env.via_target is None] * 2, # x-y coordinates of via point distance + [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) + + @property + def start_pos(self) -> Union[float, int, np.ndarray]: + return self._start_pos + + @property + def goal_pos(self) -> Union[float, int, np.ndarray]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/mujoco/alr_mujoco_env.py b/alr_envs/mujoco/alr_mujoco_env.py index a95165c..01384c2 100644 --- a/alr_envs/mujoco/alr_mujoco_env.py +++ b/alr_envs/mujoco/alr_mujoco_env.py @@ -98,14 +98,14 @@ class AlrMujocoEnv(PositionalEnv, AlrEnv): @property def start_pos(self): """ - Start position of the agent, for example joint angles of a Panda robot. Necessary for MP wrapped envs. + Start position of the agent, for example joint angles of a Panda robot. Necessary for MP wrapped simple_reacher. """ return self._start_pos @property def start_vel(self): """ - Start velocity of the agent. Necessary for MP wrapped envs. + Start velocity of the agent. Necessary for MP wrapped simple_reacher. """ return self._start_vel diff --git a/alr_envs/mujoco/gym_table_tennis/utils/util.py b/alr_envs/mujoco/gym_table_tennis/utils/util.py index 716b3c6..fa308e3 100644 --- a/alr_envs/mujoco/gym_table_tennis/utils/util.py +++ b/alr_envs/mujoco/gym_table_tennis/utils/util.py @@ -39,7 +39,7 @@ def config_save(dir_path, config): def change_kp_in_xml(kp_list, - model_path="/home/zhou/slow/table_tennis_rl/simulation/gymTableTennis/gym_table_tennis/envs/robotics/assets/table_tennis/right_arm_actuator.xml"): + model_path="/home/zhou/slow/table_tennis_rl/simulation/gymTableTennis/gym_table_tennis/simple_reacher/robotics/assets/table_tennis/right_arm_actuator.xml"): tree = ET.parse(model_path) root = tree.getroot() # for actuator in root.find("actuator"): From c0e036b2e528d63818c5eddd8db56ded359aaf36 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 16:37:41 +0200 Subject: [PATCH 14/56] Updated Ball in a cup example for new wrappers --- .../mujoco/ball_in_a_cup/ball_in_a_cup.py | 6 +-- .../ball_in_a_cup/ball_in_a_cup_mp_wrapper.py | 34 ++++++++++++ .../ball_in_a_cup_positional_env_wrapper.py | 15 ++++++ alr_envs/mujoco/ball_in_a_cup/biac_pd.py | 52 ++++++------------- 4 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py create mode 100644 alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index 8ca948b..8f26901 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -7,10 +7,10 @@ from alr_envs.mujoco import alr_mujoco_env class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): def __init__(self, n_substeps=4, apply_gravity_comp=True, simplified: bool = False, reward_type: str = None, context: np.ndarray = None): + utils.EzPickle.__init__(**locals()) self._steps = 0 - self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", - "biac_base" + ".xml") + self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "biac_base.xml") self._q_pos = [] self._q_vel = [] @@ -22,7 +22,6 @@ class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): self.context = context - utils.EzPickle.__init__(self) alr_mujoco_env.AlrMujocoEnv.__init__(self, self.xml_path, apply_gravity_comp=apply_gravity_comp, @@ -194,4 +193,3 @@ if __name__ == "__main__": break env.close() - diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py new file mode 100644 index 0000000..d4f9802 --- /dev/null +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py @@ -0,0 +1,34 @@ +from typing import Union + +import numpy as np + +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper + + +class ALRBallInACupMPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + # TODO: @Max Filter observations correctly + return np.hstack([ + [False] * 7, # cos + [False] * 7, # sin + # [True] * 2, # x-y coordinates of target distance + [False] # env steps + ]) + + @property + def start_pos(self): + if self.simplified: + return self._start_pos[1::2] + else: + return self._start_pos + + @property + def goal_pos(self): + # TODO: @Max I think the default value of returning to the start is reasonable here + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py new file mode 100644 index 0000000..1ce935f --- /dev/null +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py @@ -0,0 +1,15 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api.envs.positional_env_wrapper import PositionalEnvWrapper + + +class BallInACupPositionalEnvWrapper(PositionalEnvWrapper): + @property + def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: + return self.sim.data.qpos[0:7].copy() + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.sim.data.qvel[0:7].copy() diff --git a/alr_envs/mujoco/ball_in_a_cup/biac_pd.py b/alr_envs/mujoco/ball_in_a_cup/biac_pd.py index 1990b33..31545d0 100644 --- a/alr_envs/mujoco/ball_in_a_cup/biac_pd.py +++ b/alr_envs/mujoco/ball_in_a_cup/biac_pd.py @@ -1,11 +1,11 @@ -import gym.envs.mujoco -import mujoco_py.builder -from gym import utils, spaces import os -import numpy as np + +import gym.envs.mujoco import gym.envs.mujoco as mujoco_env -from mp_env_api.envs.mp_env import MpEnv -from mp_env_api.envs.positional_env import PositionalEnv +import mujoco_py.builder +import numpy as np +from gym import utils + from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.utils.policies import PDControllerExtend @@ -18,13 +18,13 @@ def make_detpmp_env(**kwargs): return DetPMPWrapper(_env, **kwargs) -class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPickle): +class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, utils.EzPickle): def __init__(self, frame_skip=4, apply_gravity_comp=True, simplified: bool = False, reward_type: str = None, context: np.ndarray = None): + utils.EzPickle.__init__(**locals()) self._steps = 0 - self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", - "biac_base" + ".xml") + self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "biac_base.xml") self.max_ctrl = np.array([150., 125., 40., 60., 5., 5., 2.]) @@ -39,6 +39,7 @@ class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPic self._start_vel = np.zeros(7) self.sim_time = 8 # seconds + self._dt = 0.02 self.ep_length = 4000 # based on 8 seconds with dt = 0.02 int(self.sim_time / self.dt) if reward_type == "no_context": from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward_simple import BallInACupReward @@ -51,15 +52,12 @@ class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPic self.reward_function = reward_function(self) mujoco_env.MujocoEnv.__init__(self, self.xml_path, frame_skip) - utils.EzPickle.__init__(self) @property - def start_pos(self): - if self.simplified: - return self._start_pos[1::2] - else: - return self._start_pos + def dt(self): + return self._dt + # TODO: @Max is this even needed? @property def start_vel(self): if self.simplified: @@ -67,14 +65,6 @@ class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPic else: return self._start_vel - @property - def current_pos(self): - return self.sim.data.qpos[0:7].copy() - - @property - def current_vel(self): - return self.sim.data.qvel[0:7].copy() - # def _set_action_space(self): # if self.simplified: # bounds = self.model.actuator_ctrlrange.copy().astype(np.float32)[1::2] @@ -115,10 +105,11 @@ class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPic # a = tmp if self.apply_gravity_comp: - a = a + self.sim.data.qfrc_bias[:len(a)].copy() / self.model.actuator_gear[:, 0] + a += self.sim.data.qfrc_bias[:len(a)].copy() / self.model.actuator_gear[:, 0] + + crash = False try: self.do_simulation(a, self.frame_skip) - crash = False except mujoco_py.builder.MujocoException: crash = True # joint_cons_viol = self.check_traj_in_joint_limits() @@ -158,16 +149,6 @@ class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, PositionalEnv, MpEnv, utils.EzPic [self._steps], ]) - # TODO - @property - def active_obs(self): - return np.hstack([ - [False] * 7, # cos - [False] * 7, # sin - # [True] * 2, # x-y coordinates of target distance - [False] # env steps - ]) - # These functions are for the task with 3 joint actuations def extend_des_pos(self, des_pos): des_pos_full = self._start_pos.copy() @@ -222,4 +203,3 @@ if __name__ == "__main__": break env.close() - From e250ec491e03d87174d9bcd85112a22882fadef3 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 16:51:38 +0200 Subject: [PATCH 15/56] updated setup.py --- setup.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index 22e1d1c..7170fa6 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,21 @@ from setuptools import setup -setup(name='alr_envs', - version='0.0.1', - install_requires=['gym', - 'PyQt5', - 'matplotlib', - 'mp_lib @ git+https://git@github.com/maxhuettenrauch/mp_lib@master#egg=mp_lib', - 'mujoco_py'], # And any other dependencies foo needs - ) +setup( + name='alr_envs', + version='0.0.1', + packages=['alr_envs', 'alr_envs.classic_control', 'alr_envs.mujoco', 'alr_envs.stochastic_search', + 'alr_envs.utils'], + install_requires=[ + 'gym', + 'PyQt5', + 'matplotlib', + 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', + 'mujoco_py' + ], + + url='https://github.com/ALRhub/alr_envs/', + license='MIT', + author='Fabian Otto, Marcel Sandermann, Maximilian Huettenrauch', + author_email='', + description='Custom Gym environments for various (robotics) simple_reacher.' +) From 3c774382b719a27604e5c928db4c3ac233aee268 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 24 Jun 2021 17:19:26 +0200 Subject: [PATCH 16/56] Fixed passing arguments to new wrapper structure --- alr_envs/utils/make_env_helpers.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index e876ee8..29ddb9d 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -20,10 +20,14 @@ def make_contextual_env(env_id, context, seed, rank): def make_dmp_env(**kwargs): name = kwargs.pop("name") _env = gym.make(name) - return DmpWrapper(_env, **kwargs) + for wrapper in kwargs.pop("wrappers"): + _env = wrapper(_env) + return DmpWrapper(_env, **kwargs.get("mp_kwargs")) def make_detpmp_env(**kwargs): name = kwargs.pop("name") _env = gym.make(name) - return DetPMPWrapper(_env, **kwargs) + for wrapper in kwargs.pop("wrappers"): + _env = wrapper(_env) + return DetPMPWrapper(_env, **kwargs.get("mp_kwargs")) From 29b8c3a6c746f87a6cc0e7d048a5a941e20f90d7 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 25 Jun 2021 15:43:24 +0200 Subject: [PATCH 17/56] renaming --- alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py | 2 +- ...ional_env_wrapper.py => ball_in_a_cup_positional_wrapper.py} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename alr_envs/mujoco/ball_in_a_cup/{ball_in_a_cup_positional_env_wrapper.py => ball_in_a_cup_positional_wrapper.py} (86%) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py index d4f9802..0c6c1ce 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py @@ -5,7 +5,7 @@ import numpy as np from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper -class ALRBallInACupMPWrapper(MPEnvWrapper): +class BallInACupMPWrapper(MPEnvWrapper): @property def active_obs(self): diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py similarity index 86% rename from alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py rename to alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py index 1ce935f..c1f7e07 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_env_wrapper.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py @@ -5,7 +5,7 @@ import numpy as np from mp_env_api.envs.positional_env_wrapper import PositionalEnvWrapper -class BallInACupPositionalEnvWrapper(PositionalEnvWrapper): +class BallInACupPositionalWrapper(PositionalEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: return self.sim.data.qpos[0:7].copy() From 0a1e55d97bc1f5bc6fd41e3273e01f94f8d6e460 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 25 Jun 2021 15:51:06 +0200 Subject: [PATCH 18/56] improved docs and modularity of env helpers --- alr_envs/utils/make_env_helpers.py | 125 +++++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 17 deletions(-) diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 29ddb9d..246cd7a 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -1,11 +1,29 @@ -from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper -from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper +from typing import Iterable, List, Type + import gym -from gym.vector.utils import write_to_shared_memory -import sys + +from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper +from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper +from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper -def make_env(env_id, seed, rank): +def make_env(env_id: str, seed: int, rank: int = 0): + """ + Create a new gym environment with given seed. + The rank is added to the seed and can be used for example when using vector environments. + E.g. [make_env("my_env_name-v0", 123, i) for i in range(8)] creates a list of 8 environments + with seeds 123 through 130. + Hence, testing environments should be seeded with a value which is offset by the number of training environments. + Here e.g. [make_env("my_env_name-v0", 123 + 8, i) for i in range(5)] for 5 testing environmetns + + Args: + env_id: name of the environment + seed: seed for deterministic behaviour + rank: environment rank for deterministic over multiple seeds behaviour + + Returns: + + """ env = gym.make(env_id) env.seed(seed + rank) return lambda: env @@ -17,17 +35,90 @@ def make_contextual_env(env_id, context, seed, rank): return lambda: env -def make_dmp_env(**kwargs): - name = kwargs.pop("name") - _env = gym.make(name) - for wrapper in kwargs.pop("wrappers"): - _env = wrapper(_env) - return DmpWrapper(_env, **kwargs.get("mp_kwargs")) +def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]]): + """ + Helper function for creating a wrapped gym environment using MPs. + It adds all provided wrappers to the specified environment and verifies at least one MPEnvWrapper is + provided to expose the interface for MPs. + + Args: + env_id: name of the environment + wrappers: list of wrappers (at least an MPEnvWrapper), + + Returns: gym environment with all specified wrappers applied + + """ + _env = gym.make(env_id) + + assert any(issubclass(w, MPEnvWrapper) for w in wrappers) + for w in wrappers: + _env = w(_env) + + return _env -def make_detpmp_env(**kwargs): - name = kwargs.pop("name") - _env = gym.make(name) - for wrapper in kwargs.pop("wrappers"): - _env = wrapper(_env) - return DetPMPWrapper(_env, **kwargs.get("mp_kwargs")) +def make_dmp_env(env_id: str, wrappers: Iterable, **mp_kwargs): + """ + This can also be used standalone for manually building a custom DMP environment. + Args: + env_id: base_env_name, + wrappers: list of wrappers (at least an MPEnvWrapper), + mp_kwargs: dict of at least {num_dof: int, num_basis: int} for DMP + + Returns: DMP wrapped gym env + + """ + + _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers) + return DmpWrapper(_env, **mp_kwargs) + + +def make_detpmp_env(env_id: str, wrappers: Iterable, **mp_kwargs): + """ + This can also be used standalone for manually building a custom Det ProMP environment. + Args: + env_id: base_env_name, + wrappers: list of wrappers (at least an MPEnvWrapper), + mp_kwargs: dict of at least {num_dof: int, num_basis: int, width: int} + + Returns: DMP wrapped gym env + + """ + + _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers) + return DetPMPWrapper(_env, **mp_kwargs) + + +def make_dmp_env_helper(**kwargs): + """ + Helper function for registering a DMP gym environments. + Args: + **kwargs: expects at least the following: + { + "name": base_env_name, + "wrappers": list of wrappers (at least an MPEnvWrapper), + "mp_kwargs": dict of at least {num_dof: int, num_basis: int} for DMP + } + + Returns: DMP wrapped gym env + + """ + return make_dmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), **kwargs.get("mp_kwargs")) + + +def make_detpmp_env_helper(**kwargs): + """ + Helper function for registering ProMP gym environments. + This can also be used standalone for manually building a custom ProMP environment. + Args: + **kwargs: expects at least the following: + { + "name": base_env_name, + "wrappers": list of wrappers (at least an MPEnvWrapper), + "mp_kwargs": dict of at least {num_dof: int, num_basis: int, width: int} + } + + Returns: DMP wrapped gym env + + """ + return make_detpmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), **kwargs.get("mp_kwargs")) From c8742e2934647b51c15e71aaa14ee6f0ffdc01d9 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 25 Jun 2021 16:16:56 +0200 Subject: [PATCH 19/56] updated envs and registering --- alr_envs/__init__.py | 301 ++++++++++-------- alr_envs/classic_control/__init__.py | 2 +- .../hole_reacher/hole_reacher.py | 58 ++-- .../hole_reacher/hole_reacher_mp_wrapper.py | 6 +- .../simple_reacher/simple_reacher.py | 17 +- .../simple_reacher_mp_wrapper.py | 2 +- .../viapoint_reacher/viapoint_reacher.py | 20 +- .../viapoint_reacher_mp_wrapper.py | 5 +- example.py | 16 +- 9 files changed, 248 insertions(+), 179 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 207c625..de0df8a 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -1,12 +1,16 @@ import numpy as np from gym.envs.registration import register +from alr_envs.classic_control.hole_reacher.hole_reacher_mp_wrapper import HoleReacherMPWrapper +from alr_envs.classic_control.simple_reacher.simple_reacher_mp_wrapper import SimpleReacherMPWrapper +from alr_envs.classic_control.viapoint_reacher.viapoint_reacher_mp_wrapper import ViaPointReacherMPWrapper +from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_mp_wrapper import BallInACupMPWrapper +from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_positional_wrapper import BallInACupPositionalWrapper from alr_envs.stochastic_search.functions.f_rosenbrock import Rosenbrock -# from alr_envs.utils.mps.dmp_wrapper import DmpWrapper - # Mujoco +## Reacher register( id='ALRReacher-v0', entry_point='alr_envs.mujoco:ALRReacherEnv', @@ -177,7 +181,7 @@ register( register( id='ViaPointReacher-v0', - entry_point='alr_envs.classic_control.viapoint_reacher:ViaPointReacher', + entry_point='alr_envs.classic_control:ViaPointReacher', max_episode_steps=200, kwargs={ "n_links": 5, @@ -189,7 +193,7 @@ register( ## Hole Reacher register( id='HoleReacher-v0', - entry_point='alr_envs.classic_control.hole_reacher:HoleReacherEnv', + entry_point='alr_envs.classic_control:HoleReacherEnv', max_episode_steps=200, kwargs={ "n_links": 5, @@ -205,7 +209,7 @@ register( register( id='HoleReacher-v1', - entry_point='alr_envs.classic_control.hole_reacher:HoleReacherEnv', + entry_point='alr_envs.classic_control:HoleReacherEnv', max_episode_steps=200, kwargs={ "n_links": 5, @@ -221,7 +225,7 @@ register( register( id='HoleReacher-v2', - entry_point='alr_envs.classic_control.hole_reacher:HoleReacherEnv', + entry_point='alr_envs.classic_control:HoleReacherEnv', max_episode_steps=200, kwargs={ "n_links": 5, @@ -236,39 +240,46 @@ register( ) # MP environments + ## Simple Reacher versions = ["SimpleReacher-v0", "SimpleReacher-v1", "LongSimpleReacher-v0", "LongSimpleReacher-v1"] for v in versions: name = v.split("-") register( id=f'{name[0]}DMP-{name[1]}', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ "name": f"alr_envs:{v}", - "num_dof": 2 if "long" not in v.lower() else 5, - "num_basis": 5, - "duration": 2, - "alpha_phase": 2, - "learn_goal": True, - "policy_type": "velocity", - "weights_scale": 50, + "wrappers": [SimpleReacherMPWrapper], + "mp_kwargs": { + "num_dof": 2 if "long" not in v.lower() else 5, + "num_basis": 5, + "duration": 2, + "alpha_phase": 2, + "learn_goal": True, + "policy_type": "velocity", + "weights_scale": 50, + } } ) register( id='ViaPointReacherDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ "name": "alr_envs:ViaPointReacher-v0", - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "alpha_phase": 2, - "learn_goal": False, - "policy_type": "velocity", - "weights_scale": 50, + "wrappers": [ViaPointReacherMPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "policy_type": "velocity", + "weights_scale": 50, + } } ) @@ -277,52 +288,61 @@ versions = ["v0", "v1", "v2"] for v in versions: register( id=f'HoleReacherDMP-{v}', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ "name": f"alr_envs:HoleReacher-{v}", - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "velocity", - "weights_scale": 50, - "goal_scale": 0.1 + "wrappers": [HoleReacherMPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } } ) register( id=f'HoleReacherDetPMP-{v}', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"alr_envs:HoleReacher-{v}", - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "width": 0.025, - "policy_type": "velocity", - "weights_scale": 0.2, - "zero_start": True + "wrappers": [HoleReacherMPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } } ) # TODO: properly add final_pos register( id='HoleReacherFixedGoalDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ "name": "alr_envs:HoleReacher-v0", - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "learn_goal": False, - "alpha_phase": 2, - "policy_type": "velocity", - "weights_scale": 50, - "goal_scale": 0.1 + "wrappers": [HoleReacherMPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "learn_goal": False, + "alpha_phase": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } } ) @@ -330,81 +350,101 @@ register( register( id='ALRBallInACupSimpleDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupSimple-v0", - "num_dof": 3, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "learn_goal": False, - "alpha_phase": 3, - "bandwidth_factor": 2.5, - "policy_type": "motor", - "weights_scale": 100, - "return_to_start": True, - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "mp_kwargs": { + "num_dof": 3, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "learn_goal": False, + "alpha_phase": 3, + "bandwidth_factor": 2.5, + "policy_type": "motor", + "weights_scale": 100, + "return_to_start": True, + "policy_kwargs": { + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } + } } ) register( id='ALRBallInACupDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACup-v0", - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "learn_goal": False, - "alpha_phase": 3, - "bandwidth_factor": 2.5, - "policy_type": "motor", - "weights_scale": 100, - "return_to_start": True, - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "mp_kwargs": { + "num_dof": 7, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "learn_goal": False, + "alpha_phase": 3, + "bandwidth_factor": 2.5, + "policy_type": "motor", + "weights_scale": 100, + "return_to_start": True, + "policy_kwargs": { + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } + } } ) register( id='ALRBallInACupSimpleDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupSimple-v0", - "num_dof": 3, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - # "off": -0.05, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "mp_kwargs": { + "num_dof": 3, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "width": 0.0035, + # "off": -0.05, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "zero_goal": True, + "policy_kwargs": { + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } + } } ) register( id='ALRBallInACupPDSimpleDetPMP-v0', - entry_point='alr_envs.mujoco.ball_in_a_cup.biac_pd:make_detpmp_env', + entry_point='alr_envs.mujoco.ball_in_a_cup.biac_pd:make_detpmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupPDSimple-v0", - "num_dof": 3, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - # "off": -0.05, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "mp_kwargs": { + "num_dof": 3, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "width": 0.0035, + # "off": -0.05, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "zero_goal": True, + "policy_kwargs": { + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } + } } ) @@ -430,20 +470,26 @@ register( register( id='ALRBallInACupDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupSimple-v0", - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "mp_kwargs": { + "num_dof": 7, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "width": 0.0035, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "zero_goal": True, + "policy_kwargs": { + + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } + } } ) @@ -452,18 +498,23 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_contextual_env', kwargs={ "name": "alr_envs:ALRBallInACupGoal-v0", - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "learn_goal": True, - "alpha_phase": 3, - "bandwidth_factor": 2.5, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "mp_kwargs": { + "num_dof": 7, + "num_basis": 5, + "duration": 3.5, + "post_traj_time": 4.5, + "learn_goal": True, + "alpha_phase": 3, + "bandwidth_factor": 2.5, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), + "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) + } + } } ) diff --git a/alr_envs/classic_control/__init__.py b/alr_envs/classic_control/__init__.py index 1397e41..8d95b6a 100644 --- a/alr_envs/classic_control/__init__.py +++ b/alr_envs/classic_control/__init__.py @@ -1,3 +1,3 @@ +from alr_envs.classic_control.hole_reacher.hole_reacher import HoleReacherEnv from alr_envs.classic_control.viapoint_reacher.viapoint_reacher import ViaPointReacher from alr_envs.classic_control.simple_reacher.simple_reacher import SimpleReacherEnv -from alr_envs.classic_control.hole_reacher.hole_reacher import HoleReacherEnv diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher.py b/alr_envs/classic_control/hole_reacher/hole_reacher.py index 04065f2..dfa2599 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher.py @@ -21,14 +21,14 @@ class HoleReacherEnv(gym.Env): self.random_start = random_start # provided initial parameters - self.hole_x = hole_x # x-position of center of hole - self.hole_width = hole_width # width of hole - self.hole_depth = hole_depth # depth of hole + self.initial_x = hole_x # x-position of center of hole + self.initial_width = hole_width # width of hole + self.initial_depth = hole_depth # depth of hole # temp container for current env state - self._tmp_hole_x = None - self._tmp_hole_width = None - self._tmp_hole_depth = None + self._tmp_x = None + self._tmp_width = None + self._tmp_depth = None self._goal = None # x-y coordinates for reaching the center at the bottom of the hole # collision @@ -69,6 +69,10 @@ class HoleReacherEnv(gym.Env): def dt(self) -> Union[float, int]: return self._dt + @property + def start_pos(self): + return self._start_pos + def step(self, action: np.ndarray): """ A single step with an action in joint velocity space @@ -110,13 +114,13 @@ class HoleReacherEnv(gym.Env): return self._get_obs().copy() def _generate_hole(self): - self._tmp_hole_x = self.np_random.uniform(1, 3.5, 1) if self.hole_x is None else np.copy(self.hole_x) - self._tmp_hole_width = self.np_random.uniform(0.15, 0.5, 1) if self.hole_width is None else np.copy( - self.hole_width) + self._tmp_x = self.np_random.uniform(1, 3.5, 1) if self.initial_x is None else np.copy(self.initial_x) + self._tmp_width = self.np_random.uniform(0.15, 0.5, 1) if self.initial_width is None else np.copy( + self.initial_width) # TODO we do not want this right now. - self._tmp_hole_depth = self.np_random.uniform(1, 1, 1) if self.hole_depth is None else np.copy( - self.hole_depth) - self._goal = np.hstack([self._tmp_hole_x, -self._tmp_hole_depth]) + self._tmp_depth = self.np_random.uniform(1, 1, 1) if self.initial_depth is None else np.copy( + self.initial_depth) + self._goal = np.hstack([self._tmp_x, -self._tmp_depth]) def _update_joints(self): """ @@ -164,7 +168,7 @@ class HoleReacherEnv(gym.Env): np.cos(theta), np.sin(theta), self._angle_velocity, - self._tmp_hole_width, + self._tmp_width, # self._tmp_hole_depth, self.end_effector - self._goal, self._steps @@ -192,7 +196,7 @@ class HoleReacherEnv(gym.Env): def _check_wall_collision(self, line_points): # all points that are before the hole in x - r, c = np.where(line_points[:, :, 0] < (self._tmp_hole_x - self._tmp_hole_width / 2)) + r, c = np.where(line_points[:, :, 0] < (self._tmp_x - self._tmp_width / 2)) # check if any of those points are below surface nr_line_points_below_surface_before_hole = np.sum(line_points[r, c, 1] < 0) @@ -201,7 +205,7 @@ class HoleReacherEnv(gym.Env): return True # all points that are after the hole in x - r, c = np.where(line_points[:, :, 0] > (self._tmp_hole_x + self._tmp_hole_width / 2)) + r, c = np.where(line_points[:, :, 0] > (self._tmp_x + self._tmp_width / 2)) # check if any of those points are below surface nr_line_points_below_surface_after_hole = np.sum(line_points[r, c, 1] < 0) @@ -210,11 +214,11 @@ class HoleReacherEnv(gym.Env): return True # all points that are above the hole - r, c = np.where((line_points[:, :, 0] > (self._tmp_hole_x - self._tmp_hole_width / 2)) & ( - line_points[:, :, 0] < (self._tmp_hole_x + self._tmp_hole_width / 2))) + r, c = np.where((line_points[:, :, 0] > (self._tmp_x - self._tmp_width / 2)) & ( + line_points[:, :, 0] < (self._tmp_x + self._tmp_width / 2))) # check if any of those points are below surface - nr_line_points_below_surface_in_hole = np.sum(line_points[r, c, 1] < -self._tmp_hole_depth) + nr_line_points_below_surface_in_hole = np.sum(line_points[r, c, 1] < -self._tmp_depth) if nr_line_points_below_surface_in_hole > 0: return True @@ -257,17 +261,17 @@ class HoleReacherEnv(gym.Env): def _set_patches(self): if self.fig is not None: self.fig.gca().patches = [] - left_block = patches.Rectangle((-self.n_links, -self._tmp_hole_depth), - self.n_links + self._tmp_hole_x - self._tmp_hole_width / 2, - self._tmp_hole_depth, + left_block = patches.Rectangle((-self.n_links, -self._tmp_depth), + self.n_links + self._tmp_x - self._tmp_width / 2, + self._tmp_depth, fill=True, edgecolor='k', facecolor='k') - right_block = patches.Rectangle((self._tmp_hole_x + self._tmp_hole_width / 2, -self._tmp_hole_depth), - self.n_links - self._tmp_hole_x + self._tmp_hole_width / 2, - self._tmp_hole_depth, + right_block = patches.Rectangle((self._tmp_x + self._tmp_width / 2, -self._tmp_depth), + self.n_links - self._tmp_x + self._tmp_width / 2, + self._tmp_depth, fill=True, edgecolor='k', facecolor='k') - hole_floor = patches.Rectangle((self._tmp_hole_x - self._tmp_hole_width / 2, -self._tmp_hole_depth), - self._tmp_hole_width, - 1 - self._tmp_hole_depth, + hole_floor = patches.Rectangle((self._tmp_x - self._tmp_width / 2, -self._tmp_depth), + self._tmp_width, + 1 - self._tmp_depth, fill=True, edgecolor='k', facecolor='k') # Add the patch to the Axes diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py index 3d95b8c..d39edcd 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py @@ -12,7 +12,7 @@ class HoleReacherMPWrapper(MPEnvWrapper): [self.env.random_start] * self.env.n_links, # cos [self.env.random_start] * self.env.n_links, # sin [self.env.random_start] * self.env.n_links, # velocity - [self.env.hole_width is None], # hole width + [self.env.initial_width is None], # hole width # [self.env.hole_depth is None], # hole depth [True] * 2, # x-y coordinates of target distance [False] # env steps @@ -20,7 +20,7 @@ class HoleReacherMPWrapper(MPEnvWrapper): @property def start_pos(self) -> Union[float, int, np.ndarray]: - return self._start_pos + return self.env.start_pos @property def goal_pos(self) -> Union[float, int, np.ndarray]: @@ -28,4 +28,4 @@ class HoleReacherMPWrapper(MPEnvWrapper): @property def dt(self) -> Union[float, int]: - return self.env.dt \ No newline at end of file + return self.env.dt diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher.py b/alr_envs/classic_control/simple_reacher/simple_reacher.py index 4b65daf..157913f 100644 --- a/alr_envs/classic_control/simple_reacher/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher/simple_reacher.py @@ -22,15 +22,18 @@ class SimpleReacherEnv(gym.Env): self.random_start = random_start + # provided initial parameters + self.inital_target = target + + # temp container for current env state + self._goal = None + self._joints = None self._joint_angles = None self._angle_velocity = None self._start_pos = np.zeros(self.n_links) self._start_vel = np.zeros(self.n_links) - self._target = target # provided target value - self._goal = None # updated goal value, does not change when target != None - self.max_torque = 1 self.steps_before_reward = 199 @@ -56,6 +59,10 @@ class SimpleReacherEnv(gym.Env): def dt(self) -> Union[float, int]: return self._dt + @property + def start_pos(self): + return self._start_pos + def step(self, action: np.ndarray): """ A single step with action in torque space @@ -129,14 +136,14 @@ class SimpleReacherEnv(gym.Env): def _generate_goal(self): - if self._target is None: + if self.inital_target is None: total_length = np.sum(self.link_lengths) goal = np.array([total_length, total_length]) while np.linalg.norm(goal) >= total_length: goal = self.np_random.uniform(low=-total_length, high=total_length, size=2) else: - goal = np.copy(self._target) + goal = np.copy(self.inital_target) self._goal = goal diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py index 613f30d..71f6043 100644 --- a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py @@ -18,7 +18,7 @@ class SimpleReacherMPWrapper(MPEnvWrapper): @property def start_pos(self): - return self._start_pos + return self.env.start_pos @property def goal_pos(self): diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py index fc3264d..0257da0 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py @@ -10,7 +10,7 @@ from alr_envs.classic_control.utils import check_self_collision class ViaPointReacher(gym.Env): - def __init__(self, n_links, random_start: bool = True, via_target: Union[None, Iterable] = None, + def __init__(self, n_links, random_start: bool = False, via_target: Union[None, Iterable] = None, target: Union[None, Iterable] = None, allow_self_collision=False, collision_penalty=1000): self.n_links = n_links @@ -19,8 +19,8 @@ class ViaPointReacher(gym.Env): self.random_start = random_start # provided initial parameters - self.target = target # provided target value - self.via_target = via_target # provided via point target value + self.intitial_target = target # provided target value + self.initial_via_target = via_target # provided via point target value # temp container for current env state self._via_point = np.ones(2) @@ -63,6 +63,10 @@ class ViaPointReacher(gym.Env): def dt(self): return self._dt + @property + def start_pos(self): + return self._start_pos + def step(self, action: np.ndarray): """ a single step with an action in joint velocity space @@ -107,22 +111,22 @@ class ViaPointReacher(gym.Env): total_length = np.sum(self.link_lengths) # rejection sampled point in inner circle with 0.5*Radius - if self.via_target is None: + if self.initial_via_target is None: via_target = np.array([total_length, total_length]) while np.linalg.norm(via_target) >= 0.5 * total_length: via_target = self.np_random.uniform(low=-0.5 * total_length, high=0.5 * total_length, size=2) else: - via_target = np.copy(self.via_target) + via_target = np.copy(self.initial_via_target) # rejection sampled point in outer circle - if self.target is None: + if self.intitial_target is None: goal = np.array([total_length, total_length]) while np.linalg.norm(goal) >= total_length or np.linalg.norm(goal) <= 0.5 * total_length: goal = self.np_random.uniform(low=-total_length, high=total_length, size=2) else: - goal = np.copy(self.target) + goal = np.copy(self.intitial_target) - self.via_target = via_target + self._via_point = via_target self._goal = goal def _update_joints(self): diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py index 57aff1b..a3ec7f0 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py @@ -12,18 +12,19 @@ class ViaPointReacherMPWrapper(MPEnvWrapper): [self.env.random_start] * self.env.n_links, # cos [self.env.random_start] * self.env.n_links, # sin [self.env.random_start] * self.env.n_links, # velocity - [self.env.via_target is None] * 2, # x-y coordinates of via point distance + [self.env.initial_via_target is None] * 2, # x-y coordinates of via point distance [True] * 2, # x-y coordinates of target distance [False] # env steps ]) @property def start_pos(self) -> Union[float, int, np.ndarray]: - return self._start_pos + return self.env.start_pos @property def goal_pos(self) -> Union[float, int, np.ndarray]: raise ValueError("Goal position is not available and has to be learnt based on the environment.") + @property def dt(self) -> Union[float, int]: return self.env.dt diff --git a/example.py b/example.py index abf69c9..37a9f81 100644 --- a/example.py +++ b/example.py @@ -1,7 +1,9 @@ from collections import defaultdict + import gym import numpy as np -from alr_envs.utils.mp_env_async_sampler import AlrMpEnvSampler, AlrContextualMpEnvSampler, DummyDist + +from alr_envs.utils.mp_env_async_sampler import AlrContextualMpEnvSampler, AlrMpEnvSampler, DummyDist def example_mujoco(): @@ -14,8 +16,8 @@ def example_mujoco(): obs, reward, done, info = env.step(env.action_space.sample()) rewards += reward - if i % 1 == 0: - env.render() + # if i % 1 == 0: + # env.render() if done: print(rewards) @@ -23,8 +25,7 @@ def example_mujoco(): obs = env.reset() -def example_mp(env_name="alr_envs:HoleReacherDMP-v0"): - # env = gym.make("alr_envs:ViaPointReacherDMP-v0") +def example_mp(env_name="alr_envs:HoleReacherDMP-v1"): env = gym.make(env_name) rewards = 0 # env.render(mode=None) @@ -105,11 +106,12 @@ def example_async_contextual_sampler(env_name="alr_envs:SimpleReacherDMP-v1", n_ if __name__ == '__main__': + example_mp("alr_envs:HoleReacherDetPMP-v0") # example_mujoco() # example_mp("alr_envs:SimpleReacherDMP-v1") # example_async("alr_envs:LongSimpleReacherDMP-v0", 4) # example_async_contextual_sampler() # env = gym.make("alr_envs:HoleReacherDetPMP-v1") - env_name = "alr_envs:ALRBallInACupPDSimpleDetPMP-v0" - example_async_sampler(env_name) + # env_name = "alr_envs:ALRBallInACupPDSimpleDetPMP-v0" + # example_async_sampler(env_name) # example_mp(env_name) From 3b215cd87751d1dec33c6aa51a32954c60ad2856 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 28 Jun 2021 17:25:53 +0200 Subject: [PATCH 20/56] added dmc2gym conversion and example how to leverage DMPs --- README.md | 2 +- alr_envs/__init__.py | 2 +- .../hole_reacher/hole_reacher_mp_wrapper.py | 2 +- .../simple_reacher_mp_wrapper.py | 2 +- .../viapoint_reacher_mp_wrapper.py | 2 +- alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py | 27 +++ alr_envs/dmc/__init__.py | 0 alr_envs/examples/__init__.py | 0 alr_envs/examples/examples_dmc.py | 73 +++++++ alr_envs/examples/examples_general.py | 74 +++++++ .../examples/examples_motion_primitives.py | 103 ++++++++++ .../ball_in_a_cup/ball_in_a_cup_mp_wrapper.py | 2 +- .../ball_in_a_cup_positional_wrapper.py | 2 +- alr_envs/utils/__init__.py | 60 ++++++ alr_envs/utils/dmc2gym_wrapper.py | 182 ++++++++++++++++++ alr_envs/utils/make_env_helpers.py | 66 +++++-- example.py | 117 ----------- 17 files changed, 573 insertions(+), 143 deletions(-) create mode 100644 alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py create mode 100644 alr_envs/dmc/__init__.py create mode 100644 alr_envs/examples/__init__.py create mode 100644 alr_envs/examples/examples_dmc.py create mode 100644 alr_envs/examples/examples_general.py create mode 100644 alr_envs/examples/examples_motion_primitives.py create mode 100644 alr_envs/utils/dmc2gym_wrapper.py delete mode 100644 example.py diff --git a/README.md b/README.md index 41d87f2..ce95b8d 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ cd alr_envs ```bash pip install -e . ``` -4. Use (see [example.py](./example.py)): +4. Use (see [example.py](alr_envs/examples/examples_general.py)): ```python import gym diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index de0df8a..90c60e4 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -463,7 +463,7 @@ register( "weights_scale": 0.2, "zero_start": True, "zero_goal": True, - "p_gains": np.array([4./3., 2.4, 2.5, 5./3., 2., 2., 1.25]), + "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } ) diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py index d39edcd..a2fd2a7 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py @@ -2,7 +2,7 @@ from typing import Union import numpy as np -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class HoleReacherMPWrapper(MPEnvWrapper): diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py index 71f6043..ee96fc6 100644 --- a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py @@ -2,7 +2,7 @@ from typing import Union import numpy as np -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class SimpleReacherMPWrapper(MPEnvWrapper): diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py index a3ec7f0..9764d4d 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py @@ -2,7 +2,7 @@ from typing import Union import numpy as np -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class ViaPointReacherMPWrapper(MPEnvWrapper): diff --git a/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py b/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py new file mode 100644 index 0000000..5be3baf --- /dev/null +++ b/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py @@ -0,0 +1,27 @@ +from typing import Union + +import numpy as np + +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper + + +class BallInCupMPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + # Besides the ball position, the environment is always set to 0. + return np.hstack([ + [False] * 2, # cup position + [True] * 2, # ball position + [False] * 2, # cup velocity + [False] * 2, # ball velocity + ]) + + @property + def start_pos(self) -> Union[float, int, np.ndarray]: + return np.hstack([self.physics.named.data.qpos['cup_x'], self.physics.named.data.qpos['cup_z']]) + + @property + def dt(self) -> Union[float, int]: + # Taken from: https://github.com/deepmind/dm_control/blob/master/dm_control/suite/ball_in_cup.py#L27 + return 0.02 diff --git a/alr_envs/dmc/__init__.py b/alr_envs/dmc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/examples/__init__.py b/alr_envs/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py new file mode 100644 index 0000000..a55d467 --- /dev/null +++ b/alr_envs/examples/examples_dmc.py @@ -0,0 +1,73 @@ +from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import BallInCupMPWrapper +from alr_envs.utils.make_env_helpers import make_dmp_env, make_env + + +def example_dmc(env_name="fish-swim", seed=1): + env = make_env(env_name, seed) + rewards = 0 + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(2000): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + + +def example_custom_dmc_and_mp(seed=1): + """ + Example for running a custom motion primitive based environments based off of a dmc task. + Our already registered environments follow the same structure, but do not directly allow for modifications. + Hence, this also allows to adjust hyperparameters of the motion primitives more easily. + We appreciate PRs for custom environments (especially MP wrappers of existing tasks) + for our repo: https://github.com/ALRhub/alr_envs/ + Args: + seed: seed + + Returns: + + """ + + base_env = "ball_in_cup-catch" + # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. + # You can also add other gym.Wrappers in case they are needed. + # wrappers = [HoleReacherMPWrapper] + wrappers = [BallInCupMPWrapper] + mp_kwargs = { + "num_dof": 2, # env.start_pos + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } + env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, **mp_kwargs) + # OR for a deterministic ProMP: + # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, **mp_args) + + rewards = 0 + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(10): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + + +if __name__ == '__main__': + example_dmc() + example_custom_dmc_and_mp() diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py new file mode 100644 index 0000000..041c281 --- /dev/null +++ b/alr_envs/examples/examples_general.py @@ -0,0 +1,74 @@ +import warnings +from collections import defaultdict + +import gym +import numpy as np + +from alr_envs.utils.make_env_helpers import make_env +from alr_envs.utils.mp_env_async_sampler import AlrContextualMpEnvSampler, AlrMpEnvSampler, DummyDist + + +def example_general(env_id='alr_envs:ALRReacher-v0', seed=1): + """ + Example for running any env in the step based setting. + This also includes DMC environments when leveraging our custom make_env function. + """ + + env = make_env(env_id, seed) + rewards = 0 + obs = env.reset() + print("Observation shape: ", obs.shape) + print("Action shape: ", env.action_space.shape) + + # number of environment steps + for i in range(10000): + obs, reward, done, info = env.step(env.action_space.sample()) + rewards += reward + + # if i % 1 == 0: + # env.render() + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + + +def example_async(env_id="alr_envs:HoleReacherDMP-v0", n_cpu=4, seed=int('533D', 16)): + def sample(env: gym.vector.VectorEnv, n_samples=100): + # for plotting + rewards = np.zeros(n_cpu) + + # this would generate more samples than requested if n_samples % num_envs != 0 + repeat = int(np.ceil(n_samples / env.num_envs)) + vals = defaultdict(list) + for i in range(repeat): + obs, reward, done, info = envs.step(envs.action_space.sample()) + vals['obs'].append(obs) + vals['reward'].append(reward) + vals['done'].append(done) + vals['info'].append(info) + rewards += reward + if np.any(done): + print(rewards[done]) + rewards[done] = 0 + + # do not return values above threshold + return (*map(lambda v: np.stack(v)[:n_samples], vals.values()),) + + from alr_envs.utils.make_env_helpers import make_env_rank + envs = gym.vector.AsyncVectorEnv([make_env_rank(env_id, seed, i) for i in range(n_cpu)]) + # envs = gym.vector.AsyncVectorEnv([make_env(env_id, seed + i) for i in range(n_cpu)]) + + obs = envs.reset() + print(sample(envs, 16)) + + +if __name__ == '__main__': + # DMC + # example_general("fish-swim") + + # custom mujoco env + # example_general("alr_envs:ALRReacher-v0") + + example_general("ball_in_cup-catch") diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py new file mode 100644 index 0000000..d3755d7 --- /dev/null +++ b/alr_envs/examples/examples_motion_primitives.py @@ -0,0 +1,103 @@ +from alr_envs import HoleReacherMPWrapper +from alr_envs.utils.make_env_helpers import make_dmp_env, make_env + + +def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1): + """ + Example for running a motion primitive based environment, which is already registered + Args: + env_name: DMP env_id + seed: seed + + Returns: + + """ + # While in this case gym.make() is possible to use as well, we recommend our custom make env function. + # First, it already takes care of seeding and second enables the use of DMC tasks within the gym interface. + env = make_env(env_name, seed) + rewards = 0 + # env.render(mode=None) + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(10): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if i % 1 == 0: + # render full DMP trajectory + # render can only be called once in the beginning as well. That would render every trajectory + # Calling it after every trajectory allows to modify the mode. mode=None, disables rendering. + env.render(mode="human") + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + + +def example_custom_mp(seed=1): + """ + Example for running a custom motion primitive based environments. + Our already registered environments follow the same structure, but do not directly allow for modifications. + Hence, this also allows to adjust hyperparameters of the motion primitives more easily. + We appreciate PRs for custom environments (especially MP wrappers of existing tasks) + for our repo: https://github.com/ALRhub/alr_envs/ + Args: + seed: seed + + Returns: + + """ + + base_env = "alr_envs:HoleReacher-v1" + # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. + # You can also add other gym.Wrappers in case they are needed. + wrappers = [HoleReacherMPWrapper] + mp_kwargs = { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } + env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, **mp_kwargs) + # OR for a deterministic ProMP: + # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed) + + rewards = 0 + # env.render(mode=None) + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(10): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if i % 1 == 0: + # render full DMP trajectory + # render can only be called once in the beginning as well. That would render every trajectory + # Calling it after every trajectory allows to modify the mode. mode=None, disables rendering. + env.render(mode="human") + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + + +if __name__ == '__main__': + # DMP + example_mp("alr_envs:HoleReacherDMP-v1") + + # DetProMP + example_mp("alr_envs:HoleReacherDetPMP-v1") + + # Custom DMP + example_custom_mp() diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py index 0c6c1ce..9393421 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py @@ -2,7 +2,7 @@ from typing import Union import numpy as np -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class BallInACupMPWrapper(MPEnvWrapper): diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py index c1f7e07..d1ba696 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py @@ -2,7 +2,7 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.envs.positional_env_wrapper import PositionalEnvWrapper +from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper class BallInACupPositionalWrapper(PositionalEnvWrapper): diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index e69de29..5b60ba3 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -0,0 +1,60 @@ +import re + +import gym +from gym.envs.registration import register + + +def make( + id, + seed=1, + visualize_reward=True, + from_pixels=False, + height=84, + width=84, + camera_id=0, + frame_skip=1, + episode_length=1000, + environment_kwargs=None, + time_limit=None, + channels_first=True +): + # Adopted from: https://github.com/denisyarats/dmc2gym/blob/master/dmc2gym/__init__.py + # License: MIT + # Copyright (c) 2020 Denis Yarats + + assert re.match(r"\w+-\w+", id), "env_id does not have the following structure: 'domain_name-task_name'" + domain_name, task_name = id.split("-") + + env_id = f'dmc_{domain_name}_{task_name}_{seed}-v1' + + if from_pixels: + assert not visualize_reward, 'cannot use visualize reward when learning from pixels' + + # shorten episode length + max_episode_steps = (episode_length + frame_skip - 1) // frame_skip + + if env_id not in gym.envs.registry.env_specs: + task_kwargs = {} + if seed is not None: + task_kwargs['random'] = seed + if time_limit is not None: + task_kwargs['time_limit'] = time_limit + register( + id=env_id, + entry_point='alr_envs.utils.dmc2gym_wrapper:DMCWrapper', + kwargs=dict( + domain_name=domain_name, + task_name=task_name, + task_kwargs=task_kwargs, + environment_kwargs=environment_kwargs, + visualize_reward=visualize_reward, + from_pixels=from_pixels, + height=height, + width=width, + camera_id=camera_id, + frame_skip=frame_skip, + channels_first=channels_first, + ), + max_episode_steps=max_episode_steps, + ) + return gym.make(env_id) diff --git a/alr_envs/utils/dmc2gym_wrapper.py b/alr_envs/utils/dmc2gym_wrapper.py new file mode 100644 index 0000000..4ae1ec0 --- /dev/null +++ b/alr_envs/utils/dmc2gym_wrapper.py @@ -0,0 +1,182 @@ +# Adopted from: https://github.com/denisyarats/dmc2gym/blob/master/dmc2gym/wrappers.py +# License: MIT +# Copyright (c) 2020 Denis Yarats +import matplotlib.pyplot as plt +from gym import core, spaces +from dm_control import suite, manipulation +from dm_env import specs +import numpy as np + + +def _spec_to_box(spec): + def extract_min_max(s): + assert s.dtype == np.float64 or s.dtype == np.float32, f"Only float64 and float32 types are allowed, instead {s.dtype} was found" + dim = int(np.prod(s.shape)) + if type(s) == specs.Array: + bound = np.inf * np.ones(dim, dtype=np.float32) + return -bound, bound + elif type(s) == specs.BoundedArray: + zeros = np.zeros(dim, dtype=np.float32) + return s.minimum + zeros, s.maximum + zeros + + mins, maxs = [], [] + for s in spec: + mn, mx = extract_min_max(s) + mins.append(mn) + maxs.append(mx) + low = np.concatenate(mins, axis=0) + high = np.concatenate(maxs, axis=0) + assert low.shape == high.shape + return spaces.Box(low, high, dtype=np.float32) + + +def _flatten_obs(obs): + obs_pieces = [] + for v in obs.values(): + flat = np.array([v]) if np.isscalar(v) else v.ravel() + obs_pieces.append(flat) + return np.concatenate(obs_pieces, axis=0) + + +class DMCWrapper(core.Env): + def __init__( + self, + domain_name, + task_name, + task_kwargs=None, + visualize_reward={}, + from_pixels=False, + height=84, + width=84, + camera_id=0, + frame_skip=1, + environment_kwargs=None, + channels_first=True + ): + assert 'random' in task_kwargs, 'please specify a seed, for deterministic behaviour' + self._from_pixels = from_pixels + self._height = height + self._width = width + self._camera_id = camera_id + self._frame_skip = frame_skip + self._channels_first = channels_first + + # create task + if domain_name == "manipulation": + assert not from_pixels, \ + "TODO: Vision interface for manipulation is different to suite and needs to be implemented" + self._env = manipulation.load( + environment_name=task_name, + seed=task_kwargs['random'] + ) + else: + self._env = suite.load( + domain_name=domain_name, + task_name=task_name, + task_kwargs=task_kwargs, + visualize_reward=visualize_reward, + environment_kwargs=environment_kwargs + ) + + # true and normalized action spaces + self._true_action_space = _spec_to_box([self._env.action_spec()]) + self._norm_action_space = spaces.Box( + low=-1.0, + high=1.0, + shape=self._true_action_space.shape, + dtype=np.float32 + ) + + # create observation space + if from_pixels: + shape = [3, height, width] if channels_first else [height, width, 3] + self._observation_space = spaces.Box( + low=0, high=255, shape=shape, dtype=np.uint8 + ) + else: + self._observation_space = _spec_to_box( + self._env.observation_spec().values() + ) + + self._state_space = _spec_to_box( + self._env.observation_spec().values() + ) + + self.current_state = None + + # set seed + self.seed(seed=task_kwargs.get('random', 1)) + + def __getattr__(self, name): + return getattr(self._env, name) + + def _get_obs(self, time_step): + if self._from_pixels: + obs = self.render( + mode="rgb_array", + height=self._height, + width=self._width, + camera_id=self._camera_id + ) + if self._channels_first: + obs = obs.transpose(2, 0, 1).copy() + else: + obs = _flatten_obs(time_step.observation) + return obs + + def _convert_action(self, action): + action = action.astype(float) + true_delta = self._true_action_space.high - self._true_action_space.low + norm_delta = self._norm_action_space.high - self._norm_action_space.low + action = (action - self._norm_action_space.low) / norm_delta + action = action * true_delta + self._true_action_space.low + action = action.astype(np.float32) + return action + + @property + def observation_space(self): + return self._observation_space + + @property + def state_space(self): + return self._state_space + + @property + def action_space(self): + return self._norm_action_space + + def seed(self, seed): + self._true_action_space.seed(seed) + self._norm_action_space.seed(seed) + self._observation_space.seed(seed) + + def step(self, action): + assert self._norm_action_space.contains(action) + action = self._convert_action(action) + assert self._true_action_space.contains(action) + reward = 0 + extra = {'internal_state': self._env.physics.get_state().copy()} + + for _ in range(self._frame_skip): + time_step = self._env.step(action) + reward += time_step.reward or 0 + done = time_step.last() + if done: + break + obs = self._get_obs(time_step) + self.current_state = _flatten_obs(time_step.observation) + extra['discount'] = time_step.discount + return obs, reward, done, extra + + def reset(self): + time_step = self._env.reset() + self.current_state = _flatten_obs(time_step.observation) + obs = self._get_obs(time_step) + return obs + + def render(self, mode='rgb_array', height=None, width=None, camera_id=0): + assert mode == 'rgb_array', 'only support rgb_array mode, given %s' % mode + height = height or self._height + width = width or self._width + camera_id = camera_id or self._camera_id + return self._env.physics.render(height=height, width=width, camera_id=camera_id) \ No newline at end of file diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 246cd7a..2a3ccf7 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -1,20 +1,22 @@ +import logging from typing import Iterable, List, Type import gym -from mp_env_api.envs.mp_env_wrapper import MPEnvWrapper +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper -def make_env(env_id: str, seed: int, rank: int = 0): +def make_env_rank(env_id: str, seed: int, rank: int = 0): """ - Create a new gym environment with given seed. + TODO: Do we need this? + Generate a callable to create a new gym environment with a given seed. The rank is added to the seed and can be used for example when using vector environments. - E.g. [make_env("my_env_name-v0", 123, i) for i in range(8)] creates a list of 8 environments + E.g. [make_env_rank("my_env_name-v0", 123, i) for i in range(8)] creates a list of 8 environments with seeds 123 through 130. Hence, testing environments should be seeded with a value which is offset by the number of training environments. - Here e.g. [make_env("my_env_name-v0", 123 + 8, i) for i in range(5)] for 5 testing environmetns + Here e.g. [make_env_rank("my_env_name-v0", 123 + 8, i) for i in range(5)] for 5 testing environmetns Args: env_id: name of the environment @@ -24,18 +26,34 @@ def make_env(env_id: str, seed: int, rank: int = 0): Returns: """ - env = gym.make(env_id) - env.seed(seed + rank) - return lambda: env + return lambda: make_env(env_id, seed + rank) -def make_contextual_env(env_id, context, seed, rank): - env = gym.make(env_id, context=context) - env.seed(seed + rank) - return lambda: env +def make_env(env_id: str, seed, **kwargs): + """ + Converts an env_id to an environment with the gym API. + This also works for DeepMind Control Suite env_wrappers + for which domain name and task name are expected to be separated by "-". + Args: + env_id: gym name or env_id of the form "domain_name-task_name" for DMC tasks + **kwargs: Additional kwargs for the constructor such as pixel observations, etc. + + Returns: Gym environment + + """ + try: + # Gym + env = gym.make(env_id, **kwargs) + env.seed(seed) + except gym.error.Error: + # DMC + from alr_envs.utils import make + env = make(env_id, seed=seed, **kwargs) + + return env -def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]]): +def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]], seed=1, **kwargs): """ Helper function for creating a wrapped gym environment using MPs. It adds all provided wrappers to the specified environment and verifies at least one MPEnvWrapper is @@ -44,36 +62,40 @@ def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]]): Args: env_id: name of the environment wrappers: list of wrappers (at least an MPEnvWrapper), + seed: seed of environment Returns: gym environment with all specified wrappers applied """ - _env = gym.make(env_id) + # _env = gym.make(env_id) + _env = make_env(env_id, seed, **kwargs) - assert any(issubclass(w, MPEnvWrapper) for w in wrappers) + assert any(issubclass(w, MPEnvWrapper) for w in wrappers),\ + "At least an MPEnvWrapper is required in order to leverage motion primitive environments." for w in wrappers: _env = w(_env) return _env -def make_dmp_env(env_id: str, wrappers: Iterable, **mp_kwargs): +def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, **mp_kwargs): """ This can also be used standalone for manually building a custom DMP environment. Args: env_id: base_env_name, wrappers: list of wrappers (at least an MPEnvWrapper), + seed: seed of environment mp_kwargs: dict of at least {num_dof: int, num_basis: int} for DMP Returns: DMP wrapped gym env """ - _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers) + _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed) return DmpWrapper(_env, **mp_kwargs) -def make_detpmp_env(env_id: str, wrappers: Iterable, **mp_kwargs): +def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, **mp_kwargs): """ This can also be used standalone for manually building a custom Det ProMP environment. Args: @@ -85,7 +107,7 @@ def make_detpmp_env(env_id: str, wrappers: Iterable, **mp_kwargs): """ - _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers) + _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed) return DetPMPWrapper(_env, **mp_kwargs) @@ -122,3 +144,9 @@ def make_detpmp_env_helper(**kwargs): """ return make_detpmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), **kwargs.get("mp_kwargs")) + + +def make_contextual_env(env_id, context, seed, rank): + env = gym.make(env_id, context=context) + env.seed(seed + rank) + return lambda: env diff --git a/example.py b/example.py deleted file mode 100644 index 37a9f81..0000000 --- a/example.py +++ /dev/null @@ -1,117 +0,0 @@ -from collections import defaultdict - -import gym -import numpy as np - -from alr_envs.utils.mp_env_async_sampler import AlrContextualMpEnvSampler, AlrMpEnvSampler, DummyDist - - -def example_mujoco(): - env = gym.make('alr_envs:ALRReacher-v0') - rewards = 0 - obs = env.reset() - - # number of environment steps - for i in range(10000): - obs, reward, done, info = env.step(env.action_space.sample()) - rewards += reward - - # if i % 1 == 0: - # env.render() - - if done: - print(rewards) - rewards = 0 - obs = env.reset() - - -def example_mp(env_name="alr_envs:HoleReacherDMP-v1"): - env = gym.make(env_name) - rewards = 0 - # env.render(mode=None) - obs = env.reset() - - # number of samples/full trajectories (multiple environment steps) - for i in range(10): - obs, reward, done, info = env.step(env.action_space.sample()) - rewards += reward - - if i % 1 == 0: - # render full DMP trajectory - # render can only be called once in the beginning as well. That would render every trajectory - # Calling it after every trajectory allows to modify the mode. mode=None, disables rendering. - env.render(mode="human") - - if done: - print(rewards) - rewards = 0 - obs = env.reset() - - -def example_async(env_id="alr_envs:HoleReacherDMP-v0", n_cpu=4, seed=int('533D', 16)): - def make_env(env_id, seed, rank): - env = gym.make(env_id) - env.seed(seed + rank) - return lambda: env - - def sample(env: gym.vector.VectorEnv, n_samples=100): - # for plotting - rewards = np.zeros(n_cpu) - - # this would generate more samples than requested if n_samples % num_envs != 0 - repeat = int(np.ceil(n_samples / env.num_envs)) - vals = defaultdict(list) - for i in range(repeat): - obs, reward, done, info = envs.step(envs.action_space.sample()) - vals['obs'].append(obs) - vals['reward'].append(reward) - vals['done'].append(done) - vals['info'].append(info) - rewards += reward - if np.any(done): - print(rewards[done]) - rewards[done] = 0 - - # do not return values above threshold - return (*map(lambda v: np.stack(v)[:n_samples], vals.values()),) - - envs = gym.vector.AsyncVectorEnv([make_env(env_id, seed, i) for i in range(n_cpu)]) - - obs = envs.reset() - print(sample(envs, 16)) - - -def example_async_sampler(env_name="alr_envs:HoleReacherDetPMP-v1", n_cpu=4): - n_samples = 10 - - sampler = AlrMpEnvSampler(env_name, num_envs=n_cpu) - dim = sampler.env.action_space.spaces[0].shape[0] - - thetas = np.random.randn(n_samples, dim) # usually form a search distribution - - _, rewards, __, ___ = sampler(thetas) - - print(rewards) - - -def example_async_contextual_sampler(env_name="alr_envs:SimpleReacherDMP-v1", n_cpu=4): - sampler = AlrContextualMpEnvSampler(env_name, num_envs=n_cpu) - dim = sampler.env.action_space.spaces[0].shape[0] - dist = DummyDist(dim) # needs a sample function - - n_samples = 10 - new_samples, new_contexts, obs, new_rewards, done, infos = sampler(dist, n_samples) - - print(new_rewards) - - -if __name__ == '__main__': - example_mp("alr_envs:HoleReacherDetPMP-v0") - # example_mujoco() - # example_mp("alr_envs:SimpleReacherDMP-v1") - # example_async("alr_envs:LongSimpleReacherDMP-v0", 4) - # example_async_contextual_sampler() - # env = gym.make("alr_envs:HoleReacherDetPMP-v1") - # env_name = "alr_envs:ALRBallInACupPDSimpleDetPMP-v0" - # example_async_sampler(env_name) - # example_mp(env_name) From 7c04b25eecc48eae22de9314e030a8439ce6e7ea Mon Sep 17 00:00:00 2001 From: ottofabian Date: Tue, 29 Jun 2021 16:17:18 +0200 Subject: [PATCH 21/56] finalized examples and added seed control --- alr_envs/__init__.py | 43 +++++++++++++++++++ alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py | 2 +- alr_envs/examples/examples_dmc.py | 22 +++++++--- .../examples/examples_motion_primitives.py | 21 ++++++++- alr_envs/utils/__init__.py | 4 +- alr_envs/utils/make_env_helpers.py | 14 ++++-- 6 files changed, 92 insertions(+), 14 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 90c60e4..b1056a2 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -4,6 +4,7 @@ from gym.envs.registration import register from alr_envs.classic_control.hole_reacher.hole_reacher_mp_wrapper import HoleReacherMPWrapper from alr_envs.classic_control.simple_reacher.simple_reacher_mp_wrapper import SimpleReacherMPWrapper from alr_envs.classic_control.viapoint_reacher.viapoint_reacher_mp_wrapper import ViaPointReacherMPWrapper +from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_mp_wrapper import BallInACupMPWrapper from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_positional_wrapper import BallInACupPositionalWrapper from alr_envs.stochastic_search.functions.f_rosenbrock import Rosenbrock @@ -518,6 +519,48 @@ register( } ) +## DMC + +register( + id=f'dmc_ball_in_cup_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"ball_in_cup-catch", + "wrappers": [DMCBallInCupMPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } + } +) + +register( + id=f'dmc_ball_in_cup_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"ball_in_cup-catch", + "wrappers": [DMCBallInCupMPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } + } +) + + # BBO functions for dim in [5, 10, 25, 50, 100]: diff --git a/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py b/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py index 5be3baf..97959d7 100644 --- a/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py +++ b/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py @@ -5,7 +5,7 @@ import numpy as np from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper -class BallInCupMPWrapper(MPEnvWrapper): +class DMCBallInCupMPWrapper(MPEnvWrapper): @property def active_obs(self): diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index a55d467..d1a5e8e 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -1,14 +1,15 @@ -from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import BallInCupMPWrapper +from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper from alr_envs.utils.make_env_helpers import make_dmp_env, make_env -def example_dmc(env_name="fish-swim", seed=1): +def example_dmc(env_name="fish-swim", seed=1, iterations=1000): env = make_env(env_name, seed) rewards = 0 obs = env.reset() + print(obs) - # number of samples/full trajectories (multiple environment steps) - for i in range(2000): + # number of samples(multiple environment steps) + for i in range(10): ac = env.action_space.sample() obs, reward, done, info = env.step(ac) rewards += reward @@ -37,7 +38,7 @@ def example_custom_dmc_and_mp(seed=1): # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. # wrappers = [HoleReacherMPWrapper] - wrappers = [BallInCupMPWrapper] + wrappers = [DMCBallInCupMPWrapper] mp_kwargs = { "num_dof": 2, # env.start_pos "num_basis": 5, @@ -69,5 +70,14 @@ def example_custom_dmc_and_mp(seed=1): if __name__ == '__main__': - example_dmc() + # Disclaimer: DMC environments require the seed to be specified in the beginning. + # Adjusting it afterwards with env.seed() is not recommended as it does not affect the underlying physics. + + # Standard DMC task + example_dmc("fish_swim", seed=10, iterations=1000) + + # Gym + DMC hybrid task provided in the MP framework + example_dmc("dmc_ball_in_cup_dmp-v0", seed=10, iterations=10) + + # Custom DMC task example_custom_dmc_and_mp() diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py index d3755d7..60a77c1 100644 --- a/alr_envs/examples/examples_motion_primitives.py +++ b/alr_envs/examples/examples_motion_primitives.py @@ -15,6 +15,22 @@ def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1): # While in this case gym.make() is possible to use as well, we recommend our custom make env function. # First, it already takes care of seeding and second enables the use of DMC tasks within the gym interface. env = make_env(env_name, seed) + + # Changing the mp_kwargs is possible by providing them to gym. + # E.g. here by providing way to many basis functions + # mp_kwargs = { + # "num_dof": 5, + # "num_basis": 1000, + # "duration": 2, + # "learn_goal": True, + # "alpha_phase": 2, + # "bandwidth_factor": 2, + # "policy_type": "velocity", + # "weights_scale": 50, + # "goal_scale": 0.1 + # } + # env = make_env(env_name, seed, mp_kwargs=mp_kwargs) + rewards = 0 # env.render(mode=None) obs = env.reset() @@ -40,8 +56,9 @@ def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1): def example_custom_mp(seed=1): """ Example for running a custom motion primitive based environments. - Our already registered environments follow the same structure, but do not directly allow for modifications. - Hence, this also allows to adjust hyperparameters of the motion primitives more easily. + Our already registered environments follow the same structure. + Hence, this also allows to adjust hyperparameters of the motion primitives. + Yet, we recommend the method above if you are just interested in chaining those parameters for existing tasks. We appreciate PRs for custom environments (especially MP wrappers of existing tasks) for our repo: https://github.com/ALRhub/alr_envs/ Args: diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index 5b60ba3..1eb4e9e 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -35,8 +35,8 @@ def make( if env_id not in gym.envs.registry.env_specs: task_kwargs = {} - if seed is not None: - task_kwargs['random'] = seed + # if seed is not None: + task_kwargs['random'] = seed if time_limit is not None: task_kwargs['time_limit'] = time_limit register( diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 2a3ccf7..63eb8b9 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -42,6 +42,10 @@ def make_env(env_id: str, seed, **kwargs): """ try: + # Add seed to kwargs in case it is a predefined dmc environment. + if env_id.startswith("dmc"): + kwargs.update({"seed": seed}) + # Gym env = gym.make(env_id, **kwargs) env.seed(seed) @@ -70,7 +74,7 @@ def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]], seed=1 # _env = gym.make(env_id) _env = make_env(env_id, seed, **kwargs) - assert any(issubclass(w, MPEnvWrapper) for w in wrappers),\ + assert any(issubclass(w, MPEnvWrapper) for w in wrappers), \ "At least an MPEnvWrapper is required in order to leverage motion primitive environments." for w in wrappers: _env = w(_env) @@ -125,7 +129,9 @@ def make_dmp_env_helper(**kwargs): Returns: DMP wrapped gym env """ - return make_dmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), **kwargs.get("mp_kwargs")) + seed = kwargs.get("seed", None) + return make_dmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), seed=seed, + **kwargs.get("mp_kwargs")) def make_detpmp_env_helper(**kwargs): @@ -143,7 +149,9 @@ def make_detpmp_env_helper(**kwargs): Returns: DMP wrapped gym env """ - return make_detpmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), **kwargs.get("mp_kwargs")) + seed = kwargs.get("seed", None) + return make_detpmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), seed=seed, + **kwargs.get("mp_kwargs")) def make_contextual_env(env_id, context, seed, rank): From eae149f838012efb2ddc526561d4c06883ecc439 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 30 Jun 2021 15:00:36 +0200 Subject: [PATCH 22/56] added rendering to DMC envs and updated examples --- alr_envs/examples/examples_dmc.py | 29 +++- alr_envs/examples/examples_general.py | 19 +-- .../examples/examples_motion_primitives.py | 15 +- alr_envs/mujoco/ball_in_a_cup/utils.py | 2 +- alr_envs/mujoco/beerpong/utils.py | 2 +- alr_envs/utils/dmc2gym_wrapper.py | 130 ++++++++---------- alr_envs/utils/make_env_helpers.py | 21 +-- alr_envs/utils/mp_env_async_sampler.py | 19 ++- 8 files changed, 116 insertions(+), 121 deletions(-) diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index d1a5e8e..433b12c 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -6,19 +6,24 @@ def example_dmc(env_name="fish-swim", seed=1, iterations=1000): env = make_env(env_name, seed) rewards = 0 obs = env.reset() - print(obs) + print("observation shape:", env.observation_space.shape) + print("action shape:", env.action_space.shape) # number of samples(multiple environment steps) - for i in range(10): + for i in range(iterations): ac = env.action_space.sample() obs, reward, done, info = env.step(ac) rewards += reward + env.render("human") + if done: - print(rewards) + print(env_name, rewards) rewards = 0 obs = env.reset() + env.close() + def example_custom_dmc_and_mp(seed=1): """ @@ -50,12 +55,13 @@ def example_custom_dmc_and_mp(seed=1): "weights_scale": 50, "goal_scale": 0.1 } - env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, **mp_kwargs) + env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) # OR for a deterministic ProMP: # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, **mp_args) rewards = 0 obs = env.reset() + env.render("human") # number of samples/full trajectories (multiple environment steps) for i in range(10): @@ -64,17 +70,26 @@ def example_custom_dmc_and_mp(seed=1): rewards += reward if done: - print(rewards) + print(base_env, rewards) rewards = 0 obs = env.reset() + env.close() + if __name__ == '__main__': # Disclaimer: DMC environments require the seed to be specified in the beginning. # Adjusting it afterwards with env.seed() is not recommended as it does not affect the underlying physics. - # Standard DMC task - example_dmc("fish_swim", seed=10, iterations=1000) + # For rendering DMC + # export MUJOCO_GL="osmesa" + + # Standard DMC Suite tasks + example_dmc("fish-swim", seed=10, iterations=100) + + # Manipulation tasks + # The vision versions are currently not integrated + example_dmc("manipulation-reach_site_features", seed=10, iterations=100) # Gym + DMC hybrid task provided in the MP framework example_dmc("dmc_ball_in_cup_dmp-v0", seed=10, iterations=10) diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index 041c281..e602da6 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -8,7 +8,7 @@ from alr_envs.utils.make_env_helpers import make_env from alr_envs.utils.mp_env_async_sampler import AlrContextualMpEnvSampler, AlrMpEnvSampler, DummyDist -def example_general(env_id='alr_envs:ALRReacher-v0', seed=1): +def example_general(env_id: str, seed=1, iterations=1000): """ Example for running any env in the step based setting. This also includes DMC environments when leveraging our custom make_env function. @@ -17,16 +17,16 @@ def example_general(env_id='alr_envs:ALRReacher-v0', seed=1): env = make_env(env_id, seed) rewards = 0 obs = env.reset() - print("Observation shape: ", obs.shape) + print("Observation shape: ", env.observation_space.shape) print("Action shape: ", env.action_space.shape) # number of environment steps - for i in range(10000): + for i in range(iterations): obs, reward, done, info = env.step(env.action_space.sample()) rewards += reward - # if i % 1 == 0: - # env.render() + if i % 1 == 0: + env.render() if done: print(rewards) @@ -65,10 +65,5 @@ def example_async(env_id="alr_envs:HoleReacherDMP-v0", n_cpu=4, seed=int('533D', if __name__ == '__main__': - # DMC - # example_general("fish-swim") - - # custom mujoco env - # example_general("alr_envs:ALRReacher-v0") - - example_general("ball_in_cup-catch") + # Mujoco task from framework + example_general("alr_envs:ALRReacher-v0") diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py index 60a77c1..f3de01c 100644 --- a/alr_envs/examples/examples_motion_primitives.py +++ b/alr_envs/examples/examples_motion_primitives.py @@ -83,12 +83,17 @@ def example_custom_mp(seed=1): "weights_scale": 50, "goal_scale": 0.1 } - env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, **mp_kwargs) + env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) # OR for a deterministic ProMP: # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed) rewards = 0 - # env.render(mode=None) + # render full DMP trajectory + # It is only required to call render() once in the beginning, which renders every consecutive trajectory. + # Resetting to no rendering, can be achieved by render(mode=None). + # It is also possible to change them mode multiple times when + # e.g. only every nth trajectory should be displayed. + env.render(mode="human") obs = env.reset() # number of samples/full trajectories (multiple environment steps) @@ -97,12 +102,6 @@ def example_custom_mp(seed=1): obs, reward, done, info = env.step(ac) rewards += reward - if i % 1 == 0: - # render full DMP trajectory - # render can only be called once in the beginning as well. That would render every trajectory - # Calling it after every trajectory allows to modify the mode. mode=None, disables rendering. - env.render(mode="human") - if done: print(rewards) rewards = 0 diff --git a/alr_envs/mujoco/ball_in_a_cup/utils.py b/alr_envs/mujoco/ball_in_a_cup/utils.py index 714566a..0e046a3 100644 --- a/alr_envs/mujoco/ball_in_a_cup/utils.py +++ b/alr_envs/mujoco/ball_in_a_cup/utils.py @@ -26,7 +26,7 @@ def make_contextual_env(rank, seed=0): return _init -def make_env(rank, seed=0): +def _make_env(rank, seed=0): """ Utility function for multiprocessed env. diff --git a/alr_envs/mujoco/beerpong/utils.py b/alr_envs/mujoco/beerpong/utils.py index 37d2ad1..7cd4682 100644 --- a/alr_envs/mujoco/beerpong/utils.py +++ b/alr_envs/mujoco/beerpong/utils.py @@ -26,7 +26,7 @@ def make_contextual_env(rank, seed=0): return _init -def make_env(rank, seed=0): +def _make_env(rank, seed=0): """ Utility function for multiprocessed env. diff --git a/alr_envs/utils/dmc2gym_wrapper.py b/alr_envs/utils/dmc2gym_wrapper.py index 4ae1ec0..b575db7 100644 --- a/alr_envs/utils/dmc2gym_wrapper.py +++ b/alr_envs/utils/dmc2gym_wrapper.py @@ -1,11 +1,12 @@ # Adopted from: https://github.com/denisyarats/dmc2gym/blob/master/dmc2gym/wrappers.py # License: MIT # Copyright (c) 2020 Denis Yarats -import matplotlib.pyplot as plt -from gym import core, spaces -from dm_control import suite, manipulation -from dm_env import specs +from typing import Any, Dict, Tuple + import numpy as np +from dm_control import manipulation, suite +from dm_env import specs +from gym import core, spaces def _spec_to_box(spec): @@ -43,8 +44,8 @@ class DMCWrapper(core.Env): self, domain_name, task_name, - task_kwargs=None, - visualize_reward={}, + task_kwargs={}, + visualize_reward=True, from_pixels=False, height=84, width=84, @@ -65,49 +66,23 @@ class DMCWrapper(core.Env): if domain_name == "manipulation": assert not from_pixels, \ "TODO: Vision interface for manipulation is different to suite and needs to be implemented" - self._env = manipulation.load( - environment_name=task_name, - seed=task_kwargs['random'] - ) + self._env = manipulation.load(environment_name=task_name, seed=task_kwargs['random']) else: - self._env = suite.load( - domain_name=domain_name, - task_name=task_name, - task_kwargs=task_kwargs, - visualize_reward=visualize_reward, - environment_kwargs=environment_kwargs - ) + self._env = suite.load(domain_name=domain_name, task_name=task_name, task_kwargs=task_kwargs, + visualize_reward=visualize_reward, environment_kwargs=environment_kwargs) - # true and normalized action spaces - self._true_action_space = _spec_to_box([self._env.action_spec()]) - self._norm_action_space = spaces.Box( - low=-1.0, - high=1.0, - shape=self._true_action_space.shape, - dtype=np.float32 - ) + # action and observation space + self._action_space = _spec_to_box([self._env.action_spec()]) + self._observation_space = _spec_to_box(self._env.observation_spec().values()) - # create observation space - if from_pixels: - shape = [3, height, width] if channels_first else [height, width, 3] - self._observation_space = spaces.Box( - low=0, high=255, shape=shape, dtype=np.uint8 - ) - else: - self._observation_space = _spec_to_box( - self._env.observation_spec().values() - ) - - self._state_space = _spec_to_box( - self._env.observation_spec().values() - ) - - self.current_state = None + self._last_observation = None + self.viewer = None # set seed self.seed(seed=task_kwargs.get('random', 1)) def __getattr__(self, name): + """Delegate attribute access to underlying environment.""" return getattr(self._env, name) def _get_obs(self, time_step): @@ -124,59 +99,72 @@ class DMCWrapper(core.Env): obs = _flatten_obs(time_step.observation) return obs - def _convert_action(self, action): - action = action.astype(float) - true_delta = self._true_action_space.high - self._true_action_space.low - norm_delta = self._norm_action_space.high - self._norm_action_space.low - action = (action - self._norm_action_space.low) / norm_delta - action = action * true_delta + self._true_action_space.low - action = action.astype(np.float32) - return action - @property def observation_space(self): return self._observation_space - @property - def state_space(self): - return self._state_space - @property def action_space(self): - return self._norm_action_space + return self._action_space - def seed(self, seed): - self._true_action_space.seed(seed) - self._norm_action_space.seed(seed) + def seed(self, seed=None): + self._action_space.seed(seed) self._observation_space.seed(seed) - def step(self, action): - assert self._norm_action_space.contains(action) - action = self._convert_action(action) - assert self._true_action_space.contains(action) + def step(self, action) -> Tuple[np.ndarray, float, bool, Dict[str, Any]]: + assert self._action_space.contains(action) reward = 0 extra = {'internal_state': self._env.physics.get_state().copy()} for _ in range(self._frame_skip): time_step = self._env.step(action) - reward += time_step.reward or 0 + reward += time_step.reward or 0. done = time_step.last() if done: break + + self._last_observation = _flatten_obs(time_step.observation) obs = self._get_obs(time_step) - self.current_state = _flatten_obs(time_step.observation) extra['discount'] = time_step.discount return obs, reward, done, extra - def reset(self): + def reset(self) -> np.ndarray: time_step = self._env.reset() - self.current_state = _flatten_obs(time_step.observation) + self._last_observation = _flatten_obs(time_step.observation) obs = self._get_obs(time_step) return obs def render(self, mode='rgb_array', height=None, width=None, camera_id=0): - assert mode == 'rgb_array', 'only support rgb_array mode, given %s' % mode - height = height or self._height - width = width or self._width - camera_id = camera_id or self._camera_id - return self._env.physics.render(height=height, width=width, camera_id=camera_id) \ No newline at end of file + if self._last_observation is None: + raise ValueError('Environment not ready to render. Call reset() first.') + + # assert mode == 'rgb_array', 'only support rgb_array mode, given %s' % mode + if mode == "rgb_array": + height = height or self._height + width = width or self._width + camera_id = camera_id or self._camera_id + return self._env.physics.render(height=height, width=width, camera_id=camera_id) + + elif mode == 'human': + if self.viewer is None: + # pylint: disable=import-outside-toplevel + # pylint: disable=g-import-not-at-top + from gym.envs.classic_control import rendering + self.viewer = rendering.SimpleImageViewer() + # Render max available buffer size. Larger is only possible by altering the XML. + img = self._env.physics.render(height=self._env.physics.model.vis.global_.offheight, + width=self._env.physics.model.vis.global_.offwidth) + self.viewer.imshow(img) + return self.viewer.isopen + + def close(self): + super().close() + if self.viewer is not None and self.viewer.isopen: + self.viewer.close() + + @property + def reward_range(self) -> Tuple[float, float]: + reward_spec = self._env.reward_spec() + if isinstance(reward_spec, specs.BoundedArray): + return reward_spec.minimum, reward_spec.maximum + return -float('inf'), float('inf') diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 63eb8b9..8003640 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -82,7 +82,7 @@ def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]], seed=1 return _env -def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, **mp_kwargs): +def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwargs): """ This can also be used standalone for manually building a custom DMP environment. Args: @@ -95,11 +95,11 @@ def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, **mp_kwargs): """ - _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed) + _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) return DmpWrapper(_env, **mp_kwargs) -def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, **mp_kwargs): +def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwargs): """ This can also be used standalone for manually building a custom Det ProMP environment. Args: @@ -111,7 +111,7 @@ def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, **mp_kwargs): """ - _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed) + _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) return DetPMPWrapper(_env, **mp_kwargs) @@ -129,9 +129,9 @@ def make_dmp_env_helper(**kwargs): Returns: DMP wrapped gym env """ - seed = kwargs.get("seed", None) + seed = kwargs.pop("seed", None) return make_dmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), seed=seed, - **kwargs.get("mp_kwargs")) + mp_kwargs=kwargs.pop("mp_kwargs"), **kwargs) def make_detpmp_env_helper(**kwargs): @@ -149,12 +149,13 @@ def make_detpmp_env_helper(**kwargs): Returns: DMP wrapped gym env """ - seed = kwargs.get("seed", None) + seed = kwargs.pop("seed", None) return make_detpmp_env(env_id=kwargs.pop("name"), wrappers=kwargs.pop("wrappers"), seed=seed, - **kwargs.get("mp_kwargs")) + mp_kwargs=kwargs.pop("mp_kwargs"), **kwargs) def make_contextual_env(env_id, context, seed, rank): - env = gym.make(env_id, context=context) - env.seed(seed + rank) + env = make_env(env_id, seed + rank, context=context) + # env = gym.make(env_id, context=context) + # env.seed(seed + rank) return lambda: env diff --git a/alr_envs/utils/mp_env_async_sampler.py b/alr_envs/utils/mp_env_async_sampler.py index 30f23c5..67a774c 100644 --- a/alr_envs/utils/mp_env_async_sampler.py +++ b/alr_envs/utils/mp_env_async_sampler.py @@ -3,11 +3,7 @@ from gym.vector.async_vector_env import AsyncVectorEnv import numpy as np from _collections import defaultdict - -def make_env(env_id, rank, seed=0, **env_kwargs): - env = gym.make(env_id, **env_kwargs) - env.seed(seed + rank) - return lambda: env +from alr_envs.utils.make_env_helpers import make_env_rank def split_array(ary, size): @@ -55,9 +51,10 @@ class AlrMpEnvSampler: An asynchronous sampler for non contextual MPWrapper environments. A sampler object can be called with a set of parameters and returns the corresponding final obs, rewards, dones and info dicts. """ + def __init__(self, env_id, num_envs, seed=0, **env_kwargs): self.num_envs = num_envs - self.env = AsyncVectorEnv([make_env(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) + self.env = AsyncVectorEnv([make_env_rank(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) def __call__(self, params): params = np.atleast_2d(params) @@ -74,8 +71,8 @@ class AlrMpEnvSampler: vals['info'].append(info) # do not return values above threshold - return np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples],\ - _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] + return np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples], \ + _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] class AlrContextualMpEnvSampler: @@ -83,12 +80,12 @@ class AlrContextualMpEnvSampler: An asynchronous sampler for contextual MPWrapper environments. A sampler object can be called with a set of parameters and returns the corresponding final obs, rewards, dones and info dicts. """ + def __init__(self, env_id, num_envs, seed=0, **env_kwargs): self.num_envs = num_envs self.env = AsyncVectorEnv([make_env(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) def __call__(self, dist, n_samples): - repeat = int(np.ceil(n_samples / self.env.num_envs)) vals = defaultdict(list) @@ -106,8 +103,8 @@ class AlrContextualMpEnvSampler: # do not return values above threshold return np.vstack(vals['new_samples'])[:n_samples], \ - np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples], \ - _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] + np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples], \ + _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] if __name__ == "__main__": From 6607d9cff9a1fedaffdd1a81e1dfaa05859784a1 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 30 Jun 2021 15:47:06 +0200 Subject: [PATCH 23/56] fixed imports --- alr_envs/mujoco/ball_in_a_cup/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alr_envs/mujoco/ball_in_a_cup/utils.py b/alr_envs/mujoco/ball_in_a_cup/utils.py index 0e046a3..b851cae 100644 --- a/alr_envs/mujoco/ball_in_a_cup/utils.py +++ b/alr_envs/mujoco/ball_in_a_cup/utils.py @@ -1,6 +1,6 @@ -from alr_envs.utils.mps.detpmp_wrapper import DetPMPWrapper -from alr_envs.utils.mps.dmp_wrapper import DmpWrapper from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper +from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper def make_contextual_env(rank, seed=0): From 87eb093c2c86423b755ade920b2429d70f13a0a4 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 1 Jul 2021 14:55:14 +0200 Subject: [PATCH 24/56] Add open ai gym environments --- README.md | 11 +++ alr_envs/__init__.py | 77 +++++++++++++++++++ alr_envs/examples/examples_open_ai.py | 41 ++++++++++ alr_envs/open_ai/__init__.py | 0 .../continuous_mountain_car/__init__.py | 2 + .../continuous_mountain_car/mp_wrapper.py | 17 ++++ .../positional_wrapper.py | 13 ++++ alr_envs/open_ai/fetch/__init__.py | 2 + alr_envs/open_ai/fetch/mp_wrapper.py | 18 +++++ alr_envs/open_ai/fetch/positional_wrapper.py | 13 ++++ alr_envs/open_ai/reacher_v2/__init__.py | 2 + alr_envs/open_ai/reacher_v2/mp_wrapper.py | 18 +++++ .../open_ai/reacher_v2/positional_wrapper.py | 13 ++++ 13 files changed, 227 insertions(+) create mode 100644 alr_envs/examples/examples_open_ai.py create mode 100644 alr_envs/open_ai/__init__.py create mode 100644 alr_envs/open_ai/continuous_mountain_car/__init__.py create mode 100644 alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py create mode 100644 alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py create mode 100644 alr_envs/open_ai/fetch/__init__.py create mode 100644 alr_envs/open_ai/fetch/mp_wrapper.py create mode 100644 alr_envs/open_ai/fetch/positional_wrapper.py create mode 100644 alr_envs/open_ai/reacher_v2/__init__.py create mode 100644 alr_envs/open_ai/reacher_v2/mp_wrapper.py create mode 100644 alr_envs/open_ai/reacher_v2/positional_wrapper.py diff --git a/README.md b/README.md index ce95b8d..2ab4143 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,17 @@ All environments provide the full episode reward and additional information abou [//]: |`HoleReacherDetPMP-v0`| +### OpenAi-gym Environments +These environments are wrapped-versions of their OpenAi-gym counterparts. + +|Name| Description|Horizon|Action Dimension|Context Dimension +|---|---|---|---|---| +|`ContinuousMountainCarDetPMP-v0`| A DetPmP wrapped version of the ContinuousMountainCar-v0 environment. | 100 | 1 +|`ReacherDetPMP-v2`| A DetPmP wrapped version of the Reacher-v2 environment. | 50 | 2 +|`FetchSlideDenseDetPMP-v1`| A DetPmP wrapped version of the FetchSlideDense-v1 environment. | 50 | 4 +|`FetchReachDenseDetPMP-v1`| A DetPmP wrapped version of the FetchReachDense-v1 environment. | 50 | 4 + + ### Stochastic Search |Name| Description|Horizon|Action Dimension|Observation Dimension |---|---|---|---|---| diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index b1056a2..181b627 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -7,6 +7,7 @@ from alr_envs.classic_control.viapoint_reacher.viapoint_reacher_mp_wrapper impor from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_mp_wrapper import BallInACupMPWrapper from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_positional_wrapper import BallInACupPositionalWrapper +from alr_envs.open_ai import reacher_v2, continuous_mountain_car, fetch from alr_envs.stochastic_search.functions.f_rosenbrock import Rosenbrock # Mujoco @@ -560,6 +561,82 @@ register( } ) +## Open AI +register( + id='ContinuousMountainCarDetPMP-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.classic_control:MountainCarContinuous-v0", + "wrappers": [continuous_mountain_car.PositionalWrapper, continuous_mountain_car.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 4, + "duration": 100, + "post_traj_time": 0, + "width": 0.02, + "policy_type": "motor", + "policy_kwargs": { + "p_gains": 1., + "d_gains": 1. + } + } + } +) + +register( + id='ReacherDetPMP-v2', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.mujoco:Reacher-v2", + "wrappers": [reacher_v2.PositionalWrapper, reacher_v2.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 6, + "duration": 1, + "post_traj_time": 0, + "width": 0.02, + "policy_type": "motor", + "policy_kwargs": { + "p_gains": .6, + "d_gains": .075 + } + } + } +) + +register( + id='FetchSlideDenseDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchSlideDense-v1", + "wrappers": [fetch.PositionalWrapper, fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 1, + "post_traj_time": 0, + "width": 0.02, + "policy_type": "position" + } + } +) + +register( + id='FetchReachDenseDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchReachDense-v1", + "wrappers": [fetch.PositionalWrapper, fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 1, + "post_traj_time": 0, + "width": 0.02, + "policy_type": "position" + } + } +) # BBO functions diff --git a/alr_envs/examples/examples_open_ai.py b/alr_envs/examples/examples_open_ai.py new file mode 100644 index 0000000..d001bc8 --- /dev/null +++ b/alr_envs/examples/examples_open_ai.py @@ -0,0 +1,41 @@ +from alr_envs.utils.make_env_helpers import make_env + + +def example_mp(env_name, seed=1): + """ + Example for running a motion primitive based version of a OpenAI-gym environment, which is already registered. + For more information on motion primitive specific stuff, look at the mp examples. + Args: + env_name: DetPMP env_id + seed: seed + + Returns: + + """ + # While in this case gym.make() is possible to use as well, we recommend our custom make env function. + env = make_env(env_name, seed) + + rewards = 0 + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(10): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + +if __name__ == '__main__': + # DMP - not supported yet + #example_mp("ReacherDetPMP-v2") + + # DetProMP + example_mp("ContinuousMountainCarDetPMP-v0") + example_mp("ReacherDetPMP-v2") + example_mp("FetchReachDenseDetPMP-v1") + example_mp("FetchSlideDenseDetPMP-v1") + diff --git a/alr_envs/open_ai/__init__.py b/alr_envs/open_ai/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/open_ai/continuous_mountain_car/__init__.py b/alr_envs/open_ai/continuous_mountain_car/__init__.py new file mode 100644 index 0000000..4cff6da --- /dev/null +++ b/alr_envs/open_ai/continuous_mountain_car/__init__.py @@ -0,0 +1,2 @@ +from alr_envs.open_ai.continuous_mountain_car.positional_wrapper import PositionalWrapper +from alr_envs.open_ai.continuous_mountain_car.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py new file mode 100644 index 0000000..960fc0c --- /dev/null +++ b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py @@ -0,0 +1,17 @@ +from typing import Union + +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + @property + def start_pos(self): + raise ValueError("Start position is not available") + + @property + def goal_pos(self): + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return 1. \ No newline at end of file diff --git a/alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py b/alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py new file mode 100644 index 0000000..5b587fa --- /dev/null +++ b/alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py @@ -0,0 +1,13 @@ +from typing import Union +import numpy as np +from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper + + +class PositionalWrapper(PositionalEnvWrapper): + @property + def current_vel(self) -> Union[float, int, np.ndarray]: + return np.array([self.state[1]]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return np.array([self.state[0]]) \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/__init__.py b/alr_envs/open_ai/fetch/__init__.py new file mode 100644 index 0000000..4c6d088 --- /dev/null +++ b/alr_envs/open_ai/fetch/__init__.py @@ -0,0 +1,2 @@ +from alr_envs.open_ai.fetch.positional_wrapper import PositionalWrapper +from alr_envs.open_ai.fetch.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/mp_wrapper.py b/alr_envs/open_ai/fetch/mp_wrapper.py new file mode 100644 index 0000000..2ac7b59 --- /dev/null +++ b/alr_envs/open_ai/fetch/mp_wrapper.py @@ -0,0 +1,18 @@ +from typing import Union + +from gym import spaces +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + @property + def start_pos(self): + return self.initial_gripper_xpos + + @property + def goal_pos(self): + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/positional_wrapper.py b/alr_envs/open_ai/fetch/positional_wrapper.py new file mode 100644 index 0000000..c113db6 --- /dev/null +++ b/alr_envs/open_ai/fetch/positional_wrapper.py @@ -0,0 +1,13 @@ +from typing import Union +import numpy as np +from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper + + +class PositionalWrapper(PositionalEnvWrapper): + @property + def current_vel(self) -> Union[float, int, np.ndarray]: + return self._get_obs()["observation"][-5:-1] + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self._get_obs()["observation"][:4] \ No newline at end of file diff --git a/alr_envs/open_ai/reacher_v2/__init__.py b/alr_envs/open_ai/reacher_v2/__init__.py new file mode 100644 index 0000000..a0acbea --- /dev/null +++ b/alr_envs/open_ai/reacher_v2/__init__.py @@ -0,0 +1,2 @@ +from alr_envs.open_ai.reacher_v2.positional_wrapper import PositionalWrapper +from alr_envs.open_ai.reacher_v2.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/reacher_v2/mp_wrapper.py b/alr_envs/open_ai/reacher_v2/mp_wrapper.py new file mode 100644 index 0000000..be67a35 --- /dev/null +++ b/alr_envs/open_ai/reacher_v2/mp_wrapper.py @@ -0,0 +1,18 @@ +from typing import Union + +from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + + @property + def start_pos(self): + raise ValueError("Start position is not available") + + @property + def goal_pos(self): + return self.goal + + @property + def dt(self) -> Union[float, int]: + return self.env.dt \ No newline at end of file diff --git a/alr_envs/open_ai/reacher_v2/positional_wrapper.py b/alr_envs/open_ai/reacher_v2/positional_wrapper.py new file mode 100644 index 0000000..0fc622b --- /dev/null +++ b/alr_envs/open_ai/reacher_v2/positional_wrapper.py @@ -0,0 +1,13 @@ +from typing import Union +import numpy as np +from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper + + +class PositionalWrapper(PositionalEnvWrapper): + @property + def current_vel(self) -> Union[float, int, np.ndarray]: + return self.sim.data.qvel[:2] + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.sim.data.qpos[:2] \ No newline at end of file From 585bdc7b47dae56017db19c17a81e337d20a1c50 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 2 Jul 2021 06:12:32 +0200 Subject: [PATCH 25/56] Add dm_control to setup.py --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7170fa6..cc9445c 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,8 @@ setup( 'PyQt5', 'matplotlib', 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', - 'mujoco_py' + 'mujoco_py', + 'dm_control' ], url='https://github.com/ALRhub/alr_envs/', From 80933eba096e4e28003199d62a61110a360e4e60 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 2 Jul 2021 13:09:56 +0200 Subject: [PATCH 26/56] unified API wrapper and updated examples --- alr_envs/__init__.py | 43 +-- .../hole_reacher/hole_reacher.py | 12 +- .../hole_reacher/hole_reacher_mp_wrapper.py | 14 +- .../simple_reacher/simple_reacher.py | 12 +- .../simple_reacher_mp_wrapper.py | 14 +- .../viapoint_reacher/viapoint_reacher.py | 12 +- .../viapoint_reacher_mp_wrapper.py | 14 +- alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py | 27 -- alr_envs/dmc/ball_in_cup/__init__.py | 0 .../ball_in_cup/ball_in_the_cup_mp_wrapper.py | 34 +++ alr_envs/examples/examples_dmc.py | 66 +++-- alr_envs/examples/examples_general.py | 89 ++++-- .../examples/examples_motion_primitives.py | 116 +++++--- alr_envs/mujoco/alr_mujoco_env.py | 270 ------------------ .../mujoco/ball_in_a_cup/ball_in_a_cup.py | 5 +- .../ball_in_a_cup/ball_in_a_cup_mp_wrapper.py | 12 +- .../ball_in_a_cup_positional_wrapper.py | 15 - alr_envs/mujoco/beerpong/beerpong.py | 22 +- alr_envs/mujoco/beerpong/beerpong_simple.py | 17 +- alr_envs/utils/__init__.py | 34 ++- alr_envs/utils/dmc2gym_wrapper.py | 34 ++- alr_envs/utils/make_env_helpers.py | 6 +- 22 files changed, 383 insertions(+), 485 deletions(-) delete mode 100644 alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py create mode 100644 alr_envs/dmc/ball_in_cup/__init__.py create mode 100644 alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py delete mode 100644 alr_envs/mujoco/alr_mujoco_env.py delete mode 100644 alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index b1056a2..a526ff7 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -4,9 +4,8 @@ from gym.envs.registration import register from alr_envs.classic_control.hole_reacher.hole_reacher_mp_wrapper import HoleReacherMPWrapper from alr_envs.classic_control.simple_reacher.simple_reacher_mp_wrapper import SimpleReacherMPWrapper from alr_envs.classic_control.viapoint_reacher.viapoint_reacher_mp_wrapper import ViaPointReacherMPWrapper -from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper +from alr_envs.dmc.ball_in_cup.ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_mp_wrapper import BallInACupMPWrapper -from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_positional_wrapper import BallInACupPositionalWrapper from alr_envs.stochastic_search.functions.f_rosenbrock import Rosenbrock # Mujoco @@ -204,7 +203,7 @@ register( "hole_width": None, "hole_depth": 1, "hole_x": None, - "collision_penalty": 1000, + "collision_penalty": 100, } ) @@ -236,7 +235,7 @@ register( "hole_width": 0.25, "hole_depth": 1, "hole_x": 2, - "collision_penalty": 1000, + "collision_penalty": 100, } ) @@ -354,7 +353,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupSimple-v0", - "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "wrappers": [BallInACupMPWrapper], "mp_kwargs": { "num_dof": 3, "num_basis": 5, @@ -379,7 +378,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACup-v0", - "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "wrappers": [BallInACupMPWrapper], "mp_kwargs": { "num_dof": 7, "num_basis": 5, @@ -404,7 +403,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupSimple-v0", - "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "wrappers": [BallInACupMPWrapper], "mp_kwargs": { "num_dof": 3, "num_basis": 5, @@ -429,7 +428,7 @@ register( entry_point='alr_envs.mujoco.ball_in_a_cup.biac_pd:make_detpmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupPDSimple-v0", - "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "wrappers": [BallInACupMPWrapper], "mp_kwargs": { "num_dof": 3, "num_basis": 5, @@ -474,7 +473,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "alr_envs:ALRBallInACupSimple-v0", - "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "wrappers": [BallInACupMPWrapper], "mp_kwargs": { "num_dof": 7, "num_basis": 5, @@ -486,7 +485,6 @@ register( "zero_start": True, "zero_goal": True, "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) } @@ -499,7 +497,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_contextual_env', kwargs={ "name": "alr_envs:ALRBallInACupGoal-v0", - "wrappers": [BallInACupMPWrapper, BallInACupPositionalWrapper], + "wrappers": [BallInACupMPWrapper], "mp_kwargs": { "num_dof": 7, "num_basis": 5, @@ -522,7 +520,7 @@ register( ## DMC register( - id=f'dmc_ball_in_cup_dmp-v0', + id=f'dmc_ball_in_cup-catch_dmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ @@ -531,19 +529,23 @@ register( "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 2, + "duration": 20, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, - "policy_type": "velocity", + "policy_type": "motor", "weights_scale": 50, - "goal_scale": 0.1 + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 0.2, + "d_gains": 0.05 + } } } ) register( - id=f'dmc_ball_in_cup_detpmp-v0', + id=f'dmc_ball_in_cup-catch_detpmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"ball_in_cup-catch", @@ -551,16 +553,19 @@ register( "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 2, + "duration": 20, "width": 0.025, "policy_type": "velocity", "weights_scale": 0.2, - "zero_start": True + "zero_start": True, + "policy_kwargs": { + "p_gains": 0.2, + "d_gains": 0.05 + } } } ) - # BBO functions for dim in [5, 10, 25, 50, 100]: diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher.py b/alr_envs/classic_control/hole_reacher/hole_reacher.py index dfa2599..a09dab1 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher.py @@ -69,9 +69,17 @@ class HoleReacherEnv(gym.Env): def dt(self) -> Union[float, int]: return self._dt + # @property + # def start_pos(self): + # return self._start_pos + @property - def start_pos(self): - return self._start_pos + def current_pos(self): + return self._joint_angles.copy() + + @property + def current_vel(self): + return self._angle_velocity.copy() def step(self, action: np.ndarray): """ diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py index a2fd2a7..12b5d19 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py @@ -1,8 +1,8 @@ -from typing import Union +from typing import Tuple, Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class HoleReacherMPWrapper(MPEnvWrapper): @@ -19,11 +19,15 @@ class HoleReacherMPWrapper(MPEnvWrapper): ]) @property - def start_pos(self) -> Union[float, int, np.ndarray]: - return self.env.start_pos + def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.current_pos @property - def goal_pos(self) -> Union[float, int, np.ndarray]: + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.current_vel + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: raise ValueError("Goal position is not available and has to be learnt based on the environment.") @property diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher.py b/alr_envs/classic_control/simple_reacher/simple_reacher.py index 157913f..08c151f 100644 --- a/alr_envs/classic_control/simple_reacher/simple_reacher.py +++ b/alr_envs/classic_control/simple_reacher/simple_reacher.py @@ -59,9 +59,17 @@ class SimpleReacherEnv(gym.Env): def dt(self) -> Union[float, int]: return self._dt + # @property + # def start_pos(self): + # return self._start_pos + @property - def start_pos(self): - return self._start_pos + def current_pos(self): + return self._joint_angles + + @property + def current_vel(self): + return self._angle_velocity def step(self, action: np.ndarray): """ diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py index ee96fc6..40426cf 100644 --- a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py @@ -1,8 +1,8 @@ -from typing import Union +from typing import Tuple, Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class SimpleReacherMPWrapper(MPEnvWrapper): @@ -17,11 +17,15 @@ class SimpleReacherMPWrapper(MPEnvWrapper): ]) @property - def start_pos(self): - return self.env.start_pos + def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.current_pos @property - def goal_pos(self): + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.current_vel + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: raise ValueError("Goal position is not available and has to be learnt based on the environment.") @property diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py index 0257da0..99f8bcf 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py @@ -63,9 +63,17 @@ class ViaPointReacher(gym.Env): def dt(self): return self._dt + # @property + # def start_pos(self): + # return self._start_pos + @property - def start_pos(self): - return self._start_pos + def current_pos(self): + return self._joint_angles.copy() + + @property + def current_vel(self): + return self._angle_velocity.copy() def step(self, action: np.ndarray): """ diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py index 9764d4d..a4a6ba3 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py @@ -1,8 +1,8 @@ -from typing import Union +from typing import Tuple, Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class ViaPointReacherMPWrapper(MPEnvWrapper): @@ -18,11 +18,15 @@ class ViaPointReacherMPWrapper(MPEnvWrapper): ]) @property - def start_pos(self) -> Union[float, int, np.ndarray]: - return self.env.start_pos + def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.current_pos @property - def goal_pos(self) -> Union[float, int, np.ndarray]: + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.current_vel + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: raise ValueError("Goal position is not available and has to be learnt based on the environment.") @property diff --git a/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py b/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py deleted file mode 100644 index 97959d7..0000000 --- a/alr_envs/dmc/Ball_in_the_cup_mp_wrapper.py +++ /dev/null @@ -1,27 +0,0 @@ -from typing import Union - -import numpy as np - -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper - - -class DMCBallInCupMPWrapper(MPEnvWrapper): - - @property - def active_obs(self): - # Besides the ball position, the environment is always set to 0. - return np.hstack([ - [False] * 2, # cup position - [True] * 2, # ball position - [False] * 2, # cup velocity - [False] * 2, # ball velocity - ]) - - @property - def start_pos(self) -> Union[float, int, np.ndarray]: - return np.hstack([self.physics.named.data.qpos['cup_x'], self.physics.named.data.qpos['cup_z']]) - - @property - def dt(self) -> Union[float, int]: - # Taken from: https://github.com/deepmind/dm_control/blob/master/dm_control/suite/ball_in_cup.py#L27 - return 0.02 diff --git a/alr_envs/dmc/ball_in_cup/__init__.py b/alr_envs/dmc/ball_in_cup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py b/alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py new file mode 100644 index 0000000..539f4e9 --- /dev/null +++ b/alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py @@ -0,0 +1,34 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper + + +class DMCBallInCupMPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + # Besides the ball position, the environment is always set to 0. + return np.hstack([ + [False] * 2, # cup position + [True] * 2, # ball position + [False] * 2, # cup velocity + [False] * 2, # ball velocity + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return np.hstack([self.physics.named.data.qpos['cup_x'], self.physics.named.data.qpos['cup_z']]) + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return np.hstack([self.physics.named.data.qvel['cup_x'], self.physics.named.data.qvel['cup_z']]) + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index 433b12c..d99b037 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -1,9 +1,23 @@ -from alr_envs.dmc.Ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper +from alr_envs.dmc.ball_in_cup.ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper from alr_envs.utils.make_env_helpers import make_dmp_env, make_env -def example_dmc(env_name="fish-swim", seed=1, iterations=1000): - env = make_env(env_name, seed) +def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): + """ + Example for running a DMC based env in the step based setting. + The env_id has to be specified as `domain_name-task_name` or + for manipulation tasks as `manipulation-environment_name` + + Args: + env_id: Either `domain_name-task_name` or `manipulation-environment_name` + seed: seed for deterministic behaviour + iterations: Number of rollout steps to run + render: Render the episode + + Returns: + + """ + env = make_env(env_id, seed) rewards = 0 obs = env.reset() print("observation shape:", env.observation_space.shape) @@ -15,39 +29,44 @@ def example_dmc(env_name="fish-swim", seed=1, iterations=1000): obs, reward, done, info = env.step(ac) rewards += reward - env.render("human") + if render: + env.render("human") if done: - print(env_name, rewards) + print(env_id, rewards) rewards = 0 obs = env.reset() env.close() -def example_custom_dmc_and_mp(seed=1): +def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): """ - Example for running a custom motion primitive based environments based off of a dmc task. - Our already registered environments follow the same structure, but do not directly allow for modifications. - Hence, this also allows to adjust hyperparameters of the motion primitives more easily. + Example for running a custom motion primitive based environments. + Our already registered environments follow the same structure. + Hence, this also allows to adjust hyperparameters of the motion primitives. + Yet, we recommend the method above if you are just interested in chaining those parameters for existing tasks. We appreciate PRs for custom environments (especially MP wrappers of existing tasks) for our repo: https://github.com/ALRhub/alr_envs/ Args: - seed: seed + seed: seed for deterministic behaviour + iterations: Number of rollout steps to run + render: Render the episode Returns: """ + # Base DMC name, according to structure of above example base_env = "ball_in_cup-catch" + # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. - # wrappers = [HoleReacherMPWrapper] wrappers = [DMCBallInCupMPWrapper] mp_kwargs = { "num_dof": 2, # env.start_pos "num_basis": 5, - "duration": 2, + "duration": 20, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, @@ -57,14 +76,21 @@ def example_custom_dmc_and_mp(seed=1): } env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) # OR for a deterministic ProMP: - # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, **mp_args) + # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_args) + + # This renders the full MP trajectory + # It is only required to call render() once in the beginning, which renders every consecutive trajectory. + # Resetting to no rendering, can be achieved by render(mode=None). + # It is also possible to change them mode multiple times when + # e.g. only every nth trajectory should be displayed. + if render: + env.render(mode="human") rewards = 0 obs = env.reset() - env.render("human") # number of samples/full trajectories (multiple environment steps) - for i in range(10): + for i in range(iterations): ac = env.action_space.sample() obs, reward, done, info = env.step(ac) rewards += reward @@ -85,14 +111,14 @@ if __name__ == '__main__': # export MUJOCO_GL="osmesa" # Standard DMC Suite tasks - example_dmc("fish-swim", seed=10, iterations=100) + example_dmc("fish-swim", seed=10, iterations=1000, render=True) # Manipulation tasks - # The vision versions are currently not integrated - example_dmc("manipulation-reach_site_features", seed=10, iterations=100) + # Disclaimer: The vision versions are currently not integrated and yield an error + example_dmc("manipulation-reach_site_features", seed=10, iterations=250, render=True) # Gym + DMC hybrid task provided in the MP framework - example_dmc("dmc_ball_in_cup_dmp-v0", seed=10, iterations=10) + example_dmc("dmc_ball_in_cup-catch_detpmp-v0", seed=10, iterations=1, render=True) # Custom DMC task - example_custom_dmc_and_mp() + example_custom_dmc_and_mp(seed=10, iterations=1, render=True) diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index e602da6..99ca8f6 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -4,14 +4,23 @@ from collections import defaultdict import gym import numpy as np -from alr_envs.utils.make_env_helpers import make_env +from alr_envs.utils.make_env_helpers import make_env, make_env_rank from alr_envs.utils.mp_env_async_sampler import AlrContextualMpEnvSampler, AlrMpEnvSampler, DummyDist -def example_general(env_id: str, seed=1, iterations=1000): +def example_general(env_id="Pendulum-v0", seed=1, iterations=1000, render=True): """ Example for running any env in the step based setting. This also includes DMC environments when leveraging our custom make_env function. + + Args: + env_id: OpenAI/Custom gym task id or either `domain_name-task_name` or `manipulation-environment_name` for DMC tasks + seed: seed for deterministic behaviour + iterations: Number of rollout steps to run + render: Render the episode + + Returns: + """ env = make_env(env_id, seed) @@ -25,7 +34,7 @@ def example_general(env_id: str, seed=1, iterations=1000): obs, reward, done, info = env.step(env.action_space.sample()) rewards += reward - if i % 1 == 0: + if render: env.render() if done: @@ -34,36 +43,60 @@ def example_general(env_id: str, seed=1, iterations=1000): obs = env.reset() -def example_async(env_id="alr_envs:HoleReacherDMP-v0", n_cpu=4, seed=int('533D', 16)): - def sample(env: gym.vector.VectorEnv, n_samples=100): - # for plotting - rewards = np.zeros(n_cpu) +def example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=4, seed=int('533D', 16), n_samples=800): + """ + Example for running any env in a vectorized multiprocessing setting to generate more samples faster. + This also includes DMC and DMP environments when leveraging our custom make_env function. + Be aware, increasing the number of environments reduces the total length of the individual episodes. - # this would generate more samples than requested if n_samples % num_envs != 0 - repeat = int(np.ceil(n_samples / env.num_envs)) - vals = defaultdict(list) - for i in range(repeat): - obs, reward, done, info = envs.step(envs.action_space.sample()) - vals['obs'].append(obs) - vals['reward'].append(reward) - vals['done'].append(done) - vals['info'].append(info) - rewards += reward - if np.any(done): - print(rewards[done]) - rewards[done] = 0 + Args: + env_id: OpenAI/Custom gym task id or either `domain_name-task_name` or `manipulation-environment_name` for DMC tasks + seed: seed for deterministic behaviour + n_cpu: Number of cpus cores to use in parallel + n_samples: number of samples generated in total by all environments. - # do not return values above threshold - return (*map(lambda v: np.stack(v)[:n_samples], vals.values()),) + Returns: Tuple of (obs, reward, done, info) with type np.ndarray - from alr_envs.utils.make_env_helpers import make_env_rank - envs = gym.vector.AsyncVectorEnv([make_env_rank(env_id, seed, i) for i in range(n_cpu)]) + """ + env = gym.vector.AsyncVectorEnv([make_env_rank(env_id, seed, i) for i in range(n_cpu)]) + # OR # envs = gym.vector.AsyncVectorEnv([make_env(env_id, seed + i) for i in range(n_cpu)]) - obs = envs.reset() - print(sample(envs, 16)) + # for plotting + rewards = np.zeros(n_cpu) + buffer = defaultdict(list) + + obs = env.reset() + + # this would generate more samples than requested if n_samples % num_envs != 0 + repeat = int(np.ceil(n_samples / env.num_envs)) + for i in range(repeat): + obs, reward, done, info = env.step(env.action_space.sample()) + buffer['obs'].append(obs) + buffer['reward'].append(reward) + buffer['done'].append(done) + buffer['info'].append(info) + rewards += reward + if np.any(done): + print(f"Reward at iteration {i}: {rewards[done]}") + rewards[done] = 0 + + # do not return values above threshold + return *map(lambda v: np.stack(v)[:n_samples], buffer.values()), if __name__ == '__main__': - # Mujoco task from framework - example_general("alr_envs:ALRReacher-v0") + # Basic gym task + # example_general("Pendulum-v0", seed=10, iterations=200, render=True) + # + # # Basis task from framework + # example_general("alr_envs:HoleReacher-v0", seed=10, iterations=200, render=True) + # + # # OpenAI Mujoco task + # example_general("HalfCheetah-v2", seed=10, render=True) + # + # # Mujoco task from framework + # example_general("alr_envs:ALRReacher-v0", seed=10, iterations=200, render=True) + + # Vectorized multiprocessing environments + example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=2, seed=int('533D', 16), n_samples=2 * 200) diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py index f3de01c..f374a0d 100644 --- a/alr_envs/examples/examples_motion_primitives.py +++ b/alr_envs/examples/examples_motion_primitives.py @@ -2,12 +2,14 @@ from alr_envs import HoleReacherMPWrapper from alr_envs.utils.make_env_helpers import make_dmp_env, make_env -def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1): +def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1, iterations=1, render=True): """ Example for running a motion primitive based environment, which is already registered Args: env_name: DMP env_id - seed: seed + seed: seed for deterministic behaviour + iterations: Number of rollout steps to run + render: Render the episode Returns: @@ -16,44 +18,81 @@ def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1): # First, it already takes care of seeding and second enables the use of DMC tasks within the gym interface. env = make_env(env_name, seed) - # Changing the mp_kwargs is possible by providing them to gym. - # E.g. here by providing way to many basis functions - # mp_kwargs = { - # "num_dof": 5, - # "num_basis": 1000, - # "duration": 2, - # "learn_goal": True, - # "alpha_phase": 2, - # "bandwidth_factor": 2, - # "policy_type": "velocity", - # "weights_scale": 50, - # "goal_scale": 0.1 - # } - # env = make_env(env_name, seed, mp_kwargs=mp_kwargs) - rewards = 0 # env.render(mode=None) obs = env.reset() # number of samples/full trajectories (multiple environment steps) - for i in range(10): + for i in range(iterations): + + if render and i % 2 == 0: + # This renders the full MP trajectory + # It is only required to call render() once in the beginning, which renders every consecutive trajectory. + # Resetting to no rendering, can be achieved by render(mode=None). + # It is also possible to change the mode multiple times when + # e.g. only every second trajectory should be displayed, such as here + # Just make sure the correct mode is set before executing the step. + env.render(mode="human") + else: + env.render(mode=None) + ac = env.action_space.sample() obs, reward, done, info = env.step(ac) rewards += reward - if i % 1 == 0: - # render full DMP trajectory - # render can only be called once in the beginning as well. That would render every trajectory - # Calling it after every trajectory allows to modify the mode. mode=None, disables rendering. - env.render(mode="human") - if done: print(rewards) rewards = 0 obs = env.reset() -def example_custom_mp(seed=1): +def example_custom_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1, iterations=1, render=True): + """ + Example for running a motion primitive based environment, which is already registered + Args: + env_name: DMP env_id + seed: seed for deterministic behaviour + iterations: Number of rollout steps to run + render: Render the episode + + Returns: + + """ + # Changing the mp_kwargs is possible by providing them to gym. + # E.g. here by providing way to many basis functions + mp_kwargs = { + "num_dof": 5, + "num_basis": 1000, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } + env = make_env(env_name, seed, mp_kwargs=mp_kwargs) + + # This time rendering every trajectory + if render: + env.render(mode="human") + + rewards = 0 + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(iterations): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if done: + print(rewards) + rewards = 0 + obs = env.reset() + + +def example_fully_custom_mp(seed=1, iterations=1, render=True): """ Example for running a custom motion primitive based environments. Our already registered environments follow the same structure. @@ -63,12 +102,15 @@ def example_custom_mp(seed=1): for our repo: https://github.com/ALRhub/alr_envs/ Args: seed: seed + iterations: Number of rollout steps to run + render: Render the episode Returns: """ base_env = "alr_envs:HoleReacher-v1" + # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. wrappers = [HoleReacherMPWrapper] @@ -85,19 +127,16 @@ def example_custom_mp(seed=1): } env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) # OR for a deterministic ProMP: - # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed) + # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) + + if render: + env.render(mode="human") rewards = 0 - # render full DMP trajectory - # It is only required to call render() once in the beginning, which renders every consecutive trajectory. - # Resetting to no rendering, can be achieved by render(mode=None). - # It is also possible to change them mode multiple times when - # e.g. only every nth trajectory should be displayed. - env.render(mode="human") obs = env.reset() # number of samples/full trajectories (multiple environment steps) - for i in range(10): + for i in range(iterations): ac = env.action_space.sample() obs, reward, done, info = env.step(ac) rewards += reward @@ -110,10 +149,13 @@ def example_custom_mp(seed=1): if __name__ == '__main__': # DMP - example_mp("alr_envs:HoleReacherDMP-v1") + example_mp("alr_envs:HoleReacherDMP-v1", seed=10, iterations=1, render=True) # DetProMP - example_mp("alr_envs:HoleReacherDetPMP-v1") + example_mp("alr_envs:HoleReacherDetPMP-v1", seed=10, iterations=1, render=True) - # Custom DMP - example_custom_mp() + # Altered basis functions + example_custom_mp("alr_envs:HoleReacherDMP-v1", seed=10, iterations=1, render=True) + + # Custom MP + example_fully_custom_mp(seed=10, iterations=1, render=True) diff --git a/alr_envs/mujoco/alr_mujoco_env.py b/alr_envs/mujoco/alr_mujoco_env.py deleted file mode 100644 index 01384c2..0000000 --- a/alr_envs/mujoco/alr_mujoco_env.py +++ /dev/null @@ -1,270 +0,0 @@ -from collections import OrderedDict -import os -from abc import abstractmethod - - -from gym import error, spaces -from gym.utils import seeding -import numpy as np -from os import path - -from alr_envs.utils.mps.alr_env import AlrEnv -from alr_envs.utils.positional_env import PositionalEnv - -try: - import mujoco_py -except ImportError as e: - raise error.DependencyNotInstalled("{}. (HINT: you need to install mujoco_py, and also perform the setup instructions here: https://github.com/openai/mujoco-py/.)".format(e)) - -DEFAULT_SIZE = 500 - - -def convert_observation_to_space(observation): - if isinstance(observation, dict): - space = spaces.Dict(OrderedDict([ - (key, convert_observation_to_space(value)) - for key, value in observation.items() - ])) - elif isinstance(observation, np.ndarray): - low = np.full(observation.shape, -float('inf'), dtype=np.float32) - high = np.full(observation.shape, float('inf'), dtype=np.float32) - space = spaces.Box(low, high, dtype=observation.dtype) - else: - raise NotImplementedError(type(observation), observation) - - return space - - -class AlrMujocoEnv(PositionalEnv, AlrEnv): - """ - Superclass for all MuJoCo environments. - """ - - def __init__(self, model_path, n_substeps, apply_gravity_comp=True): - """ - - Args: - model_path: path to xml file - n_substeps: how many steps mujoco does per call to env.step - apply_gravity_comp: Whether gravity compensation should be active - """ - if model_path.startswith("/"): - fullpath = model_path - else: - fullpath = os.path.join(os.path.dirname(__file__), "assets", model_path) - if not path.exists(fullpath): - raise IOError("File %s does not exist" % fullpath) - self.n_substeps = n_substeps - self.apply_gravity_comp = apply_gravity_comp - self.model = mujoco_py.load_model_from_path(fullpath) - self.sim = mujoco_py.MjSim(self.model, nsubsteps=n_substeps) - self.data = self.sim.data - self.viewer = None - self._viewers = {} - - self.metadata = { - 'render.modes': ['human', 'rgb_array', 'depth_array'], - 'video.frames_per_second': int(np.round(1.0 / self.dt)) - } - - self.init_qpos = self.sim.data.qpos.ravel().copy() - self.init_qvel = self.sim.data.qvel.ravel().copy() - - self._start_pos = None - self._start_vel = None - - self._set_action_space() - - observation = self._get_obs() # TODO: is calling get_obs enough? should we call reset, or even step? - - self._set_observation_space(observation) - - self.seed() - - @property - def current_pos(self): - """ - By default returns the joint positions of all simulated objects. May be overridden in subclass. - """ - return self.sim.data.qpos - - @property - def current_vel(self): - """ - By default returns the joint velocities of all simulated objects. May be overridden in subclass. - """ - return self.sim.data.qvel - - @property - def start_pos(self): - """ - Start position of the agent, for example joint angles of a Panda robot. Necessary for MP wrapped simple_reacher. - """ - return self._start_pos - - @property - def start_vel(self): - """ - Start velocity of the agent. Necessary for MP wrapped simple_reacher. - """ - return self._start_vel - - def extend_des_pos(self, des_pos): - """ - In a simplified environment, the actions may only control a subset of all the joints. - Extend the trajectory to match the environments full action space - Args: - des_pos: - - Returns: - - """ - pass - - def extend_des_vel(self, des_vel): - pass - - def _set_action_space(self): - bounds = self.model.actuator_ctrlrange.copy().astype(np.float32) - low, high = bounds.T - self.action_space = spaces.Box(low=low, high=high, dtype=np.float32) - return self.action_space - - def _set_observation_space(self, observation): - self.observation_space = convert_observation_to_space(observation) - return self.observation_space - - def seed(self, seed=None): - self.np_random, seed = seeding.np_random(seed) - return [seed] - - # methods to override: - # ---------------------------- - - @property - @abstractmethod - def active_obs(self): - """Returns boolean mask for each observation entry - whether the observation is returned for the contextual case or not. - This effectively allows to filter unwanted or unnecessary observations from the full step-based case. - """ - return np.ones(self.observation_space.shape, dtype=bool) - - def _get_obs(self): - """Returns the observation. - """ - raise NotImplementedError() - - def reset_model(self): - """ - Reset the robot degrees of freedom (qpos and qvel). - Implement this in each subclass. - """ - raise NotImplementedError - - def viewer_setup(self): - """ - This method is called when the viewer is initialized. - Optionally implement this method, if you need to tinker with camera position - and so forth. - """ - pass - - # ----------------------------- - - def reset(self): - self.sim.reset() - ob = self.reset_model() - return ob - - def set_state(self, qpos, qvel): - assert qpos.shape == (self.model.nq,) and qvel.shape == (self.model.nv,) - old_state = self.sim.get_state() - new_state = mujoco_py.MjSimState(old_state.time, qpos, qvel, - old_state.act, old_state.udd_state) - self.sim.set_state(new_state) - self.sim.forward() - - @property - def dt(self): - return self.model.opt.timestep * self.n_substeps - - def do_simulation(self, ctrl): - """ - Additionally returns whether there was an error while stepping the simulation - """ - error_in_sim = False - num_actuations = len(ctrl) - if self.apply_gravity_comp: - self.sim.data.ctrl[:num_actuations] = ctrl + self.sim.data.qfrc_bias[:num_actuations].copy() / self.model.actuator_gear[:, 0] - else: - self.sim.data.ctrl[:num_actuations] = ctrl - - try: - self.sim.step() - except mujoco_py.builder.MujocoException: - error_in_sim = True - - return error_in_sim - - def render(self, - mode='human', - width=DEFAULT_SIZE, - height=DEFAULT_SIZE, - camera_id=None, - camera_name=None): - if mode == 'rgb_array' or mode == 'depth_array': - if camera_id is not None and camera_name is not None: - raise ValueError("Both `camera_id` and `camera_name` cannot be" - " specified at the same time.") - - no_camera_specified = camera_name is None and camera_id is None - if no_camera_specified: - camera_name = 'track' - - if camera_id is None and camera_name in self.model._camera_name2id: - camera_id = self.model.camera_name2id(camera_name) - - self._get_viewer(mode).render(width, height, camera_id=camera_id) - - if mode == 'rgb_array': - # window size used for old mujoco-py: - data = self._get_viewer(mode).read_pixels(width, height, depth=False) - # original image is upside-down, so flip it - return data[::-1, :, :] - elif mode == 'depth_array': - self._get_viewer(mode).render(width, height) - # window size used for old mujoco-py: - # Extract depth part of the read_pixels() tuple - data = self._get_viewer(mode).read_pixels(width, height, depth=True)[1] - # original image is upside-down, so flip it - return data[::-1, :] - elif mode == 'human': - self._get_viewer(mode).render() - - def close(self): - if self.viewer is not None: - # self.viewer.finish() - self.viewer = None - self._viewers = {} - - def _get_viewer(self, mode): - self.viewer = self._viewers.get(mode) - if self.viewer is None: - if mode == 'human': - self.viewer = mujoco_py.MjViewer(self.sim) - elif mode == 'rgb_array' or mode == 'depth_array': - self.viewer = mujoco_py.MjRenderContextOffscreen(self.sim, -1) - - self.viewer_setup() - self._viewers[mode] = self.viewer - return self.viewer - - def get_body_com(self, body_name): - return self.data.get_body_xpos(body_name) - - def state_vector(self): - return np.concatenate([ - self.sim.data.qpos.flat, - self.sim.data.qvel.flat - ]) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py index 8f26901..f870877 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -1,10 +1,11 @@ from gym import utils import os import numpy as np -from alr_envs.mujoco import alr_mujoco_env +from gym.envs.mujoco import MujocoEnv -class ALRBallInACupEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): + +class ALRBallInACupEnv(MujocoEnv, utils.EzPickle): def __init__(self, n_substeps=4, apply_gravity_comp=True, simplified: bool = False, reward_type: str = None, context: np.ndarray = None): utils.EzPickle.__init__(**locals()) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py index 9393421..321358a 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py @@ -1,8 +1,8 @@ -from typing import Union +from typing import Tuple, Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class BallInACupMPWrapper(MPEnvWrapper): @@ -24,6 +24,14 @@ class BallInACupMPWrapper(MPEnvWrapper): else: return self._start_pos + @property + def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: + return self.sim.data.qpos[0:7].copy() + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.sim.data.qvel[0:7].copy() + @property def goal_pos(self): # TODO: @Max I think the default value of returning to the start is reasonable here diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py deleted file mode 100644 index d1ba696..0000000 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_positional_wrapper.py +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Tuple, Union - -import numpy as np - -from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper - - -class BallInACupPositionalWrapper(PositionalEnvWrapper): - @property - def current_pos(self) -> Union[float, int, np.ndarray, Tuple]: - return self.sim.data.qpos[0:7].copy() - - @property - def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: - return self.sim.data.qvel[0:7].copy() diff --git a/alr_envs/mujoco/beerpong/beerpong.py b/alr_envs/mujoco/beerpong/beerpong.py index 5efc431..1f3f781 100644 --- a/alr_envs/mujoco/beerpong/beerpong.py +++ b/alr_envs/mujoco/beerpong/beerpong.py @@ -1,11 +1,15 @@ -from gym import utils import os + import numpy as np -from alr_envs.mujoco import alr_mujoco_env +from gym import utils +from gym.envs.mujoco import MujocoEnv -class ALRBeerpongEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): - def __init__(self, n_substeps=4, apply_gravity_comp=True, reward_function=None): + +class ALRBeerpongEnv(MujocoEnv, utils.EzPickle): + def __init__(self, model_path, frame_skip, n_substeps=4, apply_gravity_comp=True, reward_function=None): + utils.EzPickle.__init__(**locals()) + MujocoEnv.__init__(self, model_path=model_path, frame_skip=frame_skip) self._steps = 0 self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", @@ -25,12 +29,10 @@ class ALRBeerpongEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): self.j_max = np.array([2.6, 1.985, 2.8, 3.14159, 1.25, 1.5707, 2.7]) self.context = None - - utils.EzPickle.__init__(self) - alr_mujoco_env.AlrMujocoEnv.__init__(self, - self.xml_path, - apply_gravity_comp=apply_gravity_comp, - n_substeps=n_substeps) + # alr_mujoco_env.AlrMujocoEnv.__init__(self, + # self.xml_path, + # apply_gravity_comp=apply_gravity_comp, + # n_substeps=n_substeps) self.sim_time = 8 # seconds self.sim_steps = int(self.sim_time / self.dt) diff --git a/alr_envs/mujoco/beerpong/beerpong_simple.py b/alr_envs/mujoco/beerpong/beerpong_simple.py index 7a0908d..5f6f6d2 100644 --- a/alr_envs/mujoco/beerpong/beerpong_simple.py +++ b/alr_envs/mujoco/beerpong/beerpong_simple.py @@ -1,11 +1,13 @@ from gym import utils import os import numpy as np -from alr_envs.mujoco import alr_mujoco_env +from gym.envs.mujoco import MujocoEnv -class ALRBeerpongEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): +class ALRBeerpongEnv(MujocoEnv, utils.EzPickle): def __init__(self, n_substeps=4, apply_gravity_comp=True, reward_function=None): + utils.EzPickle.__init__(**locals()) + self._steps = 0 self.xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", @@ -26,11 +28,12 @@ class ALRBeerpongEnv(alr_mujoco_env.AlrMujocoEnv, utils.EzPickle): self.context = None - utils.EzPickle.__init__(self) - alr_mujoco_env.AlrMujocoEnv.__init__(self, - self.xml_path, - apply_gravity_comp=apply_gravity_comp, - n_substeps=n_substeps) + MujocoEnv.__init__(self, model_path=self.xml_path, frame_skip=n_substeps) + + # alr_mujoco_env.AlrMujocoEnv.__init__(self, + # self.xml_path, + # apply_gravity_comp=apply_gravity_comp, + # n_substeps=n_substeps) self.sim_time = 8 # seconds self.sim_steps = int(self.sim_time / self.dt) diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index 1eb4e9e..6bdf5ec 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -1,22 +1,24 @@ +import collections import re +from typing import Union import gym from gym.envs.registration import register def make( - id, - seed=1, - visualize_reward=True, - from_pixels=False, - height=84, - width=84, - camera_id=0, - frame_skip=1, - episode_length=1000, - environment_kwargs=None, - time_limit=None, - channels_first=True + id: str, + seed: int = 1, + visualize_reward: bool = True, + from_pixels: bool = False, + height: int = 84, + width: int = 84, + camera_id: int = 0, + frame_skip: int = 1, + episode_length: Union[None, int] = None, + environment_kwargs: dict = {}, + time_limit: Union[None, float] = None, + channels_first: bool = True ): # Adopted from: https://github.com/denisyarats/dmc2gym/blob/master/dmc2gym/__init__.py # License: MIT @@ -31,12 +33,16 @@ def make( assert not visualize_reward, 'cannot use visualize reward when learning from pixels' # shorten episode length + if episode_length is None: + # Default lengths for benchmarking suite is 1000 and for manipulation tasks 250 + episode_length = 250 if domain_name == "manipulation" else 1000 + max_episode_steps = (episode_length + frame_skip - 1) // frame_skip if env_id not in gym.envs.registry.env_specs: - task_kwargs = {} + task_kwargs = {'random': seed} # if seed is not None: - task_kwargs['random'] = seed + # task_kwargs['random'] = seed if time_limit is not None: task_kwargs['time_limit'] = time_limit register( diff --git a/alr_envs/utils/dmc2gym_wrapper.py b/alr_envs/utils/dmc2gym_wrapper.py index b575db7..d1226e4 100644 --- a/alr_envs/utils/dmc2gym_wrapper.py +++ b/alr_envs/utils/dmc2gym_wrapper.py @@ -1,6 +1,7 @@ # Adopted from: https://github.com/denisyarats/dmc2gym/blob/master/dmc2gym/wrappers.py # License: MIT # Copyright (c) 2020 Denis Yarats +import collections from typing import Any, Dict, Tuple import numpy as np @@ -31,12 +32,21 @@ def _spec_to_box(spec): return spaces.Box(low, high, dtype=np.float32) -def _flatten_obs(obs): - obs_pieces = [] - for v in obs.values(): - flat = np.array([v]) if np.isscalar(v) else v.ravel() - obs_pieces.append(flat) - return np.concatenate(obs_pieces, axis=0) +def _flatten_obs(obs: collections.MutableMapping): + # obs_pieces = [] + # for v in obs.values(): + # flat = np.array([v]) if np.isscalar(v) else v.ravel() + # obs_pieces.append(flat) + # return np.concatenate(obs_pieces, axis=0) + + if not isinstance(obs, collections.MutableMapping): + raise ValueError(f'Requires dict-like observations structure. {type(obs)} found.') + + # Keep key order consistent for non OrderedDicts + keys = obs.keys() if isinstance(obs, collections.OrderedDict) else sorted(obs.keys()) + + obs_vals = [np.array([obs[key]]) if np.isscalar(obs[key]) else obs[key].ravel() for key in keys] + return np.concatenate(obs_vals) class DMCWrapper(core.Env): @@ -75,7 +85,7 @@ class DMCWrapper(core.Env): self._action_space = _spec_to_box([self._env.action_spec()]) self._observation_space = _spec_to_box(self._env.observation_spec().values()) - self._last_observation = None + self._last_state = None self.viewer = None # set seed @@ -107,6 +117,10 @@ class DMCWrapper(core.Env): def action_space(self): return self._action_space + @property + def dt(self): + return self._env.control_timestep() * self._frame_skip + def seed(self, seed=None): self._action_space.seed(seed) self._observation_space.seed(seed) @@ -123,19 +137,19 @@ class DMCWrapper(core.Env): if done: break - self._last_observation = _flatten_obs(time_step.observation) + self._last_state = _flatten_obs(time_step.observation) obs = self._get_obs(time_step) extra['discount'] = time_step.discount return obs, reward, done, extra def reset(self) -> np.ndarray: time_step = self._env.reset() - self._last_observation = _flatten_obs(time_step.observation) + self._last_state = _flatten_obs(time_step.observation) obs = self._get_obs(time_step) return obs def render(self, mode='rgb_array', height=None, width=None, camera_id=0): - if self._last_observation is None: + if self._last_state is None: raise ValueError('Environment not ready to render. Call reset() first.') # assert mode == 'rgb_array', 'only support rgb_array mode, given %s' % mode diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 8003640..6a8fce2 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -3,7 +3,7 @@ from typing import Iterable, List, Type import gym -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper @@ -32,7 +32,7 @@ def make_env_rank(env_id: str, seed: int, rank: int = 0): def make_env(env_id: str, seed, **kwargs): """ Converts an env_id to an environment with the gym API. - This also works for DeepMind Control Suite env_wrappers + This also works for DeepMind Control Suite interface_wrappers for which domain name and task name are expected to be separated by "-". Args: env_id: gym name or env_id of the form "domain_name-task_name" for DMC tasks @@ -42,7 +42,7 @@ def make_env(env_id: str, seed, **kwargs): """ try: - # Add seed to kwargs in case it is a predefined dmc environment. + # Add seed to kwargs in case it is a predefined gym+dmc hybrid environment. if env_id.startswith("dmc"): kwargs.update({"seed": seed}) From 4fafe8676402c0d9be0c852ae24ebac0de509b0a Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 2 Jul 2021 17:35:40 +0200 Subject: [PATCH 27/56] fixed ball in the cup gains --- alr_envs/__init__.py | 10 +++++----- alr_envs/examples/examples_dmc.py | 10 +++++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index a526ff7..5b9bf10 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -537,8 +537,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 0.2, - "d_gains": 0.05 + "p_gains": 50, + "d_gains": 1 } } } @@ -555,12 +555,12 @@ register( "num_basis": 5, "duration": 20, "width": 0.025, - "policy_type": "velocity", + "policy_type": "motor", "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 0.2, - "d_gains": 0.05 + "p_gains": 50, + "d_gains": 1 } } } diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index d99b037..b877933 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -64,15 +64,19 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): # You can also add other gym.Wrappers in case they are needed. wrappers = [DMCBallInCupMPWrapper] mp_kwargs = { - "num_dof": 2, # env.start_pos + "num_dof": 2, "num_basis": 5, "duration": 20, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, - "policy_type": "velocity", + "policy_type": "motor", "weights_scale": 50, - "goal_scale": 0.1 + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 0.2, + "d_gains": 0.05 + } } env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) # OR for a deterministic ProMP: From 92f1f409f3ac917fc4b902864a10f66be53b66ec Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 2 Jul 2021 18:18:11 +0200 Subject: [PATCH 28/56] fixed minor back with __getattr__ --- alr_envs/examples/examples_general.py | 8 ++++---- alr_envs/utils/dmc2gym_wrapper.py | 10 +++++++--- setup.py | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index 99ca8f6..2e5fda7 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -87,16 +87,16 @@ def example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=4, seed=int('533D', 16 if __name__ == '__main__': # Basic gym task - # example_general("Pendulum-v0", seed=10, iterations=200, render=True) + example_general("Pendulum-v0", seed=10, iterations=200, render=True) # # # Basis task from framework - # example_general("alr_envs:HoleReacher-v0", seed=10, iterations=200, render=True) + example_general("alr_envs:HoleReacher-v0", seed=10, iterations=200, render=True) # # # OpenAI Mujoco task - # example_general("HalfCheetah-v2", seed=10, render=True) + example_general("HalfCheetah-v2", seed=10, render=True) # # # Mujoco task from framework - # example_general("alr_envs:ALRReacher-v0", seed=10, iterations=200, render=True) + example_general("alr_envs:ALRReacher-v0", seed=10, iterations=200, render=True) # Vectorized multiprocessing environments example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=2, seed=int('533D', 16), n_samples=2 * 200) diff --git a/alr_envs/utils/dmc2gym_wrapper.py b/alr_envs/utils/dmc2gym_wrapper.py index d1226e4..cb3658d 100644 --- a/alr_envs/utils/dmc2gym_wrapper.py +++ b/alr_envs/utils/dmc2gym_wrapper.py @@ -91,9 +91,13 @@ class DMCWrapper(core.Env): # set seed self.seed(seed=task_kwargs.get('random', 1)) - def __getattr__(self, name): - """Delegate attribute access to underlying environment.""" - return getattr(self._env, name) + def __getattr__(self, item): + """Propagate only non-existent properties to wrapped env.""" + if item.startswith('_'): + raise AttributeError("attempted to get missing private attribute '{}'".format(item)) + if item in self.__dict__: + return getattr(self, item) + return getattr(self._env, item) def _get_obs(self, time_step): if self._from_pixels: diff --git a/setup.py b/setup.py index 7170fa6..b30ce41 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( 'gym', 'PyQt5', 'matplotlib', - 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', + # 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', 'mujoco_py' ], From 618d333116ea6e19e621e5a248778bc7d6c19de4 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 2 Jul 2021 18:20:45 +0200 Subject: [PATCH 29/56] fixup! fixed minor back with __getattr__ --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b30ce41..7170fa6 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( 'gym', 'PyQt5', 'matplotlib', - # 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', + 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', 'mujoco_py' ], From 28d10ef0894dd0f974886f5c03b9ada9646162dd Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 5 Jul 2021 08:14:39 +0200 Subject: [PATCH 30/56] Bug fixes for wrapped OpenAi environments --- alr_envs/__init__.py | 6 +++--- alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py | 2 +- alr_envs/open_ai/fetch/positional_wrapper.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 181b627..2611701 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -571,7 +571,7 @@ register( "mp_kwargs": { "num_dof": 1, "num_basis": 4, - "duration": 100, + "duration": 2, "post_traj_time": 0, "width": 0.02, "policy_type": "motor", @@ -613,7 +613,7 @@ register( "mp_kwargs": { "num_dof": 4, "num_basis": 5, - "duration": 1, + "duration": 2, "post_traj_time": 0, "width": 0.02, "policy_type": "position" @@ -630,7 +630,7 @@ register( "mp_kwargs": { "num_dof": 4, "num_basis": 5, - "duration": 1, + "duration": 2, "post_traj_time": 0, "width": 0.02, "policy_type": "position" diff --git a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py index 960fc0c..886b1e1 100644 --- a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py +++ b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py @@ -14,4 +14,4 @@ class MPWrapper(MPEnvWrapper): @property def dt(self) -> Union[float, int]: - return 1. \ No newline at end of file + return 0.02 \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/positional_wrapper.py b/alr_envs/open_ai/fetch/positional_wrapper.py index c113db6..9c6dcf2 100644 --- a/alr_envs/open_ai/fetch/positional_wrapper.py +++ b/alr_envs/open_ai/fetch/positional_wrapper.py @@ -6,8 +6,8 @@ from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper class PositionalWrapper(PositionalEnvWrapper): @property def current_vel(self) -> Union[float, int, np.ndarray]: - return self._get_obs()["observation"][-5:-1] + return self.unwrapped._get_obs()["observation"][-5:-1] @property def current_pos(self) -> Union[float, int, np.ndarray]: - return self._get_obs()["observation"][:4] \ No newline at end of file + return self.unwrapped._get_obs()["observation"][:4] \ No newline at end of file From 0046ade102be85d56c79933ac180004b06b13e7e Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 5 Jul 2021 09:16:36 +0200 Subject: [PATCH 31/56] Adopt new interface structure --- alr_envs/__init__.py | 8 ++++---- .../open_ai/continuous_mountain_car/__init__.py | 1 - .../open_ai/continuous_mountain_car/mp_wrapper.py | 9 +++++++-- .../continuous_mountain_car/positional_wrapper.py | 13 ------------- alr_envs/open_ai/fetch/__init__.py | 1 - alr_envs/open_ai/fetch/mp_wrapper.py | 10 +++++++--- alr_envs/open_ai/fetch/positional_wrapper.py | 13 ------------- alr_envs/open_ai/reacher_v2/__init__.py | 1 - alr_envs/open_ai/reacher_v2/mp_wrapper.py | 9 +++++++-- alr_envs/open_ai/reacher_v2/positional_wrapper.py | 13 ------------- 10 files changed, 25 insertions(+), 53 deletions(-) delete mode 100644 alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py delete mode 100644 alr_envs/open_ai/fetch/positional_wrapper.py delete mode 100644 alr_envs/open_ai/reacher_v2/positional_wrapper.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 144b5f2..0dfc1f5 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -573,7 +573,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.classic_control:MountainCarContinuous-v0", - "wrappers": [continuous_mountain_car.PositionalWrapper, continuous_mountain_car.MPWrapper], + "wrappers": [continuous_mountain_car.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 4, @@ -594,7 +594,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.mujoco:Reacher-v2", - "wrappers": [reacher_v2.PositionalWrapper, reacher_v2.MPWrapper], + "wrappers": [reacher_v2.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 6, @@ -615,7 +615,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.robotics:FetchSlideDense-v1", - "wrappers": [fetch.PositionalWrapper, fetch.MPWrapper], + "wrappers": [fetch.MPWrapper], "mp_kwargs": { "num_dof": 4, "num_basis": 5, @@ -632,7 +632,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.robotics:FetchReachDense-v1", - "wrappers": [fetch.PositionalWrapper, fetch.MPWrapper], + "wrappers": [fetch.MPWrapper], "mp_kwargs": { "num_dof": 4, "num_basis": 5, diff --git a/alr_envs/open_ai/continuous_mountain_car/__init__.py b/alr_envs/open_ai/continuous_mountain_car/__init__.py index 4cff6da..36f731d 100644 --- a/alr_envs/open_ai/continuous_mountain_car/__init__.py +++ b/alr_envs/open_ai/continuous_mountain_car/__init__.py @@ -1,2 +1 @@ -from alr_envs.open_ai.continuous_mountain_car.positional_wrapper import PositionalWrapper from alr_envs.open_ai.continuous_mountain_car.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py index 886b1e1..f0bccab 100644 --- a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py +++ b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py @@ -1,12 +1,17 @@ from typing import Union +import numpy as np from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class MPWrapper(MPEnvWrapper): @property - def start_pos(self): - raise ValueError("Start position is not available") + def current_vel(self) -> Union[float, int, np.ndarray]: + return np.array([self.state[1]]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return np.array([self.state[0]]) @property def goal_pos(self): diff --git a/alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py b/alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py deleted file mode 100644 index 5b587fa..0000000 --- a/alr_envs/open_ai/continuous_mountain_car/positional_wrapper.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Union -import numpy as np -from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper - - -class PositionalWrapper(PositionalEnvWrapper): - @property - def current_vel(self) -> Union[float, int, np.ndarray]: - return np.array([self.state[1]]) - - @property - def current_pos(self) -> Union[float, int, np.ndarray]: - return np.array([self.state[0]]) \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/__init__.py b/alr_envs/open_ai/fetch/__init__.py index 4c6d088..2e68176 100644 --- a/alr_envs/open_ai/fetch/__init__.py +++ b/alr_envs/open_ai/fetch/__init__.py @@ -1,2 +1 @@ -from alr_envs.open_ai.fetch.positional_wrapper import PositionalWrapper from alr_envs.open_ai.fetch.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/mp_wrapper.py b/alr_envs/open_ai/fetch/mp_wrapper.py index 2ac7b59..acb07a3 100644 --- a/alr_envs/open_ai/fetch/mp_wrapper.py +++ b/alr_envs/open_ai/fetch/mp_wrapper.py @@ -1,13 +1,17 @@ from typing import Union -from gym import spaces +import numpy as np from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class MPWrapper(MPEnvWrapper): @property - def start_pos(self): - return self.initial_gripper_xpos + def current_vel(self) -> Union[float, int, np.ndarray]: + return self.unwrapped._get_obs()["observation"][-5:-1] + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.unwrapped._get_obs()["observation"][:4] @property def goal_pos(self): diff --git a/alr_envs/open_ai/fetch/positional_wrapper.py b/alr_envs/open_ai/fetch/positional_wrapper.py deleted file mode 100644 index 9c6dcf2..0000000 --- a/alr_envs/open_ai/fetch/positional_wrapper.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Union -import numpy as np -from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper - - -class PositionalWrapper(PositionalEnvWrapper): - @property - def current_vel(self) -> Union[float, int, np.ndarray]: - return self.unwrapped._get_obs()["observation"][-5:-1] - - @property - def current_pos(self) -> Union[float, int, np.ndarray]: - return self.unwrapped._get_obs()["observation"][:4] \ No newline at end of file diff --git a/alr_envs/open_ai/reacher_v2/__init__.py b/alr_envs/open_ai/reacher_v2/__init__.py index a0acbea..48a5615 100644 --- a/alr_envs/open_ai/reacher_v2/__init__.py +++ b/alr_envs/open_ai/reacher_v2/__init__.py @@ -1,2 +1 @@ -from alr_envs.open_ai.reacher_v2.positional_wrapper import PositionalWrapper from alr_envs.open_ai.reacher_v2.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/reacher_v2/mp_wrapper.py b/alr_envs/open_ai/reacher_v2/mp_wrapper.py index be67a35..7636f50 100644 --- a/alr_envs/open_ai/reacher_v2/mp_wrapper.py +++ b/alr_envs/open_ai/reacher_v2/mp_wrapper.py @@ -1,13 +1,18 @@ from typing import Union +import numpy as np from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper class MPWrapper(MPEnvWrapper): @property - def start_pos(self): - raise ValueError("Start position is not available") + def current_vel(self) -> Union[float, int, np.ndarray]: + return self.sim.data.qvel[:2] + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.sim.data.qpos[:2] @property def goal_pos(self): diff --git a/alr_envs/open_ai/reacher_v2/positional_wrapper.py b/alr_envs/open_ai/reacher_v2/positional_wrapper.py deleted file mode 100644 index 0fc622b..0000000 --- a/alr_envs/open_ai/reacher_v2/positional_wrapper.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Union -import numpy as np -from mp_env_api.env_wrappers.positional_env_wrapper import PositionalEnvWrapper - - -class PositionalWrapper(PositionalEnvWrapper): - @property - def current_vel(self) -> Union[float, int, np.ndarray]: - return self.sim.data.qvel[:2] - - @property - def current_pos(self) -> Union[float, int, np.ndarray]: - return self.sim.data.qpos[:2] \ No newline at end of file From eae1013dac13e7e5f28a231b4b66845904613317 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 19 Jul 2021 11:57:06 +0200 Subject: [PATCH 32/56] fixed holereacher --- .../hole_reacher/hole_reacher.py | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher.py b/alr_envs/classic_control/hole_reacher/hole_reacher.py index a09dab1..6f134d4 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher.py @@ -122,13 +122,27 @@ class HoleReacherEnv(gym.Env): return self._get_obs().copy() def _generate_hole(self): - self._tmp_x = self.np_random.uniform(1, 3.5, 1) if self.initial_x is None else np.copy(self.initial_x) - self._tmp_width = self.np_random.uniform(0.15, 0.5, 1) if self.initial_width is None else np.copy( - self.initial_width) - # TODO we do not want this right now. - self._tmp_depth = self.np_random.uniform(1, 1, 1) if self.initial_depth is None else np.copy( - self.initial_depth) - self._goal = np.hstack([self._tmp_x, -self._tmp_depth]) + if self.initial_width is None: + width = self.np_random.uniform(0.15, 0.5, 1) + else: + width = np.copy(self.initial_width) + if self.initial_x is None: + # sample whole on left or right side + direction = np.random.choice([-1, 1]) + # Hole center needs to be half the width away from the arm to give a valid setting. + x = direction * self.np_random.uniform(width / 2, 3.5, 1) + else: + x = np.copy(self.initial_x) + if self.initial_depth is None: + # TODO we do not want this right now. + depth = self.np_random.uniform(1, 1, 1) + else: + depth = np.copy(self.initial_depth) + + self._tmp_hole_width = width + self._tmp_hole_x = x + self._tmp_hole_depth = depth + self._goal = np.hstack([self._tmp_hole_x, -self._tmp_hole_depth]) def _update_joints(self): """ From c6b4cff3a3669dba3441c41967714bd153d7f11f Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 19 Jul 2021 14:04:14 +0200 Subject: [PATCH 33/56] fixed holereacher --- .../classic_control/hole_reacher/hole_reacher.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher.py b/alr_envs/classic_control/hole_reacher/hole_reacher.py index 6f134d4..cb7295b 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher.py @@ -123,26 +123,26 @@ class HoleReacherEnv(gym.Env): def _generate_hole(self): if self.initial_width is None: - width = self.np_random.uniform(0.15, 0.5, 1) + width = self.np_random.uniform(0.15, 0.5) else: width = np.copy(self.initial_width) if self.initial_x is None: # sample whole on left or right side direction = np.random.choice([-1, 1]) # Hole center needs to be half the width away from the arm to give a valid setting. - x = direction * self.np_random.uniform(width / 2, 3.5, 1) + x = direction * self.np_random.uniform(width / 2, 3.5) else: x = np.copy(self.initial_x) if self.initial_depth is None: # TODO we do not want this right now. - depth = self.np_random.uniform(1, 1, 1) + depth = self.np_random.uniform(1, 1) else: depth = np.copy(self.initial_depth) - self._tmp_hole_width = width - self._tmp_hole_x = x - self._tmp_hole_depth = depth - self._goal = np.hstack([self._tmp_hole_x, -self._tmp_hole_depth]) + self._tmp_width = width + self._tmp_x = x + self._tmp_depth = depth + self._goal = np.hstack([self._tmp_x, -self._tmp_depth]) def _update_joints(self): """ @@ -216,7 +216,6 @@ class HoleReacherEnv(gym.Env): return np.squeeze(end_effector + self._joints[0, :]) def _check_wall_collision(self, line_points): - # all points that are before the hole in x r, c = np.where(line_points[:, :, 0] < (self._tmp_x - self._tmp_width / 2)) From 7e2f5d664b76f1b78ec46832ea289152cf830da6 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 19 Jul 2021 14:05:25 +0200 Subject: [PATCH 34/56] added sanity check for computed trajectory duration/length and environment episode length --- alr_envs/__init__.py | 10 +++++++--- alr_envs/examples/examples_dmc.py | 27 ++++++++++++++++--------- alr_envs/utils/__init__.py | 1 - alr_envs/utils/dmc2gym_wrapper.py | 13 ++++++++++++ alr_envs/utils/make_env_helpers.py | 32 +++++++++++++++++++++++++++--- setup.py | 2 +- 6 files changed, 68 insertions(+), 17 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 5b9bf10..04d0bf6 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -216,7 +216,7 @@ register( "random_start": False, "allow_self_collision": False, "allow_wall_collision": False, - "hole_width": None, + "hole_width": 0.25, "hole_depth": 1, "hole_x": None, "collision_penalty": 100, @@ -525,11 +525,13 @@ register( # max_episode_steps=1, kwargs={ "name": f"ball_in_cup-catch", + "time_limit": 1, + "episode_length": 50, "wrappers": [DMCBallInCupMPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 20, + "duration": 1, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, @@ -549,11 +551,13 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"ball_in_cup-catch", + "time_limit": 1, + "episode_length": 50, "wrappers": [DMCBallInCupMPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 20, + "duration": 1, "width": 0.025, "policy_type": "motor", "weights_scale": 0.2, diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index b877933..71eab74 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -38,6 +38,7 @@ def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): obs = env.reset() env.close() + del env def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): @@ -78,7 +79,12 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): "d_gains": 0.05 } } - env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) + kwargs = { + "time_limit": 20, + "episode_length": 1000, + # "frame_skip": 1 + } + env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs, **kwargs) # OR for a deterministic ProMP: # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_args) @@ -105,6 +111,7 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): obs = env.reset() env.close() + del env if __name__ == '__main__': @@ -113,16 +120,18 @@ if __name__ == '__main__': # For rendering DMC # export MUJOCO_GL="osmesa" + render = False - # Standard DMC Suite tasks - example_dmc("fish-swim", seed=10, iterations=1000, render=True) - - # Manipulation tasks - # Disclaimer: The vision versions are currently not integrated and yield an error - example_dmc("manipulation-reach_site_features", seed=10, iterations=250, render=True) + # # Standard DMC Suite tasks + # example_dmc("fish-swim", seed=10, iterations=1000, render=render) + # + # # Manipulation tasks + # # Disclaimer: The vision versions are currently not integrated and yield an error + # example_dmc("manipulation-reach_site_features", seed=10, iterations=250, render=render) # Gym + DMC hybrid task provided in the MP framework - example_dmc("dmc_ball_in_cup-catch_detpmp-v0", seed=10, iterations=1, render=True) + example_dmc("dmc_ball_in_cup-catch_detpmp-v0", seed=10, iterations=1, render=render) # Custom DMC task - example_custom_dmc_and_mp(seed=10, iterations=1, render=True) + # Different seed, because the episode is longer for this example and the name+seed combo is already registered above + example_custom_dmc_and_mp(seed=11, iterations=1, render=render) diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index 6bdf5ec..77fdd9f 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -1,4 +1,3 @@ -import collections import re from typing import Union diff --git a/alr_envs/utils/dmc2gym_wrapper.py b/alr_envs/utils/dmc2gym_wrapper.py index cb3658d..5e6a53d 100644 --- a/alr_envs/utils/dmc2gym_wrapper.py +++ b/alr_envs/utils/dmc2gym_wrapper.py @@ -125,6 +125,19 @@ class DMCWrapper(core.Env): def dt(self): return self._env.control_timestep() * self._frame_skip + @property + def base_step_limit(self): + """ + Returns: max_episode_steps of the underlying DMC env + + """ + # Accessing private attribute because DMC does not expose time_limit or step_limit. + # Only the current time_step/time as well as the control_timestep can be accessed. + try: + return (self._env._step_limit + self._frame_skip - 1) // self._frame_skip + except AttributeError as e: + return self._env._time_limit / self.dt + def seed(self, seed=None): self._action_space.seed(seed) self._observation_space.seed(seed) diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 6a8fce2..7c39126 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -1,5 +1,5 @@ import logging -from typing import Iterable, List, Type +from typing import Iterable, List, Type, Union import gym @@ -8,7 +8,7 @@ from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper -def make_env_rank(env_id: str, seed: int, rank: int = 0): +def make_env_rank(env_id: str, seed: int, rank: int = 0, **kwargs): """ TODO: Do we need this? Generate a callable to create a new gym environment with a given seed. @@ -26,7 +26,7 @@ def make_env_rank(env_id: str, seed: int, rank: int = 0): Returns: """ - return lambda: make_env(env_id, seed + rank) + return lambda: make_env(env_id, seed + rank, **kwargs) def make_env(env_id: str, seed, **kwargs): @@ -54,6 +54,10 @@ def make_env(env_id: str, seed, **kwargs): from alr_envs.utils import make env = make(env_id, seed=seed, **kwargs) + assert env.base_step_limit == env.spec.max_episode_steps, \ + f"The specified 'episode_length' of {env.spec.max_episode_steps} steps for gym is different from " \ + f"the DMC environment specification of {env.base_step_limit} steps." + return env @@ -94,6 +98,7 @@ def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwargs Returns: DMP wrapped gym env """ + verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) return DmpWrapper(_env, **mp_kwargs) @@ -110,6 +115,7 @@ def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwa Returns: DMP wrapped gym env """ + verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) return DetPMPWrapper(_env, **mp_kwargs) @@ -159,3 +165,23 @@ def make_contextual_env(env_id, context, seed, rank): # env = gym.make(env_id, context=context) # env.seed(seed + rank) return lambda: env + + +def verify_time_limit(mp_time_limit: Union[None, float], env_time_limit: Union[None, float]): + """ + When using DMC check if a manually specified time limit matches the trajectory duration the MP receives. + Mostly, the time_limit for DMC is not specified and the default values from DMC are taken. + This check, however, can only been done after instantiating the environment. + It can be found in the BaseMP class. + + Args: + mp_time_limit: max trajectory length of mp in seconds + env_time_limit: max trajectory length of DMC environment in seconds + + Returns: + + """ + if mp_time_limit is not None and env_time_limit is not None: + assert mp_time_limit == env_time_limit, \ + f"The manually specified 'time_limit' of {env_time_limit}s does not match " \ + f"the duration of {mp_time_limit}s for the MP." diff --git a/setup.py b/setup.py index 7170fa6..b30ce41 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( 'gym', 'PyQt5', 'matplotlib', - 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', + # 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', 'mujoco_py' ], From 92e6a84d0333232cbeae0474c52bd6dcda1c37ab Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 5 Jul 2021 09:52:41 +0200 Subject: [PATCH 35/56] Adopt new interface structure --- README.md | 3 ++- alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py | 2 +- alr_envs/open_ai/fetch/mp_wrapper.py | 2 +- alr_envs/open_ai/reacher_v2/mp_wrapper.py | 6 +----- reacher.egg-info/PKG-INFO | 10 ---------- reacher.egg-info/SOURCES.txt | 7 ------- reacher.egg-info/dependency_links.txt | 1 - reacher.egg-info/requires.txt | 1 - reacher.egg-info/top_level.txt | 1 - setup.py | 4 ++-- 10 files changed, 7 insertions(+), 30 deletions(-) delete mode 100644 reacher.egg-info/PKG-INFO delete mode 100644 reacher.egg-info/SOURCES.txt delete mode 100644 reacher.egg-info/dependency_links.txt delete mode 100644 reacher.egg-info/requires.txt delete mode 100644 reacher.egg-info/top_level.txt diff --git a/README.md b/README.md index 2ab4143..56ec0bf 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ This repository collects custom Robotics environments not included in benchmark suites like OpenAI gym, rllab, etc. Creating a custom (Mujoco) gym environment can be done according to [this guide](https://github.com/openai/gym/blob/master/docs/creating-environments.md). For stochastic search problems with gym interface use the `Rosenbrock-v0` reference implementation. -We also support to solve environments with DMPs. When adding new DMP tasks check the `ViaPointReacherDMP-v0` reference implementation. +We also support to solve environments with Dynamic Movement Primitives (DMPs) and Probabilistic Movement Primitives (DetPMP, we only consider the mean usually). +When adding new DMP tasks check the `ViaPointReacherDMP-v0` reference implementation. When simply using the tasks, you can also leverage the wrapper class `DmpWrapper` to turn normal gym environments in to DMP tasks. ## Environments diff --git a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py index f0bccab..29378ed 100644 --- a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py +++ b/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class MPWrapper(MPEnvWrapper): diff --git a/alr_envs/open_ai/fetch/mp_wrapper.py b/alr_envs/open_ai/fetch/mp_wrapper.py index acb07a3..6602a18 100644 --- a/alr_envs/open_ai/fetch/mp_wrapper.py +++ b/alr_envs/open_ai/fetch/mp_wrapper.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class MPWrapper(MPEnvWrapper): diff --git a/alr_envs/open_ai/reacher_v2/mp_wrapper.py b/alr_envs/open_ai/reacher_v2/mp_wrapper.py index 7636f50..d3181b5 100644 --- a/alr_envs/open_ai/reacher_v2/mp_wrapper.py +++ b/alr_envs/open_ai/reacher_v2/mp_wrapper.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -from mp_env_api.env_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper class MPWrapper(MPEnvWrapper): @@ -14,10 +14,6 @@ class MPWrapper(MPEnvWrapper): def current_pos(self) -> Union[float, int, np.ndarray]: return self.sim.data.qpos[:2] - @property - def goal_pos(self): - return self.goal - @property def dt(self) -> Union[float, int]: return self.env.dt \ No newline at end of file diff --git a/reacher.egg-info/PKG-INFO b/reacher.egg-info/PKG-INFO deleted file mode 100644 index 9ea9f7e..0000000 --- a/reacher.egg-info/PKG-INFO +++ /dev/null @@ -1,10 +0,0 @@ -Metadata-Version: 1.0 -Name: reacher -Version: 0.0.1 -Summary: UNKNOWN -Home-page: UNKNOWN -Author: UNKNOWN -Author-email: UNKNOWN -License: UNKNOWN -Description: UNKNOWN -Platform: UNKNOWN diff --git a/reacher.egg-info/SOURCES.txt b/reacher.egg-info/SOURCES.txt deleted file mode 100644 index b771181..0000000 --- a/reacher.egg-info/SOURCES.txt +++ /dev/null @@ -1,7 +0,0 @@ -README.md -setup.py -reacher.egg-info/PKG-INFO -reacher.egg-info/SOURCES.txt -reacher.egg-info/dependency_links.txt -reacher.egg-info/requires.txt -reacher.egg-info/top_level.txt \ No newline at end of file diff --git a/reacher.egg-info/dependency_links.txt b/reacher.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/reacher.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/reacher.egg-info/requires.txt b/reacher.egg-info/requires.txt deleted file mode 100644 index 1e6c2dd..0000000 --- a/reacher.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -gym diff --git a/reacher.egg-info/top_level.txt b/reacher.egg-info/top_level.txt deleted file mode 100644 index 8b13789..0000000 --- a/reacher.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/setup.py b/setup.py index cc9445c..703bbee 100644 --- a/setup.py +++ b/setup.py @@ -3,14 +3,14 @@ from setuptools import setup setup( name='alr_envs', version='0.0.1', - packages=['alr_envs', 'alr_envs.classic_control', 'alr_envs.mujoco', 'alr_envs.stochastic_search', + packages=['alr_envs', 'alr_envs.classic_control', 'alr_envs.open_ai', 'alr_envs.mujoco', 'alr_envs.stochastic_search', 'alr_envs.utils'], install_requires=[ 'gym', 'PyQt5', 'matplotlib', 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', - 'mujoco_py', + 'mujoco-py<2.1,>=2.0', 'dm_control' ], From d2414797c7f2e8156fc76213e61b1431c7be6f7b Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 23 Jul 2021 15:18:39 +0200 Subject: [PATCH 36/56] Update README.md --- README.md | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 56ec0bf..a4ad30f 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@ -## ALR Environments +## ALR Robotics Control Environments This repository collects custom Robotics environments not included in benchmark suites like OpenAI gym, rllab, etc. Creating a custom (Mujoco) gym environment can be done according to [this guide](https://github.com/openai/gym/blob/master/docs/creating-environments.md). For stochastic search problems with gym interface use the `Rosenbrock-v0` reference implementation. We also support to solve environments with Dynamic Movement Primitives (DMPs) and Probabilistic Movement Primitives (DetPMP, we only consider the mean usually). -When adding new DMP tasks check the `ViaPointReacherDMP-v0` reference implementation. -When simply using the tasks, you can also leverage the wrapper class `DmpWrapper` to turn normal gym environments in to DMP tasks. -## Environments +## Step-based Environments Currently we have the following environments: ### Mujoco @@ -33,11 +31,13 @@ Currently we have the following environments: |`ViaPointReacher-v0`| Simple reaching task leveraging a via point, which supports self collision detection. Provides a reward only at 100 and 199 for reaching the viapoint and goal point, respectively.| 200 | 5 | 18 |`HoleReacher-v0`| 5 link reaching task where the end-effector needs to reach into a narrow hole without collding with itself or walls | 200 | 5 | 18 -### DMP Environments -These environments are closer to stochastic search. They always execute a full trajectory, which is computed by a DMP and executed by a controller, e.g. a PD controller. -The goal is to learn the parameters of this DMP to generate a suitable trajectory. -All environments provide the full episode reward and additional information about early terminations, e.g. due to collisions. +## Motion Primitive Environments (Episodic environments) +Unlike step-based environments, these motion primitive (MP) environments are closer to stochastic search and what can be found in robotics. They always execute a full trajectory, which is computed by a Dynamic Motion Primitive (DMP) or Probabilitic Motion Primitive (DetPMP) and translated into individual actions with a controller, e.g. a PD controller. The actual Controller, however, depends on the type of environment, i.e. position, velocity, or torque controlled. +The goal is to learn the parametrization of the motion primitives in order to generate a suitable trajectory. +MP This can also be done in a contextual setting, where all changing elements of the task are exposed once in the beginning. This requires to find a new parametrization for each trajectory. +All environments provide the full cumulative episode reward and additional information about early terminations, e.g. due to collisions. +### Classic Control |Name| Description|Horizon|Action Dimension|Context Dimension |---|---|---|---|---| |`ViaPointReacherDMP-v0`| A DMP provides a trajectory for the `ViaPointReacher-v0` task. | 200 | 25 @@ -49,18 +49,31 @@ All environments provide the full episode reward and additional information abou [//]: |`HoleReacherDetPMP-v0`| -### OpenAi-gym Environments -These environments are wrapped-versions of their OpenAi-gym counterparts. +### OpenAI gym Environments +These environments are wrapped-versions of their OpenAI-gym counterparts. -|Name| Description|Horizon|Action Dimension|Context Dimension +|Name| Description|Trajectory Horizon|Action Dimension|Context Dimension |---|---|---|---|---| |`ContinuousMountainCarDetPMP-v0`| A DetPmP wrapped version of the ContinuousMountainCar-v0 environment. | 100 | 1 |`ReacherDetPMP-v2`| A DetPmP wrapped version of the Reacher-v2 environment. | 50 | 2 |`FetchSlideDenseDetPMP-v1`| A DetPmP wrapped version of the FetchSlideDense-v1 environment. | 50 | 4 |`FetchReachDenseDetPMP-v1`| A DetPmP wrapped version of the FetchReachDense-v1 environment. | 50 | 4 +### Deep Mind Control Suite Environments +These environments are wrapped-versions of their Deep Mind Control Suite (DMC) counterparts. +Given most task can be solved in shorter horizon lengths than the original 1000 steps, we often shorten the episodes for those task. -### Stochastic Search +|Name| Description|Trajectory Horizon|Action Dimension|Context Dimension +|---|---|---|---|---| +|`dmc_ball_in_cup-catch_detpmp-v0`| A DetPmP wrapped version of the "catch" task for the "ball_in_cup" environment. | 50 | 10 | 2 +|`dmc_ball_in_cup-catch_dmp-v0`| A DMP wrapped version of the "catch" task for the "ball_in_cup" environment. | 50| 10 | 2 +|`dmc_reacher-easy_detpmp-v0`| A DetPmP wrapped version of the "easy" task for the "reacher" environment. | 1000 | 10 | 4 +|`dmc_reacher-easy_dmp-v0`| A DMP wrapped version of the "easy" task for the "reacher" environment. | 1000| 10 | 4 +|`dmc_reacher-hard_detpmp-v0`| A DetPmP wrapped version of the "hard" task for the "reacher" environment.| 1000 | 10 | 4 +|`dmc_reacher-hard_dmp-v0`| A DMP wrapped version of the "hard" task for the "reacher" environment. | 1000 | 10 | 4 + + +## Stochastic Search |Name| Description|Horizon|Action Dimension|Observation Dimension |---|---|---|---|---| |`Rosenbrock{dim}-v0`| Gym interface for Rosenbrock function. `{dim}` is one of 5, 10, 25, 50 or 100. | 1 | `{dim}` | 0 @@ -96,4 +109,4 @@ for i in range(10000): ``` -For an example using a DMP wrapped env and asynchronous sampling look at [mp_env_async_sampler.py](./alr_envs/utils/mp_env_async_sampler.py) \ No newline at end of file +For an example using a DMP wrapped env and asynchronous sampling look at [mp_env_async_sampler.py](./alr_envs/utils/mp_env_async_sampler.py) From 24e73d5098dc1e4a17375afd44c10151dc616f0a Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 26 Jul 2021 17:07:17 +0200 Subject: [PATCH 37/56] added DMC Reacher, cartpole, reach_size; removed BBO --- README.md | 6 - alr_envs/__init__.py | 721 +++++++++++------- .../hole_reacher/hole_reacher.py | 4 +- .../{ball_in_cup => manipulation}/__init__.py | 0 .../manipulation/reach}/__init__.py | 0 .../manipulation/reach/reach_mp_wrapper.py | 38 + alr_envs/dmc/suite/__init__.py | 0 alr_envs/dmc/suite/ball_in_cup/__init__.py | 0 .../ball_in_cup/ball_in_cup_mp_wrapper.py} | 4 +- alr_envs/dmc/suite/reacher/__init__.py | 0 .../dmc/suite/reacher/reacher_mp_wrapper.py | 33 + alr_envs/examples/examples_dmc.py | 12 +- alr_envs/examples/examples_general.py | 9 +- .../examples/examples_motion_primitives.py | 9 +- alr_envs/mujoco/__init__.py | 4 +- alr_envs/mujoco/{ => reacher}/balancing.py | 0 alr_envs/stochastic_search/__init__.py | 1 - .../stochastic_search/functions/f_base.py | 76 -- .../functions/f_rosenbrock.py | 56 -- .../stochastic_search/stochastic_search.py | 22 - alr_envs/utils/make_env_helpers.py | 4 +- setup.py | 3 +- 22 files changed, 563 insertions(+), 439 deletions(-) rename alr_envs/dmc/{ball_in_cup => manipulation}/__init__.py (100%) rename alr_envs/{stochastic_search/functions => dmc/manipulation/reach}/__init__.py (100%) create mode 100644 alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py create mode 100644 alr_envs/dmc/suite/__init__.py create mode 100644 alr_envs/dmc/suite/ball_in_cup/__init__.py rename alr_envs/dmc/{ball_in_cup/ball_in_the_cup_mp_wrapper.py => suite/ball_in_cup/ball_in_cup_mp_wrapper.py} (80%) create mode 100644 alr_envs/dmc/suite/reacher/__init__.py create mode 100644 alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py rename alr_envs/mujoco/{ => reacher}/balancing.py (100%) delete mode 100644 alr_envs/stochastic_search/__init__.py delete mode 100644 alr_envs/stochastic_search/functions/f_base.py delete mode 100644 alr_envs/stochastic_search/functions/f_rosenbrock.py delete mode 100644 alr_envs/stochastic_search/stochastic_search.py diff --git a/README.md b/README.md index ce95b8d..88808e7 100644 --- a/README.md +++ b/README.md @@ -48,12 +48,6 @@ All environments provide the full episode reward and additional information abou [//]: |`HoleReacherDetPMP-v0`| -### Stochastic Search -|Name| Description|Horizon|Action Dimension|Observation Dimension -|---|---|---|---|---| -|`Rosenbrock{dim}-v0`| Gym interface for Rosenbrock function. `{dim}` is one of 5, 10, 25, 50 or 100. | 1 | `{dim}` | 0 - - ## Install 1. Clone the repository ```bash diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 04d0bf6..c3da16d 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -4,9 +4,11 @@ from gym.envs.registration import register from alr_envs.classic_control.hole_reacher.hole_reacher_mp_wrapper import HoleReacherMPWrapper from alr_envs.classic_control.simple_reacher.simple_reacher_mp_wrapper import SimpleReacherMPWrapper from alr_envs.classic_control.viapoint_reacher.viapoint_reacher_mp_wrapper import ViaPointReacherMPWrapper -from alr_envs.dmc.ball_in_cup.ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper -from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_mp_wrapper import BallInACupMPWrapper -from alr_envs.stochastic_search.functions.f_rosenbrock import Rosenbrock +from alr_envs.dmc.manipulation.reach.reach_mp_wrapper import DMCReachSiteMPWrapper +from alr_envs.dmc.suite.ball_in_cup.ball_in_cup_mp_wrapper import DMCBallInCupMPWrapper +from alr_envs.dmc.suite.cartpole.cartpole_mp_wrapper import DMCCartpoleMPWrapper, DMCCartpoleThreePolesMPWrapper, \ + DMCCartpoleTwoPolesMPWrapper +from alr_envs.dmc.suite.reacher.reacher_mp_wrapper import DMCReacherMPWrapper # Mujoco @@ -88,54 +90,6 @@ register( } ) -register( - id='ALRBallInACupSimple-v0', - entry_point='alr_envs.mujoco:ALRBallInACupEnv', - max_episode_steps=4000, - kwargs={ - "simplified": True, - "reward_type": "no_context", - } -) - -register( - id='ALRBallInACupPDSimple-v0', - entry_point='alr_envs.mujoco:ALRBallInACupPDEnv', - max_episode_steps=4000, - kwargs={ - "simplified": True, - "reward_type": "no_context" - } -) - -register( - id='ALRBallInACupPD-v0', - entry_point='alr_envs.mujoco:ALRBallInACupPDEnv', - max_episode_steps=4000, - kwargs={ - "simplified": False, - "reward_type": "no_context" - } -) - -register( - id='ALRBallInACup-v0', - entry_point='alr_envs.mujoco:ALRBallInACupEnv', - max_episode_steps=4000, - kwargs={ - "reward_type": "no_context" - } -) - -register( - id='ALRBallInACupGoal-v0', - entry_point='alr_envs.mujoco:ALRBallInACupEnv', - max_episode_steps=4000, - kwargs={ - "reward_type": "contextual_goal" - } -) - # Classic control ## Simple Reacher @@ -239,7 +193,7 @@ register( } ) -# MP environments +# Motion Primitive Environments ## Simple Reacher versions = ["SimpleReacher-v0", "SimpleReacher-v1", "LongSimpleReacher-v0", "LongSimpleReacher-v1"] @@ -255,7 +209,7 @@ for v in versions: "mp_kwargs": { "num_dof": 2 if "long" not in v.lower() else 5, "num_basis": 5, - "duration": 2, + "duration": 20, "alpha_phase": 2, "learn_goal": True, "policy_type": "velocity", @@ -325,200 +279,14 @@ for v in versions: } ) -# TODO: properly add final_pos -register( - id='HoleReacherFixedGoalDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": "alr_envs:HoleReacher-v0", - "wrappers": [HoleReacherMPWrapper], - "mp_kwargs": { - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "learn_goal": False, - "alpha_phase": 2, - "policy_type": "velocity", - "weights_scale": 50, - "goal_scale": 0.1 - } - } -) - -## Ball in Cup - -register( - id='ALRBallInACupSimpleDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - kwargs={ - "name": "alr_envs:ALRBallInACupSimple-v0", - "wrappers": [BallInACupMPWrapper], - "mp_kwargs": { - "num_dof": 3, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "learn_goal": False, - "alpha_phase": 3, - "bandwidth_factor": 2.5, - "policy_type": "motor", - "weights_scale": 100, - "return_to_start": True, - "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } - } - } -) - -register( - id='ALRBallInACupDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - kwargs={ - "name": "alr_envs:ALRBallInACup-v0", - "wrappers": [BallInACupMPWrapper], - "mp_kwargs": { - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "learn_goal": False, - "alpha_phase": 3, - "bandwidth_factor": 2.5, - "policy_type": "motor", - "weights_scale": 100, - "return_to_start": True, - "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } - } - } -) - -register( - id='ALRBallInACupSimpleDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "alr_envs:ALRBallInACupSimple-v0", - "wrappers": [BallInACupMPWrapper], - "mp_kwargs": { - "num_dof": 3, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - # "off": -0.05, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } - } - } -) - -register( - id='ALRBallInACupPDSimpleDetPMP-v0', - entry_point='alr_envs.mujoco.ball_in_a_cup.biac_pd:make_detpmp_env_helper', - kwargs={ - "name": "alr_envs:ALRBallInACupPDSimple-v0", - "wrappers": [BallInACupMPWrapper], - "mp_kwargs": { - "num_dof": 3, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - # "off": -0.05, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } - } - } -) - -register( - id='ALRBallInACupPDDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env', - kwargs={ - "name": "alr_envs:ALRBallInACupPD-v0", - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - # "off": -0.05, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } -) - -register( - id='ALRBallInACupDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "alr_envs:ALRBallInACupSimple-v0", - "wrappers": [BallInACupMPWrapper], - "mp_kwargs": { - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "width": 0.0035, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "zero_goal": True, - "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } - } - } -) - -register( - id='ALRBallInACupGoalDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_contextual_env', - kwargs={ - "name": "alr_envs:ALRBallInACupGoal-v0", - "wrappers": [BallInACupMPWrapper], - "mp_kwargs": { - "num_dof": 7, - "num_basis": 5, - "duration": 3.5, - "post_traj_time": 4.5, - "learn_goal": True, - "alpha_phase": 3, - "bandwidth_factor": 2.5, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": np.array([4. / 3., 2.4, 2.5, 5. / 3., 2., 2., 1.25]), - "d_gains": np.array([0.0466, 0.12, 0.125, 0.04166, 0.06, 0.06, 0.025]) - } - } - } -) - -## DMC +## Deep Mind Control Suite (DMC) +### Suite +# tasks = ["ball_in_cup-catch", "reacher-easy", "reacher-hard", "cartpole-balance", "cartpole-balance_sparse", +# "cartpole-swingup", "cartpole-swingup_sparse", "cartpole-two_poles", "cartpole-three_poles"] +# wrappers = [DMCBallInCupMPWrapper, DMCReacherMPWrapper, DMCReacherMPWrapper, DMCCartpoleMPWrapper, +# partial(DMCCartpoleMPWrapper)] +# for t, w in zip(tasks, wrappers): register( id=f'dmc_ball_in_cup-catch_dmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', @@ -570,14 +338,455 @@ register( } ) -# BBO functions - -for dim in [5, 10, 25, 50, 100]: - register( - id=f'Rosenbrock{dim}-v0', - entry_point='alr_envs.stochastic_search:StochasticSearchEnv', - max_episode_steps=1, - kwargs={ - "cost_f": Rosenbrock(dim), +# TODO tune gains and episode length for all below +register( + id=f'dmc_reacher-easy_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"reacher-easy", + "time_limit": 1, + "episode_length": 50, + "wrappers": [DMCReacherMPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 1, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } } - ) + } +) + +register( + id=f'dmc_reacher-easy_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"reacher-easy", + "time_limit": 1, + "episode_length": 50, + "wrappers": [DMCReacherMPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 1, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_reacher-hard_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"reacher-hard", + "time_limit": 1, + "episode_length": 50, + "wrappers": [DMCReacherMPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 1, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_reacher-hard_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"reacher-hard", + "time_limit": 1, + "episode_length": 50, + "wrappers": [DMCReacherMPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 1, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +register( + id=f'dmc_cartpole-balance_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-balance", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-balance_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-balance", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +register( + id=f'dmc_cartpole-balance_sparse_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-balance_sparse", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-balance_sparse_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-balance_sparse", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-swingup_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-swingup", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-swingup_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-swingup", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +register( + id=f'dmc_cartpole-swingup_sparse_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-swingup_sparse", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-swingup_sparse_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-swingup_sparse", + # "time_limit": 1, + "episode_length": 1000, + "wrappers": [DMCCartpoleMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +register( + id=f'dmc_cartpole-two_poles_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-two_poles", + # "time_limit": 1, + "episode_length": 1000, + # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=2)], + "wrappers": [DMCCartpoleTwoPolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-two_poles_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-two_poles", + # "time_limit": 1, + "episode_length": 1000, + # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=2)], + "wrappers": [DMCCartpoleTwoPolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +register( + id=f'dmc_cartpole-three_poles_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-three_poles", + # "time_limit": 1, + "episode_length": 1000, + # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=3)], + "wrappers": [DMCCartpoleThreePolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +register( + id=f'dmc_cartpole-three_poles_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-three_poles", + # "time_limit": 1, + "episode_length": 1000, + # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=3)], + "wrappers": [DMCCartpoleThreePolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) + +### Manipulation + +register( + id=f'dmc_manipulation-reach_site_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"manipulation-reach_site_features", + # "time_limit": 1, + "episode_length": 250, + "wrappers": [DMCReachSiteMPWrapper], + "mp_kwargs": { + "num_dof": 9, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1, + } + } +) + +register( + id=f'dmc_manipulation-reach_site_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"manipulation-reach_site_features", + # "time_limit": 1, + "episode_length": 250, + "wrappers": [DMCReachSiteMPWrapper], + "mp_kwargs": { + "num_dof": 9, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True, + } + } +) diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher.py b/alr_envs/classic_control/hole_reacher/hole_reacher.py index cb7295b..2482714 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher.py +++ b/alr_envs/classic_control/hole_reacher/hole_reacher.py @@ -128,7 +128,7 @@ class HoleReacherEnv(gym.Env): width = np.copy(self.initial_width) if self.initial_x is None: # sample whole on left or right side - direction = np.random.choice([-1, 1]) + direction = self.np_random.choice([-1, 1]) # Hole center needs to be half the width away from the arm to give a valid setting. x = direction * self.np_random.uniform(width / 2, 3.5) else: @@ -263,7 +263,7 @@ class HoleReacherEnv(gym.Env): self.fig.show() self.fig.gca().set_title( - f"Iteration: {self._steps}, distance: {self.end_effector - self._goal}") + f"Iteration: {self._steps}, distance: {np.linalg.norm(self.end_effector - self._goal) ** 2}") if mode == "human": diff --git a/alr_envs/dmc/ball_in_cup/__init__.py b/alr_envs/dmc/manipulation/__init__.py similarity index 100% rename from alr_envs/dmc/ball_in_cup/__init__.py rename to alr_envs/dmc/manipulation/__init__.py diff --git a/alr_envs/stochastic_search/functions/__init__.py b/alr_envs/dmc/manipulation/reach/__init__.py similarity index 100% rename from alr_envs/stochastic_search/functions/__init__.py rename to alr_envs/dmc/manipulation/reach/__init__.py diff --git a/alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py b/alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py new file mode 100644 index 0000000..612b44d --- /dev/null +++ b/alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py @@ -0,0 +1,38 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper + + +class DMCReachSiteMPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + # Joint and target positions are randomized, velocities are always set to 0. + return np.hstack([ + [True] * 3, # target position + [True] * 12, # sin/cos arm joint position + [True] * 6, # arm joint torques + [False] * 6, # arm joint velocities + [True] * 3, # sin/cos hand joint position + [False] * 3, # hand joint velocities + [True] * 3, # hand pinch site position + [True] * 9, # pinch site rmat + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.env.physics.named.data.qpos[:] + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.physics.named.data.qvel[:] + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/dmc/suite/__init__.py b/alr_envs/dmc/suite/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/dmc/suite/ball_in_cup/__init__.py b/alr_envs/dmc/suite/ball_in_cup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py b/alr_envs/dmc/suite/ball_in_cup/ball_in_cup_mp_wrapper.py similarity index 80% rename from alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py rename to alr_envs/dmc/suite/ball_in_cup/ball_in_cup_mp_wrapper.py index 539f4e9..514f6f1 100644 --- a/alr_envs/dmc/ball_in_cup/ball_in_the_cup_mp_wrapper.py +++ b/alr_envs/dmc/suite/ball_in_cup/ball_in_cup_mp_wrapper.py @@ -19,11 +19,11 @@ class DMCBallInCupMPWrapper(MPEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray]: - return np.hstack([self.physics.named.data.qpos['cup_x'], self.physics.named.data.qpos['cup_z']]) + return np.hstack([self.env.physics.named.data.qpos['cup_x'], self.env.physics.named.data.qpos['cup_z']]) @property def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: - return np.hstack([self.physics.named.data.qvel['cup_x'], self.physics.named.data.qvel['cup_z']]) + return np.hstack([self.env.physics.named.data.qvel['cup_x'], self.env.physics.named.data.qvel['cup_z']]) @property def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: diff --git a/alr_envs/dmc/suite/reacher/__init__.py b/alr_envs/dmc/suite/reacher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py b/alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py new file mode 100644 index 0000000..17baf04 --- /dev/null +++ b/alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py @@ -0,0 +1,33 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper + + +class DMCReacherMPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + # Joint and target positions are randomized, velocities are always set to 0. + return np.hstack([ + [True] * 2, # joint position + [True] * 2, # target position + [False] * 2, # joint velocity + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.env.physics.named.data.qpos[:] + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.physics.named.data.qvel[:] + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index 71eab74..6e24d83 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -1,4 +1,4 @@ -from alr_envs.dmc.ball_in_cup.ball_in_the_cup_mp_wrapper import DMCBallInCupMPWrapper +from alr_envs.dmc.suite.ball_in_cup.ball_in_cup_mp_wrapper import DMCBallInCupMPWrapper from alr_envs.utils.make_env_helpers import make_dmp_env, make_env @@ -123,11 +123,11 @@ if __name__ == '__main__': render = False # # Standard DMC Suite tasks - # example_dmc("fish-swim", seed=10, iterations=1000, render=render) - # - # # Manipulation tasks - # # Disclaimer: The vision versions are currently not integrated and yield an error - # example_dmc("manipulation-reach_site_features", seed=10, iterations=250, render=render) + example_dmc("fish-swim", seed=10, iterations=1000, render=render) + + # Manipulation tasks + # Disclaimer: The vision versions are currently not integrated and yield an error + example_dmc("manipulation-reach_site_features", seed=10, iterations=250, render=render) # Gym + DMC hybrid task provided in the MP framework example_dmc("dmc_ball_in_cup-catch_detpmp-v0", seed=10, iterations=1, render=render) diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index 2e5fda7..d237c03 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -86,17 +86,18 @@ def example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=4, seed=int('533D', 16 if __name__ == '__main__': + render = False # Basic gym task - example_general("Pendulum-v0", seed=10, iterations=200, render=True) + example_general("Pendulum-v0", seed=10, iterations=200, render=render) # # # Basis task from framework - example_general("alr_envs:HoleReacher-v0", seed=10, iterations=200, render=True) + example_general("alr_envs:HoleReacher-v0", seed=10, iterations=200, render=render) # # # OpenAI Mujoco task - example_general("HalfCheetah-v2", seed=10, render=True) + example_general("HalfCheetah-v2", seed=10, render=render) # # # Mujoco task from framework - example_general("alr_envs:ALRReacher-v0", seed=10, iterations=200, render=True) + example_general("alr_envs:ALRReacher-v0", seed=10, iterations=200, render=render) # Vectorized multiprocessing environments example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=2, seed=int('533D', 16), n_samples=2 * 200) diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py index f374a0d..2dca54e 100644 --- a/alr_envs/examples/examples_motion_primitives.py +++ b/alr_envs/examples/examples_motion_primitives.py @@ -148,14 +148,15 @@ def example_fully_custom_mp(seed=1, iterations=1, render=True): if __name__ == '__main__': + render = False # DMP - example_mp("alr_envs:HoleReacherDMP-v1", seed=10, iterations=1, render=True) + example_mp("alr_envs:HoleReacherDMP-v1", seed=10, iterations=1, render=render) # DetProMP - example_mp("alr_envs:HoleReacherDetPMP-v1", seed=10, iterations=1, render=True) + example_mp("alr_envs:HoleReacherDetPMP-v1", seed=10, iterations=1, render=render) # Altered basis functions - example_custom_mp("alr_envs:HoleReacherDMP-v1", seed=10, iterations=1, render=True) + example_custom_mp("alr_envs:HoleReacherDMP-v1", seed=10, iterations=1, render=render) # Custom MP - example_fully_custom_mp(seed=10, iterations=1, render=True) + example_fully_custom_mp(seed=10, iterations=1, render=render) diff --git a/alr_envs/mujoco/__init__.py b/alr_envs/mujoco/__init__.py index 82f3784..d86e772 100644 --- a/alr_envs/mujoco/__init__.py +++ b/alr_envs/mujoco/__init__.py @@ -1,4 +1,4 @@ from alr_envs.mujoco.reacher.alr_reacher import ALRReacherEnv -from alr_envs.mujoco.balancing import BalancingEnv -# from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +from alr_envs.mujoco.reacher.balancing import BalancingEnv +from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv from alr_envs.mujoco.ball_in_a_cup.biac_pd import ALRBallInACupPDEnv diff --git a/alr_envs/mujoco/balancing.py b/alr_envs/mujoco/reacher/balancing.py similarity index 100% rename from alr_envs/mujoco/balancing.py rename to alr_envs/mujoco/reacher/balancing.py diff --git a/alr_envs/stochastic_search/__init__.py b/alr_envs/stochastic_search/__init__.py deleted file mode 100644 index 257680f..0000000 --- a/alr_envs/stochastic_search/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from alr_envs.stochastic_search.stochastic_search import StochasticSearchEnv diff --git a/alr_envs/stochastic_search/functions/f_base.py b/alr_envs/stochastic_search/functions/f_base.py deleted file mode 100644 index 31b4323..0000000 --- a/alr_envs/stochastic_search/functions/f_base.py +++ /dev/null @@ -1,76 +0,0 @@ -import numpy as np -import scipy.stats as scistats - -np.seterr(divide='ignore', invalid='ignore') - - -class BaseObjective(object): - def __init__(self, dim, int_opt=None, val_opt=None, alpha=None, beta=None): - self.dim = dim - self.alpha = alpha - self.beta = beta - # check if optimal parameter is in interval... - if int_opt is not None: - self.x_opt = np.random.uniform(int_opt[0], int_opt[1], size=(1, dim)) - # ... or based on a single value - elif val_opt is not None: - self.one_pm = np.where(np.random.rand(1, dim) > 0.5, 1, -1) - self.x_opt = val_opt * self.one_pm - else: - raise ValueError("Optimal value or interval has to be defined") - self.f_opt = np.round(np.clip(scistats.cauchy.rvs(loc=0, scale=100, size=1)[0], -1000, 1000), decimals=2) - self.i = np.arange(self.dim) - self._lambda_alpha = None - self._q = None - self._r = None - - def __call__(self, x): - return self.evaluate_full(x) - - def evaluate_full(self, x): - raise NotImplementedError("Subclasses should implement this!") - - def gs(self): - # Gram Schmidt ortho-normalization - a = np.random.randn(self.dim, self.dim) - b, _ = np.linalg.qr(a) - return b - - # TODO: property probably unnecessary - @property - def q(self): - if self._q is None: - self._q = self.gs() - return self._q - - @property - def r(self): - if self._r is None: - self._r = self.gs() - return self._r - - @property - def lambda_alpha(self): - if self._lambda_alpha is None: - if isinstance(self.alpha, int): - lambda_ii = np.power(self.alpha, 1 / 2 * self.i / (self.dim - 1)) - self._lambda_alpha = np.diag(lambda_ii) - else: - lambda_ii = np.power(self.alpha[:, None], 1 / 2 * self.i[None, :] / (self.dim - 1)) - self._lambda_alpha = np.stack([np.diag(l_ii) for l_ii in lambda_ii]) - return self._lambda_alpha - - @staticmethod - def f_pen(x): - return np.sum(np.maximum(0, np.abs(x) - 5), axis=1) - - def t_asy_beta(self, x): - # exp = np.power(x, 1 + self.beta * self.i[:, None] / (self.input_dim - 1) * np.sqrt(x)) - # return np.where(x > 0, exp, x) - return x - - def t_osz(self, x): - x_hat = np.where(x != 0, np.log(np.abs(x)), 0) - c_1 = np.where(x > 0, 10, 5.5) - c_2 = np.where(x > 0, 7.9, 3.1) - return np.sign(x) * np.exp(x_hat + 0.049 * (np.sin(c_1 * x_hat) + np.sin(c_2 * x_hat))) diff --git a/alr_envs/stochastic_search/functions/f_rosenbrock.py b/alr_envs/stochastic_search/functions/f_rosenbrock.py deleted file mode 100644 index a0f6bc4..0000000 --- a/alr_envs/stochastic_search/functions/f_rosenbrock.py +++ /dev/null @@ -1,56 +0,0 @@ -import numpy as np - -from alr_envs.stochastic_search.functions.f_base import BaseObjective - - -class Rosenbrock(BaseObjective): - def __init__(self, dim, int_opt=(-3., 3.)): - super(Rosenbrock, self).__init__(dim, int_opt=int_opt) - self.c = np.maximum(1, np.sqrt(self.dim) / 8) - - def evaluate_full(self, x): - x = np.atleast_2d(x) - assert x.shape[1] == self.dim - - z = self.c * (x - self.x_opt) + 1 - z_end = z[:, 1:] - z_begin = z[:, :-1] - - a = z_begin ** 2 - z_end - b = z_begin - 1 - - return np.sum(100 * a ** 2 + b ** 2, axis=1) + self.f_opt - - -class RosenbrockRotated(BaseObjective): - def __init__(self, dim, int_opt=(-3., 3.)): - super(RosenbrockRotated, self).__init__(dim, int_opt=int_opt) - self.c = np.maximum(1, np.sqrt(self.dim) / 8) - - def evaluate_full(self, x): - x = np.atleast_2d(x) - assert x.shape[1] == self.dim - - z = (self.c * self.r @ x.T + 1 / 2).T - a = z[:, :-1] ** 2 - z[:, 1:] - b = z[:, :-1] - 1 - - return np.sum(100 * a ** 2 + b ** 2, axis=1) + self.f_opt - - -class RosenbrockRaw(BaseObjective): - def __init__(self, dim, int_opt=(-3., 3.)): - super(RosenbrockRaw, self).__init__(dim, int_opt=int_opt) - self.x_opt = np.ones((1, dim)) - self.f_opt = 0 - - def evaluate_full(self, x): - x = np.atleast_2d(x) - assert x.shape[1] == self.dim - - a = x[:, :-1] ** 2 - x[:, 1:] - b = x[:, :-1] - 1 - - out = np.sum(100 * a ** 2 + b ** 2, axis=1) - - return out diff --git a/alr_envs/stochastic_search/stochastic_search.py b/alr_envs/stochastic_search/stochastic_search.py deleted file mode 100644 index fd9af8d..0000000 --- a/alr_envs/stochastic_search/stochastic_search.py +++ /dev/null @@ -1,22 +0,0 @@ -import gym -import numpy as np - -from alr_envs.stochastic_search.functions.f_base import BaseObjective - - -class StochasticSearchEnv(gym.Env): - - def __init__(self, cost_f: BaseObjective): - self.cost_f = cost_f - - self.action_space = gym.spaces.Box(low=-np.inf, high=np.inf, shape=(self.cost_f.dim,), dtype=np.float64) - self.observation_space = gym.spaces.Box(low=(), high=(), shape=(), dtype=np.float64) - - def step(self, action): - return np.zeros(self.observation_space.shape), np.squeeze(-self.cost_f(action)), True, {} - - def reset(self): - return np.zeros(self.observation_space.shape) - - def render(self, mode='human'): - pass diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 7c39126..0ba9dea 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -49,6 +49,8 @@ def make_env(env_id: str, seed, **kwargs): # Gym env = gym.make(env_id, **kwargs) env.seed(seed) + env.action_space.seed(seed) + env.observation_space.seed(seed) except gym.error.Error: # DMC from alr_envs.utils import make @@ -79,7 +81,7 @@ def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]], seed=1 _env = make_env(env_id, seed, **kwargs) assert any(issubclass(w, MPEnvWrapper) for w in wrappers), \ - "At least an MPEnvWrapper is required in order to leverage motion primitive environments." + "At least one MPEnvWrapper is required in order to leverage motion primitive environments." for w in wrappers: _env = w(_env) diff --git a/setup.py b/setup.py index b30ce41..6c3c658 100644 --- a/setup.py +++ b/setup.py @@ -17,5 +17,6 @@ setup( license='MIT', author='Fabian Otto, Marcel Sandermann, Maximilian Huettenrauch', author_email='', - description='Custom Gym environments for various (robotics) simple_reacher.' + description='Custom Gym environments for various (robotics) tasks. integration of DMC environments into the' + 'gym interface, and support for using motion primitives with gym environments.' ) From 7c92c0b92afd99b9574f7a992cf861c1eb8fb790 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 26 Jul 2021 17:07:25 +0200 Subject: [PATCH 38/56] added DMC Reacher, cartpole, reach_size; removed BBO --- alr_envs/dmc/suite/cartpole/__init__.py | 0 .../dmc/suite/cartpole/cartpole_mp_wrapper.py | 51 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 alr_envs/dmc/suite/cartpole/__init__.py create mode 100644 alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py diff --git a/alr_envs/dmc/suite/cartpole/__init__.py b/alr_envs/dmc/suite/cartpole/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py b/alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py new file mode 100644 index 0000000..d8f8493 --- /dev/null +++ b/alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py @@ -0,0 +1,51 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper + + +class DMCCartpoleMPWrapper(MPEnvWrapper): + + def __init__(self, env, n_poles: int = 1): + self.n_poles = n_poles + super().__init__(env) + + + @property + def active_obs(self): + # Besides the ball position, the environment is always set to 0. + return np.hstack([ + [True], # slider position + [True] * 2 * self.n_poles, # sin/cos hinge angles + [True], # slider velocity + [True] * self.n_poles, # hinge velocities + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.env.physics.named.data.qpos["slider"] + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.physics.named.data.qvel["slider"] + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt + + +class DMCCartpoleTwoPolesMPWrapper(DMCCartpoleMPWrapper): + + def __init__(self, env): + super().__init__(env, n_poles=2) + + +class DMCCartpoleThreePolesMPWrapper(DMCCartpoleMPWrapper): + + def __init__(self, env): + super().__init__(env, n_poles=3) From 0dec89ff178bed3ef00c9054269c893c963a85f8 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 26 Jul 2021 17:07:45 +0200 Subject: [PATCH 39/56] Added basic test cases for functionality and determinism --- test/__init__.py | 0 test/test_envs.py | 108 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 test/__init__.py create mode 100644 test/test_envs.py diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test_envs.py b/test/test_envs.py new file mode 100644 index 0000000..addd1a3 --- /dev/null +++ b/test/test_envs.py @@ -0,0 +1,108 @@ +import unittest + +import gym +import numpy as np + +import alr_envs # noqa +from alr_envs.utils.make_env_helpers import make_env + +ALL_SPECS = list(spec for spec in gym.envs.registry.all() if "alr_envs" in spec.entry_point) +SEED = 1 + + +class TestEnvironments(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 `domain_name-task_name` or + for manipulation tasks as `manipulation-environment_name` + + Args: + env_id: Either `domain_name-task_name` or `manipulation-environment_name` + iterations: Number of rollout steps to run + seed= random seeding + render: Render the episode + + Returns: + + """ + env: gym.Env = make_env(env_id, seed=seed) + rewards = [] + observations = [] + dones = [] + obs = env.reset() + self._verify_observations(obs, env.observation_space, "reset()") + + length = env.spec.max_episode_steps + if iterations is None: + if length is None: + iterations = 1 + else: + iterations = length + + # number of samples(multiple environment steps) + for i in range(iterations): + observations.append(obs) + + ac = env.action_space.sample() + # 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: + obs = env.reset() + + observations.append(obs) + env.close() + del env + return np.array(observations), np.array(rewards), np.array(dones) + + 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_environment_functionality(self): + """Tests that environments runs without errors using random actions.""" + for spec in ALL_SPECS: + # try: + with self.subTest(msg=spec.id): + self._run_env(spec.id) + + def test_environment_determinism(self): + """Tests that identical seeds produce identical trajectories.""" + seed = 0 + # Iterate over two trajectories generated using identical sequences of + # random actions, and with identical task random states. Check that the + # observations, rewards, discounts and step types are identical. + for spec in ALL_SPECS: + # try: + with self.subTest(msg=spec.id): + self._run_env(spec.id) + traj1 = self._run_env(spec.id, seed=seed) + traj2 = self._run_env(spec.id, seed=seed) + for i, time_step in enumerate(zip(*traj1, *traj2)): + obs1, rwd1, done1, obs2, rwd2, done2 = time_step + self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] {obs1} and {obs2} 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.") + + +if __name__ == '__main__': + unittest.main() From a11965827db6099f4ac1b54f7ebb9ea9e49e31fd Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 30 Jul 2021 11:59:02 +0200 Subject: [PATCH 40/56] fixed OpenAI fetch tasks; added nicer imports --- alr_envs/__init__.py | 159 ++++++++++-------- .../classic_control/hole_reacher/__init__.py | 1 + ...le_reacher_mp_wrapper.py => mp_wrapper.py} | 4 +- .../simple_reacher/__init__.py | 1 + ...le_reacher_mp_wrapper.py => mp_wrapper.py} | 4 +- .../viapoint_reacher/__init__.py | 1 + ...nt_reacher_mp_wrapper.py => mp_wrapper.py} | 4 +- alr_envs/dmc/__init__.py | 5 + alr_envs/dmc/manipulation/reach/__init__.py | 1 + .../{reach_mp_wrapper.py => mp_wrapper.py} | 4 +- alr_envs/dmc/suite/ball_in_cup/__init__.py | 1 + ...all_in_cup_mp_wrapper.py => mp_wrapper.py} | 4 +- alr_envs/dmc/suite/cartpole/__init__.py | 3 + .../{cartpole_mp_wrapper.py => mp_wrapper.py} | 8 +- alr_envs/dmc/suite/reacher/__init__.py | 1 + .../{reacher_mp_wrapper.py => mp_wrapper.py} | 4 +- alr_envs/examples/examples_dmc.py | 13 +- alr_envs/examples/examples_general.py | 8 +- .../examples/examples_motion_primitives.py | 4 +- alr_envs/examples/pd_control_gain_tuning.py | 74 ++++++++ .../ball_in_a_cup/ball_in_a_cup_mp_wrapper.py | 2 +- alr_envs/open_ai/__init__.py | 3 + alr_envs/open_ai/classic_control/__init__.py | 0 .../continuous_mountain_car/__init__.py | 1 + .../continuous_mountain_car/mp_wrapper.py | 2 +- .../continuous_mountain_car/__init__.py | 1 - alr_envs/open_ai/fetch/__init__.py | 1 - alr_envs/open_ai/fetch/mp_wrapper.py | 22 --- alr_envs/open_ai/mujoco/__init__.py | 0 .../open_ai/mujoco/reacher_v2/__init__.py | 1 + .../{ => mujoco}/reacher_v2/mp_wrapper.py | 2 +- alr_envs/open_ai/reacher_v2/__init__.py | 1 - alr_envs/open_ai/robotics/__init__.py | 0 alr_envs/open_ai/robotics/fetch/__init__.py | 1 + alr_envs/open_ai/robotics/fetch/mp_wrapper.py | 49 ++++++ alr_envs/utils/__init__.py | 3 +- .../{dmc2gym_wrapper.py => dmc_wrapper.py} | 45 ++--- alr_envs/utils/make_env_helpers.py | 27 ++- alr_envs/utils/utils.py | 3 +- setup.py | 2 +- test/test_envs.py | 5 +- 41 files changed, 316 insertions(+), 159 deletions(-) rename alr_envs/classic_control/hole_reacher/{hole_reacher_mp_wrapper.py => mp_wrapper.py} (90%) rename alr_envs/classic_control/simple_reacher/{simple_reacher_mp_wrapper.py => mp_wrapper.py} (89%) rename alr_envs/classic_control/viapoint_reacher/{viapoint_reacher_mp_wrapper.py => mp_wrapper.py} (89%) rename alr_envs/dmc/manipulation/reach/{reach_mp_wrapper.py => mp_wrapper.py} (90%) rename alr_envs/dmc/suite/ball_in_cup/{ball_in_cup_mp_wrapper.py => mp_wrapper.py} (90%) rename alr_envs/dmc/suite/cartpole/{cartpole_mp_wrapper.py => mp_wrapper.py} (83%) rename alr_envs/dmc/suite/reacher/{reacher_mp_wrapper.py => mp_wrapper.py} (88%) create mode 100644 alr_envs/examples/pd_control_gain_tuning.py create mode 100644 alr_envs/open_ai/classic_control/__init__.py create mode 100644 alr_envs/open_ai/classic_control/continuous_mountain_car/__init__.py rename alr_envs/open_ai/{ => classic_control}/continuous_mountain_car/mp_wrapper.py (85%) delete mode 100644 alr_envs/open_ai/continuous_mountain_car/__init__.py delete mode 100644 alr_envs/open_ai/fetch/__init__.py delete mode 100644 alr_envs/open_ai/fetch/mp_wrapper.py create mode 100644 alr_envs/open_ai/mujoco/__init__.py create mode 100644 alr_envs/open_ai/mujoco/reacher_v2/__init__.py rename alr_envs/open_ai/{ => mujoco}/reacher_v2/mp_wrapper.py (78%) delete mode 100644 alr_envs/open_ai/reacher_v2/__init__.py create mode 100644 alr_envs/open_ai/robotics/__init__.py create mode 100644 alr_envs/open_ai/robotics/fetch/__init__.py create mode 100644 alr_envs/open_ai/robotics/fetch/mp_wrapper.py rename alr_envs/utils/{dmc2gym_wrapper.py => dmc_wrapper.py} (88%) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index cfa6251..5a92082 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -1,15 +1,12 @@ -import numpy as np from gym.envs.registration import register +from gym.wrappers import FlattenObservation -from alr_envs.classic_control.hole_reacher.hole_reacher_mp_wrapper import HoleReacherMPWrapper -from alr_envs.classic_control.simple_reacher.simple_reacher_mp_wrapper import SimpleReacherMPWrapper -from alr_envs.classic_control.viapoint_reacher.viapoint_reacher_mp_wrapper import ViaPointReacherMPWrapper -from alr_envs.dmc.manipulation.reach.reach_mp_wrapper import DMCReachSiteMPWrapper -from alr_envs.dmc.suite.ball_in_cup.ball_in_cup_mp_wrapper import DMCBallInCupMPWrapper -from alr_envs.dmc.suite.cartpole.cartpole_mp_wrapper import DMCCartpoleMPWrapper, DMCCartpoleThreePolesMPWrapper, \ - DMCCartpoleTwoPolesMPWrapper -from alr_envs.open_ai import reacher_v2, continuous_mountain_car, fetch -from alr_envs.dmc.suite.reacher.reacher_mp_wrapper import DMCReacherMPWrapper +from alr_envs import classic_control, dmc, open_ai + +from alr_envs.utils.make_env_helpers import make_dmp_env +from alr_envs.utils.make_env_helpers import make_detpmp_env +from alr_envs.utils.make_env_helpers import make_env +from alr_envs.utils.make_env_helpers import make_env_rank # Mujoco @@ -206,7 +203,7 @@ for v in versions: # max_episode_steps=1, kwargs={ "name": f"alr_envs:{v}", - "wrappers": [SimpleReacherMPWrapper], + "wrappers": [classic_control.simple_reacher.MPWrapper], "mp_kwargs": { "num_dof": 2 if "long" not in v.lower() else 5, "num_basis": 5, @@ -225,7 +222,7 @@ register( # max_episode_steps=1, kwargs={ "name": "alr_envs:ViaPointReacher-v0", - "wrappers": [ViaPointReacherMPWrapper], + "wrappers": [classic_control.viapoint_reacher.MPWrapper], "mp_kwargs": { "num_dof": 5, "num_basis": 5, @@ -238,6 +235,25 @@ register( } ) +register( + id='ViaPointReacherDetPMP-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": "alr_envs:ViaPointReacher-v0", + "wrappers": [classic_control.viapoint_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } + } +) + ## Hole Reacher versions = ["v0", "v1", "v2"] for v in versions: @@ -247,7 +263,7 @@ for v in versions: # max_episode_steps=1, kwargs={ "name": f"alr_envs:HoleReacher-{v}", - "wrappers": [HoleReacherMPWrapper], + "wrappers": [classic_control.hole_reacher.MPWrapper], "mp_kwargs": { "num_dof": 5, "num_basis": 5, @@ -267,7 +283,7 @@ for v in versions: entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"alr_envs:HoleReacher-{v}", - "wrappers": [HoleReacherMPWrapper], + "wrappers": [classic_control.hole_reacher.MPWrapper], "mp_kwargs": { "num_dof": 5, "num_basis": 5, @@ -283,11 +299,6 @@ for v in versions: ## Deep Mind Control Suite (DMC) ### Suite -# tasks = ["ball_in_cup-catch", "reacher-easy", "reacher-hard", "cartpole-balance", "cartpole-balance_sparse", -# "cartpole-swingup", "cartpole-swingup_sparse", "cartpole-two_poles", "cartpole-three_poles"] -# wrappers = [DMCBallInCupMPWrapper, DMCReacherMPWrapper, DMCReacherMPWrapper, DMCCartpoleMPWrapper, -# partial(DMCCartpoleMPWrapper)] -# for t, w in zip(tasks, wrappers): register( id=f'dmc_ball_in_cup-catch_dmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', @@ -296,7 +307,7 @@ register( "name": f"ball_in_cup-catch", "time_limit": 1, "episode_length": 50, - "wrappers": [DMCBallInCupMPWrapper], + "wrappers": [dmc.suite.ball_in_cup.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, @@ -322,7 +333,7 @@ register( "name": f"ball_in_cup-catch", "time_limit": 1, "episode_length": 50, - "wrappers": [DMCBallInCupMPWrapper], + "wrappers": [dmc.suite.ball_in_cup.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, @@ -339,7 +350,7 @@ register( } ) -# TODO tune gains and episode length for all below +# TODO tune episode length for all below register( id=f'dmc_reacher-easy_dmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', @@ -348,7 +359,7 @@ register( "name": f"reacher-easy", "time_limit": 1, "episode_length": 50, - "wrappers": [DMCReacherMPWrapper], + "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, @@ -374,7 +385,7 @@ register( "name": f"reacher-easy", "time_limit": 1, "episode_length": 50, - "wrappers": [DMCReacherMPWrapper], + "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, @@ -399,7 +410,7 @@ register( "name": f"reacher-hard", "time_limit": 1, "episode_length": 50, - "wrappers": [DMCReacherMPWrapper], + "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, @@ -425,7 +436,7 @@ register( "name": f"reacher-hard", "time_limit": 1, "episode_length": 50, - "wrappers": [DMCReacherMPWrapper], + "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, @@ -448,8 +459,9 @@ register( kwargs={ "name": f"cartpole-balance", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -461,8 +473,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -474,8 +486,9 @@ register( kwargs={ "name": f"cartpole-balance", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -485,8 +498,8 @@ register( "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -498,8 +511,9 @@ register( kwargs={ "name": f"cartpole-balance_sparse", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -511,8 +525,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -524,8 +538,9 @@ register( kwargs={ "name": f"cartpole-balance_sparse", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -535,8 +550,8 @@ register( "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -549,8 +564,9 @@ register( kwargs={ "name": f"cartpole-swingup", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -562,8 +578,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -575,8 +591,9 @@ register( kwargs={ "name": f"cartpole-swingup", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -586,8 +603,8 @@ register( "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -599,8 +616,9 @@ register( kwargs={ "name": f"cartpole-swingup_sparse", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -612,8 +630,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -625,8 +643,9 @@ register( kwargs={ "name": f"cartpole-swingup_sparse", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, - "wrappers": [DMCCartpoleMPWrapper], + "wrappers": [dmc.suite.cartpole.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -636,8 +655,8 @@ register( "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -649,9 +668,10 @@ register( kwargs={ "name": f"cartpole-two_poles", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=2)], - "wrappers": [DMCCartpoleTwoPolesMPWrapper], + "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -663,8 +683,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -676,9 +696,10 @@ register( kwargs={ "name": f"cartpole-two_poles", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=2)], - "wrappers": [DMCCartpoleTwoPolesMPWrapper], + "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -688,8 +709,8 @@ register( "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -701,9 +722,10 @@ register( kwargs={ "name": f"cartpole-three_poles", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=3)], - "wrappers": [DMCCartpoleThreePolesMPWrapper], + "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -715,8 +737,8 @@ register( "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -728,9 +750,10 @@ register( kwargs={ "name": f"cartpole-three_poles", # "time_limit": 1, + "camera_id": 0, "episode_length": 1000, # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=3)], - "wrappers": [DMCCartpoleThreePolesMPWrapper], + "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 5, @@ -740,8 +763,8 @@ register( "weights_scale": 0.2, "zero_start": True, "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 + "p_gains": 10, + "d_gains": 10 } } } @@ -757,7 +780,7 @@ register( "name": f"manipulation-reach_site_features", # "time_limit": 1, "episode_length": 250, - "wrappers": [DMCReachSiteMPWrapper], + "wrappers": [dmc.manipulation.reach.MPWrapper], "mp_kwargs": { "num_dof": 9, "num_basis": 5, @@ -779,7 +802,7 @@ register( "name": f"manipulation-reach_site_features", # "time_limit": 1, "episode_length": 250, - "wrappers": [DMCReachSiteMPWrapper], + "wrappers": [dmc.manipulation.reach.MPWrapper], "mp_kwargs": { "num_dof": 9, "num_basis": 5, @@ -798,7 +821,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.classic_control:MountainCarContinuous-v0", - "wrappers": [continuous_mountain_car.MPWrapper], + "wrappers": [open_ai.classic_control.continuous_mountain_car.MPWrapper], "mp_kwargs": { "num_dof": 1, "num_basis": 4, @@ -819,7 +842,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.mujoco:Reacher-v2", - "wrappers": [reacher_v2.MPWrapper], + "wrappers": [open_ai.mujoco.reacher_v2.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 6, @@ -840,7 +863,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.robotics:FetchSlideDense-v1", - "wrappers": [fetch.MPWrapper], + "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], "mp_kwargs": { "num_dof": 4, "num_basis": 5, @@ -857,7 +880,7 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": "gym.envs.robotics:FetchReachDense-v1", - "wrappers": [fetch.MPWrapper], + "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], "mp_kwargs": { "num_dof": 4, "num_basis": 5, diff --git a/alr_envs/classic_control/hole_reacher/__init__.py b/alr_envs/classic_control/hole_reacher/__init__.py index e69de29..c5e6d2f 100644 --- a/alr_envs/classic_control/hole_reacher/__init__.py +++ b/alr_envs/classic_control/hole_reacher/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py b/alr_envs/classic_control/hole_reacher/mp_wrapper.py similarity index 90% rename from alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py rename to alr_envs/classic_control/hole_reacher/mp_wrapper.py index 12b5d19..d951161 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/hole_reacher/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class HoleReacherMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): @property def active_obs(self): return np.hstack([ diff --git a/alr_envs/classic_control/simple_reacher/__init__.py b/alr_envs/classic_control/simple_reacher/__init__.py index e69de29..989b5a9 100644 --- a/alr_envs/classic_control/simple_reacher/__init__.py +++ b/alr_envs/classic_control/simple_reacher/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py b/alr_envs/classic_control/simple_reacher/mp_wrapper.py similarity index 89% rename from alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py rename to alr_envs/classic_control/simple_reacher/mp_wrapper.py index 40426cf..4b71e3a 100644 --- a/alr_envs/classic_control/simple_reacher/simple_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/simple_reacher/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class SimpleReacherMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): @property def active_obs(self): return np.hstack([ diff --git a/alr_envs/classic_control/viapoint_reacher/__init__.py b/alr_envs/classic_control/viapoint_reacher/__init__.py index e69de29..989b5a9 100644 --- a/alr_envs/classic_control/viapoint_reacher/__init__.py +++ b/alr_envs/classic_control/viapoint_reacher/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py b/alr_envs/classic_control/viapoint_reacher/mp_wrapper.py similarity index 89% rename from alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py rename to alr_envs/classic_control/viapoint_reacher/mp_wrapper.py index a4a6ba3..6b3e85d 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher_mp_wrapper.py +++ b/alr_envs/classic_control/viapoint_reacher/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class ViaPointReacherMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): @property def active_obs(self): return np.hstack([ diff --git a/alr_envs/dmc/__init__.py b/alr_envs/dmc/__init__.py index e69de29..c5a343d 100644 --- a/alr_envs/dmc/__init__.py +++ b/alr_envs/dmc/__init__.py @@ -0,0 +1,5 @@ +# from alr_envs.dmc import manipulation, suite +from alr_envs.dmc.suite import ball_in_cup +from alr_envs.dmc.suite import reacher +from alr_envs.dmc.suite import cartpole +from alr_envs.dmc.manipulation import reach \ No newline at end of file diff --git a/alr_envs/dmc/manipulation/reach/__init__.py b/alr_envs/dmc/manipulation/reach/__init__.py index e69de29..989b5a9 100644 --- a/alr_envs/dmc/manipulation/reach/__init__.py +++ b/alr_envs/dmc/manipulation/reach/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py b/alr_envs/dmc/manipulation/reach/mp_wrapper.py similarity index 90% rename from alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py rename to alr_envs/dmc/manipulation/reach/mp_wrapper.py index 612b44d..2d03f7b 100644 --- a/alr_envs/dmc/manipulation/reach/reach_mp_wrapper.py +++ b/alr_envs/dmc/manipulation/reach/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class DMCReachSiteMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): @property def active_obs(self): diff --git a/alr_envs/dmc/suite/ball_in_cup/__init__.py b/alr_envs/dmc/suite/ball_in_cup/__init__.py index e69de29..989b5a9 100644 --- a/alr_envs/dmc/suite/ball_in_cup/__init__.py +++ b/alr_envs/dmc/suite/ball_in_cup/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/dmc/suite/ball_in_cup/ball_in_cup_mp_wrapper.py b/alr_envs/dmc/suite/ball_in_cup/mp_wrapper.py similarity index 90% rename from alr_envs/dmc/suite/ball_in_cup/ball_in_cup_mp_wrapper.py rename to alr_envs/dmc/suite/ball_in_cup/mp_wrapper.py index 514f6f1..fb068b3 100644 --- a/alr_envs/dmc/suite/ball_in_cup/ball_in_cup_mp_wrapper.py +++ b/alr_envs/dmc/suite/ball_in_cup/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class DMCBallInCupMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): @property def active_obs(self): diff --git a/alr_envs/dmc/suite/cartpole/__init__.py b/alr_envs/dmc/suite/cartpole/__init__.py index e69de29..823077a 100644 --- a/alr_envs/dmc/suite/cartpole/__init__.py +++ b/alr_envs/dmc/suite/cartpole/__init__.py @@ -0,0 +1,3 @@ +from .mp_wrapper import MPWrapper +from .mp_wrapper import TwoPolesMPWrapper +from .mp_wrapper import ThreePolesMPWrapper \ No newline at end of file diff --git a/alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py b/alr_envs/dmc/suite/cartpole/mp_wrapper.py similarity index 83% rename from alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py rename to alr_envs/dmc/suite/cartpole/mp_wrapper.py index d8f8493..1ca99f5 100644 --- a/alr_envs/dmc/suite/cartpole/cartpole_mp_wrapper.py +++ b/alr_envs/dmc/suite/cartpole/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class DMCCartpoleMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): def __init__(self, env, n_poles: int = 1): self.n_poles = n_poles @@ -39,13 +39,13 @@ class DMCCartpoleMPWrapper(MPEnvWrapper): return self.env.dt -class DMCCartpoleTwoPolesMPWrapper(DMCCartpoleMPWrapper): +class TwoPolesMPWrapper(MPWrapper): def __init__(self, env): super().__init__(env, n_poles=2) -class DMCCartpoleThreePolesMPWrapper(DMCCartpoleMPWrapper): +class ThreePolesMPWrapper(MPWrapper): def __init__(self, env): super().__init__(env, n_poles=3) diff --git a/alr_envs/dmc/suite/reacher/__init__.py b/alr_envs/dmc/suite/reacher/__init__.py index e69de29..989b5a9 100644 --- a/alr_envs/dmc/suite/reacher/__init__.py +++ b/alr_envs/dmc/suite/reacher/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py b/alr_envs/dmc/suite/reacher/mp_wrapper.py similarity index 88% rename from alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py rename to alr_envs/dmc/suite/reacher/mp_wrapper.py index 17baf04..86bc992 100644 --- a/alr_envs/dmc/suite/reacher/reacher_mp_wrapper.py +++ b/alr_envs/dmc/suite/reacher/mp_wrapper.py @@ -2,10 +2,10 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper -class DMCReacherMPWrapper(MPEnvWrapper): +class MPWrapper(MPEnvWrapper): @property def active_obs(self): diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index 6e24d83..b29329d 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -1,5 +1,5 @@ -from alr_envs.dmc.suite.ball_in_cup.ball_in_cup_mp_wrapper import DMCBallInCupMPWrapper -from alr_envs.utils.make_env_helpers import make_dmp_env, make_env +import alr_envs +from alr_envs.dmc.suite.ball_in_cup.mp_wrapper import MPWrapper def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): @@ -17,13 +17,12 @@ def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): Returns: """ - env = make_env(env_id, seed) + env = alr_envs.make_env(env_id, seed) rewards = 0 obs = env.reset() print("observation shape:", env.observation_space.shape) print("action shape:", env.action_space.shape) - # number of samples(multiple environment steps) for i in range(iterations): ac = env.action_space.sample() obs, reward, done, info = env.step(ac) @@ -63,7 +62,7 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. - wrappers = [DMCBallInCupMPWrapper] + wrappers = [MPWrapper] mp_kwargs = { "num_dof": 2, "num_basis": 5, @@ -84,9 +83,9 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): "episode_length": 1000, # "frame_skip": 1 } - env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs, **kwargs) + env = alr_envs.make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs, **kwargs) # OR for a deterministic ProMP: - # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_args) + # env = alr_envs.make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_args) # This renders the full MP trajectory # It is only required to call render() once in the beginning, which renders every consecutive trajectory. diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index d237c03..88d79d5 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -1,11 +1,9 @@ -import warnings from collections import defaultdict import gym import numpy as np -from alr_envs.utils.make_env_helpers import make_env, make_env_rank -from alr_envs.utils.mp_env_async_sampler import AlrContextualMpEnvSampler, AlrMpEnvSampler, DummyDist +import alr_envs def example_general(env_id="Pendulum-v0", seed=1, iterations=1000, render=True): @@ -23,7 +21,7 @@ def example_general(env_id="Pendulum-v0", seed=1, iterations=1000, render=True): """ - env = make_env(env_id, seed) + env = alr_envs.make_env(env_id, seed) rewards = 0 obs = env.reset() print("Observation shape: ", env.observation_space.shape) @@ -58,7 +56,7 @@ def example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=4, seed=int('533D', 16 Returns: Tuple of (obs, reward, done, info) with type np.ndarray """ - env = gym.vector.AsyncVectorEnv([make_env_rank(env_id, seed, i) for i in range(n_cpu)]) + env = gym.vector.AsyncVectorEnv([alr_envs.make_env_rank(env_id, seed, i) for i in range(n_cpu)]) # OR # envs = gym.vector.AsyncVectorEnv([make_env(env_id, seed + i) for i in range(n_cpu)]) diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py index 2dca54e..480b58d 100644 --- a/alr_envs/examples/examples_motion_primitives.py +++ b/alr_envs/examples/examples_motion_primitives.py @@ -1,4 +1,4 @@ -from alr_envs import HoleReacherMPWrapper +from alr_envs import MPWrapper from alr_envs.utils.make_env_helpers import make_dmp_env, make_env @@ -113,7 +113,7 @@ def example_fully_custom_mp(seed=1, iterations=1, render=True): # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. - wrappers = [HoleReacherMPWrapper] + wrappers = [MPWrapper] mp_kwargs = { "num_dof": 5, "num_basis": 5, diff --git a/alr_envs/examples/pd_control_gain_tuning.py b/alr_envs/examples/pd_control_gain_tuning.py new file mode 100644 index 0000000..55ab1c0 --- /dev/null +++ b/alr_envs/examples/pd_control_gain_tuning.py @@ -0,0 +1,74 @@ +import numpy as np +from matplotlib import pyplot as plt + +from alr_envs import dmc +from alr_envs.utils.make_env_helpers import make_detpmp_env + +# This might work for some environments, however, please verify either way the correct trajectory information +# for your environment are extracted below +SEED = 10 +env_id = "cartpole-swingup" +wrappers = [dmc.suite.cartpole.MPWrapper] + +mp_kwargs = { + "num_dof": 1, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 # a good starting point is the sqrt of p_gains + } +} + +kwargs = dict(time_limit=2, episode_length=200) + +env = make_detpmp_env(env_id, wrappers, seed=SEED, mp_kwargs=mp_kwargs, + **kwargs) + +# Plot difference between real trajectory and target MP trajectory +env.reset() +pos, vel = env.mp_rollout(env.action_space.sample()) + +base_shape = env.full_action_space.shape +actual_pos = np.zeros((len(pos), *base_shape)) +actual_pos_ball = np.zeros((len(pos), *base_shape)) +actual_vel = np.zeros((len(pos), *base_shape)) +act = np.zeros((len(pos), *base_shape)) + +for t, pos_vel in enumerate(zip(pos, vel)): + actions = env.policy.get_action(pos_vel[0], pos_vel[1]) + actions = np.clip(actions, env.full_action_space.low, env.full_action_space.high) + _, _, _, _ = env.env.step(actions) + act[t, :] = actions + # TODO verify for your environment + actual_pos[t, :] = env.current_pos + # actual_pos_ball[t, :] = env.physics.data.qpos[2:] + actual_vel[t, :] = env.current_vel + +plt.figure(figsize=(15, 5)) + +plt.subplot(131) +plt.title("Position") +plt.plot(actual_pos, c='C0', label=["true" if i == 0 else "" for i in range(np.prod(base_shape))]) +# plt.plot(actual_pos_ball, label="true pos ball") +plt.plot(pos, c='C1', label=["MP" if i == 0 else "" for i in range(np.prod(base_shape))]) +plt.xlabel("Episode steps") +plt.legend() + +plt.subplot(132) +plt.title("Velocity") +plt.plot(actual_vel, c='C0', label=[f"true" if i == 0 else "" for i in range(np.prod(base_shape))]) +plt.plot(vel, c='C1', label=[f"MP" if i == 0 else "" for i in range(np.prod(base_shape))]) +plt.xlabel("Episode steps") +plt.legend() + +plt.subplot(133) +plt.title("Actions") +plt.plot(act, c="C0"), # label=[f"actions" if i == 0 else "" for i in range(np.prod(base_action_shape))]) +plt.xlabel("Episode steps") +# plt.legend() +plt.show() diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py index 321358a..945fa8d 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py +++ b/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py @@ -2,7 +2,7 @@ from typing import Tuple, Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper class BallInACupMPWrapper(MPEnvWrapper): diff --git a/alr_envs/open_ai/__init__.py b/alr_envs/open_ai/__init__.py index e69de29..1e531cf 100644 --- a/alr_envs/open_ai/__init__.py +++ b/alr_envs/open_ai/__init__.py @@ -0,0 +1,3 @@ +from alr_envs.open_ai.mujoco import reacher_v2 +from alr_envs.open_ai.robotics import fetch +from alr_envs.open_ai.classic_control import continuous_mountain_car \ No newline at end of file diff --git a/alr_envs/open_ai/classic_control/__init__.py b/alr_envs/open_ai/classic_control/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/open_ai/classic_control/continuous_mountain_car/__init__.py b/alr_envs/open_ai/classic_control/continuous_mountain_car/__init__.py new file mode 100644 index 0000000..989b5a9 --- /dev/null +++ b/alr_envs/open_ai/classic_control/continuous_mountain_car/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py b/alr_envs/open_ai/classic_control/continuous_mountain_car/mp_wrapper.py similarity index 85% rename from alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py rename to alr_envs/open_ai/classic_control/continuous_mountain_car/mp_wrapper.py index 29378ed..2a2357a 100644 --- a/alr_envs/open_ai/continuous_mountain_car/mp_wrapper.py +++ b/alr_envs/open_ai/classic_control/continuous_mountain_car/mp_wrapper.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper class MPWrapper(MPEnvWrapper): diff --git a/alr_envs/open_ai/continuous_mountain_car/__init__.py b/alr_envs/open_ai/continuous_mountain_car/__init__.py deleted file mode 100644 index 36f731d..0000000 --- a/alr_envs/open_ai/continuous_mountain_car/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from alr_envs.open_ai.continuous_mountain_car.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/__init__.py b/alr_envs/open_ai/fetch/__init__.py deleted file mode 100644 index 2e68176..0000000 --- a/alr_envs/open_ai/fetch/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from alr_envs.open_ai.fetch.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/fetch/mp_wrapper.py b/alr_envs/open_ai/fetch/mp_wrapper.py deleted file mode 100644 index 6602a18..0000000 --- a/alr_envs/open_ai/fetch/mp_wrapper.py +++ /dev/null @@ -1,22 +0,0 @@ -from typing import Union - -import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper - - -class MPWrapper(MPEnvWrapper): - @property - def current_vel(self) -> Union[float, int, np.ndarray]: - return self.unwrapped._get_obs()["observation"][-5:-1] - - @property - def current_pos(self) -> Union[float, int, np.ndarray]: - return self.unwrapped._get_obs()["observation"][:4] - - @property - def goal_pos(self): - raise ValueError("Goal position is not available and has to be learnt based on the environment.") - - @property - def dt(self) -> Union[float, int]: - return self.env.dt \ No newline at end of file diff --git a/alr_envs/open_ai/mujoco/__init__.py b/alr_envs/open_ai/mujoco/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/open_ai/mujoco/reacher_v2/__init__.py b/alr_envs/open_ai/mujoco/reacher_v2/__init__.py new file mode 100644 index 0000000..989b5a9 --- /dev/null +++ b/alr_envs/open_ai/mujoco/reacher_v2/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/reacher_v2/mp_wrapper.py b/alr_envs/open_ai/mujoco/reacher_v2/mp_wrapper.py similarity index 78% rename from alr_envs/open_ai/reacher_v2/mp_wrapper.py rename to alr_envs/open_ai/mujoco/reacher_v2/mp_wrapper.py index d3181b5..16202e5 100644 --- a/alr_envs/open_ai/reacher_v2/mp_wrapper.py +++ b/alr_envs/open_ai/mujoco/reacher_v2/mp_wrapper.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper class MPWrapper(MPEnvWrapper): diff --git a/alr_envs/open_ai/reacher_v2/__init__.py b/alr_envs/open_ai/reacher_v2/__init__.py deleted file mode 100644 index 48a5615..0000000 --- a/alr_envs/open_ai/reacher_v2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from alr_envs.open_ai.reacher_v2.mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/robotics/__init__.py b/alr_envs/open_ai/robotics/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/alr_envs/open_ai/robotics/fetch/__init__.py b/alr_envs/open_ai/robotics/fetch/__init__.py new file mode 100644 index 0000000..989b5a9 --- /dev/null +++ b/alr_envs/open_ai/robotics/fetch/__init__.py @@ -0,0 +1 @@ +from .mp_wrapper import MPWrapper \ No newline at end of file diff --git a/alr_envs/open_ai/robotics/fetch/mp_wrapper.py b/alr_envs/open_ai/robotics/fetch/mp_wrapper.py new file mode 100644 index 0000000..218e175 --- /dev/null +++ b/alr_envs/open_ai/robotics/fetch/mp_wrapper.py @@ -0,0 +1,49 @@ +from typing import Union + +import numpy as np + +from mp_env_api import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + return np.hstack([ + [False] * 3, # achieved goal + [True] * 3, # desired/true goal + [False] * 3, # grip pos + [True, True, False] * int(self.has_object), # object position + [True, True, False] * int(self.has_object), # object relative position + [False] * 2, # gripper state + [False] * 3 * int(self.has_object), # object rotation + [False] * 3 * int(self.has_object), # object velocity position + [False] * 3 * int(self.has_object), # object velocity rotation + [False] * 3, # grip velocity position + [False] * 2, # gripper velocity + ]).astype(bool) + + @property + def current_vel(self) -> Union[float, int, np.ndarray]: + dt = self.sim.nsubsteps * self.sim.model.opt.timestep + grip_velp = self.sim.data.get_site_xvelp("robot0:grip") * dt + # gripper state should be symmetric for left and right. + # They are controlled with only one action for both gripper joints + gripper_state = self.sim.data.get_joint_qvel('robot0:r_gripper_finger_joint') * dt + return np.hstack([grip_velp, gripper_state]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + grip_pos = self.sim.data.get_site_xpos("robot0:grip") + # gripper state should be symmetric for left and right. + # They are controlled with only one action for both gripper joints + gripper_state = self.sim.data.get_joint_qpos('robot0:r_gripper_finger_joint') + return np.hstack([grip_pos, gripper_state]) + + @property + def goal_pos(self): + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index 77fdd9f..758d49f 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -37,7 +37,6 @@ def make( episode_length = 250 if domain_name == "manipulation" else 1000 max_episode_steps = (episode_length + frame_skip - 1) // frame_skip - if env_id not in gym.envs.registry.env_specs: task_kwargs = {'random': seed} # if seed is not None: @@ -46,7 +45,7 @@ def make( task_kwargs['time_limit'] = time_limit register( id=env_id, - entry_point='alr_envs.utils.dmc2gym_wrapper:DMCWrapper', + entry_point='alr_envs.utils.dmc_wrapper:DMCWrapper', kwargs=dict( domain_name=domain_name, task_name=task_name, diff --git a/alr_envs/utils/dmc2gym_wrapper.py b/alr_envs/utils/dmc_wrapper.py similarity index 88% rename from alr_envs/utils/dmc2gym_wrapper.py rename to alr_envs/utils/dmc_wrapper.py index 5e6a53d..10f1af9 100644 --- a/alr_envs/utils/dmc2gym_wrapper.py +++ b/alr_envs/utils/dmc_wrapper.py @@ -33,11 +33,14 @@ def _spec_to_box(spec): def _flatten_obs(obs: collections.MutableMapping): - # obs_pieces = [] - # for v in obs.values(): - # flat = np.array([v]) if np.isscalar(v) else v.ravel() - # obs_pieces.append(flat) - # return np.concatenate(obs_pieces, axis=0) + """ + Flattens an observation of type MutableMapping, e.g. a dict to a 1D array. + Args: + obs: observation to flatten + + Returns: 1D array of observation + + """ if not isinstance(obs, collections.MutableMapping): raise ValueError(f'Requires dict-like observations structure. {type(obs)} found.') @@ -52,19 +55,19 @@ def _flatten_obs(obs: collections.MutableMapping): class DMCWrapper(core.Env): def __init__( self, - domain_name, - task_name, - task_kwargs={}, - visualize_reward=True, - from_pixels=False, - height=84, - width=84, - camera_id=0, - frame_skip=1, - environment_kwargs=None, - channels_first=True + domain_name: str, + task_name: str, + task_kwargs: dict = {}, + visualize_reward: bool = True, + from_pixels: bool = False, + height: int = 84, + width: int = 84, + camera_id: int = 0, + frame_skip: int = 1, + environment_kwargs: dict = None, + channels_first: bool = True ): - assert 'random' in task_kwargs, 'please specify a seed, for deterministic behaviour' + assert 'random' in task_kwargs, 'Please specify a seed for deterministic behavior.' self._from_pixels = from_pixels self._height = height self._width = width @@ -74,7 +77,7 @@ class DMCWrapper(core.Env): # create task if domain_name == "manipulation": - assert not from_pixels, \ + assert not from_pixels and not task_name.endswith("_vision"), \ "TODO: Vision interface for manipulation is different to suite and needs to be implemented" self._env = manipulation.load(environment_name=task_name, seed=task_kwargs['random']) else: @@ -169,11 +172,12 @@ class DMCWrapper(core.Env): if self._last_state is None: raise ValueError('Environment not ready to render. Call reset() first.') + camera_id = camera_id or self._camera_id + # assert mode == 'rgb_array', 'only support rgb_array mode, given %s' % mode if mode == "rgb_array": height = height or self._height width = width or self._width - camera_id = camera_id or self._camera_id return self._env.physics.render(height=height, width=width, camera_id=camera_id) elif mode == 'human': @@ -184,7 +188,8 @@ class DMCWrapper(core.Env): self.viewer = rendering.SimpleImageViewer() # Render max available buffer size. Larger is only possible by altering the XML. img = self._env.physics.render(height=self._env.physics.model.vis.global_.offheight, - width=self._env.physics.model.vis.global_.offwidth) + width=self._env.physics.model.vis.global_.offwidth, + camera_id=camera_id) self.viewer.imshow(img) return self.viewer.isopen diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 0ba9dea..0348492 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -2,13 +2,14 @@ import logging from typing import Iterable, List, Type, Union import gym +import numpy as np -from mp_env_api.interface_wrappers.mp_env_wrapper import MPEnvWrapper +from mp_env_api import MPEnvWrapper from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper -def make_env_rank(env_id: str, seed: int, rank: int = 0, **kwargs): +def make_env_rank(env_id: str, seed: int, rank: int = 0, return_callable=True, **kwargs): """ TODO: Do we need this? Generate a callable to create a new gym environment with a given seed. @@ -22,11 +23,16 @@ def make_env_rank(env_id: str, seed: int, rank: int = 0, **kwargs): env_id: name of the environment seed: seed for deterministic behaviour rank: environment rank for deterministic over multiple seeds behaviour + return_callable: If True returns a callable to create the environment instead of the environment itself. Returns: """ - return lambda: make_env(env_id, seed + rank, **kwargs) + + def f(): + return make_env(env_id, seed + rank, **kwargs) + + return f if return_callable else f() def make_env(env_id: str, seed, **kwargs): @@ -103,6 +109,9 @@ def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwargs verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) + + verify_dof(_env, mp_kwargs.get("num_dof")) + return DmpWrapper(_env, **mp_kwargs) @@ -120,6 +129,9 @@ def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwa verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) + + verify_dof(_env, mp_kwargs.get("num_dof")) + return DetPMPWrapper(_env, **mp_kwargs) @@ -185,5 +197,12 @@ def verify_time_limit(mp_time_limit: Union[None, float], env_time_limit: Union[N """ if mp_time_limit is not None and env_time_limit is not None: assert mp_time_limit == env_time_limit, \ - f"The manually specified 'time_limit' of {env_time_limit}s does not match " \ + f"The specified 'time_limit' of {env_time_limit}s does not match " \ f"the duration of {mp_time_limit}s for the MP." + + +def verify_dof(base_env: gym.Env, dof: int): + action_shape = np.prod(base_env.action_space.shape) + assert dof == action_shape, \ + f"The specified degrees of freedom ('num_dof') {dof} do not match " \ + f"the action space of {action_shape} the base environments" diff --git a/alr_envs/utils/utils.py b/alr_envs/utils/utils.py index 89205bd..3354db3 100644 --- a/alr_envs/utils/utils.py +++ b/alr_envs/utils/utils.py @@ -15,8 +15,7 @@ def angle_normalize(x, type="deg"): if type not in ["deg", "rad"]: raise ValueError(f"Invalid type {type}. Choose one of 'deg' or 'rad'.") if type == "deg": - x = np.deg2rad(x) # x * pi / 180 + x = np.deg2rad(x) # x * pi / 180 two_pi = 2 * np.pi return x - two_pi * np.floor((x + np.pi) / two_pi) - diff --git a/setup.py b/setup.py index 189be19..16374e4 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='alr_envs', version='0.0.1', - packages=['alr_envs', 'alr_envs.classic_control', 'alr_envs.open_ai', 'alr_envs.mujoco', 'alr_envs.stochastic_search', + packages=['alr_envs', 'alr_envs.classic_control', 'alr_envs.open_ai', 'alr_envs.mujoco', 'alr_envs.dmc', 'alr_envs.utils'], install_requires=[ 'gym', diff --git a/test/test_envs.py b/test/test_envs.py index addd1a3..2e5bf7e 100644 --- a/test/test_envs.py +++ b/test/test_envs.py @@ -88,11 +88,8 @@ class TestEnvironments(unittest.TestCase): def test_environment_determinism(self): """Tests that identical seeds produce identical trajectories.""" seed = 0 - # Iterate over two trajectories generated using identical sequences of - # random actions, and with identical task random states. Check that the - # observations, rewards, discounts and step types are identical. + # Iterate over two trajectories, which should have the same state and action sequence for spec in ALL_SPECS: - # try: with self.subTest(msg=spec.id): self._run_env(spec.id) traj1 = self._run_env(spec.id, seed=seed) From 3eb938e0de145ad9aed521dc3789e6a87845670a Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 3 Aug 2021 16:51:54 +0200 Subject: [PATCH 41/56] Introduce short version of the continuous mountain car env --- alr_envs/__init__.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 5a92082..e9c09db 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -191,6 +191,14 @@ register( } ) +# Short Continuous Mountain Car +register( + id="MountainCarContinuous-v1", + entry_point="gym.envs.classic_control:Continuous_MountainCarEnv", + max_episode_steps=100, + reward_threshold=90.0, +) + # Motion Primitive Environments ## Simple Reacher @@ -817,10 +825,10 @@ register( ## Open AI register( - id='ContinuousMountainCarDetPMP-v0', + id='ContinuousMountainCarDetPMP-v1', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ - "name": "gym.envs.classic_control:MountainCarContinuous-v0", + "name": "alr_envs:MountainCarContinuous-v1", "wrappers": [open_ai.classic_control.continuous_mountain_car.MPWrapper], "mp_kwargs": { "num_dof": 1, From 9b1ccb3235c5faac00c11abe7f25ec0450263e5f Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 19 Aug 2021 09:30:54 +0200 Subject: [PATCH 42/56] integrated metaworld tasks into the framework --- alr_envs/__init__.py | 72 ++++++++-- alr_envs/dmc/README.MD | 3 + alr_envs/examples/examples_dmc.py | 2 +- alr_envs/examples/examples_general.py | 4 +- .../examples/examples_motion_primitives.py | 11 +- alr_envs/examples/examples_open_ai.py | 8 +- alr_envs/meta/README.MD | 26 ++++ alr_envs/meta/__init__.py | 1 + alr_envs/meta/button_press.py | 48 +++++++ alr_envs/open_ai/README.MD | 3 + alr_envs/utils/__init__.py | 4 +- alr_envs/utils/make_env_helpers.py | 44 ++++-- alr_envs/utils/mp_env_async_sampler.py | 4 +- setup.py | 1 + test/test_dmc_envs.py | 127 ++++++++++++++++++ test/test_envs.py | 7 +- test/test_metaworld_envs.py | 107 +++++++++++++++ 17 files changed, 429 insertions(+), 43 deletions(-) create mode 100644 alr_envs/dmc/README.MD create mode 100644 alr_envs/meta/README.MD create mode 100644 alr_envs/meta/__init__.py create mode 100644 alr_envs/meta/button_press.py create mode 100644 alr_envs/open_ai/README.MD create mode 100644 test/test_dmc_envs.py create mode 100644 test/test_metaworld_envs.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 5a92082..5615be4 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -1,12 +1,12 @@ from gym.envs.registration import register from gym.wrappers import FlattenObservation -from alr_envs import classic_control, dmc, open_ai +from alr_envs import classic_control, dmc, open_ai, meta from alr_envs.utils.make_env_helpers import make_dmp_env from alr_envs.utils.make_env_helpers import make_detpmp_env -from alr_envs.utils.make_env_helpers import make_env -from alr_envs.utils.make_env_helpers import make_env_rank +from alr_envs.utils.make_env_helpers import make +from alr_envs.utils.make_env_helpers import make_rank # Mujoco @@ -305,13 +305,13 @@ register( # max_episode_steps=1, kwargs={ "name": f"ball_in_cup-catch", - "time_limit": 1, - "episode_length": 50, + "time_limit": 2, + "episode_length": 100, "wrappers": [dmc.suite.ball_in_cup.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 1, + "duration": 2, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, @@ -331,16 +331,16 @@ register( entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"ball_in_cup-catch", - "time_limit": 1, - "episode_length": 50, + "time_limit": 2, + "episode_length": 100, "wrappers": [dmc.suite.ball_in_cup.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 1, + "duration": 2, "width": 0.025, "policy_type": "motor", - "weights_scale": 0.2, + "weights_scale": 1, "zero_start": True, "policy_kwargs": { "p_gains": 50, @@ -875,6 +875,23 @@ register( } ) +register( + id='FetchSlideDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchSlide-v1", + "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "policy_type": "position" + } + } +) + register( id='FetchReachDenseDetPMP-v1', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', @@ -891,3 +908,38 @@ register( } } ) + +register( + id='FetchReachDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchReach-v1", + "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "policy_type": "position" + } + } +) + +register( + id='ButtonPressDetPMP-v2', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "button-press-v2", + "wrappers": [meta.button_press.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "policy_type": "position" + } + } +) + diff --git a/alr_envs/dmc/README.MD b/alr_envs/dmc/README.MD new file mode 100644 index 0000000..f7d7475 --- /dev/null +++ b/alr_envs/dmc/README.MD @@ -0,0 +1,3 @@ +# DeepMind Control (DMC) Wrappers + +These are the Environment Wrappers for selected [DeepMind Control](https://deepmind.com/research/publications/2020/dm-control-Software-and-Tasks-for-Continuous-Control) environments in order to use our Motion Primitive gym interface with them. \ No newline at end of file diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index b29329d..95dd51d 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -17,7 +17,7 @@ def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): Returns: """ - env = alr_envs.make_env(env_id, seed) + env = alr_envs.make(env_id, seed) rewards = 0 obs = env.reset() print("observation shape:", env.observation_space.shape) diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index 88d79d5..a215a8d 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -21,7 +21,7 @@ def example_general(env_id="Pendulum-v0", seed=1, iterations=1000, render=True): """ - env = alr_envs.make_env(env_id, seed) + env = alr_envs.make(env_id, seed) rewards = 0 obs = env.reset() print("Observation shape: ", env.observation_space.shape) @@ -56,7 +56,7 @@ def example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=4, seed=int('533D', 16 Returns: Tuple of (obs, reward, done, info) with type np.ndarray """ - env = gym.vector.AsyncVectorEnv([alr_envs.make_env_rank(env_id, seed, i) for i in range(n_cpu)]) + env = gym.vector.AsyncVectorEnv([alr_envs.make_rank(env_id, seed, i) for i in range(n_cpu)]) # OR # envs = gym.vector.AsyncVectorEnv([make_env(env_id, seed + i) for i in range(n_cpu)]) diff --git a/alr_envs/examples/examples_motion_primitives.py b/alr_envs/examples/examples_motion_primitives.py index 480b58d..6decdb1 100644 --- a/alr_envs/examples/examples_motion_primitives.py +++ b/alr_envs/examples/examples_motion_primitives.py @@ -1,5 +1,4 @@ -from alr_envs import MPWrapper -from alr_envs.utils.make_env_helpers import make_dmp_env, make_env +import alr_envs def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1, iterations=1, render=True): @@ -16,7 +15,7 @@ def example_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1, iterations=1, rend """ # While in this case gym.make() is possible to use as well, we recommend our custom make env function. # First, it already takes care of seeding and second enables the use of DMC tasks within the gym interface. - env = make_env(env_name, seed) + env = alr_envs.make(env_name, seed) rewards = 0 # env.render(mode=None) @@ -71,7 +70,7 @@ def example_custom_mp(env_name="alr_envs:HoleReacherDMP-v1", seed=1, iterations= "weights_scale": 50, "goal_scale": 0.1 } - env = make_env(env_name, seed, mp_kwargs=mp_kwargs) + env = alr_envs.make(env_name, seed, mp_kwargs=mp_kwargs) # This time rendering every trajectory if render: @@ -113,7 +112,7 @@ def example_fully_custom_mp(seed=1, iterations=1, render=True): # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. - wrappers = [MPWrapper] + wrappers = [alr_envs.classic_control.hole_reacher.MPWrapper] mp_kwargs = { "num_dof": 5, "num_basis": 5, @@ -125,7 +124,7 @@ def example_fully_custom_mp(seed=1, iterations=1, render=True): "weights_scale": 50, "goal_scale": 0.1 } - env = make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) + env = alr_envs.make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) # OR for a deterministic ProMP: # env = make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) diff --git a/alr_envs/examples/examples_open_ai.py b/alr_envs/examples/examples_open_ai.py index d001bc8..9f90be5 100644 --- a/alr_envs/examples/examples_open_ai.py +++ b/alr_envs/examples/examples_open_ai.py @@ -1,4 +1,4 @@ -from alr_envs.utils.make_env_helpers import make_env +import alr_envs def example_mp(env_name, seed=1): @@ -13,7 +13,7 @@ def example_mp(env_name, seed=1): """ # While in this case gym.make() is possible to use as well, we recommend our custom make env function. - env = make_env(env_name, seed) + env = alr_envs.make(env_name, seed) rewards = 0 obs = env.reset() @@ -29,13 +29,13 @@ def example_mp(env_name, seed=1): rewards = 0 obs = env.reset() + if __name__ == '__main__': # DMP - not supported yet - #example_mp("ReacherDetPMP-v2") + # example_mp("ReacherDMP-v2") # DetProMP example_mp("ContinuousMountainCarDetPMP-v0") example_mp("ReacherDetPMP-v2") example_mp("FetchReachDenseDetPMP-v1") example_mp("FetchSlideDenseDetPMP-v1") - diff --git a/alr_envs/meta/README.MD b/alr_envs/meta/README.MD new file mode 100644 index 0000000..c8d9cd1 --- /dev/null +++ b/alr_envs/meta/README.MD @@ -0,0 +1,26 @@ +# MetaWorld Wrappers + +These are the Environment Wrappers for selected [Metaworld](https://meta-world.github.io/) environments in order to use our Motion Primitive gym interface with them. +All Metaworld environments have a 39 dimensional observation space with the same structure. The tasks differ only in the objective and the initial observations that are randomized. +Unused observations are zeroed out. E.g. for `Button-Press-v2` the observation mask looks the following: +```python + return np.hstack([ + # Current observation + [False] * 3, # end-effector position + [False] * 1, # normalized gripper open distance + [True] * 3, # main object position + [False] * 4, # main object quaternion + [False] * 3, # secondary object position + [False] * 4, # secondary object quaternion + # Previous observation + [False] * 3, # previous end-effector position + [False] * 1, # previous normalized gripper open distance + [False] * 3, # previous main object position + [False] * 4, # previous main object quaternion + [False] * 3, # previous second object position + [False] * 4, # previous second object quaternion + # Goal + [True] * 3, # goal position + ]) +``` +For other tasks only the boolean values have to be adjusted accordingly. \ No newline at end of file diff --git a/alr_envs/meta/__init__.py b/alr_envs/meta/__init__.py new file mode 100644 index 0000000..ebc4ab2 --- /dev/null +++ b/alr_envs/meta/__init__.py @@ -0,0 +1 @@ +from alr_envs.meta import button_press diff --git a/alr_envs/meta/button_press.py b/alr_envs/meta/button_press.py new file mode 100644 index 0000000..b552cc4 --- /dev/null +++ b/alr_envs/meta/button_press.py @@ -0,0 +1,48 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + # This structure is the same for all metaworld environments. + # Only the observations which change could differ + return np.hstack([ + # Current observation + [False] * 3, # end-effector position + [False] * 1, # normalized gripper open distance + [True] * 3, # main object position + [False] * 4, # main object quaternion + [False] * 3, # secondary object position + [False] * 4, # secondary object quaternion + # Previous observation + # TODO: Include previous values? According to their source they might be wrong for the first iteration. + [False] * 3, # previous end-effector position + [False] * 1, # previous normalized gripper open distance + [False] * 3, # previous main object position + [False] * 4, # previous main object quaternion + [False] * 3, # previous second object position + [False] * 4, # previous second object quaternion + # Goal + [True] * 3, # goal position + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + return self.env.physics.named.data.qpos[:] + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + return self.env.physics.named.data.qvel[:] + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/open_ai/README.MD b/alr_envs/open_ai/README.MD new file mode 100644 index 0000000..9c30ffe --- /dev/null +++ b/alr_envs/open_ai/README.MD @@ -0,0 +1,3 @@ +# OpenAI Gym Wrappers + +These are the Environment Wrappers for selected [OpenAI Gym](https://gym.openai.com/) environments in order to use our Motion Primitive gym interface with them. \ No newline at end of file diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index 758d49f..b811354 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -4,8 +4,10 @@ from typing import Union import gym from gym.envs.registration import register +from alr_envs.utils.make_env_helpers import make -def make( + +def make_dmc( id: str, seed: int = 1, visualize_reward: bool = True, diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 0348492..466f7cf 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -3,21 +3,22 @@ from typing import Iterable, List, Type, Union import gym import numpy as np +from gym.envs.registration import EnvSpec from mp_env_api import MPEnvWrapper from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper -def make_env_rank(env_id: str, seed: int, rank: int = 0, return_callable=True, **kwargs): +def make_rank(env_id: str, seed: int, rank: int = 0, return_callable=True, **kwargs): """ TODO: Do we need this? Generate a callable to create a new gym environment with a given seed. The rank is added to the seed and can be used for example when using vector environments. - E.g. [make_env_rank("my_env_name-v0", 123, i) for i in range(8)] creates a list of 8 environments + E.g. [make_rank("my_env_name-v0", 123, i) for i in range(8)] creates a list of 8 environments with seeds 123 through 130. Hence, testing environments should be seeded with a value which is offset by the number of training environments. - Here e.g. [make_env_rank("my_env_name-v0", 123 + 8, i) for i in range(5)] for 5 testing environmetns + Here e.g. [make_rank("my_env_name-v0", 123 + 8, i) for i in range(5)] for 5 testing environmetns Args: env_id: name of the environment @@ -30,12 +31,12 @@ def make_env_rank(env_id: str, seed: int, rank: int = 0, return_callable=True, * """ def f(): - return make_env(env_id, seed + rank, **kwargs) + return make(env_id, seed + rank, **kwargs) return f if return_callable else f() -def make_env(env_id: str, seed, **kwargs): +def make(env_id: str, seed, **kwargs): """ Converts an env_id to an environment with the gym API. This also works for DeepMind Control Suite interface_wrappers @@ -58,13 +59,30 @@ def make_env(env_id: str, seed, **kwargs): env.action_space.seed(seed) env.observation_space.seed(seed) except gym.error.Error: - # DMC - from alr_envs.utils import make - env = make(env_id, seed=seed, **kwargs) - assert env.base_step_limit == env.spec.max_episode_steps, \ - f"The specified 'episode_length' of {env.spec.max_episode_steps} steps for gym is different from " \ - f"the DMC environment specification of {env.base_step_limit} steps." + # MetaWorld env + import metaworld + if env_id in metaworld.ML1.ENV_NAMES: + env = metaworld.envs.ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE[env_id + "-goal-observable"](seed=seed, **kwargs) + # setting this avoids generating the same initialization after each reset + env._freeze_rand_vec = False + # Manually set spec, as metaworld environments are not registered via gym + env.unwrapped.spec = EnvSpec(env_id) + # Set Timelimit based on the maximum allowed path length of the environment + env = gym.wrappers.TimeLimit(env, max_episode_steps=env.max_path_length) + env.seed(seed) + env.action_space.seed(seed) + env.observation_space.seed(seed) + env.goal_space.seed(seed) + + else: + # DMC + from alr_envs.utils import make_dmc + env = make_dmc(env_id, seed=seed, **kwargs) + + assert env.base_step_limit == env.spec.max_episode_steps, \ + f"The specified 'episode_length' of {env.spec.max_episode_steps} steps for gym is different from " \ + f"the DMC environment specification of {env.base_step_limit} steps." return env @@ -84,7 +102,7 @@ def _make_wrapped_env(env_id: str, wrappers: Iterable[Type[gym.Wrapper]], seed=1 """ # _env = gym.make(env_id) - _env = make_env(env_id, seed, **kwargs) + _env = make(env_id, seed, **kwargs) assert any(issubclass(w, MPEnvWrapper) for w in wrappers), \ "At least one MPEnvWrapper is required in order to leverage motion primitive environments." @@ -175,7 +193,7 @@ def make_detpmp_env_helper(**kwargs): def make_contextual_env(env_id, context, seed, rank): - env = make_env(env_id, seed + rank, context=context) + env = make(env_id, seed + rank, context=context) # env = gym.make(env_id, context=context) # env.seed(seed + rank) return lambda: env diff --git a/alr_envs/utils/mp_env_async_sampler.py b/alr_envs/utils/mp_env_async_sampler.py index 67a774c..b24e908 100644 --- a/alr_envs/utils/mp_env_async_sampler.py +++ b/alr_envs/utils/mp_env_async_sampler.py @@ -3,7 +3,7 @@ from gym.vector.async_vector_env import AsyncVectorEnv import numpy as np from _collections import defaultdict -from alr_envs.utils.make_env_helpers import make_env_rank +from alr_envs.utils.make_env_helpers import make_rank def split_array(ary, size): @@ -54,7 +54,7 @@ class AlrMpEnvSampler: def __init__(self, env_id, num_envs, seed=0, **env_kwargs): self.num_envs = num_envs - self.env = AsyncVectorEnv([make_env_rank(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) + self.env = AsyncVectorEnv([make_rank(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) def __call__(self, params): params = np.atleast_2d(params) diff --git a/setup.py b/setup.py index 16374e4..55a1a95 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,7 @@ setup( 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', 'mujoco-py<2.1,>=2.0', 'dm_control' + 'metaworld @ git+https://github.com/rlworkgroup/metaworld.git@master#egg=metaworld' ], url='https://github.com/ALRhub/alr_envs/', diff --git a/test/test_dmc_envs.py b/test/test_dmc_envs.py new file mode 100644 index 0000000..4eb1589 --- /dev/null +++ b/test/test_dmc_envs.py @@ -0,0 +1,127 @@ +import unittest + +import gym +import numpy as np + +from dm_control import suite, manipulation + +from alr_envs import make + +DMC_ENVS = [f'{env}-{task}' for env, task in suite.ALL_TASKS if env != "lqr"] +MANIPULATION_SPECS = [f'manipulation-{task}' for task in manipulation.ALL if task.endswith('_features')] +SEED = 1 + + +class TestEnvironments(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 `domain_name-task_name` or + for manipulation tasks as `manipulation-environment_name` + + Args: + env_id: Either `domain_name-task_name` or `manipulation-environment_name` + 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 = [] + dones = [] + obs = env.reset() + self._verify_observations(obs, env.observation_space, "reset()") + + length = env.spec.max_episode_steps + if iterations is None: + if length is None: + iterations = 1 + else: + iterations = length + + # number of samples(multiple environment steps) + for i in range(iterations): + observations.append(obs) + + ac = env.action_space.sample() + # 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: + obs = env.reset() + + assert done, "Done flag is not True after max episode length." + observations.append(obs) + env.close() + del env + return np.array(observations), np.array(rewards), np.array(dones) + + 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_dmc_functionality(self): + """Tests that environments runs without errors using random actions.""" + for env_id in DMC_ENVS: + with self.subTest(msg=env_id): + self._run_env(env_id) + + def test_dmc_determinism(self): + """Tests that identical seeds produce identical trajectories.""" + seed = 0 + # Iterate over two trajectories, which should have the same state and action sequence + for env_id in DMC_ENVS: + 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, obs2, rwd2, done2 = time_step + self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] {obs1} and {obs2} 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 test_manipulation_functionality(self): + """Tests that environments runs without errors using random actions.""" + for env_id in MANIPULATION_SPECS: + with self.subTest(msg=env_id): + self._run_env(env_id) + + def test_manipulation_determinism(self): + """Tests that identical seeds produce identical trajectories.""" + seed = 0 + # Iterate over two trajectories, which should have the same state and action sequence + for env_id in MANIPULATION_SPECS: + 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, obs2, rwd2, done2 = time_step + self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] {obs1} and {obs2} 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.") + self.assertEqual(done1, done2, f"Dones [{i}] {done1} and {done2} do not match.") + + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_envs.py b/test/test_envs.py index 2e5bf7e..8c21295 100644 --- a/test/test_envs.py +++ b/test/test_envs.py @@ -4,7 +4,7 @@ import gym import numpy as np import alr_envs # noqa -from alr_envs.utils.make_env_helpers import make_env +from alr_envs.utils.make_env_helpers import make ALL_SPECS = list(spec for spec in gym.envs.registry.all() if "alr_envs" in spec.entry_point) SEED = 1 @@ -27,7 +27,7 @@ class TestEnvironments(unittest.TestCase): Returns: """ - env: gym.Env = make_env(env_id, seed=seed) + env: gym.Env = make(env_id, seed=seed) rewards = [] observations = [] dones = [] @@ -62,6 +62,7 @@ class TestEnvironments(unittest.TestCase): if done: obs = env.reset() + assert done, "Done flag is not True after max episode length." observations.append(obs) env.close() del env @@ -81,7 +82,6 @@ class TestEnvironments(unittest.TestCase): def test_environment_functionality(self): """Tests that environments runs without errors using random actions.""" for spec in ALL_SPECS: - # try: with self.subTest(msg=spec.id): self._run_env(spec.id) @@ -91,7 +91,6 @@ class TestEnvironments(unittest.TestCase): # Iterate over two trajectories, which should have the same state and action sequence for spec in ALL_SPECS: with self.subTest(msg=spec.id): - self._run_env(spec.id) traj1 = self._run_env(spec.id, seed=seed) traj2 = self._run_env(spec.id, seed=seed) for i, time_step in enumerate(zip(*traj1, *traj2)): diff --git a/test/test_metaworld_envs.py b/test/test_metaworld_envs.py new file mode 100644 index 0000000..0a05ffc --- /dev/null +++ b/test/test_metaworld_envs.py @@ -0,0 +1,107 @@ +import unittest + +import gym +import numpy as np + +from alr_envs import make +from metaworld.envs import ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE + +ALL_ENVS = [env.split("-goal-observable")[0] for env, _ in ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE.items()] +SEED = 1 + + +class TestEnvironments(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 `domain_name-task_name` or + for manipulation tasks as `manipulation-environment_name` + + Args: + env_id: Either `domain_name-task_name` or `manipulation-environment_name` + 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()") + + length = env.max_path_length + if iterations is None: + if length is None: + iterations = 1 + else: + iterations = length + + # 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: + obs = env.reset() + + assert done, "Done flag is not True after max episode length." + 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_dmc_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_dmc_determinism(self): + """Tests that identical seeds produce identical trajectories.""" + seed = 0 + # Iterate over two trajectories, which should have the same state and action sequence + for env_id in ALL_ENVS: + 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.assertAlmostEqual(rwd1, rwd2, f"Rewards [{i}] {rwd1} and {rwd2} do not match.") + self.assertEqual(done1, done2, f"Dones [{i}] {done1} and {done2} do not match.") + + +if __name__ == '__main__': + unittest.main() From cb603859d9923130e117e500c1293c3f58b7fbae Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 19 Aug 2021 16:46:11 +0200 Subject: [PATCH 43/56] custom metaworld controller --- alr_envs/meta/button_press.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/alr_envs/meta/button_press.py b/alr_envs/meta/button_press.py index b552cc4..55c0731 100644 --- a/alr_envs/meta/button_press.py +++ b/alr_envs/meta/button_press.py @@ -33,11 +33,12 @@ class MPWrapper(MPEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray]: - return self.env.physics.named.data.qpos[:] + r_close = self.env.data.get_joint_qpos("r_close") + return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) @property def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: - return self.env.physics.named.data.qvel[:] + raise NotImplementedError("Velocity cannot be retrieved.") @property def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: From c39877ece0a88cb68bfbaf3364d5cbd67874dcb8 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 20 Aug 2021 14:23:33 +0200 Subject: [PATCH 44/56] added all metaworld tasks as ProMP --- alr_envs/__init__.py | 123 +++++++++++++++--- alr_envs/examples/examples_general.py | 11 +- alr_envs/examples/pd_control_gain_tuning.py | 20 ++- alr_envs/meta/__init__.py | 2 +- alr_envs/meta/goal_and_endeffector_change.py | 68 ++++++++++ ...ton_press.py => goal_and_object_change.py} | 19 +++ alr_envs/meta/goal_change.py | 68 ++++++++++ alr_envs/meta/object_change.py | 68 ++++++++++ 8 files changed, 344 insertions(+), 35 deletions(-) create mode 100644 alr_envs/meta/goal_and_endeffector_change.py rename alr_envs/meta/{button_press.py => goal_and_object_change.py} (65%) create mode 100644 alr_envs/meta/goal_change.py create mode 100644 alr_envs/meta/object_change.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 5615be4..a0d1b43 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -316,7 +316,6 @@ register( "alpha_phase": 2, "bandwidth_factor": 2, "policy_type": "motor", - "weights_scale": 50, "goal_scale": 0.1, "policy_kwargs": { "p_gains": 50, @@ -340,7 +339,6 @@ register( "duration": 2, "width": 0.025, "policy_type": "motor", - "weights_scale": 1, "zero_start": True, "policy_kwargs": { "p_gains": 50, @@ -828,6 +826,7 @@ register( "duration": 2, "post_traj_time": 0, "width": 0.02, + "zero_start": True, "policy_type": "motor", "policy_kwargs": { "p_gains": 1., @@ -849,6 +848,7 @@ register( "duration": 1, "post_traj_time": 0, "width": 0.02, + "zero_start": True, "policy_type": "motor", "policy_kwargs": { "p_gains": .6, @@ -870,6 +870,7 @@ register( "duration": 2, "post_traj_time": 0, "width": 0.02, + "zero_start": True, "policy_type": "position" } } @@ -887,6 +888,7 @@ register( "duration": 2, "post_traj_time": 0, "width": 0.02, + "zero_start": True, "policy_type": "position" } } @@ -904,6 +906,7 @@ register( "duration": 2, "post_traj_time": 0, "width": 0.02, + "zero_start": True, "policy_type": "position" } } @@ -921,25 +924,109 @@ register( "duration": 2, "post_traj_time": 0, "width": 0.02, + "zero_start": True, "policy_type": "position" } } ) -register( - id='ButtonPressDetPMP-v2', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "button-press-v2", - "wrappers": [meta.button_press.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 6.25, - "post_traj_time": 0, - "width": 0.025, - "policy_type": "position" - } - } -) +# MetaWorld +goal_change_envs = ["assembly-v2", "pick-out-of-hole-v2", "plate-slide-v2", "plate-slide-back-v2", + ] +for env_id in goal_change_envs: + env_id_split = env_id.split("-") + name = "".join([s.capitalize() for s in env_id_split[:-1]]) + register( + id=f'{name}DetPMP-{env_id_split[-1]}', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": env_id, + "wrappers": [meta.goal_change.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + +object_change_envs = ["bin-picking-v2", "hammer-v2", "sweep-into-v2"] +for env_id in object_change_envs: + env_id_split = env_id.split("-") + name = "".join([s.capitalize() for s in env_id_split[:-1]]) + register( + id=f'{name}DetPMP-{env_id_split[-1]}', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": env_id, + "wrappers": [meta.object_change.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + +goal_and_object_change_envs = ["box-close-v2", "button-press-v2", "button-press-wall-v2", "button-press-topdown-v2", + "button-press-topdown-wall-v2", "coffee-button-v2", "coffee-pull-v2", + "coffee-push-v2", "dial-turn-v2", "disassemble-v2", "door-close-v2", + "door-lock-v2", "door-open-v2", "door-unlock-v2", "hand-insert-v2", + "drawer-close-v2", "drawer-open-v2", "faucet-open-v2", "faucet-close-v2", + "handle-press-side-v2", "handle-press-v2", "handle-pull-side-v2", + "handle-pull-v2", "lever-pull-v2", "peg-insert-side-v2", "pick-place-wall-v2", + "reach-v2", "push-back-v2", "push-v2", "pick-place-v2", "peg-unplug-side-v2", + "soccer-v2", "stick-push-v2", "stick-pull-v2", "push-wall-v2", "reach-wall-v2", + "shelf-place-v2", "sweep-v2", "window-open-v2", "window-close-v2" + ] +for env_id in goal_and_object_change_envs: + env_id_split = env_id.split("-") + name = "".join([s.capitalize() for s in env_id_split[:-1]]) + register( + id=f'{name}DetPMP-{env_id_split[-1]}', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": env_id, + "wrappers": [meta.goal_and_object_change.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + +goal_and_endeffector_change_envs = ["basketball-v2"] +for env_id in goal_and_endeffector_change_envs: + env_id_split = env_id.split("-") + name = "".join([s.capitalize() for s in env_id_split[:-1]]) + register( + id=f'{name}DetPMP-{env_id_split[-1]}', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": env_id, + "wrappers": [meta.goal_and_endeffector_change.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) diff --git a/alr_envs/examples/examples_general.py b/alr_envs/examples/examples_general.py index a215a8d..d043d6d 100644 --- a/alr_envs/examples/examples_general.py +++ b/alr_envs/examples/examples_general.py @@ -80,20 +80,21 @@ def example_async(env_id="alr_envs:HoleReacher-v0", n_cpu=4, seed=int('533D', 16 rewards[done] = 0 # do not return values above threshold - return *map(lambda v: np.stack(v)[:n_samples], buffer.values()), + return (*map(lambda v: np.stack(v)[:n_samples], buffer.values()),) if __name__ == '__main__': - render = False + render = True + # Basic gym task example_general("Pendulum-v0", seed=10, iterations=200, render=render) - # + # # Basis task from framework example_general("alr_envs:HoleReacher-v0", seed=10, iterations=200, render=render) - # + # # OpenAI Mujoco task example_general("HalfCheetah-v2", seed=10, render=render) - # + # # Mujoco task from framework example_general("alr_envs:ALRReacher-v0", seed=10, iterations=200, render=render) diff --git a/alr_envs/examples/pd_control_gain_tuning.py b/alr_envs/examples/pd_control_gain_tuning.py index 55ab1c0..3fb8251 100644 --- a/alr_envs/examples/pd_control_gain_tuning.py +++ b/alr_envs/examples/pd_control_gain_tuning.py @@ -1,30 +1,30 @@ import numpy as np from matplotlib import pyplot as plt -from alr_envs import dmc +from alr_envs import dmc, meta from alr_envs.utils.make_env_helpers import make_detpmp_env # This might work for some environments, however, please verify either way the correct trajectory information # for your environment are extracted below SEED = 10 -env_id = "cartpole-swingup" -wrappers = [dmc.suite.cartpole.MPWrapper] +env_id = "ball_in_cup-catch" +wrappers = [dmc.ball_in_cup.MPWrapper] mp_kwargs = { - "num_dof": 1, - "num_basis": 5, + "num_dof": 2, + "num_basis": 10, "duration": 2, "width": 0.025, "policy_type": "motor", - "weights_scale": 0.2, + "weights_scale": 1, "zero_start": True, "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 # a good starting point is the sqrt of p_gains + "p_gains": 1, + "d_gains": 1 } } -kwargs = dict(time_limit=2, episode_length=200) +kwargs = dict(time_limit=2, episode_length=100) env = make_detpmp_env(env_id, wrappers, seed=SEED, mp_kwargs=mp_kwargs, **kwargs) @@ -35,7 +35,6 @@ pos, vel = env.mp_rollout(env.action_space.sample()) base_shape = env.full_action_space.shape actual_pos = np.zeros((len(pos), *base_shape)) -actual_pos_ball = np.zeros((len(pos), *base_shape)) actual_vel = np.zeros((len(pos), *base_shape)) act = np.zeros((len(pos), *base_shape)) @@ -46,7 +45,6 @@ for t, pos_vel in enumerate(zip(pos, vel)): act[t, :] = actions # TODO verify for your environment actual_pos[t, :] = env.current_pos - # actual_pos_ball[t, :] = env.physics.data.qpos[2:] actual_vel[t, :] = env.current_vel plt.figure(figsize=(15, 5)) diff --git a/alr_envs/meta/__init__.py b/alr_envs/meta/__init__.py index ebc4ab2..b2482ee 100644 --- a/alr_envs/meta/__init__.py +++ b/alr_envs/meta/__init__.py @@ -1 +1 @@ -from alr_envs.meta import button_press +from alr_envs.meta import goal_and_object_change, goal_and_endeffector_change, goal_change, object_change diff --git a/alr_envs/meta/goal_and_endeffector_change.py b/alr_envs/meta/goal_and_endeffector_change.py new file mode 100644 index 0000000..95c29e3 --- /dev/null +++ b/alr_envs/meta/goal_and_endeffector_change.py @@ -0,0 +1,68 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + """ + This Wrapper is for environments where merely the goal changes in the beginning + and no secondary objects or end effectors are altered at the start of an episode. + You can verify this by executing the code below for your environment id and check if the output is non-zero + at the same indices. + ```python + import alr_envs + env = alr_envs.make(env_id, 1) + print(env.reset() - env.reset()) + array([ !=0 , !=0 , !=0 , 0. , 0., + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , !=0 , !=0 , + !=0 , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , !=0 , !=0 , !=0]) + ``` + """ + + @property + def active_obs(self): + # This structure is the same for all metaworld environments. + # Only the observations which change could differ + return np.hstack([ + # Current observation + [True] * 3, # end-effector position + [False] * 1, # normalized gripper open distance + [False] * 3, # main object position + [False] * 4, # main object quaternion + [False] * 3, # secondary object position + [False] * 4, # secondary object quaternion + # Previous observation + # TODO: Include previous values? According to their source they might be wrong for the first iteration. + [False] * 3, # previous end-effector position + [False] * 1, # previous normalized gripper open distance + [False] * 3, # previous main object position + [False] * 4, # previous main object quaternion + [False] * 3, # previous second object position + [False] * 4, # previous second object quaternion + # Goal + [True] * 3, # goal position + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + r_close = self.env.data.get_joint_qpos("r_close") + return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + raise NotImplementedError("Velocity cannot be retrieved.") + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/meta/button_press.py b/alr_envs/meta/goal_and_object_change.py similarity index 65% rename from alr_envs/meta/button_press.py rename to alr_envs/meta/goal_and_object_change.py index 55c0731..6811ace 100644 --- a/alr_envs/meta/button_press.py +++ b/alr_envs/meta/goal_and_object_change.py @@ -6,6 +6,25 @@ from mp_env_api import MPEnvWrapper class MPWrapper(MPEnvWrapper): + """ + This Wrapper is for environments where merely the goal changes in the beginning + and no secondary objects or end effectors are altered at the start of an episode. + You can verify this by executing the code below for your environment id and check if the output is non-zero + at the same indices. + ```python + import alr_envs + env = alr_envs.make(env_id, 1) + print(env.reset() - env.reset()) + array([ 0. , 0. , 0. , 0. , !=0, + !=0 , !=0 , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , !=0 , !=0 , !=0 , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , !=0 , !=0 , !=0]) + ``` + """ @property def active_obs(self): diff --git a/alr_envs/meta/goal_change.py b/alr_envs/meta/goal_change.py new file mode 100644 index 0000000..15f4de9 --- /dev/null +++ b/alr_envs/meta/goal_change.py @@ -0,0 +1,68 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + """ + This Wrapper is for environments where merely the goal changes in the beginning + and no secondary objects or end effectors are altered at the start of an episode. + You can verify this by executing the code below for your environment id and check if the output is non-zero + at the same indices. + ```python + import alr_envs + env = alr_envs.make(env_id, 1) + print(env.reset() - env.reset()) + array([ 0. , 0. , 0. , 0. , 0, + 0 , 0 , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0 , 0 , 0 , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , !=0 , !=0 , !=0]) + ``` + """ + + @property + def active_obs(self): + # This structure is the same for all metaworld environments. + # Only the observations which change could differ + return np.hstack([ + # Current observation + [False] * 3, # end-effector position + [False] * 1, # normalized gripper open distance + [False] * 3, # main object position + [False] * 4, # main object quaternion + [False] * 3, # secondary object position + [False] * 4, # secondary object quaternion + # Previous observation + # TODO: Include previous values? According to their source they might be wrong for the first iteration. + [False] * 3, # previous end-effector position + [False] * 1, # previous normalized gripper open distance + [False] * 3, # previous main object position + [False] * 4, # previous main object quaternion + [False] * 3, # previous second object position + [False] * 4, # previous second object quaternion + # Goal + [True] * 3, # goal position + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + r_close = self.env.data.get_joint_qpos("r_close") + return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + raise NotImplementedError("Velocity cannot be retrieved.") + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt diff --git a/alr_envs/meta/object_change.py b/alr_envs/meta/object_change.py new file mode 100644 index 0000000..c7e506b --- /dev/null +++ b/alr_envs/meta/object_change.py @@ -0,0 +1,68 @@ +from typing import Tuple, Union + +import numpy as np + +from mp_env_api import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + """ + This Wrapper is for environments where merely the goal changes in the beginning + and no secondary objects or end effectors are altered at the start of an episode. + You can verify this by executing the code below for your environment id and check if the output is non-zero + at the same indices. + ```python + import alr_envs + env = alr_envs.make(env_id, 1) + print(env.reset() - env.reset()) + array([ 0. , 0. , 0. , 0. , !=0 , + !=0 , !=0 , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0 , 0 , 0 , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0.]) + ``` + """ + + @property + def active_obs(self): + # This structure is the same for all metaworld environments. + # Only the observations which change could differ + return np.hstack([ + # Current observation + [False] * 3, # end-effector position + [False] * 1, # normalized gripper open distance + [False] * 3, # main object position + [False] * 4, # main object quaternion + [False] * 3, # secondary object position + [False] * 4, # secondary object quaternion + # Previous observation + # TODO: Include previous values? According to their source they might be wrong for the first iteration. + [False] * 3, # previous end-effector position + [False] * 1, # previous normalized gripper open distance + [False] * 3, # previous main object position + [False] * 4, # previous main object quaternion + [False] * 3, # previous second object position + [False] * 4, # previous second object quaternion + # Goal + [True] * 3, # goal position + ]) + + @property + def current_pos(self) -> Union[float, int, np.ndarray]: + r_close = self.env.data.get_joint_qpos("r_close") + return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + + @property + def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: + raise NotImplementedError("Velocity cannot be retrieved.") + + @property + def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]: + raise ValueError("Goal position is not available and has to be learnt based on the environment.") + + @property + def dt(self) -> Union[float, int]: + return self.env.dt From 4f18a529b652f0cb9f13a83aa786c80d917e2302 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 20 Aug 2021 14:38:23 +0200 Subject: [PATCH 45/56] metaworld examples --- alr_envs/examples/examples_metaworld.py | 128 ++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 alr_envs/examples/examples_metaworld.py diff --git a/alr_envs/examples/examples_metaworld.py b/alr_envs/examples/examples_metaworld.py new file mode 100644 index 0000000..b86b624 --- /dev/null +++ b/alr_envs/examples/examples_metaworld.py @@ -0,0 +1,128 @@ +import alr_envs +from alr_envs.meta.goal_and_object_change import MPWrapper + + +def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): + """ + Example for running a MetaWorld based env in the step based setting. + The env_id has to be specified as `task_name-v2`. V1 versions are not supported and we always + return the observable goal version. + All tasks can be found here: https://arxiv.org/pdf/1910.10897.pdf or https://meta-world.github.io/ + + Args: + env_id: `task_name-v2` + seed: seed for deterministic behaviour (TODO: currently not working due to an issue in MetaWorld code) + iterations: Number of rollout steps to run + render: Render the episode + + Returns: + + """ + env = alr_envs.make(env_id, seed) + rewards = 0 + obs = env.reset() + print("observation shape:", env.observation_space.shape) + print("action shape:", env.action_space.shape) + + for i in range(iterations): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if render: + # THIS NEEDS TO BE SET TO FALSE FOR NOW, BECAUSE THE INTERFACE FOR RENDERING IS DIFFERENT TO BASIC GYM + # TODO: Remove this, when Metaworld fixes its interface. + env.render(False) + + if done: + print(env_id, rewards) + rewards = 0 + obs = env.reset() + + env.close() + del env + + +def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): + """ + Example for running a custom motion primitive based environments. + Our already registered environments follow the same structure. + Hence, this also allows to adjust hyperparameters of the motion primitives. + Yet, we recommend the method above if you are just interested in chaining those parameters for existing tasks. + We appreciate PRs for custom environments (especially MP wrappers of existing tasks) + for our repo: https://github.com/ALRhub/alr_envs/ + Args: + seed: seed for deterministic behaviour (TODO: currently not working due to an issue in MetaWorld code) + iterations: Number of rollout steps to run + render: Render the episode (TODO: currently not working due to an issue in MetaWorld code) + + Returns: + + """ + + # Base MetaWorld name, according to structure of above example + base_env = "button-press-v2" + + # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. + # You can also add other gym.Wrappers in case they are needed. + wrappers = [MPWrapper] + mp_kwargs = { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + + env = alr_envs.make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) + # OR for a DMP: + # env = alr_envs.make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs, **kwargs) + + # This renders the full MP trajectory + # It is only required to call render() once in the beginning, which renders every consecutive trajectory. + # Resetting to no rendering, can be achieved by render(mode=None). + # It is also possible to change them mode multiple times when + # e.g. only every nth trajectory should be displayed. + if render: + raise ValueError("Metaworld render interface bug does not allow to render() fixes its interface. " + "A temporary workaround is to alter their code in MujocoEnv render() from " + "`if not offscreen` to `if not offscreen or offscreen == 'human'`.") + # TODO: Remove this, when Metaworld fixes its interface. + # env.render(mode="human") + + rewards = 0 + obs = env.reset() + + # number of samples/full trajectories (multiple environment steps) + for i in range(iterations): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if done: + print(base_env, rewards) + rewards = 0 + obs = env.reset() + + env.close() + del env + + +if __name__ == '__main__': + # Disclaimer: MetaWorld environments require the seed to be specified in the beginning. + # Adjusting it afterwards with env.seed() is not recommended as it may not affect the underlying behavior. + + # For rendering it might be necessary to specify your OpenGL installation + # export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libGLEW.so + render = False + + # # Standard DMC Suite tasks + example_dmc("button-press-v2", seed=10, iterations=500, render=render) + + # MP + MetaWorld hybrid task provided in the our framework + example_dmc("ButtonPressDetPMP-v2", seed=10, iterations=1, render=render) + + # Custom MetaWorld task + example_custom_dmc_and_mp(seed=10, iterations=1, render=render) From 5c7045101810b210e72c52486cae31f80174a429 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Mon, 23 Aug 2021 17:24:55 +0200 Subject: [PATCH 46/56] added more documentation --- README.md | 259 ++++++++---- alr_envs/__init__.py | 498 +++++++----------------- alr_envs/classic_control/README.MD | 21 + alr_envs/dmc/README.MD | 18 +- alr_envs/examples/examples_dmc.py | 25 +- alr_envs/examples/examples_metaworld.py | 20 +- alr_envs/mujoco/README.MD | 15 + alr_envs/open_ai/README.MD | 13 +- 8 files changed, 419 insertions(+), 450 deletions(-) create mode 100644 alr_envs/classic_control/README.MD create mode 100644 alr_envs/mujoco/README.MD diff --git a/README.md b/README.md index 74e3838..860bddc 100644 --- a/README.md +++ b/README.md @@ -1,105 +1,212 @@ ## ALR Robotics Control Environments - -This repository collects custom Robotics environments not included in benchmark suites like OpenAI gym, rllab, etc. -Creating a custom (Mujoco) gym environment can be done according to [this guide](https://github.com/openai/gym/blob/master/docs/creating-environments.md). -For stochastic search problems with gym interface use the `Rosenbrock-v0` reference implementation. -We also support to solve environments with Dynamic Movement Primitives (DMPs) and Probabilistic Movement Primitives (DetPMP, we only consider the mean usually). -## Step-based Environments -Currently we have the following environments: - -### Mujoco - -|Name| Description|Horizon|Action Dimension|Observation Dimension -|---|---|---|---|---| -|`ALRReacher-v0`|Modified (5 links) Mujoco gym's `Reacher-v2` (2 links)| 200 | 5 | 21 -|`ALRReacherSparse-v0`|Same as `ALRReacher-v0`, but the distance penalty is only provided in the last time step.| 200 | 5 | 21 -|`ALRReacherSparseBalanced-v0`|Same as `ALRReacherSparse-v0`, but the end-effector has to remain upright.| 200 | 5 | 21 -|`ALRLongReacher-v0`|Modified (7 links) Mujoco gym's `Reacher-v2` (2 links)| 200 | 7 | 27 -|`ALRLongReacherSparse-v0`|Same as `ALRLongReacher-v0`, but the distance penalty is only provided in the last time step.| 200 | 7 | 27 -|`ALRLongReacherSparseBalanced-v0`|Same as `ALRLongReacherSparse-v0`, but the end-effector has to remain upright.| 200 | 7 | 27 -|`ALRBallInACupSimple-v0`| Ball-in-a-cup task where a robot needs to catch a ball attached to a cup at its end-effector. | 4000 | 3 | wip -|`ALRBallInACup-v0`| Ball-in-a-cup task where a robot needs to catch a ball attached to a cup at its end-effector | 4000 | 7 | wip -|`ALRBallInACupGoal-v0`| Similiar to `ALRBallInACupSimple-v0` but the ball needs to be caught at a specified goal position | 4000 | 7 | wip - -### Classic Control - -|Name| Description|Horizon|Action Dimension|Observation Dimension -|---|---|---|---|---| -|`SimpleReacher-v0`| Simple reaching task (2 links) without any physics simulation. Provides no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions towards the end of the trajectory.| 200 | 2 | 9 -|`LongSimpleReacher-v0`| Simple reaching task (5 links) without any physics simulation. Provides no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions towards the end of the trajectory.| 200 | 5 | 18 -|`ViaPointReacher-v0`| Simple reaching task leveraging a via point, which supports self collision detection. Provides a reward only at 100 and 199 for reaching the viapoint and goal point, respectively.| 200 | 5 | 18 -|`HoleReacher-v0`| 5 link reaching task where the end-effector needs to reach into a narrow hole without collding with itself or walls | 200 | 5 | 18 +This project offers a large verity of reinforcement learning environments under a unifying interface base on OpenAI gym. +Besides, some custom environments we also provide support for the benchmark suites +[OpenAI gym](https://gym.openai.com/), +[DeepMind Control](https://deepmind.com/research/publications/2020/dm-control-Software-and-Tasks-for-Continuous-Control) +(DMC), and [Metaworld](https://meta-world.github.io/). Custom (Mujoco) gym environment can be created according +to [this guide](https://github.com/openai/gym/blob/master/docs/creating-environments.md). Unlike existing libraries, we +further support to control agents with Dynamic Movement Primitives (DMPs) and Probabilistic Movement Primitives (DetPMP, +we only consider the mean usually). ## Motion Primitive Environments (Episodic environments) -Unlike step-based environments, these motion primitive (MP) environments are closer to stochastic search and what can be found in robotics. They always execute a full trajectory, which is computed by a Dynamic Motion Primitive (DMP) or Probabilitic Motion Primitive (DetPMP) and translated into individual actions with a controller, e.g. a PD controller. The actual Controller, however, depends on the type of environment, i.e. position, velocity, or torque controlled. -The goal is to learn the parametrization of the motion primitives in order to generate a suitable trajectory. -MP This can also be done in a contextual setting, where all changing elements of the task are exposed once in the beginning. This requires to find a new parametrization for each trajectory. -All environments provide the full cumulative episode reward and additional information about early terminations, e.g. due to collisions. -### Classic Control -|Name| Description|Horizon|Action Dimension|Context Dimension -|---|---|---|---|---| -|`ViaPointReacherDMP-v0`| A DMP provides a trajectory for the `ViaPointReacher-v0` task. | 200 | 25 -|`HoleReacherFixedGoalDMP-v0`| A DMP provides a trajectory for the `HoleReacher-v0` task with a fixed goal attractor. | 200 | 25 -|`HoleReacherDMP-v0`| A DMP provides a trajectory for the `HoleReacher-v0` task. The goal attractor needs to be learned. | 200 | 30 -|`ALRBallInACupSimpleDMP-v0`| A DMP provides a trajectory for the `ALRBallInACupSimple-v0` task where only 3 joints are actuated. | 4000 | 15 -|`ALRBallInACupDMP-v0`| A DMP provides a trajectory for the `ALRBallInACup-v0` task. | 4000 | 35 -|`ALRBallInACupGoalDMP-v0`| A DMP provides a trajectory for the `ALRBallInACupGoal-v0` task. | 4000 | 35 | 3 +Unlike step-based environments, motion primitive (MP) environments are closer related to stochastic search, black box +optimization and methods that often used in robotics. MP environments are trajectory-based and always execute a full +trajectory, which is generated by a Dynamic Motion Primitive (DMP) or a Probabilistic Motion Primitive (DetPMP). The +generated trajectory is translated into individual step-wise actions by a controller. The exact choice of controller is, +however, dependent on the type of environment. We currently support position, velocity, and PD-Controllers for position, +velocity and torque control, respectively. The goal of all MP environments is still to learn a policy. Yet, an action +represents the parametrization of the motion primitives to generate a suitable trajectory. Additionally, in this +framework we support the above setting for the contextual setting, for which we expose all changing substates of the +task as a single observation in the beginning. This requires to predict a new action/MP parametrization for each +trajectory. All environments provide the next to the cumulative episode reward also all collected information from each +step as part of the info dictionary. This information should, however, mainly be used for debugging and logging. -[//]: |`HoleReacherDetPMP-v0`| +|Key| Description| +|---|---| +`trajectory`| Generated trajectory from MP +`step_actions`| Step-wise executed action based on controller output +`step_observations`| Step-wise intermediate observations +`step_rewards`| Step-wise rewards +`trajectory_length`| Total number of environment interactions +`other`| All other information from the underlying environment are returned as a list with length `trajectory_length` maintaining the original key. In case some information are not provided every time step, the missing values are filled with `None`. -### OpenAI gym Environments -These environments are wrapped-versions of their OpenAI-gym counterparts. +## Installation -|Name| Description|Trajectory Horizon|Action Dimension|Context Dimension -|---|---|---|---|---| -|`ContinuousMountainCarDetPMP-v0`| A DetPmP wrapped version of the ContinuousMountainCar-v0 environment. | 100 | 1 -|`ReacherDetPMP-v2`| A DetPmP wrapped version of the Reacher-v2 environment. | 50 | 2 -|`FetchSlideDenseDetPMP-v1`| A DetPmP wrapped version of the FetchSlideDense-v1 environment. | 50 | 4 -|`FetchReachDenseDetPMP-v1`| A DetPmP wrapped version of the FetchReachDense-v1 environment. | 50 | 4 +1. Clone the repository -### Deep Mind Control Suite Environments -These environments are wrapped-versions of their Deep Mind Control Suite (DMC) counterparts. -Given most task can be solved in shorter horizon lengths than the original 1000 steps, we often shorten the episodes for those task. - -|Name| Description|Trajectory Horizon|Action Dimension|Context Dimension -|---|---|---|---|---| -|`dmc_ball_in_cup-catch_detpmp-v0`| A DetPmP wrapped version of the "catch" task for the "ball_in_cup" environment. | 50 | 10 | 2 -|`dmc_ball_in_cup-catch_dmp-v0`| A DMP wrapped version of the "catch" task for the "ball_in_cup" environment. | 50| 10 | 2 -|`dmc_reacher-easy_detpmp-v0`| A DetPmP wrapped version of the "easy" task for the "reacher" environment. | 1000 | 10 | 4 -|`dmc_reacher-easy_dmp-v0`| A DMP wrapped version of the "easy" task for the "reacher" environment. | 1000| 10 | 4 -|`dmc_reacher-hard_detpmp-v0`| A DetPmP wrapped version of the "hard" task for the "reacher" environment.| 1000 | 10 | 4 -|`dmc_reacher-hard_dmp-v0`| A DMP wrapped version of the "hard" task for the "reacher" environment. | 1000 | 10 | 4 - -## Install -1. Clone the repository ```bash git clone git@github.com:ALRhub/alr_envs.git ``` -2. Go to the folder + +2. Go to the folder + ```bash cd alr_envs ``` -3. Install with + +3. Install with + ```bash pip install -e . ``` -4. Use (see [example.py](alr_envs/examples/examples_general.py)): -```python -import gym -env = gym.make('alr_envs:SimpleReacher-v0') +## Using the framework + +We prepared [multiple examples](alr_envs/examples/), please have a look there for more specific examples. + +### Step-wise environments + +```python +import alr_envs + +env = alr_envs.make('HoleReacher-v0', seed=1) state = env.reset() -for i in range(10000): +for i in range(1000): state, reward, done, info = env.step(env.action_space.sample()) if i % 5 == 0: env.render() if done: state = env.reset() - ``` -For an example using a DMP wrapped env and asynchronous sampling look at [mp_env_async_sampler.py](./alr_envs/utils/mp_env_async_sampler.py) +For Deepmind control tasks we expect the `env_id` to be specified as `domain_name-task_name` or for manipulation tasks +as `manipulation-environment_name`. All other environments can be created based on their original name. + +Existing MP tasks can be created the same way as above. Just keep in mind, calling `step()` always executs a full +trajectory. + +```python +import alr_envs + +env = alr_envs.make('HoleReacherDetPMP-v0', seed=1) +# render() can be called once in the beginning with all necessary arguments. To turn it of again just call render(None). +env.render() + +state = env.reset() + +for i in range(5): + state, reward, done, info = env.step(env.action_space.sample()) + + # Not really necessary as the environments resets itself after each trajectory anyway. + state = env.reset() +``` + +To show all available environments, we provide some additional convenience. Each value will return a dictionary with two +keys `DMP` and `DetPMP` that store a list of available environment names. + +```python +import alr_envs + +print("Custom MP tasks:") +print(alr_envs.ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS) + +print("OpenAI Gym MP tasks:") +print(alr_envs.ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS) + +print("Deepmind Control MP tasks:") +print(alr_envs.ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS) + +print("MetaWorld MP tasks:") +print(alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS) +``` + +### How to create a new MP task + +In case a required task is not supported yet in the MP framework, it can be created relatively easy. For the task at +hand, the following interface needs to be implemented. + +```python +import numpy as np +from mp_env_api import MPEnvWrapper + + +class MPWrapper(MPEnvWrapper): + + @property + def active_obs(self): + """ + Returns boolean mask for each substate in the full observation. + It determines whether the observation is returned for the contextual case or not. + This effectively allows to filter unwanted or unnecessary observations from the full step-based case. + E.g. Velocities starting at 0 are only changing after the first action. Given we only receive the first + observation, the velocities are not necessary in the observation for the MP task. + """ + return np.ones(self.observation_space.shape, dtype=bool) + + @property + def current_vel(self): + """ + Returns the current velocity of the action/control dimension. + The dimensionality has to match the action/control dimension. + This is not required when exclusively using position control, + it should, however, be implemented regardless. + E.g. The joint velocities that are directly or indirectly controlled by the action. + """ + raise NotImplementedError() + + @property + def current_pos(self): + """ + Returns the current position of the action/control dimension. + The dimensionality has to match the action/control dimension. + This is not required when exclusively using velocity control, + it should, however, be implemented regardless. + E.g. The joint positions that are directly or indirectly controlled by the action. + """ + raise NotImplementedError() + + @property + def goal_pos(self): + """ + Returns a predefined final position of the action/control dimension. + This is only required for the DMP and is most of the time learned instead. + """ + raise NotImplementedError() + + @property + def dt(self): + """ + Returns the time between two simulated steps of the environment + """ + raise NotImplementedError() + +``` + +If you created a new task wrapper, feel free to open a PR, so we can integrate it for others to use as well. +Without the integration the task can still be used. A rough outline can be shown here, for more details we recommend +having a look at the [examples](alr_envs/examples/). + +```python +import alr_envs + +# Base environment name, according to structure of above example +base_env_id = "ball_in_cup-catch" + +# Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. +# You can also add other gym.Wrappers in case they are needed, +# e.g. gym.wrappers.FlattenObservation for dict observations +wrappers = [alr_envs.dmc.suite.ball_in_cup.MPWrapper] +mp_kwargs = {...} +kwargs = {...} +env = alr_envs.make_dmp_env(base_env_id, wrappers=wrappers, seed=1, mp_kwargs=mp_kwargs, **kwargs) +# OR for a deterministic ProMP (other mp_kwargs are required): +# env = alr_envs.make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_args) + +rewards = 0 +obs = env.reset() + +# number of samples/full trajectories (multiple environment steps) +for i in range(5): + ac = env.action_space.sample() + obs, reward, done, info = env.step(ac) + rewards += reward + + if done: + print(base_env_id, rewards) + rewards = 0 + obs = env.reset() +``` diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index a0d1b43..9fb3ae2 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -8,6 +8,13 @@ from alr_envs.utils.make_env_helpers import make_detpmp_env from alr_envs.utils.make_env_helpers import make from alr_envs.utils.make_env_helpers import make_rank +# Convenience function for all MP environments +ALL_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} +ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} +ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} + # Mujoco ## Reacher @@ -197,8 +204,9 @@ register( versions = ["SimpleReacher-v0", "SimpleReacher-v1", "LongSimpleReacher-v0", "LongSimpleReacher-v1"] for v in versions: name = v.split("-") + env_id = f'{name[0]}DMP-{name[1]}' register( - id=f'{name[0]}DMP-{name[1]}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ @@ -215,6 +223,28 @@ for v in versions: } } ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) + + env_id = f'{name[0]}DetPMP-{name[1]}' + register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"alr_envs:{v}", + "wrappers": [classic_control.simple_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2 if "long" not in v.lower() else 5, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } + } + ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) register( id='ViaPointReacherDMP-v0', @@ -234,6 +264,7 @@ register( } } ) +ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("ViaPointReacherDMP-v0") register( id='ViaPointReacherDetPMP-v0', @@ -253,12 +284,14 @@ register( } } ) +ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ViaPointReacherDetPMP-v0") ## Hole Reacher versions = ["v0", "v1", "v2"] for v in versions: + env_id = f'HoleReacherDMP-{v}' register( - id=f'HoleReacherDMP-{v}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ @@ -277,9 +310,11 @@ for v in versions: } } ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) + env_id = f'HoleReacherDetPMP-{v}' register( - id=f'HoleReacherDetPMP-{v}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"alr_envs:HoleReacher-{v}", @@ -295,6 +330,7 @@ for v in versions: } } ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) ## Deep Mind Control Suite (DMC) ### Suite @@ -305,13 +341,13 @@ register( # max_episode_steps=1, kwargs={ "name": f"ball_in_cup-catch", - "time_limit": 2, - "episode_length": 100, + "time_limit": 20, + "episode_length": 1000, "wrappers": [dmc.suite.ball_in_cup.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 2, + "duration": 20, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, @@ -324,19 +360,20 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_ball_in_cup-catch_dmp-v0") register( id=f'dmc_ball_in_cup-catch_detpmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"ball_in_cup-catch", - "time_limit": 2, - "episode_length": 100, + "time_limit": 20, + "episode_length": 1000, "wrappers": [dmc.suite.ball_in_cup.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 2, + "duration": 20, "width": 0.025, "policy_type": "motor", "zero_start": True, @@ -347,21 +384,21 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_ball_in_cup-catch_detpmp-v0") -# TODO tune episode length for all below register( id=f'dmc_reacher-easy_dmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', # max_episode_steps=1, kwargs={ "name": f"reacher-easy", - "time_limit": 1, - "episode_length": 50, + "time_limit": 20, + "episode_length": 1000, "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 1, + "duration": 20, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, @@ -375,19 +412,20 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_reacher-easy_dmp-v0") register( id=f'dmc_reacher-easy_detpmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"reacher-easy", - "time_limit": 1, - "episode_length": 50, + "time_limit": 20, + "episode_length": 1000, "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 1, + "duration": 20, "width": 0.025, "policy_type": "motor", "weights_scale": 0.2, @@ -399,6 +437,7 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-easy_detpmp-v0") register( id=f'dmc_reacher-hard_dmp-v0', @@ -406,13 +445,13 @@ register( # max_episode_steps=1, kwargs={ "name": f"reacher-hard", - "time_limit": 1, - "episode_length": 50, + "time_limit": 20, + "episode_length": 1000, "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 1, + "duration": 20, "learn_goal": True, "alpha_phase": 2, "bandwidth_factor": 2, @@ -426,19 +465,20 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_reacher-hard_dmp-v0") register( id=f'dmc_reacher-hard_detpmp-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": f"reacher-hard", - "time_limit": 1, - "episode_length": 50, + "time_limit": 20, + "episode_length": 1000, "wrappers": [dmc.suite.reacher.MPWrapper], "mp_kwargs": { "num_dof": 2, "num_basis": 5, - "duration": 1, + "duration": 20, "width": 0.025, "policy_type": "motor", "weights_scale": 0.2, @@ -450,323 +490,67 @@ register( } } ) -register( - id=f'dmc_cartpole-balance_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-balance", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-hard_detpmp-v0") -register( - id=f'dmc_cartpole-balance_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-balance", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -register( - id=f'dmc_cartpole-balance_sparse_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-balance_sparse", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) +dmc_cartpole_tasks = ["balance", "balance_sparse", "swingup", "swingup_sparse", "two_poles", "three_poles"] -register( - id=f'dmc_cartpole-balance_sparse_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-balance_sparse", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 +for task in dmc_cartpole_tasks: + env_id = f'dmc_cartpole-{task}_dmp-v0' + register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-{task}", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [dmc.suite.cartpole.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } } } - } -) + ) + ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) -register( - id=f'dmc_cartpole-swingup_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-swingup", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 + env_id = f'dmc_cartpole-{task}_detpmp-v0' + register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-{task}", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [dmc.suite.cartpole.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } } } - } -) - -register( - id=f'dmc_cartpole-swingup_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-swingup", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -register( - id=f'dmc_cartpole-swingup_sparse_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-swingup_sparse", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) - -register( - id=f'dmc_cartpole-swingup_sparse_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-swingup_sparse", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -register( - id=f'dmc_cartpole-two_poles_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-two_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=2)], - "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) - -register( - id=f'dmc_cartpole-two_poles_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-two_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=2)], - "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -register( - id=f'dmc_cartpole-three_poles_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-three_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=3)], - "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) - -register( - id=f'dmc_cartpole-three_poles_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-three_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - # "wrappers": [partial(DMCCartpoleMPWrapper, n_poles=3)], - "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) + ) + ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) ### Manipulation @@ -792,6 +576,7 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_manipulation-reach_site_dmp-v0") register( id=f'dmc_manipulation-reach_site_detpmp-v0', @@ -812,6 +597,7 @@ register( } } ) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_manipulation-reach_site_detpmp-v0") ## Open AI register( @@ -835,6 +621,7 @@ register( } } ) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ContinuousMountainCarDetPMP-v0") register( id='ReacherDetPMP-v2', @@ -857,6 +644,7 @@ register( } } ) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ReacherDetPMP-v2") register( id='FetchSlideDenseDetPMP-v1', @@ -875,6 +663,7 @@ register( } } ) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchSlideDenseDetPMP-v1") register( id='FetchSlideDetPMP-v1', @@ -893,6 +682,7 @@ register( } } ) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchSlideDetPMP-v1") register( id='FetchReachDenseDetPMP-v1', @@ -911,6 +701,7 @@ register( } } ) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchReachDenseDetPMP-v1") register( id='FetchReachDetPMP-v1', @@ -929,19 +720,21 @@ register( } } ) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchReachDetPMP-v1") # MetaWorld goal_change_envs = ["assembly-v2", "pick-out-of-hole-v2", "plate-slide-v2", "plate-slide-back-v2", ] -for env_id in goal_change_envs: - env_id_split = env_id.split("-") - name = "".join([s.capitalize() for s in env_id_split[:-1]]) +for task in goal_change_envs: + task_id_split = task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + env_id = f'{name}DetPMP-{task_id_split[-1]}' register( - id=f'{name}DetPMP-{env_id_split[-1]}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ - "name": env_id, + "name": task, "wrappers": [meta.goal_change.MPWrapper], "mp_kwargs": { "num_dof": 4, @@ -954,13 +747,15 @@ for env_id in goal_change_envs: } } ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) object_change_envs = ["bin-picking-v2", "hammer-v2", "sweep-into-v2"] -for env_id in object_change_envs: - env_id_split = env_id.split("-") - name = "".join([s.capitalize() for s in env_id_split[:-1]]) +for task in object_change_envs: + task_id_split = task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + env_id = f'{name}DetPMP-{task_id_split[-1]}' register( - id=f'{name}DetPMP-{env_id_split[-1]}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": env_id, @@ -976,6 +771,7 @@ for env_id in object_change_envs: } } ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) goal_and_object_change_envs = ["box-close-v2", "button-press-v2", "button-press-wall-v2", "button-press-topdown-v2", "button-press-topdown-wall-v2", "coffee-button-v2", "coffee-pull-v2", @@ -988,11 +784,12 @@ goal_and_object_change_envs = ["box-close-v2", "button-press-v2", "button-press- "soccer-v2", "stick-push-v2", "stick-pull-v2", "push-wall-v2", "reach-wall-v2", "shelf-place-v2", "sweep-v2", "window-open-v2", "window-close-v2" ] -for env_id in goal_and_object_change_envs: - env_id_split = env_id.split("-") - name = "".join([s.capitalize() for s in env_id_split[:-1]]) +for task in goal_and_object_change_envs: + task_id_split = task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + env_id = f'{name}DetPMP-{task_id_split[-1]}' register( - id=f'{name}DetPMP-{env_id_split[-1]}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": env_id, @@ -1008,13 +805,15 @@ for env_id in goal_and_object_change_envs: } } ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) goal_and_endeffector_change_envs = ["basketball-v2"] -for env_id in goal_and_endeffector_change_envs: - env_id_split = env_id.split("-") - name = "".join([s.capitalize() for s in env_id_split[:-1]]) +for task in goal_and_endeffector_change_envs: + task_id_split = task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + env_id = f'{name}DetPMP-{task_id_split[-1]}' register( - id=f'{name}DetPMP-{env_id_split[-1]}', + id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ "name": env_id, @@ -1030,3 +829,4 @@ for env_id in goal_and_endeffector_change_envs: } } ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) diff --git a/alr_envs/classic_control/README.MD b/alr_envs/classic_control/README.MD new file mode 100644 index 0000000..ebe2101 --- /dev/null +++ b/alr_envs/classic_control/README.MD @@ -0,0 +1,21 @@ +### Classic Control + +## Step-based Environments +|Name| Description|Horizon|Action Dimension|Observation Dimension +|---|---|---|---|---| +|`SimpleReacher-v0`| Simple reaching task (2 links) without any physics simulation. Provides no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions towards the end of the trajectory.| 200 | 2 | 9 +|`LongSimpleReacher-v0`| Simple reaching task (5 links) without any physics simulation. Provides no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions towards the end of the trajectory.| 200 | 5 | 18 +|`ViaPointReacher-v0`| Simple reaching task leveraging a via point, which supports self collision detection. Provides a reward only at 100 and 199 for reaching the viapoint and goal point, respectively.| 200 | 5 | 18 +|`HoleReacher-v0`| 5 link reaching task where the end-effector needs to reach into a narrow hole without collding with itself or walls | 200 | 5 | 18 + +## MP Environments +|Name| Description|Horizon|Action Dimension|Context Dimension +|---|---|---|---|---| +|`ViaPointReacherDMP-v0`| A DMP provides a trajectory for the `ViaPointReacher-v0` task. | 200 | 25 +|`HoleReacherFixedGoalDMP-v0`| A DMP provides a trajectory for the `HoleReacher-v0` task with a fixed goal attractor. | 200 | 25 +|`HoleReacherDMP-v0`| A DMP provides a trajectory for the `HoleReacher-v0` task. The goal attractor needs to be learned. | 200 | 30 +|`ALRBallInACupSimpleDMP-v0`| A DMP provides a trajectory for the `ALRBallInACupSimple-v0` task where only 3 joints are actuated. | 4000 | 15 +|`ALRBallInACupDMP-v0`| A DMP provides a trajectory for the `ALRBallInACup-v0` task. | 4000 | 35 +|`ALRBallInACupGoalDMP-v0`| A DMP provides a trajectory for the `ALRBallInACupGoal-v0` task. | 4000 | 35 | 3 + +[//]: |`HoleReacherDetPMP-v0`| \ No newline at end of file diff --git a/alr_envs/dmc/README.MD b/alr_envs/dmc/README.MD index f7d7475..791ee84 100644 --- a/alr_envs/dmc/README.MD +++ b/alr_envs/dmc/README.MD @@ -1,3 +1,19 @@ # DeepMind Control (DMC) Wrappers -These are the Environment Wrappers for selected [DeepMind Control](https://deepmind.com/research/publications/2020/dm-control-Software-and-Tasks-for-Continuous-Control) environments in order to use our Motion Primitive gym interface with them. \ No newline at end of file +These are the Environment Wrappers for selected +[DeepMind Control](https://deepmind.com/research/publications/2020/dm-control-Software-and-Tasks-for-Continuous-Control) +environments in order to use our Motion Primitive gym interface with them. + +## MP Environments + +[//]: <> (These environments are wrapped-versions of their Deep Mind Control Suite (DMC) counterparts. Given most task can be) +[//]: <> (solved in shorter horizon lengths than the original 1000 steps, we often shorten the episodes for those task.) + +|Name| Description|Trajectory Horizon|Action Dimension|Context Dimension +|---|---|---|---|---| +|`dmc_ball_in_cup-catch_detpmp-v0`| A DetPmP wrapped version of the "catch" task for the "ball_in_cup" environment. | 1000 | 10 | 2 +|`dmc_ball_in_cup-catch_dmp-v0`| A DMP wrapped version of the "catch" task for the "ball_in_cup" environment. | 1000| 10 | 2 +|`dmc_reacher-easy_detpmp-v0`| A DetPmP wrapped version of the "easy" task for the "reacher" environment. | 1000 | 10 | 4 +|`dmc_reacher-easy_dmp-v0`| A DMP wrapped version of the "easy" task for the "reacher" environment. | 1000| 10 | 4 +|`dmc_reacher-hard_detpmp-v0`| A DetPmP wrapped version of the "hard" task for the "reacher" environment.| 1000 | 10 | 4 +|`dmc_reacher-hard_dmp-v0`| A DMP wrapped version of the "hard" task for the "reacher" environment. | 1000 | 10 | 4 diff --git a/alr_envs/examples/examples_dmc.py b/alr_envs/examples/examples_dmc.py index 95dd51d..2d310c4 100644 --- a/alr_envs/examples/examples_dmc.py +++ b/alr_envs/examples/examples_dmc.py @@ -1,5 +1,4 @@ import alr_envs -from alr_envs.dmc.suite.ball_in_cup.mp_wrapper import MPWrapper def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): @@ -62,29 +61,29 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. - wrappers = [MPWrapper] + wrappers = [alr_envs.dmc.suite.ball_in_cup.MPWrapper] mp_kwargs = { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "learn_goal": True, + "num_dof": 2, # degrees of fredom a.k.a. the old action space dimensionality + "num_basis": 5, # number of basis functions, the new action space has size num_dof x num_basis + "duration": 20, # length of trajectory in s, number of steps = duration / dt + "learn_goal": True, # learn the goal position (recommended) "alpha_phase": 2, "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { + "policy_type": "motor", # controller type, 'velocity', 'position', and 'motor' (torque control) + "weights_scale": 1, # scaling of MP weights + "goal_scale": 1, # scaling of learned goal position + "policy_kwargs": { # only required for torque control/PD-Controller "p_gains": 0.2, "d_gains": 0.05 } } kwargs = { - "time_limit": 20, - "episode_length": 1000, + "time_limit": 20, # same as duration value but as max horizon for underlying DMC environment + "episode_length": 1000, # corresponding number of episode steps # "frame_skip": 1 } env = alr_envs.make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs, **kwargs) - # OR for a deterministic ProMP: + # OR for a deterministic ProMP (other mp_kwargs are required, see metaworld_examples): # env = alr_envs.make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_args) # This renders the full MP trajectory diff --git a/alr_envs/examples/examples_metaworld.py b/alr_envs/examples/examples_metaworld.py index b86b624..e88ed6c 100644 --- a/alr_envs/examples/examples_metaworld.py +++ b/alr_envs/examples/examples_metaworld.py @@ -1,5 +1,4 @@ import alr_envs -from alr_envs.meta.goal_and_object_change import MPWrapper def example_dmc(env_id="fish-swim", seed=1, iterations=1000, render=True): @@ -65,19 +64,20 @@ def example_custom_dmc_and_mp(seed=1, iterations=1, render=True): # Replace this wrapper with the custom wrapper for your environment by inheriting from the MPEnvWrapper. # You can also add other gym.Wrappers in case they are needed. - wrappers = [MPWrapper] + wrappers = [alr_envs.meta.goal_and_object_change.MPWrapper] mp_kwargs = { - "num_dof": 4, - "num_basis": 5, - "duration": 6.25, - "post_traj_time": 0, - "width": 0.025, - "zero_start": True, - "policy_type": "metaworld", + "num_dof": 4, # degrees of fredom a.k.a. the old action space dimensionality + "num_basis": 5, # number of basis functions, the new action space has size num_dof x num_basis + "duration": 6.25, # length of trajectory in s, number of steps = duration / dt + "post_traj_time": 0, # pad trajectory with additional zeros at the end (recommended: 0) + "width": 0.025, # width of the basis functions + "zero_start": True, # start from current environment position if True + "weights_scale": 1, # scaling of MP weights + "policy_type": "metaworld", # custom controller type for metaworld environments } env = alr_envs.make_detpmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs) - # OR for a DMP: + # OR for a DMP (other mp_kwargs are required, see dmc_examples): # env = alr_envs.make_dmp_env(base_env, wrappers=wrappers, seed=seed, mp_kwargs=mp_kwargs, **kwargs) # This renders the full MP trajectory diff --git a/alr_envs/mujoco/README.MD b/alr_envs/mujoco/README.MD new file mode 100644 index 0000000..0ea5a1f --- /dev/null +++ b/alr_envs/mujoco/README.MD @@ -0,0 +1,15 @@ +# Custom Mujoco tasks + +## Step-based Environments +|Name| Description|Horizon|Action Dimension|Observation Dimension +|---|---|---|---|---| +|`ALRReacher-v0`|Modified (5 links) Mujoco gym's `Reacher-v2` (2 links)| 200 | 5 | 21 +|`ALRReacherSparse-v0`|Same as `ALRReacher-v0`, but the distance penalty is only provided in the last time step.| 200 | 5 | 21 +|`ALRReacherSparseBalanced-v0`|Same as `ALRReacherSparse-v0`, but the end-effector has to remain upright.| 200 | 5 | 21 +|`ALRLongReacher-v0`|Modified (7 links) Mujoco gym's `Reacher-v2` (2 links)| 200 | 7 | 27 +|`ALRLongReacherSparse-v0`|Same as `ALRLongReacher-v0`, but the distance penalty is only provided in the last time step.| 200 | 7 | 27 +|`ALRLongReacherSparseBalanced-v0`|Same as `ALRLongReacherSparse-v0`, but the end-effector has to remain upright.| 200 | 7 | 27 +|`ALRBallInACupSimple-v0`| Ball-in-a-cup task where a robot needs to catch a ball attached to a cup at its end-effector. | 4000 | 3 | wip +|`ALRBallInACup-v0`| Ball-in-a-cup task where a robot needs to catch a ball attached to a cup at its end-effector | 4000 | 7 | wip +|`ALRBallInACupGoal-v0`| Similar to `ALRBallInACupSimple-v0` but the ball needs to be caught at a specified goal position | 4000 | 7 | wip + \ No newline at end of file diff --git a/alr_envs/open_ai/README.MD b/alr_envs/open_ai/README.MD index 9c30ffe..985c093 100644 --- a/alr_envs/open_ai/README.MD +++ b/alr_envs/open_ai/README.MD @@ -1,3 +1,14 @@ # OpenAI Gym Wrappers -These are the Environment Wrappers for selected [OpenAI Gym](https://gym.openai.com/) environments in order to use our Motion Primitive gym interface with them. \ No newline at end of file +These are the Environment Wrappers for selected [OpenAI Gym](https://gym.openai.com/) environments to use +the Motion Primitive gym interface for them. + +## MP Environments +These environments are wrapped-versions of their OpenAI-gym counterparts. + +|Name| Description|Trajectory Horizon|Action Dimension|Context Dimension +|---|---|---|---|---| +|`ContinuousMountainCarDetPMP-v0`| A DetPmP wrapped version of the ContinuousMountainCar-v0 environment. | 100 | 1 +|`ReacherDetPMP-v2`| A DetPmP wrapped version of the Reacher-v2 environment. | 50 | 2 +|`FetchSlideDenseDetPMP-v1`| A DetPmP wrapped version of the FetchSlideDense-v1 environment. | 50 | 4 +|`FetchReachDenseDetPMP-v1`| A DetPmP wrapped version of the FetchReachDense-v1 environment. | 50 | 4 From 031dba541a9a23b62995eb51818a351116eae68a Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 25 Aug 2021 11:43:32 +0200 Subject: [PATCH 47/56] fixed metaworld registration bug --- alr_envs/__init__.py | 124 +++++++++++++++++++++++- alr_envs/dmc/__init__.py | 1 - alr_envs/dmc/manipulation/__init__.py | 1 + alr_envs/dmc/suite/__init__.py | 1 + alr_envs/dmc/suite/cartpole/__init__.py | 2 +- alr_envs/utils/make_env_helpers.py | 3 +- test/test_envs.py | 6 ++ 7 files changed, 129 insertions(+), 9 deletions(-) diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 9fb3ae2..5664d7c 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -236,7 +236,7 @@ for v in versions: "mp_kwargs": { "num_dof": 2 if "long" not in v.lower() else 5, "num_basis": 5, - "duration": 2, + "duration": 20, "width": 0.025, "policy_type": "velocity", "weights_scale": 0.2, @@ -492,7 +492,7 @@ register( ) ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-hard_detpmp-v0") -dmc_cartpole_tasks = ["balance", "balance_sparse", "swingup", "swingup_sparse", "two_poles", "three_poles"] +dmc_cartpole_tasks = ["balance", "balance_sparse", "swingup", "swingup_sparse"] for task in dmc_cartpole_tasks: env_id = f'dmc_cartpole-{task}_dmp-v0' @@ -552,6 +552,120 @@ for task in dmc_cartpole_tasks: ) ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) +env_id = f'dmc_cartpole-two_poles_dmp-v0' +register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-two_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) + +env_id = f'dmc_cartpole-two_poles_detpmp-v0' +register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-two_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) + +env_id = f'dmc_cartpole-three_poles_dmp-v0' +register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-three_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) + +env_id = f'dmc_cartpole-three_poles_detpmp-v0' +register( + id=env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-three_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) + ### Manipulation register( @@ -758,7 +872,7 @@ for task in object_change_envs: id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ - "name": env_id, + "name": task, "wrappers": [meta.object_change.MPWrapper], "mp_kwargs": { "num_dof": 4, @@ -792,7 +906,7 @@ for task in goal_and_object_change_envs: id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ - "name": env_id, + "name": task, "wrappers": [meta.goal_and_object_change.MPWrapper], "mp_kwargs": { "num_dof": 4, @@ -816,7 +930,7 @@ for task in goal_and_endeffector_change_envs: id=env_id, entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', kwargs={ - "name": env_id, + "name": task, "wrappers": [meta.goal_and_endeffector_change.MPWrapper], "mp_kwargs": { "num_dof": 4, diff --git a/alr_envs/dmc/__init__.py b/alr_envs/dmc/__init__.py index c5a343d..b1cf281 100644 --- a/alr_envs/dmc/__init__.py +++ b/alr_envs/dmc/__init__.py @@ -1,4 +1,3 @@ -# from alr_envs.dmc import manipulation, suite from alr_envs.dmc.suite import ball_in_cup from alr_envs.dmc.suite import reacher from alr_envs.dmc.suite import cartpole diff --git a/alr_envs/dmc/manipulation/__init__.py b/alr_envs/dmc/manipulation/__init__.py index e69de29..5d17d4d 100644 --- a/alr_envs/dmc/manipulation/__init__.py +++ b/alr_envs/dmc/manipulation/__init__.py @@ -0,0 +1 @@ +from alr_envs.dmc.manipulation import reach diff --git a/alr_envs/dmc/suite/__init__.py b/alr_envs/dmc/suite/__init__.py index e69de29..f889cad 100644 --- a/alr_envs/dmc/suite/__init__.py +++ b/alr_envs/dmc/suite/__init__.py @@ -0,0 +1 @@ +from alr_envs.dmc.suite import cartpole, ball_in_cup, reacher diff --git a/alr_envs/dmc/suite/cartpole/__init__.py b/alr_envs/dmc/suite/cartpole/__init__.py index 823077a..c5f9bee 100644 --- a/alr_envs/dmc/suite/cartpole/__init__.py +++ b/alr_envs/dmc/suite/cartpole/__init__.py @@ -1,3 +1,3 @@ from .mp_wrapper import MPWrapper from .mp_wrapper import TwoPolesMPWrapper -from .mp_wrapper import ThreePolesMPWrapper \ No newline at end of file +from .mp_wrapper import ThreePolesMPWrapper diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 466f7cf..755b8ce 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -1,5 +1,4 @@ -import logging -from typing import Iterable, List, Type, Union +from typing import Iterable, Type, Union import gym import numpy as np diff --git a/test/test_envs.py b/test/test_envs.py index 8c21295..bf12693 100644 --- a/test/test_envs.py +++ b/test/test_envs.py @@ -99,6 +99,12 @@ class TestEnvironments(unittest.TestCase): 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 test_environment_functionality_meta(self): + """Tests that environments runs without errors using random actions.""" + for id in alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS['DetPMP']: + with self.subTest(msg=id): + self._run_env(id) + if __name__ == '__main__': unittest.main() From c443b06fef0339577c5cb2969fa498bbf7e11099 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 25 Aug 2021 17:16:20 +0200 Subject: [PATCH 48/56] improved project structure and exposed methods --- alr_envs/__init__.py | 955 +----------------- alr_envs/alr/__init__.py | 329 ++++++ alr_envs/{ => alr}/classic_control/README.MD | 0 alr_envs/alr/classic_control/__init__.py | 3 + .../classic_control/hole_reacher/__init__.py | 0 .../hole_reacher/hole_reacher.py | 2 +- .../hole_reacher/mp_wrapper.py | 0 .../simple_reacher/__init__.py | 0 .../simple_reacher/mp_wrapper.py | 0 .../simple_reacher/simple_reacher.py | 0 alr_envs/{ => alr}/classic_control/utils.py | 0 .../viapoint_reacher/__init__.py | 0 .../viapoint_reacher/mp_wrapper.py | 0 .../viapoint_reacher/viapoint_reacher.py | 4 +- alr_envs/{ => alr}/mujoco/README.MD | 0 alr_envs/alr/mujoco/__init__.py | 4 + alr_envs/{ => alr}/mujoco/alr_reward_fct.py | 0 .../mujoco/ball_in_a_cup/__init__.py | 0 .../mujoco/ball_in_a_cup/assets/biac_base.xml | 0 .../mujoco/ball_in_a_cup/ball_in_a_cup.py | 4 +- .../ball_in_a_cup/ball_in_a_cup_mp_wrapper.py | 0 .../ball_in_a_cup/ball_in_a_cup_reward.py | 2 +- .../ball_in_a_cup_reward_simple.py | 2 +- .../{ => alr}/mujoco/ball_in_a_cup/biac_pd.py | 4 +- .../{ => alr}/mujoco/ball_in_a_cup/utils.py | 2 +- .../{ => alr}/mujoco/beerpong/__init__.py | 0 .../mujoco/beerpong/assets/beerpong.xml | 0 .../{ => alr}/mujoco/beerpong/beerpong.py | 2 +- .../mujoco/beerpong/beerpong_reward.py | 2 +- .../mujoco/beerpong/beerpong_reward_simple.py | 2 +- .../mujoco/beerpong/beerpong_simple.py | 2 +- alr_envs/{ => alr}/mujoco/beerpong/utils.py | 4 +- .../mujoco/gym_table_tennis/__init__.py | 0 .../mujoco/gym_table_tennis/envs/__init__.py | 0 .../envs/assets/include_7_motor_actuator.xml | 0 .../assets/include_barrett_wam_7dof_left.xml | 0 .../assets/include_barrett_wam_7dof_right.xml | 0 .../envs/assets/include_table.xml | 0 .../envs/assets/include_target_ball.xml | 0 .../envs/assets/include_test_balls.xml | 0 .../envs/assets/meshes/base_link_convex.stl | Bin .../envs/assets/meshes/base_link_fine.stl | Bin .../meshes/bhand_finger_dist_link_fine.stl | Bin .../meshes/bhand_finger_med_link_convex.stl | Bin .../meshes/bhand_finger_med_link_fine.stl | Bin ...nger_prox_link_convex_decomposition_p1.stl | Bin ...nger_prox_link_convex_decomposition_p3.stl | Bin .../meshes/bhand_finger_prox_link_fine.stl | Bin ...hand_palm_link_convex_decomposition_p1.stl | Bin ...hand_palm_link_convex_decomposition_p2.stl | Bin ...hand_palm_link_convex_decomposition_p3.stl | Bin ...hand_palm_link_convex_decomposition_p4.stl | Bin .../envs/assets/meshes/elbow_link_convex.stl | Bin .../forearm_link_convex_decomposition_p1.stl | Bin .../forearm_link_convex_decomposition_p2.stl | Bin .../envs/assets/meshes/forearm_link_fine.stl | Bin .../shoulder_link_convex_decomposition_p1.stl | Bin .../shoulder_link_convex_decomposition_p2.stl | Bin .../shoulder_link_convex_decomposition_p3.stl | Bin .../envs/assets/meshes/shoulder_link_fine.stl | Bin .../meshes/shoulder_pitch_link_convex.stl | Bin .../meshes/shoulder_pitch_link_fine.stl | Bin ...upper_arm_link_convex_decomposition_p1.stl | Bin ...upper_arm_link_convex_decomposition_p2.stl | Bin .../assets/meshes/upper_arm_link_fine.stl | Bin .../assets/meshes/wrist_palm_link_convex.stl | Bin ...ist_pitch_link_convex_decomposition_p1.stl | Bin ...ist_pitch_link_convex_decomposition_p2.stl | Bin ...ist_pitch_link_convex_decomposition_p3.stl | Bin .../assets/meshes/wrist_pitch_link_fine.stl | Bin ...wrist_yaw_link_convex_decomposition_p1.stl | Bin ...wrist_yaw_link_convex_decomposition_p2.stl | Bin .../assets/meshes/wrist_yaw_link_fine.stl | Bin .../envs/assets/right_arm_actuator.xml | 0 .../gym_table_tennis/envs/assets/shared.xml | 0 .../envs/assets/table_tennis_env.xml | 0 .../gym_table_tennis/envs/table_tennis_env.py | 4 +- .../mujoco/gym_table_tennis/utils/__init__.py | 0 .../gym_table_tennis/utils/experiment.py | 2 +- .../utils/rewards/__init__.py | 0 .../utils/rewards/hierarchical_reward.py | 0 .../gym_table_tennis/utils/rewards/rewards.py | 0 .../mujoco/gym_table_tennis/utils/util.py | 0 .../mujoco/meshes/wam/base_link_convex.stl | Bin .../mujoco/meshes/wam/base_link_fine.stl | Bin alr_envs/{ => alr}/mujoco/meshes/wam/cup.stl | Bin .../mujoco/meshes/wam/cup_split1.stl | Bin .../mujoco/meshes/wam/cup_split10.stl | Bin .../mujoco/meshes/wam/cup_split11.stl | Bin .../mujoco/meshes/wam/cup_split12.stl | Bin .../mujoco/meshes/wam/cup_split13.stl | Bin .../mujoco/meshes/wam/cup_split14.stl | Bin .../mujoco/meshes/wam/cup_split15.stl | Bin .../mujoco/meshes/wam/cup_split16.stl | Bin .../mujoco/meshes/wam/cup_split17.stl | Bin .../mujoco/meshes/wam/cup_split18.stl | Bin .../mujoco/meshes/wam/cup_split2.stl | Bin .../mujoco/meshes/wam/cup_split3.stl | Bin .../mujoco/meshes/wam/cup_split4.stl | Bin .../mujoco/meshes/wam/cup_split5.stl | Bin .../mujoco/meshes/wam/cup_split6.stl | Bin .../mujoco/meshes/wam/cup_split7.stl | Bin .../mujoco/meshes/wam/cup_split8.stl | Bin .../mujoco/meshes/wam/cup_split9.stl | Bin .../mujoco/meshes/wam/elbow_link_convex.stl | Bin .../mujoco/meshes/wam}/elbow_link_fine.stl | Bin .../forearm_link_convex_decomposition_p1.stl | Bin .../forearm_link_convex_decomposition_p2.stl | Bin .../mujoco/meshes/wam/forearm_link_fine.stl | Bin .../shoulder_link_convex_decomposition_p1.stl | Bin .../shoulder_link_convex_decomposition_p2.stl | Bin .../shoulder_link_convex_decomposition_p3.stl | Bin .../mujoco/meshes/wam/shoulder_link_fine.stl | Bin .../meshes/wam/shoulder_pitch_link_convex.stl | Bin .../meshes/wam/shoulder_pitch_link_fine.stl | Bin ...upper_arm_link_convex_decomposition_p1.stl | Bin ...upper_arm_link_convex_decomposition_p2.stl | Bin .../mujoco/meshes/wam/upper_arm_link_fine.stl | Bin .../meshes/wam/wrist_palm_link_convex.stl | Bin .../meshes/wam}/wrist_palm_link_fine.stl | Bin ...ist_pitch_link_convex_decomposition_p3.stl | Bin ...wrist_yaw_link_convex_decomposition_p1.stl | Bin ...wrist_yaw_link_convex_decomposition_p2.stl | Bin alr_envs/{ => alr}/mujoco/reacher/__init__.py | 0 .../mujoco/reacher/assets/reacher_5links.xml | 0 .../mujoco/reacher/assets/reacher_7links.xml | 0 .../{ => alr}/mujoco/reacher/balancing.py | 0 alr_envs/classic_control/__init__.py | 3 - alr_envs/dmc/__init__.py | 389 ++++++- alr_envs/{utils => dmc}/dmc_wrapper.py | 0 alr_envs/dmc/manipulation/__init__.py | 2 +- .../{reach => reach_site}/__init__.py | 0 .../{reach => reach_site}/mp_wrapper.py | 0 alr_envs/dmc/suite/__init__.py | 2 +- alr_envs/meta/__init__.py | 115 ++- ...al_change.py => goal_change_mp_wrapper.py} | 0 ... => goal_endeffector_change_mp_wrapper.py} | 0 ...ge.py => goal_object_change_mp_wrapper.py} | 0 ..._change.py => object_change_mp_wrapper.py} | 0 alr_envs/mujoco/__init__.py | 4 - .../assets/ball-in-a-cup_base.xml | 366 ------- .../gym_table_tennis/envs/MUJOCO_LOG.TXT | 3 - .../meshes/bhand_finger_dist_link_convex.stl | Bin 57684 -> 0 bytes ...nger_prox_link_convex_decomposition_p2.stl | Bin 86684 -> 0 bytes .../envs/assets/meshes/bhand_palm_fine.stl | Bin 1146484 -> 0 bytes .../mujoco/meshes/wam/elbow_link_fine.stl | Bin 141384 -> 0 bytes .../meshes/wam/wrist_palm_link_fine.stl | Bin 44484 -> 0 bytes ...ist_pitch_link_convex_decomposition_p1.stl | Bin 35284 -> 0 bytes ...ist_pitch_link_convex_decomposition_p2.stl | Bin 34284 -> 0 bytes .../meshes/wam/wrist_pitch_link_fine.stl | Bin 563684 -> 0 bytes .../mujoco/meshes/wam/wrist_yaw_link_fine.stl | Bin 1316784 -> 0 bytes alr_envs/mujoco/reacher/alr_reacher.py | 88 -- alr_envs/open_ai/__init__.py | 133 ++- alr_envs/open_ai/classic_control/__init__.py | 1 + alr_envs/open_ai/mujoco/__init__.py | 1 + alr_envs/open_ai/robotics/__init__.py | 1 + alr_envs/utils/__init__.py | 2 +- alr_envs/utils/make_env_helpers.py | 21 +- alr_envs/utils/mp_env_async_sampler.py | 122 --- setup.py | 3 +- 160 files changed, 1010 insertions(+), 1575 deletions(-) create mode 100644 alr_envs/alr/__init__.py rename alr_envs/{ => alr}/classic_control/README.MD (100%) create mode 100644 alr_envs/alr/classic_control/__init__.py rename alr_envs/{ => alr}/classic_control/hole_reacher/__init__.py (100%) rename alr_envs/{ => alr}/classic_control/hole_reacher/hole_reacher.py (99%) rename alr_envs/{ => alr}/classic_control/hole_reacher/mp_wrapper.py (100%) rename alr_envs/{ => alr}/classic_control/simple_reacher/__init__.py (100%) rename alr_envs/{ => alr}/classic_control/simple_reacher/mp_wrapper.py (100%) rename alr_envs/{ => alr}/classic_control/simple_reacher/simple_reacher.py (100%) rename alr_envs/{ => alr}/classic_control/utils.py (100%) rename alr_envs/{ => alr}/classic_control/viapoint_reacher/__init__.py (100%) rename alr_envs/{ => alr}/classic_control/viapoint_reacher/mp_wrapper.py (100%) rename alr_envs/{ => alr}/classic_control/viapoint_reacher/viapoint_reacher.py (99%) rename alr_envs/{ => alr}/mujoco/README.MD (100%) create mode 100644 alr_envs/alr/mujoco/__init__.py rename alr_envs/{ => alr}/mujoco/alr_reward_fct.py (100%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/assets/biac_base.xml (100%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/ball_in_a_cup.py (96%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py (100%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py (99%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py (99%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/biac_pd.py (97%) rename alr_envs/{ => alr}/mujoco/ball_in_a_cup/utils.py (97%) rename alr_envs/{ => alr}/mujoco/beerpong/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/beerpong/assets/beerpong.xml (100%) rename alr_envs/{ => alr}/mujoco/beerpong/beerpong.py (98%) rename alr_envs/{ => alr}/mujoco/beerpong/beerpong_reward.py (99%) rename alr_envs/{ => alr}/mujoco/beerpong/beerpong_reward_simple.py (99%) rename alr_envs/{ => alr}/mujoco/beerpong/beerpong_simple.py (98%) rename alr_envs/{ => alr}/mujoco/beerpong/utils.py (93%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/include_7_motor_actuator.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_left.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_right.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/include_table.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/include_target_ball.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/include_test_balls.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/base_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/base_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p3.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p3.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p4.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p3.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p3.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/right_arm_actuator.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/shared.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/assets/table_tennis_env.xml (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/envs/table_tennis_env.py (98%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/utils/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/utils/experiment.py (96%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/utils/rewards/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/utils/rewards/hierarchical_reward.py (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/utils/rewards/rewards.py (100%) rename alr_envs/{ => alr}/mujoco/gym_table_tennis/utils/util.py (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/base_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/base_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split1.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split10.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split11.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split12.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split13.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split14.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split15.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split16.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split17.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split18.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split2.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split3.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split4.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split5.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split6.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split7.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split8.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/cup_split9.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/elbow_link_convex.stl (100%) rename alr_envs/{mujoco/gym_table_tennis/envs/assets/meshes => alr/mujoco/meshes/wam}/elbow_link_fine.stl (100%) mode change 100644 => 100755 rename alr_envs/{ => alr}/mujoco/meshes/wam/forearm_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/forearm_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/forearm_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/shoulder_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/shoulder_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/shoulder_link_convex_decomposition_p3.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/shoulder_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/shoulder_pitch_link_convex.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/shoulder_pitch_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/upper_arm_link_fine.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/wrist_palm_link_convex.stl (100%) rename alr_envs/{mujoco/gym_table_tennis/envs/assets/meshes => alr/mujoco/meshes/wam}/wrist_palm_link_fine.stl (100%) mode change 100644 => 100755 rename alr_envs/{ => alr}/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p3.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p1.stl (100%) rename alr_envs/{ => alr}/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p2.stl (100%) rename alr_envs/{ => alr}/mujoco/reacher/__init__.py (100%) rename alr_envs/{ => alr}/mujoco/reacher/assets/reacher_5links.xml (100%) rename alr_envs/{ => alr}/mujoco/reacher/assets/reacher_7links.xml (100%) rename alr_envs/{ => alr}/mujoco/reacher/balancing.py (100%) delete mode 100644 alr_envs/classic_control/__init__.py rename alr_envs/{utils => dmc}/dmc_wrapper.py (100%) rename alr_envs/dmc/manipulation/{reach => reach_site}/__init__.py (100%) rename alr_envs/dmc/manipulation/{reach => reach_site}/mp_wrapper.py (100%) rename alr_envs/meta/{goal_change.py => goal_change_mp_wrapper.py} (100%) rename alr_envs/meta/{goal_and_endeffector_change.py => goal_endeffector_change_mp_wrapper.py} (100%) rename alr_envs/meta/{goal_and_object_change.py => goal_object_change_mp_wrapper.py} (100%) rename alr_envs/meta/{object_change.py => object_change_mp_wrapper.py} (100%) delete mode 100644 alr_envs/mujoco/__init__.py delete mode 100644 alr_envs/mujoco/ball_in_a_cup/assets/ball-in-a-cup_base.xml delete mode 100644 alr_envs/mujoco/gym_table_tennis/envs/MUJOCO_LOG.TXT delete mode 100644 alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_convex.stl delete mode 100644 alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p2.stl delete mode 100644 alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_fine.stl delete mode 100755 alr_envs/mujoco/meshes/wam/elbow_link_fine.stl delete mode 100755 alr_envs/mujoco/meshes/wam/wrist_palm_link_fine.stl delete mode 100755 alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p1.stl delete mode 100755 alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p2.stl delete mode 100755 alr_envs/mujoco/meshes/wam/wrist_pitch_link_fine.stl delete mode 100755 alr_envs/mujoco/meshes/wam/wrist_yaw_link_fine.stl delete mode 100644 alr_envs/mujoco/reacher/alr_reacher.py delete mode 100644 alr_envs/utils/mp_env_async_sampler.py diff --git a/alr_envs/__init__.py b/alr_envs/__init__.py index 5664d7c..e43e3b1 100644 --- a/alr_envs/__init__.py +++ b/alr_envs/__init__.py @@ -1,946 +1,15 @@ -from gym.envs.registration import register -from gym.wrappers import FlattenObservation - -from alr_envs import classic_control, dmc, open_ai, meta - -from alr_envs.utils.make_env_helpers import make_dmp_env -from alr_envs.utils.make_env_helpers import make_detpmp_env -from alr_envs.utils.make_env_helpers import make -from alr_envs.utils.make_env_helpers import make_rank +from alr_envs import dmc, meta, open_ai +from alr_envs.utils.make_env_helpers import make, make_detpmp_env, make_dmp_env, make_rank +from alr_envs.utils import make_dmc # Convenience function for all MP environments -ALL_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} -ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} -ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} +from .alr import ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS +from .dmc import ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS +from .meta import ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS +from .open_ai import ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS -# Mujoco - -## Reacher -register( - id='ALRReacher-v0', - entry_point='alr_envs.mujoco:ALRReacherEnv', - max_episode_steps=200, - kwargs={ - "steps_before_reward": 0, - "n_links": 5, - "balance": False, - } -) - -register( - id='ALRReacherSparse-v0', - entry_point='alr_envs.mujoco:ALRReacherEnv', - max_episode_steps=200, - kwargs={ - "steps_before_reward": 200, - "n_links": 5, - "balance": False, - } -) - -register( - id='ALRReacherSparseBalanced-v0', - entry_point='alr_envs.mujoco:ALRReacherEnv', - max_episode_steps=200, - kwargs={ - "steps_before_reward": 200, - "n_links": 5, - "balance": True, - } -) - -register( - id='ALRLongReacher-v0', - entry_point='alr_envs.mujoco:ALRReacherEnv', - max_episode_steps=200, - kwargs={ - "steps_before_reward": 0, - "n_links": 7, - "balance": False, - } -) - -register( - id='ALRLongReacherSparse-v0', - entry_point='alr_envs.mujoco:ALRReacherEnv', - max_episode_steps=200, - kwargs={ - "steps_before_reward": 200, - "n_links": 7, - "balance": False, - } -) - -register( - id='ALRLongReacherSparseBalanced-v0', - entry_point='alr_envs.mujoco:ALRReacherEnv', - max_episode_steps=200, - kwargs={ - "steps_before_reward": 200, - "n_links": 7, - "balance": True, - } -) - -## Balancing Reacher - -register( - id='Balancing-v0', - entry_point='alr_envs.mujoco:BalancingEnv', - max_episode_steps=200, - kwargs={ - "n_links": 5, - } -) - -# Classic control - -## Simple Reacher -register( - id='SimpleReacher-v0', - entry_point='alr_envs.classic_control:SimpleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 2, - } -) - -register( - id='SimpleReacher-v1', - entry_point='alr_envs.classic_control:SimpleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 2, - "random_start": False - } -) - -register( - id='LongSimpleReacher-v0', - entry_point='alr_envs.classic_control:SimpleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 5, - } -) - -register( - id='LongSimpleReacher-v1', - entry_point='alr_envs.classic_control:SimpleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 5, - "random_start": False - } -) - -## Viapoint Reacher - -register( - id='ViaPointReacher-v0', - entry_point='alr_envs.classic_control:ViaPointReacher', - max_episode_steps=200, - kwargs={ - "n_links": 5, - "allow_self_collision": False, - "collision_penalty": 1000 - } -) - -## Hole Reacher -register( - id='HoleReacher-v0', - entry_point='alr_envs.classic_control:HoleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 5, - "random_start": True, - "allow_self_collision": False, - "allow_wall_collision": False, - "hole_width": None, - "hole_depth": 1, - "hole_x": None, - "collision_penalty": 100, - } -) - -register( - id='HoleReacher-v1', - entry_point='alr_envs.classic_control:HoleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 5, - "random_start": False, - "allow_self_collision": False, - "allow_wall_collision": False, - "hole_width": 0.25, - "hole_depth": 1, - "hole_x": None, - "collision_penalty": 100, - } -) - -register( - id='HoleReacher-v2', - entry_point='alr_envs.classic_control:HoleReacherEnv', - max_episode_steps=200, - kwargs={ - "n_links": 5, - "random_start": False, - "allow_self_collision": False, - "allow_wall_collision": False, - "hole_width": 0.25, - "hole_depth": 1, - "hole_x": 2, - "collision_penalty": 100, - } -) - -# Motion Primitive Environments - -## Simple Reacher -versions = ["SimpleReacher-v0", "SimpleReacher-v1", "LongSimpleReacher-v0", "LongSimpleReacher-v1"] -for v in versions: - name = v.split("-") - env_id = f'{name[0]}DMP-{name[1]}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"alr_envs:{v}", - "wrappers": [classic_control.simple_reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 2 if "long" not in v.lower() else 5, - "num_basis": 5, - "duration": 20, - "alpha_phase": 2, - "learn_goal": True, - "policy_type": "velocity", - "weights_scale": 50, - } - } - ) - ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) - - env_id = f'{name[0]}DetPMP-{name[1]}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"alr_envs:{v}", - "wrappers": [classic_control.simple_reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 2 if "long" not in v.lower() else 5, - "num_basis": 5, - "duration": 20, - "width": 0.025, - "policy_type": "velocity", - "weights_scale": 0.2, - "zero_start": True - } - } - ) - ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -register( - id='ViaPointReacherDMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": "alr_envs:ViaPointReacher-v0", - "wrappers": [classic_control.viapoint_reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "learn_goal": True, - "alpha_phase": 2, - "policy_type": "velocity", - "weights_scale": 50, - } - } -) -ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("ViaPointReacherDMP-v0") - -register( - id='ViaPointReacherDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": "alr_envs:ViaPointReacher-v0", - "wrappers": [classic_control.viapoint_reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "width": 0.025, - "policy_type": "velocity", - "weights_scale": 0.2, - "zero_start": True - } - } -) -ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ViaPointReacherDetPMP-v0") - -## Hole Reacher -versions = ["v0", "v1", "v2"] -for v in versions: - env_id = f'HoleReacherDMP-{v}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"alr_envs:HoleReacher-{v}", - "wrappers": [classic_control.hole_reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "velocity", - "weights_scale": 50, - "goal_scale": 0.1 - } - } - ) - ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) - - env_id = f'HoleReacherDetPMP-{v}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"alr_envs:HoleReacher-{v}", - "wrappers": [classic_control.hole_reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 5, - "num_basis": 5, - "duration": 2, - "width": 0.025, - "policy_type": "velocity", - "weights_scale": 0.2, - "zero_start": True - } - } - ) - ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -## Deep Mind Control Suite (DMC) -### Suite - -register( - id=f'dmc_ball_in_cup-catch_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"ball_in_cup-catch", - "time_limit": 20, - "episode_length": 1000, - "wrappers": [dmc.suite.ball_in_cup.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_ball_in_cup-catch_dmp-v0") - -register( - id=f'dmc_ball_in_cup-catch_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"ball_in_cup-catch", - "time_limit": 20, - "episode_length": 1000, - "wrappers": [dmc.suite.ball_in_cup.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "width": 0.025, - "policy_type": "motor", - "zero_start": True, - "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_ball_in_cup-catch_detpmp-v0") - -register( - id=f'dmc_reacher-easy_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"reacher-easy", - "time_limit": 20, - "episode_length": 1000, - "wrappers": [dmc.suite.reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_reacher-easy_dmp-v0") - -register( - id=f'dmc_reacher-easy_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"reacher-easy", - "time_limit": 20, - "episode_length": 1000, - "wrappers": [dmc.suite.reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-easy_detpmp-v0") - -register( - id=f'dmc_reacher-hard_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"reacher-hard", - "time_limit": 20, - "episode_length": 1000, - "wrappers": [dmc.suite.reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_reacher-hard_dmp-v0") - -register( - id=f'dmc_reacher-hard_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"reacher-hard", - "time_limit": 20, - "episode_length": 1000, - "wrappers": [dmc.suite.reacher.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 5, - "duration": 20, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 50, - "d_gains": 1 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-hard_detpmp-v0") - -dmc_cartpole_tasks = ["balance", "balance_sparse", "swingup", "swingup_sparse"] - -for task in dmc_cartpole_tasks: - env_id = f'dmc_cartpole-{task}_dmp-v0' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-{task}", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } - ) - ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) - - env_id = f'dmc_cartpole-{task}_detpmp-v0' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-{task}", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } - ) - ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -env_id = f'dmc_cartpole-two_poles_dmp-v0' -register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-two_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) - -env_id = f'dmc_cartpole-two_poles_detpmp-v0' -register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-two_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.TwoPolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -env_id = f'dmc_cartpole-three_poles_dmp-v0' -register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"cartpole-three_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "motor", - "weights_scale": 50, - "goal_scale": 0.1, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(env_id) - -env_id = f'dmc_cartpole-three_poles_detpmp-v0' -register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"cartpole-three_poles", - # "time_limit": 1, - "camera_id": 0, - "episode_length": 1000, - "wrappers": [dmc.suite.cartpole.ThreePolesMPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "motor", - "weights_scale": 0.2, - "zero_start": True, - "policy_kwargs": { - "p_gains": 10, - "d_gains": 10 - } - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -### Manipulation - -register( - id=f'dmc_manipulation-reach_site_dmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', - # max_episode_steps=1, - kwargs={ - "name": f"manipulation-reach_site_features", - # "time_limit": 1, - "episode_length": 250, - "wrappers": [dmc.manipulation.reach.MPWrapper], - "mp_kwargs": { - "num_dof": 9, - "num_basis": 5, - "duration": 10, - "learn_goal": True, - "alpha_phase": 2, - "bandwidth_factor": 2, - "policy_type": "velocity", - "weights_scale": 50, - "goal_scale": 0.1, - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_manipulation-reach_site_dmp-v0") - -register( - id=f'dmc_manipulation-reach_site_detpmp-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": f"manipulation-reach_site_features", - # "time_limit": 1, - "episode_length": 250, - "wrappers": [dmc.manipulation.reach.MPWrapper], - "mp_kwargs": { - "num_dof": 9, - "num_basis": 5, - "duration": 10, - "width": 0.025, - "policy_type": "velocity", - "weights_scale": 0.2, - "zero_start": True, - } - } -) -ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_manipulation-reach_site_detpmp-v0") - -## Open AI -register( - id='ContinuousMountainCarDetPMP-v0', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "gym.envs.classic_control:MountainCarContinuous-v0", - "wrappers": [open_ai.classic_control.continuous_mountain_car.MPWrapper], - "mp_kwargs": { - "num_dof": 1, - "num_basis": 4, - "duration": 2, - "post_traj_time": 0, - "width": 0.02, - "zero_start": True, - "policy_type": "motor", - "policy_kwargs": { - "p_gains": 1., - "d_gains": 1. - } - } - } -) -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ContinuousMountainCarDetPMP-v0") - -register( - id='ReacherDetPMP-v2', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "gym.envs.mujoco:Reacher-v2", - "wrappers": [open_ai.mujoco.reacher_v2.MPWrapper], - "mp_kwargs": { - "num_dof": 2, - "num_basis": 6, - "duration": 1, - "post_traj_time": 0, - "width": 0.02, - "zero_start": True, - "policy_type": "motor", - "policy_kwargs": { - "p_gains": .6, - "d_gains": .075 - } - } - } -) -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ReacherDetPMP-v2") - -register( - id='FetchSlideDenseDetPMP-v1', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "gym.envs.robotics:FetchSlideDense-v1", - "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 2, - "post_traj_time": 0, - "width": 0.02, - "zero_start": True, - "policy_type": "position" - } - } -) -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchSlideDenseDetPMP-v1") - -register( - id='FetchSlideDetPMP-v1', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "gym.envs.robotics:FetchSlide-v1", - "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 2, - "post_traj_time": 0, - "width": 0.02, - "zero_start": True, - "policy_type": "position" - } - } -) -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchSlideDetPMP-v1") - -register( - id='FetchReachDenseDetPMP-v1', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "gym.envs.robotics:FetchReachDense-v1", - "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 2, - "post_traj_time": 0, - "width": 0.02, - "zero_start": True, - "policy_type": "position" - } - } -) -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchReachDenseDetPMP-v1") - -register( - id='FetchReachDetPMP-v1', - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": "gym.envs.robotics:FetchReach-v1", - "wrappers": [FlattenObservation, open_ai.robotics.fetch.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 2, - "post_traj_time": 0, - "width": 0.02, - "zero_start": True, - "policy_type": "position" - } - } -) -ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchReachDetPMP-v1") - -# MetaWorld - -goal_change_envs = ["assembly-v2", "pick-out-of-hole-v2", "plate-slide-v2", "plate-slide-back-v2", - ] -for task in goal_change_envs: - task_id_split = task.split("-") - name = "".join([s.capitalize() for s in task_id_split[:-1]]) - env_id = f'{name}DetPMP-{task_id_split[-1]}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": task, - "wrappers": [meta.goal_change.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 6.25, - "post_traj_time": 0, - "width": 0.025, - "zero_start": True, - "policy_type": "metaworld", - } - } - ) - ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -object_change_envs = ["bin-picking-v2", "hammer-v2", "sweep-into-v2"] -for task in object_change_envs: - task_id_split = task.split("-") - name = "".join([s.capitalize() for s in task_id_split[:-1]]) - env_id = f'{name}DetPMP-{task_id_split[-1]}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": task, - "wrappers": [meta.object_change.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 6.25, - "post_traj_time": 0, - "width": 0.025, - "zero_start": True, - "policy_type": "metaworld", - } - } - ) - ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -goal_and_object_change_envs = ["box-close-v2", "button-press-v2", "button-press-wall-v2", "button-press-topdown-v2", - "button-press-topdown-wall-v2", "coffee-button-v2", "coffee-pull-v2", - "coffee-push-v2", "dial-turn-v2", "disassemble-v2", "door-close-v2", - "door-lock-v2", "door-open-v2", "door-unlock-v2", "hand-insert-v2", - "drawer-close-v2", "drawer-open-v2", "faucet-open-v2", "faucet-close-v2", - "handle-press-side-v2", "handle-press-v2", "handle-pull-side-v2", - "handle-pull-v2", "lever-pull-v2", "peg-insert-side-v2", "pick-place-wall-v2", - "reach-v2", "push-back-v2", "push-v2", "pick-place-v2", "peg-unplug-side-v2", - "soccer-v2", "stick-push-v2", "stick-pull-v2", "push-wall-v2", "reach-wall-v2", - "shelf-place-v2", "sweep-v2", "window-open-v2", "window-close-v2" - ] -for task in goal_and_object_change_envs: - task_id_split = task.split("-") - name = "".join([s.capitalize() for s in task_id_split[:-1]]) - env_id = f'{name}DetPMP-{task_id_split[-1]}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": task, - "wrappers": [meta.goal_and_object_change.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 6.25, - "post_traj_time": 0, - "width": 0.025, - "zero_start": True, - "policy_type": "metaworld", - } - } - ) - ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) - -goal_and_endeffector_change_envs = ["basketball-v2"] -for task in goal_and_endeffector_change_envs: - task_id_split = task.split("-") - name = "".join([s.capitalize() for s in task_id_split[:-1]]) - env_id = f'{name}DetPMP-{task_id_split[-1]}' - register( - id=env_id, - entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ - "name": task, - "wrappers": [meta.goal_and_endeffector_change.MPWrapper], - "mp_kwargs": { - "num_dof": 4, - "num_basis": 5, - "duration": 6.25, - "post_traj_time": 0, - "width": 0.025, - "zero_start": True, - "policy_type": "metaworld", - } - } - ) - ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(env_id) +ALL_MOTION_PRIMITIVE_ENVIRONMENTS = { + key: value + ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS[key] + + ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS[key] + + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS[key] + for key, value in ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS.items()} diff --git a/alr_envs/alr/__init__.py b/alr_envs/alr/__init__.py new file mode 100644 index 0000000..179839c --- /dev/null +++ b/alr_envs/alr/__init__.py @@ -0,0 +1,329 @@ +from gym import register + +from . import classic_control, mujoco +from .classic_control.hole_reacher.hole_reacher import HoleReacherEnv +from .classic_control.simple_reacher.simple_reacher import SimpleReacherEnv +from .classic_control.viapoint_reacher.viapoint_reacher import ViaPointReacherEnv +from .mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +from .mujoco.ball_in_a_cup.biac_pd import ALRBallInACupPDEnv +from .mujoco.reacher.alr_reacher import ALRReacherEnv +from .mujoco.reacher.balancing import BalancingEnv + +ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} + +# Classic Control +## Simple Reacher +register( + id='SimpleReacher-v0', + entry_point='alr_envs.alr.classic_control:SimpleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 2, + } +) + +register( + id='SimpleReacher-v1', + entry_point='alr_envs.alr.classic_control:SimpleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 2, + "random_start": False + } +) + +register( + id='LongSimpleReacher-v0', + entry_point='alr_envs.alr.classic_control:SimpleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + } +) + +register( + id='LongSimpleReacher-v1', + entry_point='alr_envs.alr.classic_control:SimpleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + "random_start": False + } +) + +## Viapoint Reacher + +register( + id='ViaPointReacher-v0', + entry_point='alr_envs.alr.classic_control:ViaPointReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + "allow_self_collision": False, + "collision_penalty": 1000 + } +) + +## Hole Reacher +register( + id='HoleReacher-v0', + entry_point='alr_envs.alr.classic_control:HoleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + "random_start": True, + "allow_self_collision": False, + "allow_wall_collision": False, + "hole_width": None, + "hole_depth": 1, + "hole_x": None, + "collision_penalty": 100, + } +) + +register( + id='HoleReacher-v1', + entry_point='alr_envs.alr.classic_control:HoleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + "random_start": False, + "allow_self_collision": False, + "allow_wall_collision": False, + "hole_width": 0.25, + "hole_depth": 1, + "hole_x": None, + "collision_penalty": 100, + } +) + +register( + id='HoleReacher-v2', + entry_point='alr_envs.alr.classic_control:HoleReacherEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + "random_start": False, + "allow_self_collision": False, + "allow_wall_collision": False, + "hole_width": 0.25, + "hole_depth": 1, + "hole_x": 2, + "collision_penalty": 100, + } +) + +# Mujoco + +## Reacher +register( + id='ALRReacher-v0', + entry_point='alr_envs.alr.mujoco:ALRReacherEnv', + max_episode_steps=200, + kwargs={ + "steps_before_reward": 0, + "n_links": 5, + "balance": False, + } +) + +register( + id='ALRReacherSparse-v0', + entry_point='alr_envs.alr.mujoco:ALRReacherEnv', + max_episode_steps=200, + kwargs={ + "steps_before_reward": 200, + "n_links": 5, + "balance": False, + } +) + +register( + id='ALRReacherSparseBalanced-v0', + entry_point='alr_envs.alr.mujoco:ALRReacherEnv', + max_episode_steps=200, + kwargs={ + "steps_before_reward": 200, + "n_links": 5, + "balance": True, + } +) + +register( + id='ALRLongReacher-v0', + entry_point='alr_envs.alr.mujoco:ALRReacherEnv', + max_episode_steps=200, + kwargs={ + "steps_before_reward": 0, + "n_links": 7, + "balance": False, + } +) + +register( + id='ALRLongReacherSparse-v0', + entry_point='alr_envs.alr.mujoco:ALRReacherEnv', + max_episode_steps=200, + kwargs={ + "steps_before_reward": 200, + "n_links": 7, + "balance": False, + } +) + +register( + id='ALRLongReacherSparseBalanced-v0', + entry_point='alr_envs.alr.mujoco:ALRReacherEnv', + max_episode_steps=200, + kwargs={ + "steps_before_reward": 200, + "n_links": 7, + "balance": True, + } +) + +## Balancing Reacher + +register( + id='Balancing-v0', + entry_point='alr_envs.alr.mujoco:BalancingEnv', + max_episode_steps=200, + kwargs={ + "n_links": 5, + } +) + +# Motion Primitive Environments + +## Simple Reacher +_versions = ["SimpleReacher-v0", "SimpleReacher-v1", "LongSimpleReacher-v0", "LongSimpleReacher-v1"] +for _v in _versions: + _name = _v.split("-") + _env_id = f'{_name[0]}DMP-{_name[1]}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"alr_envs:{_v}", + "wrappers": [classic_control.simple_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2 if "long" not in _v.lower() else 5, + "num_basis": 5, + "duration": 20, + "alpha_phase": 2, + "learn_goal": True, + "policy_type": "velocity", + "weights_scale": 50, + } + } + ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(_env_id) + + _env_id = f'{_name[0]}DetPMP-{_name[1]}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"alr_envs:{_v}", + "wrappers": [classic_control.simple_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2 if "long" not in _v.lower() else 5, + "num_basis": 5, + "duration": 20, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } + } + ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +# Viapoint reacher +register( + id='ViaPointReacherDMP-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": "alr_envs:ViaPointReacher-v0", + "wrappers": [classic_control.viapoint_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "policy_type": "velocity", + "weights_scale": 50, + } + } +) +ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("ViaPointReacherDMP-v0") + +register( + id='ViaPointReacherDetPMP-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": "alr_envs:ViaPointReacher-v0", + "wrappers": [classic_control.viapoint_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } + } +) +ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ViaPointReacherDetPMP-v0") + +## Hole Reacher +_versions = ["v0", "v1", "v2"] +for _v in _versions: + _env_id = f'HoleReacherDMP-{_v}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"alr_envs:HoleReacher-{_v}", + "wrappers": [classic_control.hole_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1 + } + } + ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(_env_id) + + _env_id = f'HoleReacherDetPMP-{_v}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"alr_envs:HoleReacher-{_v}", + "wrappers": [classic_control.hole_reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 5, + "num_basis": 5, + "duration": 2, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True + } + } + ) + ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) diff --git a/alr_envs/classic_control/README.MD b/alr_envs/alr/classic_control/README.MD similarity index 100% rename from alr_envs/classic_control/README.MD rename to alr_envs/alr/classic_control/README.MD diff --git a/alr_envs/alr/classic_control/__init__.py b/alr_envs/alr/classic_control/__init__.py new file mode 100644 index 0000000..73575ab --- /dev/null +++ b/alr_envs/alr/classic_control/__init__.py @@ -0,0 +1,3 @@ +from .hole_reacher.hole_reacher import HoleReacherEnv +from .simple_reacher.simple_reacher import SimpleReacherEnv +from .viapoint_reacher.viapoint_reacher import ViaPointReacherEnv diff --git a/alr_envs/classic_control/hole_reacher/__init__.py b/alr_envs/alr/classic_control/hole_reacher/__init__.py similarity index 100% rename from alr_envs/classic_control/hole_reacher/__init__.py rename to alr_envs/alr/classic_control/hole_reacher/__init__.py diff --git a/alr_envs/classic_control/hole_reacher/hole_reacher.py b/alr_envs/alr/classic_control/hole_reacher/hole_reacher.py similarity index 99% rename from alr_envs/classic_control/hole_reacher/hole_reacher.py rename to alr_envs/alr/classic_control/hole_reacher/hole_reacher.py index 2482714..ee1a997 100644 --- a/alr_envs/classic_control/hole_reacher/hole_reacher.py +++ b/alr_envs/alr/classic_control/hole_reacher/hole_reacher.py @@ -6,7 +6,7 @@ import numpy as np from gym.utils import seeding from matplotlib import patches -from alr_envs.classic_control.utils import check_self_collision +from alr_envs.alr.classic_control.utils import check_self_collision class HoleReacherEnv(gym.Env): diff --git a/alr_envs/classic_control/hole_reacher/mp_wrapper.py b/alr_envs/alr/classic_control/hole_reacher/mp_wrapper.py similarity index 100% rename from alr_envs/classic_control/hole_reacher/mp_wrapper.py rename to alr_envs/alr/classic_control/hole_reacher/mp_wrapper.py diff --git a/alr_envs/classic_control/simple_reacher/__init__.py b/alr_envs/alr/classic_control/simple_reacher/__init__.py similarity index 100% rename from alr_envs/classic_control/simple_reacher/__init__.py rename to alr_envs/alr/classic_control/simple_reacher/__init__.py diff --git a/alr_envs/classic_control/simple_reacher/mp_wrapper.py b/alr_envs/alr/classic_control/simple_reacher/mp_wrapper.py similarity index 100% rename from alr_envs/classic_control/simple_reacher/mp_wrapper.py rename to alr_envs/alr/classic_control/simple_reacher/mp_wrapper.py diff --git a/alr_envs/classic_control/simple_reacher/simple_reacher.py b/alr_envs/alr/classic_control/simple_reacher/simple_reacher.py similarity index 100% rename from alr_envs/classic_control/simple_reacher/simple_reacher.py rename to alr_envs/alr/classic_control/simple_reacher/simple_reacher.py diff --git a/alr_envs/classic_control/utils.py b/alr_envs/alr/classic_control/utils.py similarity index 100% rename from alr_envs/classic_control/utils.py rename to alr_envs/alr/classic_control/utils.py diff --git a/alr_envs/classic_control/viapoint_reacher/__init__.py b/alr_envs/alr/classic_control/viapoint_reacher/__init__.py similarity index 100% rename from alr_envs/classic_control/viapoint_reacher/__init__.py rename to alr_envs/alr/classic_control/viapoint_reacher/__init__.py diff --git a/alr_envs/classic_control/viapoint_reacher/mp_wrapper.py b/alr_envs/alr/classic_control/viapoint_reacher/mp_wrapper.py similarity index 100% rename from alr_envs/classic_control/viapoint_reacher/mp_wrapper.py rename to alr_envs/alr/classic_control/viapoint_reacher/mp_wrapper.py diff --git a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py b/alr_envs/alr/classic_control/viapoint_reacher/viapoint_reacher.py similarity index 99% rename from alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py rename to alr_envs/alr/classic_control/viapoint_reacher/viapoint_reacher.py index 99f8bcf..95d1e7f 100644 --- a/alr_envs/classic_control/viapoint_reacher/viapoint_reacher.py +++ b/alr_envs/alr/classic_control/viapoint_reacher/viapoint_reacher.py @@ -5,10 +5,10 @@ import matplotlib.pyplot as plt import numpy as np from gym.utils import seeding -from alr_envs.classic_control.utils import check_self_collision +from alr_envs.alr.classic_control.utils import check_self_collision -class ViaPointReacher(gym.Env): +class ViaPointReacherEnv(gym.Env): def __init__(self, n_links, random_start: bool = False, via_target: Union[None, Iterable] = None, target: Union[None, Iterable] = None, allow_self_collision=False, collision_penalty=1000): diff --git a/alr_envs/mujoco/README.MD b/alr_envs/alr/mujoco/README.MD similarity index 100% rename from alr_envs/mujoco/README.MD rename to alr_envs/alr/mujoco/README.MD diff --git a/alr_envs/alr/mujoco/__init__.py b/alr_envs/alr/mujoco/__init__.py new file mode 100644 index 0000000..6744d15 --- /dev/null +++ b/alr_envs/alr/mujoco/__init__.py @@ -0,0 +1,4 @@ +from .reacher.alr_reacher import ALRReacherEnv +from .reacher.balancing import BalancingEnv +from .ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +from .ball_in_a_cup.biac_pd import ALRBallInACupPDEnv \ No newline at end of file diff --git a/alr_envs/mujoco/alr_reward_fct.py b/alr_envs/alr/mujoco/alr_reward_fct.py similarity index 100% rename from alr_envs/mujoco/alr_reward_fct.py rename to alr_envs/alr/mujoco/alr_reward_fct.py diff --git a/alr_envs/mujoco/ball_in_a_cup/__init__.py b/alr_envs/alr/mujoco/ball_in_a_cup/__init__.py similarity index 100% rename from alr_envs/mujoco/ball_in_a_cup/__init__.py rename to alr_envs/alr/mujoco/ball_in_a_cup/__init__.py diff --git a/alr_envs/mujoco/ball_in_a_cup/assets/biac_base.xml b/alr_envs/alr/mujoco/ball_in_a_cup/assets/biac_base.xml similarity index 100% rename from alr_envs/mujoco/ball_in_a_cup/assets/biac_base.xml rename to alr_envs/alr/mujoco/ball_in_a_cup/assets/biac_base.xml diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup.py similarity index 96% rename from alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py rename to alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup.py index f870877..7cff670 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup.py +++ b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup.py @@ -35,10 +35,10 @@ class ALRBallInACupEnv(MujocoEnv, utils.EzPickle): self.sim_time = 8 # seconds self.sim_steps = int(self.sim_time / self.dt) if reward_type == "no_context": - from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward_simple import BallInACupReward + from alr_envs.alr.mujoco.ball_in_a_cup.ball_in_a_cup_reward_simple import BallInACupReward reward_function = BallInACupReward elif reward_type == "contextual_goal": - from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward + from alr_envs.alr.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward reward_function = BallInACupReward else: raise ValueError("Unknown reward type: {}".format(reward_type)) diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py similarity index 100% rename from alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py rename to alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_mp_wrapper.py diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py similarity index 99% rename from alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py rename to alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py index e34aecf..4ea4381 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py +++ b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_reward.py @@ -1,5 +1,5 @@ import numpy as np -from alr_envs.mujoco import alr_reward_fct +from alr_envs.alr.mujoco import alr_reward_fct class BallInACupReward(alr_reward_fct.AlrReward): diff --git a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py similarity index 99% rename from alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py rename to alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py index 295dcf9..a147d89 100644 --- a/alr_envs/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py +++ b/alr_envs/alr/mujoco/ball_in_a_cup/ball_in_a_cup_reward_simple.py @@ -1,5 +1,5 @@ import numpy as np -from alr_envs.mujoco import alr_reward_fct +from alr_envs.alr.mujoco import alr_reward_fct class BallInACupReward(alr_reward_fct.AlrReward): diff --git a/alr_envs/mujoco/ball_in_a_cup/biac_pd.py b/alr_envs/alr/mujoco/ball_in_a_cup/biac_pd.py similarity index 97% rename from alr_envs/mujoco/ball_in_a_cup/biac_pd.py rename to alr_envs/alr/mujoco/ball_in_a_cup/biac_pd.py index 31545d0..b047c54 100644 --- a/alr_envs/mujoco/ball_in_a_cup/biac_pd.py +++ b/alr_envs/alr/mujoco/ball_in_a_cup/biac_pd.py @@ -42,10 +42,10 @@ class ALRBallInACupPDEnv(mujoco_env.MujocoEnv, utils.EzPickle): self._dt = 0.02 self.ep_length = 4000 # based on 8 seconds with dt = 0.02 int(self.sim_time / self.dt) if reward_type == "no_context": - from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward_simple import BallInACupReward + from alr_envs.alr.mujoco.ball_in_a_cup.ball_in_a_cup_reward_simple import BallInACupReward reward_function = BallInACupReward elif reward_type == "contextual_goal": - from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward + from alr_envs.alr.mujoco.ball_in_a_cup.ball_in_a_cup_reward import BallInACupReward reward_function = BallInACupReward else: raise ValueError("Unknown reward type: {}".format(reward_type)) diff --git a/alr_envs/mujoco/ball_in_a_cup/utils.py b/alr_envs/alr/mujoco/ball_in_a_cup/utils.py similarity index 97% rename from alr_envs/mujoco/ball_in_a_cup/utils.py rename to alr_envs/alr/mujoco/ball_in_a_cup/utils.py index b851cae..0dd972c 100644 --- a/alr_envs/mujoco/ball_in_a_cup/utils.py +++ b/alr_envs/alr/mujoco/ball_in_a_cup/utils.py @@ -1,4 +1,4 @@ -from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv +from alr_envs.alr.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv from mp_env_api.mp_wrappers.detpmp_wrapper import DetPMPWrapper from mp_env_api.mp_wrappers.dmp_wrapper import DmpWrapper diff --git a/alr_envs/mujoco/beerpong/__init__.py b/alr_envs/alr/mujoco/beerpong/__init__.py similarity index 100% rename from alr_envs/mujoco/beerpong/__init__.py rename to alr_envs/alr/mujoco/beerpong/__init__.py diff --git a/alr_envs/mujoco/beerpong/assets/beerpong.xml b/alr_envs/alr/mujoco/beerpong/assets/beerpong.xml similarity index 100% rename from alr_envs/mujoco/beerpong/assets/beerpong.xml rename to alr_envs/alr/mujoco/beerpong/assets/beerpong.xml diff --git a/alr_envs/mujoco/beerpong/beerpong.py b/alr_envs/alr/mujoco/beerpong/beerpong.py similarity index 98% rename from alr_envs/mujoco/beerpong/beerpong.py rename to alr_envs/alr/mujoco/beerpong/beerpong.py index 1f3f781..4d8f389 100644 --- a/alr_envs/mujoco/beerpong/beerpong.py +++ b/alr_envs/alr/mujoco/beerpong/beerpong.py @@ -37,7 +37,7 @@ class ALRBeerpongEnv(MujocoEnv, utils.EzPickle): self.sim_time = 8 # seconds self.sim_steps = int(self.sim_time / self.dt) if reward_function is None: - from alr_envs.mujoco.beerpong.beerpong_reward import BeerpongReward + from alr_envs.alr.mujoco.beerpong.beerpong_reward import BeerpongReward reward_function = BeerpongReward self.reward_function = reward_function(self.sim, self.sim_steps) self.cup_robot_id = self.sim.model._site_name2id["cup_robot_final"] diff --git a/alr_envs/mujoco/beerpong/beerpong_reward.py b/alr_envs/alr/mujoco/beerpong/beerpong_reward.py similarity index 99% rename from alr_envs/mujoco/beerpong/beerpong_reward.py rename to alr_envs/alr/mujoco/beerpong/beerpong_reward.py index 3281409..c3ca3c6 100644 --- a/alr_envs/mujoco/beerpong/beerpong_reward.py +++ b/alr_envs/alr/mujoco/beerpong/beerpong_reward.py @@ -1,5 +1,5 @@ import numpy as np -from alr_envs.mujoco import alr_reward_fct +from alr_envs.alr.mujoco import alr_reward_fct class BeerpongReward(alr_reward_fct.AlrReward): diff --git a/alr_envs/mujoco/beerpong/beerpong_reward_simple.py b/alr_envs/alr/mujoco/beerpong/beerpong_reward_simple.py similarity index 99% rename from alr_envs/mujoco/beerpong/beerpong_reward_simple.py rename to alr_envs/alr/mujoco/beerpong/beerpong_reward_simple.py index b79e963..fbe2163 100644 --- a/alr_envs/mujoco/beerpong/beerpong_reward_simple.py +++ b/alr_envs/alr/mujoco/beerpong/beerpong_reward_simple.py @@ -1,5 +1,5 @@ import numpy as np -from alr_envs.mujoco import alr_reward_fct +from alr_envs.alr.mujoco import alr_reward_fct class BeerpongReward(alr_reward_fct.AlrReward): diff --git a/alr_envs/mujoco/beerpong/beerpong_simple.py b/alr_envs/alr/mujoco/beerpong/beerpong_simple.py similarity index 98% rename from alr_envs/mujoco/beerpong/beerpong_simple.py rename to alr_envs/alr/mujoco/beerpong/beerpong_simple.py index 5f6f6d2..73da83d 100644 --- a/alr_envs/mujoco/beerpong/beerpong_simple.py +++ b/alr_envs/alr/mujoco/beerpong/beerpong_simple.py @@ -38,7 +38,7 @@ class ALRBeerpongEnv(MujocoEnv, utils.EzPickle): self.sim_time = 8 # seconds self.sim_steps = int(self.sim_time / self.dt) if reward_function is None: - from alr_envs.mujoco.beerpong.beerpong_reward_simple import BeerpongReward + from alr_envs.alr.mujoco.beerpong.beerpong_reward_simple import BeerpongReward reward_function = BeerpongReward self.reward_function = reward_function(self.sim, self.sim_steps) self.cup_robot_id = self.sim.model._site_name2id["cup_robot_final"] diff --git a/alr_envs/mujoco/beerpong/utils.py b/alr_envs/alr/mujoco/beerpong/utils.py similarity index 93% rename from alr_envs/mujoco/beerpong/utils.py rename to alr_envs/alr/mujoco/beerpong/utils.py index 7cd4682..f43e881 100644 --- a/alr_envs/mujoco/beerpong/utils.py +++ b/alr_envs/alr/mujoco/beerpong/utils.py @@ -1,6 +1,6 @@ from alr_envs.utils.mps.detpmp_wrapper import DetPMPWrapper -from alr_envs.mujoco.beerpong.beerpong import ALRBeerpongEnv -from alr_envs.mujoco.beerpong.beerpong_simple import ALRBeerpongEnv as ALRBeerpongEnvSimple +from alr_envs.alr.mujoco.beerpong.beerpong import ALRBeerpongEnv +from alr_envs.alr.mujoco.beerpong.beerpong_simple import ALRBeerpongEnv as ALRBeerpongEnvSimple def make_contextual_env(rank, seed=0): diff --git a/alr_envs/mujoco/gym_table_tennis/__init__.py b/alr_envs/alr/mujoco/gym_table_tennis/__init__.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/__init__.py rename to alr_envs/alr/mujoco/gym_table_tennis/__init__.py diff --git a/alr_envs/mujoco/gym_table_tennis/envs/__init__.py b/alr_envs/alr/mujoco/gym_table_tennis/envs/__init__.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/__init__.py rename to alr_envs/alr/mujoco/gym_table_tennis/envs/__init__.py diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/include_7_motor_actuator.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_7_motor_actuator.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/include_7_motor_actuator.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_7_motor_actuator.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_left.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_left.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_left.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_left.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_right.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_right.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_right.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_barrett_wam_7dof_right.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/include_table.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_table.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/include_table.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_table.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/include_target_ball.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_target_ball.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/include_target_ball.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_target_ball.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/include_test_balls.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_test_balls.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/include_test_balls.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/include_test_balls.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/base_link_convex.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/base_link_convex.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/base_link_convex.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/base_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/base_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/base_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/base_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/base_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_convex.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_convex.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_convex.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_med_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p3.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p3.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p3.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_convex_decomposition_p3.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_prox_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p3.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p3.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p3.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p3.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p4.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p4.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p4.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/bhand_palm_link_convex_decomposition_p4.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_convex.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_convex.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_convex.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/forearm_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p3.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p3.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p3.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_convex_decomposition_p3.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_convex.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_convex.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_convex.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/shoulder_pitch_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/upper_arm_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_convex.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_convex.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_convex.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p3.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p3.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p3.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_convex_decomposition_p3.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_pitch_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_fine.stl b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_fine.stl similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_fine.stl rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/meshes/wrist_yaw_link_fine.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/right_arm_actuator.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/right_arm_actuator.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/right_arm_actuator.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/right_arm_actuator.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/shared.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/shared.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/shared.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/shared.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/table_tennis_env.xml b/alr_envs/alr/mujoco/gym_table_tennis/envs/assets/table_tennis_env.xml similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/table_tennis_env.xml rename to alr_envs/alr/mujoco/gym_table_tennis/envs/assets/table_tennis_env.xml diff --git a/alr_envs/mujoco/gym_table_tennis/envs/table_tennis_env.py b/alr_envs/alr/mujoco/gym_table_tennis/envs/table_tennis_env.py similarity index 98% rename from alr_envs/mujoco/gym_table_tennis/envs/table_tennis_env.py rename to alr_envs/alr/mujoco/gym_table_tennis/envs/table_tennis_env.py index f155f06..9b16ae1 100644 --- a/alr_envs/mujoco/gym_table_tennis/envs/table_tennis_env.py +++ b/alr_envs/alr/mujoco/gym_table_tennis/envs/table_tennis_env.py @@ -2,9 +2,9 @@ import numpy as np from gym import spaces from gym.envs.robotics import robot_env, utils # import xml.etree.ElementTree as ET -from alr_envs.mujoco.gym_table_tennis.utils.rewards.hierarchical_reward import HierarchicalRewardTableTennis +from alr_envs.alr.mujoco.gym_table_tennis.utils.rewards.hierarchical_reward import HierarchicalRewardTableTennis import glfw -from alr_envs.mujoco.gym_table_tennis.utils.experiment import ball_initialize +from alr_envs.alr.mujoco.gym_table_tennis.utils.experiment import ball_initialize from pathlib import Path import os diff --git a/alr_envs/mujoco/gym_table_tennis/utils/__init__.py b/alr_envs/alr/mujoco/gym_table_tennis/utils/__init__.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/utils/__init__.py rename to alr_envs/alr/mujoco/gym_table_tennis/utils/__init__.py diff --git a/alr_envs/mujoco/gym_table_tennis/utils/experiment.py b/alr_envs/alr/mujoco/gym_table_tennis/utils/experiment.py similarity index 96% rename from alr_envs/mujoco/gym_table_tennis/utils/experiment.py rename to alr_envs/alr/mujoco/gym_table_tennis/utils/experiment.py index addd6c5..a106d68 100644 --- a/alr_envs/mujoco/gym_table_tennis/utils/experiment.py +++ b/alr_envs/alr/mujoco/gym_table_tennis/utils/experiment.py @@ -1,6 +1,6 @@ import numpy as np from gym.utils import seeding -from alr_envs.mujoco.gym_table_tennis.utils.util import read_yaml, read_json +from alr_envs.alr.mujoco.gym_table_tennis.utils.util import read_yaml, read_json from pathlib import Path diff --git a/alr_envs/mujoco/gym_table_tennis/utils/rewards/__init__.py b/alr_envs/alr/mujoco/gym_table_tennis/utils/rewards/__init__.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/utils/rewards/__init__.py rename to alr_envs/alr/mujoco/gym_table_tennis/utils/rewards/__init__.py diff --git a/alr_envs/mujoco/gym_table_tennis/utils/rewards/hierarchical_reward.py b/alr_envs/alr/mujoco/gym_table_tennis/utils/rewards/hierarchical_reward.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/utils/rewards/hierarchical_reward.py rename to alr_envs/alr/mujoco/gym_table_tennis/utils/rewards/hierarchical_reward.py diff --git a/alr_envs/mujoco/gym_table_tennis/utils/rewards/rewards.py b/alr_envs/alr/mujoco/gym_table_tennis/utils/rewards/rewards.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/utils/rewards/rewards.py rename to alr_envs/alr/mujoco/gym_table_tennis/utils/rewards/rewards.py diff --git a/alr_envs/mujoco/gym_table_tennis/utils/util.py b/alr_envs/alr/mujoco/gym_table_tennis/utils/util.py similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/utils/util.py rename to alr_envs/alr/mujoco/gym_table_tennis/utils/util.py diff --git a/alr_envs/mujoco/meshes/wam/base_link_convex.stl b/alr_envs/alr/mujoco/meshes/wam/base_link_convex.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/base_link_convex.stl rename to alr_envs/alr/mujoco/meshes/wam/base_link_convex.stl diff --git a/alr_envs/mujoco/meshes/wam/base_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/base_link_fine.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/base_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/base_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/cup.stl b/alr_envs/alr/mujoco/meshes/wam/cup.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup.stl rename to alr_envs/alr/mujoco/meshes/wam/cup.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split1.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split1.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split1.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split1.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split10.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split10.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split10.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split10.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split11.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split11.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split11.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split11.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split12.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split12.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split12.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split12.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split13.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split13.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split13.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split13.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split14.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split14.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split14.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split14.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split15.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split15.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split15.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split15.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split16.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split16.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split16.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split16.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split17.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split17.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split17.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split17.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split18.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split18.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split18.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split18.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split2.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split2.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split2.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split2.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split3.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split3.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split3.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split3.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split4.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split4.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split4.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split4.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split5.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split5.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split5.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split5.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split6.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split6.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split6.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split6.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split7.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split7.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split7.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split7.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split8.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split8.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split8.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split8.stl diff --git a/alr_envs/mujoco/meshes/wam/cup_split9.stl b/alr_envs/alr/mujoco/meshes/wam/cup_split9.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/cup_split9.stl rename to alr_envs/alr/mujoco/meshes/wam/cup_split9.stl diff --git a/alr_envs/mujoco/meshes/wam/elbow_link_convex.stl b/alr_envs/alr/mujoco/meshes/wam/elbow_link_convex.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/elbow_link_convex.stl rename to alr_envs/alr/mujoco/meshes/wam/elbow_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/elbow_link_fine.stl old mode 100644 new mode 100755 similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/elbow_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/elbow_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/forearm_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/meshes/wam/forearm_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/forearm_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/meshes/wam/forearm_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/meshes/wam/forearm_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/meshes/wam/forearm_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/forearm_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/meshes/wam/forearm_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/meshes/wam/forearm_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/forearm_link_fine.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/forearm_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/forearm_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/shoulder_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/meshes/wam/shoulder_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/shoulder_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/meshes/wam/shoulder_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/meshes/wam/shoulder_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/meshes/wam/shoulder_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/shoulder_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/meshes/wam/shoulder_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/meshes/wam/shoulder_link_convex_decomposition_p3.stl b/alr_envs/alr/mujoco/meshes/wam/shoulder_link_convex_decomposition_p3.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/shoulder_link_convex_decomposition_p3.stl rename to alr_envs/alr/mujoco/meshes/wam/shoulder_link_convex_decomposition_p3.stl diff --git a/alr_envs/mujoco/meshes/wam/shoulder_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/shoulder_link_fine.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/shoulder_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/shoulder_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/shoulder_pitch_link_convex.stl b/alr_envs/alr/mujoco/meshes/wam/shoulder_pitch_link_convex.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/shoulder_pitch_link_convex.stl rename to alr_envs/alr/mujoco/meshes/wam/shoulder_pitch_link_convex.stl diff --git a/alr_envs/mujoco/meshes/wam/shoulder_pitch_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/shoulder_pitch_link_fine.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/shoulder_pitch_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/shoulder_pitch_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/meshes/wam/upper_arm_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/meshes/wam/upper_arm_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/upper_arm_link_fine.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/upper_arm_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/upper_arm_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/wrist_palm_link_convex.stl b/alr_envs/alr/mujoco/meshes/wam/wrist_palm_link_convex.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/wrist_palm_link_convex.stl rename to alr_envs/alr/mujoco/meshes/wam/wrist_palm_link_convex.stl diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_fine.stl b/alr_envs/alr/mujoco/meshes/wam/wrist_palm_link_fine.stl old mode 100644 new mode 100755 similarity index 100% rename from alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/wrist_palm_link_fine.stl rename to alr_envs/alr/mujoco/meshes/wam/wrist_palm_link_fine.stl diff --git a/alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p3.stl b/alr_envs/alr/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p3.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p3.stl rename to alr_envs/alr/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p3.stl diff --git a/alr_envs/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p1.stl b/alr_envs/alr/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p1.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p1.stl rename to alr_envs/alr/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p1.stl diff --git a/alr_envs/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p2.stl b/alr_envs/alr/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p2.stl similarity index 100% rename from alr_envs/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p2.stl rename to alr_envs/alr/mujoco/meshes/wam/wrist_yaw_link_convex_decomposition_p2.stl diff --git a/alr_envs/mujoco/reacher/__init__.py b/alr_envs/alr/mujoco/reacher/__init__.py similarity index 100% rename from alr_envs/mujoco/reacher/__init__.py rename to alr_envs/alr/mujoco/reacher/__init__.py diff --git a/alr_envs/mujoco/reacher/assets/reacher_5links.xml b/alr_envs/alr/mujoco/reacher/assets/reacher_5links.xml similarity index 100% rename from alr_envs/mujoco/reacher/assets/reacher_5links.xml rename to alr_envs/alr/mujoco/reacher/assets/reacher_5links.xml diff --git a/alr_envs/mujoco/reacher/assets/reacher_7links.xml b/alr_envs/alr/mujoco/reacher/assets/reacher_7links.xml similarity index 100% rename from alr_envs/mujoco/reacher/assets/reacher_7links.xml rename to alr_envs/alr/mujoco/reacher/assets/reacher_7links.xml diff --git a/alr_envs/mujoco/reacher/balancing.py b/alr_envs/alr/mujoco/reacher/balancing.py similarity index 100% rename from alr_envs/mujoco/reacher/balancing.py rename to alr_envs/alr/mujoco/reacher/balancing.py diff --git a/alr_envs/classic_control/__init__.py b/alr_envs/classic_control/__init__.py deleted file mode 100644 index 8d95b6a..0000000 --- a/alr_envs/classic_control/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from alr_envs.classic_control.hole_reacher.hole_reacher import HoleReacherEnv -from alr_envs.classic_control.viapoint_reacher.viapoint_reacher import ViaPointReacher -from alr_envs.classic_control.simple_reacher.simple_reacher import SimpleReacherEnv diff --git a/alr_envs/dmc/__init__.py b/alr_envs/dmc/__init__.py index b1cf281..17d1f7f 100644 --- a/alr_envs/dmc/__init__.py +++ b/alr_envs/dmc/__init__.py @@ -1,4 +1,385 @@ -from alr_envs.dmc.suite import ball_in_cup -from alr_envs.dmc.suite import reacher -from alr_envs.dmc.suite import cartpole -from alr_envs.dmc.manipulation import reach \ No newline at end of file +from . import manipulation, suite + +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} + +from gym.envs.registration import register + +# DeepMind Control Suite (DMC) + +register( + id=f'dmc_ball_in_cup-catch_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"ball_in_cup-catch", + "time_limit": 20, + "episode_length": 1000, + "wrappers": [suite.ball_in_cup.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 20, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_ball_in_cup-catch_dmp-v0") + +register( + id=f'dmc_ball_in_cup-catch_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"ball_in_cup-catch", + "time_limit": 20, + "episode_length": 1000, + "wrappers": [suite.ball_in_cup.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 20, + "width": 0.025, + "policy_type": "motor", + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_ball_in_cup-catch_detpmp-v0") + +register( + id=f'dmc_reacher-easy_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"reacher-easy", + "time_limit": 20, + "episode_length": 1000, + "wrappers": [suite.reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 20, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_reacher-easy_dmp-v0") + +register( + id=f'dmc_reacher-easy_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"reacher-easy", + "time_limit": 20, + "episode_length": 1000, + "wrappers": [suite.reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 20, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-easy_detpmp-v0") + +register( + id=f'dmc_reacher-hard_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"reacher-hard", + "time_limit": 20, + "episode_length": 1000, + "wrappers": [suite.reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 20, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_reacher-hard_dmp-v0") + +register( + id=f'dmc_reacher-hard_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"reacher-hard", + "time_limit": 20, + "episode_length": 1000, + "wrappers": [suite.reacher.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 5, + "duration": 20, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 50, + "d_gains": 1 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_reacher-hard_detpmp-v0") + +_dmc_cartpole_tasks = ["balance", "balance_sparse", "swingup", "swingup_sparse"] + +for _task in _dmc_cartpole_tasks: + _env_id = f'dmc_cartpole-{_task}_dmp-v0' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-{_task}", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [suite.cartpole.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } + ) + ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(_env_id) + + _env_id = f'dmc_cartpole-{_task}_detpmp-v0' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-{_task}", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [suite.cartpole.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } + ) + ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +_env_id = f'dmc_cartpole-two_poles_dmp-v0' +register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-two_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [suite.cartpole.TwoPolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(_env_id) + +_env_id = f'dmc_cartpole-two_poles_detpmp-v0' +register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-two_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [suite.cartpole.TwoPolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +_env_id = f'dmc_cartpole-three_poles_dmp-v0' +register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"cartpole-three_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [suite.cartpole.ThreePolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "motor", + "weights_scale": 50, + "goal_scale": 0.1, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append(_env_id) + +_env_id = f'dmc_cartpole-three_poles_detpmp-v0' +register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"cartpole-three_poles", + # "time_limit": 1, + "camera_id": 0, + "episode_length": 1000, + "wrappers": [suite.cartpole.ThreePolesMPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "motor", + "weights_scale": 0.2, + "zero_start": True, + "policy_kwargs": { + "p_gains": 10, + "d_gains": 10 + } + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +# DeepMind Manipulation + +register( + id=f'dmc_manipulation-reach_site_dmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_dmp_env_helper', + # max_episode_steps=1, + kwargs={ + "name": f"manipulation-reach_site_features", + # "time_limit": 1, + "episode_length": 250, + "wrappers": [manipulation.reach_site.MPWrapper], + "mp_kwargs": { + "num_dof": 9, + "num_basis": 5, + "duration": 10, + "learn_goal": True, + "alpha_phase": 2, + "bandwidth_factor": 2, + "policy_type": "velocity", + "weights_scale": 50, + "goal_scale": 0.1, + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"].append("dmc_manipulation-reach_site_dmp-v0") + +register( + id=f'dmc_manipulation-reach_site_detpmp-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": f"manipulation-reach_site_features", + # "time_limit": 1, + "episode_length": 250, + "wrappers": [manipulation.reach_site.MPWrapper], + "mp_kwargs": { + "num_dof": 9, + "num_basis": 5, + "duration": 10, + "width": 0.025, + "policy_type": "velocity", + "weights_scale": 0.2, + "zero_start": True, + } + } +) +ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("dmc_manipulation-reach_site_detpmp-v0") diff --git a/alr_envs/utils/dmc_wrapper.py b/alr_envs/dmc/dmc_wrapper.py similarity index 100% rename from alr_envs/utils/dmc_wrapper.py rename to alr_envs/dmc/dmc_wrapper.py diff --git a/alr_envs/dmc/manipulation/__init__.py b/alr_envs/dmc/manipulation/__init__.py index 5d17d4d..f3a4147 100644 --- a/alr_envs/dmc/manipulation/__init__.py +++ b/alr_envs/dmc/manipulation/__init__.py @@ -1 +1 @@ -from alr_envs.dmc.manipulation import reach +from . import reach_site diff --git a/alr_envs/dmc/manipulation/reach/__init__.py b/alr_envs/dmc/manipulation/reach_site/__init__.py similarity index 100% rename from alr_envs/dmc/manipulation/reach/__init__.py rename to alr_envs/dmc/manipulation/reach_site/__init__.py diff --git a/alr_envs/dmc/manipulation/reach/mp_wrapper.py b/alr_envs/dmc/manipulation/reach_site/mp_wrapper.py similarity index 100% rename from alr_envs/dmc/manipulation/reach/mp_wrapper.py rename to alr_envs/dmc/manipulation/reach_site/mp_wrapper.py diff --git a/alr_envs/dmc/suite/__init__.py b/alr_envs/dmc/suite/__init__.py index f889cad..7d206fc 100644 --- a/alr_envs/dmc/suite/__init__.py +++ b/alr_envs/dmc/suite/__init__.py @@ -1 +1 @@ -from alr_envs.dmc.suite import cartpole, ball_in_cup, reacher +from . import cartpole, ball_in_cup, reacher diff --git a/alr_envs/meta/__init__.py b/alr_envs/meta/__init__.py index b2482ee..8cf1784 100644 --- a/alr_envs/meta/__init__.py +++ b/alr_envs/meta/__init__.py @@ -1 +1,114 @@ -from alr_envs.meta import goal_and_object_change, goal_and_endeffector_change, goal_change, object_change +from gym import register + +from . import goal_object_change_mp_wrapper, goal_change_mp_wrapper, goal_endeffector_change_mp_wrapper, \ + object_change_mp_wrapper + +ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} + +# MetaWorld + +_goal_change_envs = ["assembly-v2", "pick-out-of-hole-v2", "plate-slide-v2", "plate-slide-back-v2"] +for _task in _goal_change_envs: + task_id_split = _task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + _env_id = f'{name}DetPMP-{task_id_split[-1]}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": _task, + "wrappers": [goal_change_mp_wrapper.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +_object_change_envs = ["bin-picking-v2", "hammer-v2", "sweep-into-v2"] +for _task in _object_change_envs: + task_id_split = _task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + _env_id = f'{name}DetPMP-{task_id_split[-1]}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": _task, + "wrappers": [object_change_mp_wrapper.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +_goal_and_object_change_envs = ["box-close-v2", "button-press-v2", "button-press-wall-v2", "button-press-topdown-v2", + "button-press-topdown-wall-v2", "coffee-button-v2", "coffee-pull-v2", + "coffee-push-v2", "dial-turn-v2", "disassemble-v2", "door-close-v2", + "door-lock-v2", "door-open-v2", "door-unlock-v2", "hand-insert-v2", + "drawer-close-v2", "drawer-open-v2", "faucet-open-v2", "faucet-close-v2", + "handle-press-side-v2", "handle-press-v2", "handle-pull-side-v2", + "handle-pull-v2", "lever-pull-v2", "peg-insert-side-v2", "pick-place-wall-v2", + "reach-v2", "push-back-v2", "push-v2", "pick-place-v2", "peg-unplug-side-v2", + "soccer-v2", "stick-push-v2", "stick-pull-v2", "push-wall-v2", "reach-wall-v2", + "shelf-place-v2", "sweep-v2", "window-open-v2", "window-close-v2" + ] +for _task in _goal_and_object_change_envs: + task_id_split = _task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + _env_id = f'{name}DetPMP-{task_id_split[-1]}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": _task, + "wrappers": [goal_object_change_mp_wrapper.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) + +_goal_and_endeffector_change_envs = ["basketball-v2"] +for _task in _goal_and_endeffector_change_envs: + task_id_split = _task.split("-") + name = "".join([s.capitalize() for s in task_id_split[:-1]]) + _env_id = f'{name}DetPMP-{task_id_split[-1]}' + register( + id=_env_id, + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": _task, + "wrappers": [goal_endeffector_change_mp_wrapper.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 6.25, + "post_traj_time": 0, + "width": 0.025, + "zero_start": True, + "policy_type": "metaworld", + } + } + ) + ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append(_env_id) diff --git a/alr_envs/meta/goal_change.py b/alr_envs/meta/goal_change_mp_wrapper.py similarity index 100% rename from alr_envs/meta/goal_change.py rename to alr_envs/meta/goal_change_mp_wrapper.py diff --git a/alr_envs/meta/goal_and_endeffector_change.py b/alr_envs/meta/goal_endeffector_change_mp_wrapper.py similarity index 100% rename from alr_envs/meta/goal_and_endeffector_change.py rename to alr_envs/meta/goal_endeffector_change_mp_wrapper.py diff --git a/alr_envs/meta/goal_and_object_change.py b/alr_envs/meta/goal_object_change_mp_wrapper.py similarity index 100% rename from alr_envs/meta/goal_and_object_change.py rename to alr_envs/meta/goal_object_change_mp_wrapper.py diff --git a/alr_envs/meta/object_change.py b/alr_envs/meta/object_change_mp_wrapper.py similarity index 100% rename from alr_envs/meta/object_change.py rename to alr_envs/meta/object_change_mp_wrapper.py diff --git a/alr_envs/mujoco/__init__.py b/alr_envs/mujoco/__init__.py deleted file mode 100644 index d86e772..0000000 --- a/alr_envs/mujoco/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from alr_envs.mujoco.reacher.alr_reacher import ALRReacherEnv -from alr_envs.mujoco.reacher.balancing import BalancingEnv -from alr_envs.mujoco.ball_in_a_cup.ball_in_a_cup import ALRBallInACupEnv -from alr_envs.mujoco.ball_in_a_cup.biac_pd import ALRBallInACupPDEnv diff --git a/alr_envs/mujoco/ball_in_a_cup/assets/ball-in-a-cup_base.xml b/alr_envs/mujoco/ball_in_a_cup/assets/ball-in-a-cup_base.xml deleted file mode 100644 index b534205..0000000 --- a/alr_envs/mujoco/ball_in_a_cup/assets/ball-in-a-cup_base.xml +++ /dev/null @@ -1,366 +0,0 @@ - - - diff --git a/alr_envs/mujoco/gym_table_tennis/envs/MUJOCO_LOG.TXT b/alr_envs/mujoco/gym_table_tennis/envs/MUJOCO_LOG.TXT deleted file mode 100644 index 91c2162..0000000 --- a/alr_envs/mujoco/gym_table_tennis/envs/MUJOCO_LOG.TXT +++ /dev/null @@ -1,3 +0,0 @@ -Mon Jan 25 15:45:30 2021 -ERROR: GLEW initalization error: Missing GL version - diff --git a/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_convex.stl b/alr_envs/mujoco/gym_table_tennis/envs/assets/meshes/bhand_finger_dist_link_convex.stl deleted file mode 100644 index 3b05c27dc347e0b4e256db689fa9ffb0694f5cf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57684 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�Z>`we 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⋙cNY;QVB%aZG5!^1#)txuig$BG$t}qZq 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 z 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 diff --git a/alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p1.stl b/alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p1.stl deleted file mode 100755 index c36f88f1e4b7a43abd8394ea1750591c6aaf6c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35284 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 diff --git a/alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p2.stl b/alr_envs/mujoco/meshes/wam/wrist_pitch_link_convex_decomposition_p2.stl deleted file mode 100755 index d00cac16e816a761e692145057ff1d707aa86853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34284 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�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

jK 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�>-KYfC`+R8(d(lVMj=5C= zJxF-O#;_ks>vn1+P=#w#&4FusR$L6r<(Snv#~et6@HP#;CFg>g0|`{&>`{s3Zz9=} z2{(V?B$!rID zkf{ApA}xL08_i$>RX7(+0%t~hBw8(`UVZvk+MCuSe(8#$$!!0qqNJIT9~a zSwQo?wT=hGLRIiNYD1qn;WJs4Yvxerx`qF!1CfHOLSkOYIdp2Z_rD;)1gci=zl*jW zIA!T8?8QS>X4CIKc>ghiy>8|}4-$9YG>Zl`|J9NM2~-WfZ4Ny++%`+lgG3k3QP-LS z2~^?wXto1ANVJ+agMMmjTSbvTRq(ot#~>be*Izl0niU?KW>x4xB6tLmKo$17nFBpY zbe?_}ojTwh!NCNo@c1_g{00NRLy$I2>tcHvg`P;_uCdWUMwd8?BDl^rV z1AFw;kVGnfapBY2a~g9bUY(Oj7m@8b99DuV94E6K@4vK=hE4YF6w5ukkoqk2>?YSO zq(e2Wzj}fBGkx4bn$pU9Qh>S59Oyyfwlxds^)Vt3*m0 z?%mO2q~NNMh~Jk;b?&g;4`M7-z5H1s-5>XvWo^eR0{z_E`$gNW^%JP{THCMNu;tiV%x&gC4-%L=m_QZI zW0OD+62a|20#&#wnK^2nNhhjuzk96Z{g+OM8hEzM9{p!?lW0;WgT`LF(j~gFT_xVL zg9-E?vHIc+s+Z-_W)37!)xRDSAsd07b(dt&+jUpD6=I~|97tTvbiZL99ZaC=$Jh*N z|6);uRI=mNC2my(JJM*v=6hY+%z6988mmt1I6fFB-VVNPL1z=$kKAG3RP8KNvE>aS6hfjeoUtyHr(fVj-=E6 zjh>B>f?Iwb5OaS|ryhq2Be{s~d4{o2g~yGV1AB2vl?=LIb8$uxi8?hi=(^u*gt{8wEadKfu1jRrBhaq;#7sikT26|(kxpJ>?>3mbK01R?{}R=PcF-K zN3FqtyXd z{^k*WTcP403xOV?l{m6{7X7-cdl5v;i}R>c%t%+Y{`0wX{k|y{0_(-r)@wXHT&>x1 z^dN!li%w`Sbbog`g$^ZKszMLO#U3$pAc3kr$7Tk!~Xr zm_SwkW^?JPFBVu@jvgd}=M@sDl3uv9x~=8ti6naOoMx#C39(fb+`H&OV(3AxDrLGQ z2NI|fT4#*eyHEd=Nx7qExUqJh%%rz}@a%IVP_^>=OsY}Sqs<&x$%mnZbor~J-F(-q z&7dZ^lP&GQO1|Z)QVthY6;^`8z`rx8)|{D^97v$*-TyLa@G%>K?ZDbGlG$?fAhF=8 zOj`S-ZG}SuRj*#3NmsmQBc9uwNf(duX56^^Oq!kJ*%&FfDkPTe$fSzLgXXTzA5=|$ zFO#1B*G8b{_(z%adoypoo?BH&oZX#CQ^wk6JH|p)@Jz(9z4g2->Q{P}J2Nm+a9<(u zMu{vM@vuh+6R2udI*Z~<&$i6OA4+A>gn#aGJqOq>S8`4)_Rnk%C)}L?+X7-?OzGW1$Lr#LR)m!JBh4smdKwi_up|OwY@tvTHor z%z;&*>gJ5~I5B!Y4cU_6&8vv3 zfe&hD2Fw!mL|#AW@o(mks+7PA&##mka4m`+BwDyG10#))G1ig|qt3nSFAK#Wu z&&H%#T8;#&|?5A(ZdzIrz#T3es6$PJzgt|mQD5U zYid=>qMP>Ep0JGhD}(+WzSPZubluoYdU3t?x!G6fL1KG{Olp0~MqrM$^E2qm=e*}W zNSis(gTy6m(&@_I78NlbsKU8m=D_~JeCO59qTW~9?o!c%gxL1+h$K`s_~I-&-pckY zqg#3=&Dy@qZDEC!Oj^CgvoW994xAb9RL!EPpLtINgR4Rh5)VTx+Z{a;sOrR5mhXJK+%ikBM{AGCq?ZR4)w`GjiTFO5 zH2-3cHpc@AR0SU&_3q0I&!4u>W>TNN-t#?)q%+2!Lp?~m!Sw2$wx@#_3stzrm^rW) zQ$Nn6-9x+{#rBy5dXRYYl}y^R?{3R@Ac3m71)22YJ2nD6|E|rX?>c%aj1*iI61mGW z>HL3-8bMUyvFXpD;~|wa*s;NFZI9uZ)U)a%mX@Oj2|2?lZRS7%RY&?~1k93^z4*z0 z*^Axmk95hQ3cr?d?fHFk$oZwLr7Ef9&TneEp0z`B=z;&mx;92Kt3nSF@dI<{y`Hr# zIgmirey;GV&2=n9`(|0xtJkmjvLhkV6@SR2KV~0uKR2sF4-y&wWYDZ7KUs(l2eat8 z-G8{At!=XD^xda@`OF*`7l}#(vT5J1e_L`OfvSqB+0^c%GZtd(`8hQG(-LlI^7ZjPXFCOv@a4_tDap-o>g=g)_!%IgZEN`?Dw|=43JY3W;mJ&7wPA@Os_MfmNXj z$H^qH7YDtXO`jh;uNZxW#H(*-(G}Y1ga|KrO>Mn+6bJx_gLf}lqvDsTHk>1*OnT5dlTJ?!Us`Z3721uLj zKo1gMUXw)q?r&nrfds08=Pu5lyDFyA3#+`|#Yn+bA#qESRQj`o?Wo0AsKQmr%zAdvtI+Q1x5mEc!6hHWTqI zQ?qkA9qr|vGjJ}LInaZ|d)evKcd6}+g9NIEzn@Nz?z9oui!rZfQ{A(d7Nf6_c=eTR zx~;P9IL8r0)m}csEnMQAyUdp3nt^TlA~k{fz3$C1lRys=V(YbbbV5~^&P<@$oozX= z-YX_$)9#17b1k;d%z+*xb`Q;_r~dHhU;=4*OnFh z&i@9xwn^0eFNMmDS>bw`ol2p&o9-@xn75bT^u4j1J2TGaFQl!%Rd(&*-u zAvf;qI!Scquhp&{OrQseiu|_hPpRu%+H40Bs7l|HL>DDKZ6UB7NI!9UA!XiVy9)pP zn}xK|spYnI=06K*-8k>g3u&_|?9nYJQ|Q}-rEVp``g(@zS=BX(cJ7+v+CA<~qE)>+SqStXv9DzkegF0RA_!Eap5b3dzn5Ym zutx_sOrU*tdiR;Zy^9_sN_64h2p8T{o8y55s)CR6QMaVh=9-VW_0DgUO37m$c5Uo+ zGY6{HUXn_mP4Q-aFo7N<+LcYERg>@6u*fNT6y~*(7Sa_^^e*qjS~S6dL(ohO5Gn zHFKZ`iG4gvru~{`$$Y;SovanLJ?J=s{eJV zbitLLur@$s1S+N@&q6%zBNrP43oPPOE~7NY8v)Kr?#XtITPs#ON<+0oDS3_FlP zD=PPQ?cu+r(zAKDSqStXfw|4zMFLd^K2D`$pN+NTI8Y^(Cf(50_0+p8g_73~bZuP0 z%^c`KqW489bmBhSH3P2U)BjGS6D?AUkpqeMK2M~%>ul#JtO`{Z^Xl{17d8T~cjm9n zrsl0bcdNpFGh2=xB-+*GYv0d5ap_N6`hjrzSi#EsQAlfMUUFu=7hygrRCsy@P!13gHrdoi6FzT>T^W;>8T)$)32 zlrnFmB?qo#GZK<%)}y0b6|OO64)h?glb?&m?6& zL5vh!6%xrClc#nN(&g(|!QFmrrVc@bUvQE4}pjDP=%v0+<3HwjUx2Z_ONB+-Wb z)4#t^tYQGY-Z=6<%wbIdIiqQI3BH@TPa|dv0qx z5);qQqU)dXXfp@KLe-T08PxJW?_6RM==tCC>2$}7@3^CekxT+TNE}+2P9M(o=wJd> zc(yYMJWu5OFPRp$|H7^6+|C9_%;w$GHr(&gW)6&nD!gYf2|Q19TgGqgmHM|BRUwg> zkU+ubt$gFW)Acq@k`A#TK|V_ zrA7i(!D~BS69Z{&lyH~U2&Z!(~e&|QHl9elSXy9$% zx%T7>7tx$yw)0@qpL1zS|4ZB}3+MOT@be2I~Br&b6Ee8@}s|uffnpI(+biXo>dateM z_B8gPNuURbGgsu%i_JVbm_Su}?L69$={+ws3H01rJ&%@-^?v(-xlIB+NMNrA6R46% z%US7)zh^+&B+!Gz;DbD;yW75_M*>w1_vTV)wr#yaPlGkNH1C$b zia4S$2NG!y`s|)untA=@ma5Rx`Qco8ccu5e3PuX93W=}Q@f-`oB8;5;|(rm~ro+#=nQqZa?t>A8N_xE`ci zl}{rlp_zq14-%6Pq*C)nwJk*VscCfYYu#MWGh5Q=@a2Pj`ONXaxJcA_E}ilY&#~k{ z0#(=xW{#(JB+;zLuH7cRxa8X;s(O77*On`1d+*{HlzAnUs#GXfjCLSV>cdp3{z#P~ z+JUOz-o+98uvZ#gI{U_ARE5Md1Jh_~ey1X;LKTjz*}GfrOrisuZrm!pdva_Nt$e=2 z%VG!j?x9VoG-lV3ZKA@_9Je)@uDp#H1r}m^msEP{$M|dI_*mX6mB#P-+O;uKa8*cL!EIWQ(xIJ13MNps zi;0^`bhHrYSv?_@a!%&Cs&lIfiG&5*z6H-(a$qb};rY>Q2afZ+8_-BwE(sOLx@zWG2xqTiC(4m|@u5A+NS~BHHnK3HM4* z?gtiZ{eN4p22Da#>On&KP_G$H0(11=d{3C(-f|HiwKshS=}Wohh|pj?Ak)} z9hqyJIX-(Yhc?w1;CjmE=g@)&2ZsrMlhr~&UA;C1w*x&$^qH1J3H?3VY&jCB!ag(!?9l;ha;VeVuHnAYYE1%jAknrUhpKJq z9?(}B3soIo%b};s^so@<$@(~l&gS+mMpa0NJz%j%2e$)N(mtIFenLG+wErZB#>Mor zv;$+I3TLR9W85dH^wP9OZY(*MXul;4PNlK0d!L&GdXQLFkU}|4F1J*5@%$vZYuA;o zr{A5)l+vcLFQ1tM=kAmHvuIMqRvrV{_LtG9!^P4>c_!2iA_n z>y?wJQ(6;C4kS>8?K9hftv$XVnNBn;s^ypiiGMn$(APDuD55G<1&_zwzhuyd?|S2b zJ^kwH3>tN@_qo{)^dPZ5Bc1>0&o<_mF){6+}e>gbD#%___LXGTedf{!33(# zG{~aA8nv+X70jQZcV$z;w6?{l3W-cQ2BpUp zqbej0Rmq{DI~_|7>|IoKZJI;Ndv&l7G82#Pj(0uRq%NRJx3+U_oS|mR(SyW>H2#N@ z9v&S`psMrk1=RF9luv3(|i9wZKI%%Y_yueOXJ5~#v+iJ9Z2J=5rzD#oJaNto_q* z9JjQ0^%C3;^dRwvGoN06`xZ-8NT6z3+B|K@NrPyS*4y zA#v?H*|hi936>n#4pfaHiD2fO>7sl08+JPR78{AiG`MRy^H#^-}-a6X~w1ww9v@3F&E_m1b2)pz5i_ z3DoJG&n$g~9wZL;nn10d+fxLAs)COu$-g^V2pNO2)Aza_u~qeR`4sxI$36>z9wcOa zRN8Dg5~v#RK?B$mNcFn{nuuvGiuYdaixNcSC90y_dSS*$(tX6214; zDS{AMRo{&pNZ-|~Z6Rd7uKluy>v`<_;Z&k?6W30BU5?;Ez1R-SZMGaeNMIiZ6R5%pO#-Wue0z6X=+-XnsQ*|6OFPgLN&GpmY!QUes=EH! zL9}s@jdBv2JROVATZw5&A5k^>2`RfRLu9CK0W7+{YE zj|X~?kVrZ-fgU8pPJY3gZ_x==;S4p2!<~oFp;sHZ^{yyAh`y|TnQQ+ydH~&d%(G1b zJxF|2c_7_zqJgF5NT3RP#LR&nB)-197tJ_W(~<)TRAIlFIrbkMO|fIW6}fepk<@vE z7dQRB;q=qy7)uWHAQ3#~NT5pW5*ONXpa%(@V`e)REM2+bVA}`XdLQidVgANv9&qh% z+H~J`c0_YaJJ9prtw}GhTI;DWQg99=&aUa+e*aio4vd8=t}sq3G;@@iKd#{X#Vg%< zt1qmP-|muTzBZWzwibz6TR-0R*B>4oOrQ#T#3Zox3S;hRKcKhQ+TeDe2Z=4)Ys8hk zDxj)xpP-6+Bwl;Otg6S0&lPO^^j^1rdUctdzv>z9tdD(Y66itV{lhopckbELGE0y^ z7522518YC?bc49o7kI4=ZU=gh*l}=n+_AT8S29STihCqpd&H~?JxH8dIxlWhVZQ|v zsN%IGURP9;Ko1hbE`L03>2=-}r%5D#{6T)%ByY7mk+3;`7BzIoAb4#@4-zYmZ^$1I zYs-NIs&Mw0RiOuo#WNP=&t1{jGE0y^70xj;$GjK*&VM^G){WJ3%`f?F&U)9SSglE* z2Z;m==px~vABBG>*~BZhpLe1yZ3lp`_FCn zI9L^`E~r#8e%G!VmRYi`bfx(Ar+;(r$+&mpLq8mLZHZ*>-P*${6*O(*5v&T2!54GO z6!eMx-g0+`9wcTSELCvr{O>FTsv^fc@Hh`&c_A@iONoN~w`?t!92yH%codlPitCNP z@yF_JFYfuPLj2fL-mK(E0ev-Uc(sC4dFQ)C`(srKUOwvGrC|Ha9OyyfshL#@HdpoT z!h#7@;c;UUSUZnqe76fP3eQCQm}3i(DD{4o_*I8(cV0-KihCsfhX=fSII}AB3|mk& zzT8vi6{9L7xEJF4H~h;!ufijRDm)6zs&KYvWmGCCIOw1GCV?Y}M7tAJ3$A+7Yf~_R zDx5t&BHRwX=XCTgmG531y~i~PTmf(%%Q)##U=rwwB!Xv&#=`OEdz^T^3paD12Z`Wz zlpeg$X*>BfcWn9DlB3U%YkYT4*fw*Z2Z@-}bf@nr+cSM6P}OSc3P->iFe{M zoK54Nwai2$P*uNXn)7Gk(-wmF?00zof7gSww8>r-dXNatfds0s-^`Yy2ZvlU3=8S>CUM(`z$#|&Chj`#%8%5?CFax&vl-u?0s(b z6?%{e9uFi?wIw6R={4Q9OB#BRX#HQNv+=XN*}D z5~!*@EzPMnd7&i-dXT`GZ{|P(RSzVlI&a=+%hBSZ6z8Y6z5Ubjs--ypE%WyHjWQEq zjv}$WZi=(|qOUFOK+lxMDb8Cby?r>&Ee8@`v`%q;fA63r2gX8GStrHmRq}fafu0uq zQ=CH!yd73BlG(fHLE@KzDb9kQJvx{`6(0X4@%;yh&P~sHyHPYedXWd=2kEaXze(;aq%8NlT7W*JeARTyMR? zwJUf$I-W{)QpR|DuS{Q>?EG;>X*X^#fgU9K-kj`ou2ITT6`nJGPD*jgzFXw^1CClG zsyvzEta!%T8POaMob9OEyDi1}`xD!4h)7&pHPx9^&fDeW-lnO}Z_WR-9D_JgBj3z$ zjxG20OTdvet3nSFr3x~f-Zyx3FoCN4$1)sea(PSdqUXcB3}^e;3tbiF4$gtZju9D7 ziJ9IU3noy7v(hB$y_f53X}!Vi#hE>Go#|hAcKnOEPQr%gExlWNOrCS+NpJtOf(m)g zkT2J}s@*r`IhXF(ZXwWv#Ixn{oTQ`MEX1uJr8?6#u5mqY-<#^pS+Lf%aW0tc7~3e- z8UEN~KGoP8Q=R5{w(BeOVB8YJQk|}Q9?0+++|jU9wa)vlj7Wdoo(Gk0#$oMDbBcRHUiI(Ej~(eHZ}Bm z7b68%g~S)nCpnkT^TsKdK-HAiNlx_WHyW zh1ZW}JMe09{9TF8(FR3bSz-<(>Ry-V4D4XrT?`3SRV$z9JbQ`lD!j$d2~M}Yuerzb z-M1w=rI$SA+7d~h2bk@+ymPu!=4S6KbIadp&huNnv(NFgbZ7G|w%LvzBtq%wPDbB+ z%UXhGHC$1r>`Qf?O84@aRpD8!a;;S7xt8nPxJa7>dXRYjbc*xbi{6^p4it}$L?|G6$vd=`k-s!hE)j6=j zo0T}SW)Acq(LO2Fsr!vb2NS3YzV_MOEX7%#^NKqgF0aA8d*O~^%tRzEshr|`S$&sf zUST^>g-;XAb~Jq;&uPBz7dO@$3-X*EE4*tToG~VW9wc6xo#&MJ=^sl~NT3SO!DbFT zBhRav=QPUo?$t1oNuURbiGSrf7aj2K`hp2mHQSl%tf=GNS(pTR-h3<9sX4||VQ!N^ z4-zlrlRys=A8p8SoYS^v8Azb2!Rj2R^`*AwiRcNXH>r79#)g;zLc4!nZw_k4=;*NG?HxHx-E0zF8qe<;P78vBf;DkM;~n7{wJYQ}RG z0zE@#r#St_dr!GAQgBsB%(^4RS-I~8OAd^Ms#b$joNlFGvJmLGxm}90=a6>?fsul% zLSjqH6zBPS$dUtNp$f0<%p7ely;n_vP}c%+#G-uGpkOmJ2? zU%9Q78EXGF13gG|{WQT@Ir9@sUm<}iJPORJ(1S$fy$R0NN*@K}(0c$>;oYm51Mg)Y z9+T+YIIF1pTC56*k3LCsc5krV8z6zIPG2WFIg4y(1N3Z|n&c$habI{mw0&kfFb5Jh zCMP-bhOa21uTVAeoh0X`Pw%!6SM^VJ)^}UvdUm{$>^OCEicu93DF>6Ce@bUta$q}9 zh3m1|a;*28ok>pT=82uzpL-?d;j74<=U5}dQVbU z-tVYw65GKe6{<>X-VeZ~qZ6un@QV8b2#Lk-AG@*m{bTv1OSr;zSFW+-5JEjjG%t5w z_;a%=Bv3VeU8Zx{4G&v#pa+S;&F*uurWQq@s&&UK=d;v%EjiGGL~vgrfvUAtGn{p$ zms@h62Z`VjL;_Wx&PsPqy!n772YQgeUN^@hlF-q_UN?!ytLHht4=P9UdzkGT7dvmA z|BqXVo!X}kU*7u9!#hQ34WK<;rCJlawvf+$-!^9T8M&wGMxUi z>bNb(UJyb*_qSX@SAziYaNBbfwxkl?qg9DZNX(hek0CAL;;=0Fb;{2rvk@9t+rlP$f3MQ*FtC9whjEXNTY6wh)EytGS*9OKUaaxAt5c+h$Qq#de~oiN^RUCA;Y=!qnhHmgEHY*q1<6X_MFNuUP_+4XqfF0V&S z0zG1D4!$l8+a`e?B*fP1$LNHr__{QJKo7>W(fgxGrLZB`XYsEY3m0|@kBT(R|efSDtbP!&H-2q4gdamBX(Ph2FSsz3X!3Lwyf zai1Kwiq0#4on%}KBvdtP z@qGaVdN6L`I%cT~JxGXce~T`XP*vdyZpncjj4QUjuV}VBl2BFQxyzD6V(}T$^%S08 z!?x}lX66tTUw=3<;|kC1VS=v)EIA6#;jRaX!n1Y}1ga!ba8>F-V(HrD=Rlwed&F$H zT!m>13$N$gUMRd$b8VBjHgO)^TI+AOg>s#!bnqT@=s`kk-J8zL5lN^Dcg!;htR34_ zc$Z;m2YQge3e6lyph|4Mv#{hq4-(jiW)37!#ZU2wpAK4bMD9n%cV4ba?mu*IvWOhu zDZEQ@iNd=VOAd^Ms-|V8(|YTkXXrr!+hDxgPUnX5UV8lfSYM=s`kkJs!=f zA_-O9`uz9+Lh9W+MoTdG1262Vm=fvT+MMpEe+e_C>&2MMu%A8gw@ zA(Bv)wC~jvgdF zUpay1_O$gb5~w<`c`~g{u&oUIO&syJdTx)(%Ai+d%ic~8xLQIF5@PGMmf7-1LRI_? z9r3q)mbr@_j2panG!m%dZ~KV9eYNC34-#^Q)2lPH9Y~<+n#-~RT8 zECm0mkodg`*TcW%C4O(hwI#PkGRK^ELLlB%!Bz3j3&cA`xHk5>NuVc^xMHX`{=tOM zs=^s+68sA);@?@hmGJMRh<`y{0$58SyXAicu93{F^f3U!E0F z6{`4`T*SXTvk?3{E8<_CxgP!<8SyXAicu93{F^f3U!GZV;0U4$$I0v~A@r!lBNZe0 z2|d=3;NKAv|MIYis!)YTftdq)k$>Gr{Cl`!^c52POE==*!xd2#s&Jgls(2?2;+=Hd zSiCC&@lHCf&A*@}-bu%j1OH!5Rt9}?C%vn-nFBpY@LR3Kd)8R48IV8~ztu|o?yH61 zx2SmU;9YLL{1z4Qo-9SQ16zm$@5w^Ei;Jb@NT7=MXCdCX#X|6I6vX>ixbPJ6`zm1&;?3{5~)78^D$vSP825eO}_Xek}xg_0OM4Dt@1r_^n?HfgXO-mw2a`VpN3$zYR>hw~QqRR)s2l z1DK9Bun{hw4C0+ziXeFZ3gVqx zTovzFLA-N|g}`-?-vB0lo7g>y_>E)Y{cF>mcZ4C{ zr^r?DJ{rXP6j=y7v+(=X#QP<3lW^iS`w zxaArtxGE(09TVam5-d5eg{ZJw*_x;yr7Kck8hbvbHx36|U5`; zJAx7K6=osO!#jTw?-f>zs*vDaz=-z>v*f_4P=#j(v*i=h(!*9L0WPkfvVuO1m_RGe@^_Cy4#~T-^{Ae zg9N{^PP~7KWjv5T6L{+H5*<)6P9wd0rRN|dg zEjf@t6<*t!Iq-^w_wgd$`OA%qkxT+TNbn9_#5;dkW(g9g!qv{qfgU7yPcPz~zbrYB zKvnQ6ipL=DSwy^NksFtH79ifU$dZHibRpi)&h_w~cf`Blxi&^J+kqY=csC;AJ@za) z3<6ZV0}=6_MHT|<<$Vo^cS0yeRY>rT1;jfcSaM)hsNx+9i1#(H5Lhqog+#n#QZcGR zg5P~7-aW~Z1FJ$6zwb``hP;J955MD1{3d)cszQR_eJ6e^-jV~WLKVO7PW*+Iu)ZTBzU(b;ys-#Ik2x#g~z|ySG-3b@lJkjEc{juzXdW0^dJ%Z-5nCB z3jTHptKyvliFXL~RcKa)l_0_UjuP)kYUwK^P{q5H5btejA$YGS;@zcO5AOm+yjN7X zD*N+YRPkO>#QQb6=P1c-C(wfg?oy^AW|-GO)y2n&Jr@@`hddtMczuaMwfu88-)va}rg3RS$b74cqJ z76LuIn-%e%SH-9b3Et(3c>gO)4y+1Qyt5VYURV|aJ-nM0@t#-3s0s<*<%)R!D@zWn z3RS$b74cqJ76LuIn-%e%SH-Cc2;Sw2c>gO)4y+1Qc;#%)UGyNqdtnjpo@L2_1ghk7 zy?ZrtNL6~|@NPZCd-{ZrsG^T^BzS)x;@#{l#|O3?Rk$jdRpGJ5JE;)wSro2Ht2GI1 z2NJwz5%DfZ0aa-%RAHOU9E%svr;C={QXs!WKC*ij{kp8XYs)jI=N|9u+9rXXNJ8K2 z2quJ9)z!@w&|eigS#qEUi65>_q%Svhu@H@#Wz&hZV_eTYrLrmctJ_>#W{KuAt3nSF zWe#M~)wg(bFoCMyzsaJ%y4wi!%(yO#UVd;?F{(o1nh!H6Z`Mdl%ds7(+WczSEZl(Tdp1?4*#7^bw|vyJ z%pKuMbksihDVv53oMa);gT2u3IFJ7;HUe{8`(ZZidw-%YpTFf=2@>(oWYb;mj<-~W zm7uE5`fSRaX(N7XoJAjIHgRKBdpDDAThP?CSN6(~>k>;2^dM3F@l2Xn;L&C~kU-V& z_tWXoopF{N=s{xG+DvLQ)G2~M6&}H6Rp>zi`!JY5Rq)Dy9wdT~4p%9qbei{uFs}t zF7W6mRe=i6L?$7>J??ehVYiabAB?A!r9E3d=U>NL#sfV_OiUk7qptF3e-4d>s=;x$ z)AGYM;@+!A(!x*waj-L&RtF{(o1Jf0i(;Sc$i9E(0a6}S8v@4X`aKjFBE-+bVz zB$B>kWadEC#vAv=ZCz6ofw7SIyWR(J_8dr{3fpH^g&rjM|D@w~@ACREm_QZwx=G;w z`!<%DXqT)p*!k?QtkU*7uUUXj}!T-Y>chxQX0;XDoOYgO;K44AKvVfcGwB@Ai@8Oo&VGY z@7hN&91B(0>;AsdkwT)u@}2qmc`$)0oC|(JS4;k{`1}FCzFb6KVat(7nwyYcbYGzg z$H}aU*Vk>jzMgryL4N-(o87A9bFJ1-s0WF|=eNx-F~YXC7q+9I@SGuWU0Xg^+suKU z!b-xl?qw34P?bbd+fS%Ra-hv`KDqg#6RMINYWoTGNDj2^_fZ&22vy1FYWs7j2MMw5 zcPtnSRq}Z-p&lf}w%^fXEL6$o!GwB{5Zk^}2*yH{d>%}w2MMut&k=v`BB3hDp|+n; z55_IbXL-tru~1dmjsSwIay>|ht?yI#t3pCml0$7jp&pDYwmy@MPN+(9sO=}zgK@>? zxezZaMsz||l0$7jp&pDYHXn}xIgn75N*Y<*KRI-x4bp|+n;55^T+*W>7f zsw9WnenLGMH~QMH1gh|SW#-^3$b7zTch^_G3eV^3cGs4w_^jsICV?uxR?p{a^&$w2 zg#_Qp$eGiU0|`_W_JV~#4-$O8lh1cZMG&as`<;BgE3y!L&6&^lAFhY*Eb{sO!?m$m zv#(IacN6)1|4{^iv5?@a{(QbSuvCQvs&Hh@szWa-_Uy!7EGWD$H^q#xbsB5?yPu0rIH1^cGVzRouw-M+$7M0gxpQs z_+xdK4kl2w=dTI{V@ug~TtrXpVU-HHU3gJ3szRdF`&9~79WGNuRj88o>Dc(&p&leg z4X;-4!vnTG8Zj2ChApUCQ0^()j@H!|)`)9&Ni(-zUWwZO^@nG3q;uFO6^U=!bZ>ul zL~~2a(evM}N$pmx^;GAUBZ3I;9P8_=aJ|wCx@RixnQId0K_Ylh*%ik(#0`kO+-;#e z_nEt*v1ES7=s+l^{`J%stx%^tSab5~$j;y+(f7tGv-Pb71Yg zy3CGS^^CVaad11(gM>Vj>)g}Z&(_R=1gdbpnFQ7=_k*o32+zcG=qn_49Gsnh>@C}# z%h*?_lBsp9D1yMgLPDOG&7y`b zZB~T@s&Iyy1h!C~oh-f1o5$EACV?I#vL-*C-=mF32NS50Cm}iOyk0PgwEdl(=|j97 zxTQ^c2Eg{21bUEYJp0!;rGp7n;mDdq>$`8FTPB6aIXwF~-#MJ4M5U{bJdv z92g5#cz!eq?8W|xJM&9D5S~}zd?taFAo2a=WBK)}*R{{9a4b||g=UVXyDG$gR?<7C z%9GpVmQ};E-98?u8nC5AeEwVED}eC$n>n~0VGk1WRQ2t|SbICd1gdcS{WJ z=-x#lE2C0;!NH&$8Vgl8{$^GD{43uf=4 z2MPWT;T#B5;SBZX;O7i(y?joL}C)9&+#nxwl(Fs*a4z>M+dN8io`t&n8p(@Ft zwx3WB#uZzi;zlP_B{|gg6Y9aZV(YWz=!B{yhuVHZJs4MPeX1UvP?h9R+fS$m;}+)2 zw;xeRaD}d_upI$}sxYqDJQpm-ImSYjd>%}w2MMwD+Zun%kx-T7P}@(a2jhyZ-#SGn zR3$mo_7m#CxMK6M8PHcqs7i9E?a!eej4QT&^B0{^mE=&{PpAjuimhvYbV5~k`-gsKZ<*t?CNbHVO0~A-1mI(Fs+_ ze^jY$66nFWVsnpJs){63C7-M9&!HZSE4H3dqZ6u<9BTUs^2*(b~G6RCt}zH9UEFT=K(13gHHZ6A+FLRIp)+Ws8s!MI{;uSX|T zB{|gg6Y9aZVr#EQCsZXl)b!NY^^prp(=@_wx3WB#uZ!VTXaHIl0$7jp&pDYw$8Wc zgsLQm+I~Vk7*}ljFP$(Js^s%vLOn=`&3BNNF~?Y_lFx$)^&k=auL~FpRr0z1bA{Pg z1)Gy-$mi4B$@Sn{SxL04!I#&H-SNvLdVJKP_WtWc^dKR#U9TU_97v!liT4Ct+~uq# z2YQeYTd$nW9Fc^oq~Fvw3G`rGvGoohI-x3wq_&?>55^7Nu@_^Z3isvp=UDXY1@7-; zuuU@N_Lidu3CwNgh$OU4^10f6LOmEac$a33g(}<++sskE=_1~A|IU)&dlYFkWpHL6R6+g@dXNy?evZOe zsFKfv3H2Z$ww{UnEk{CCl0$7jp&pDYww{Ti6RMINYWoTGU|g~FOcb3^mE=&{PpAju z3ZegF6ilEh_&<^4pT2YrFZ{FplR{NA?1Z+g2nM{@X0Z_9Cx z9wg)%UXNxo2NI}~&w~l|AR)G{O8y*3s7i9E?I+ZOamCivH9Dax$)UENP!Glxo5#aF zuS6$QB{|gg6Y9aZVh7HWa4b|wj$lGPNEGI?9D^7ORfX*cAh;c_2MMuxWDES)i5Lr2 z@_8_!9weSFx4?NR-uCt~#zK{Resp)dr7C0h1HNn2=YC9tZQlrnJ#s%7CfL?$qZ6u< z9BTUs^+*o1wb!E)s*)UP`w8_(4zzXlL?=`wIn?$O>X961b3XeKWmOfnBY@CYh3#-v zV(ZcDuL=oONe;FBgnBTp*t#l3CsZXl)bjd_)E0 zPy$twgO4Z+(dM!_jy@4)RoLbyAr3z;u^fZwK|*Z4wmSzxRkBK`ZT2pDFs|78R6RPO zDv6}FpHL6R6?^ZC(=6@4Sf~nBoaS6~(6-M+MxCinX8I;Kme72a>DoM+VcV<R4iRgyz(KcOCsE4Hrl(Fs*a4z>M+ zdN8ioe56@s3C2Q|d>%}w2MMuto%dITgsLQm+I~Vk7*}jv=c5y5~`BV)%NF555^T+dpbIy zD#@X?pHL6R6?wKAX`NT^D3sO`_89*irt zKE;hrs7i9E?I+ZOamCi}CZiLok{oLL3H4xHvGu#j=!B{yhuVHZJs6kwlX7_ftAO!P z0#&?+l*7ADS%~^I)9BB{rwimbm@zz+?ycx4xA|^GR`kvZiAxaNk zNNp#-=6aBpXTA0u=s_Yl2NI}~&w0LCszTK}aT&B}+_SDKm_QE_*oS6cA%QAslf5eR zL=yJCLIV4WXG~BI@I(^!9P;e~f0yF+k9-TDD*0S(v*qYPLTr1>BMDW>=W6?Ns0ZVU zt=C=A2~|lBwf%&8Fs|6V9$V%W#zK{R9!#hQ39|Vn z$)UENP!Glxo6mLueT9UoB!}Am9O}WiVlR8SSHAyzjUrqTd2r4kW}@m8>!SE5=%?!hHw%EF-_BamPSb2DQzq(1V27_TxN~ zP?dbHwm*k@Fs|5oG)E^?B{|gg6Y9aZV(ZZyoluqJP}@(a2jhyZ$7XawRgyz(KcOCs zE4CiZ(Fs*a4z>M+dN8iodTd4~R3$mo_7m#CxMJ(k9Gy^=I{;H5rmE=&{PpAju7UpyB$f6UR&s7z+BY;p9#uZ!d$ox5wP?h9R+fS$m zs0ZVU&1-%@4kT11In?&&P!GlxTkpuC6RMIN zYWoTGU|b>iS!O^xlt9(tUK6O*b9*erRg-UZvgej}-|pocj=t5}@0zY*+pG#bNQiAe zpGOj^lF!xl=THyE6`Om#z<)$xEL6$o!GwB{5S!;hKn^5SB{|ggw?jP`S8P3NM<-Mz zIn?$O>cO~T^U)m84kT11In?&&P!GlxThH3j2~|lBwf%&8Fs|5o){ai7N^+>}C)9&+ z#pbm#ps$cnmE=&{pF=$uS8P28M<-MzIn?$O>cO~T>sdQGp(@Ftwx3WB#x2ZeIiF)J zR28-(fZ%qx9wfxpv$nq~Bvd6i)b|Is z_FqxPvCmy4P__8ztxmVf7g~sns|V16GZoycj2jybpxg^Ca&0Dv3D-8OLJt!BE@{9{ zI!K_3DT<%&H;@RdK%s{ObaGFs|6#hXwxLjU-ehpQ~+Fg&vG6HqX$2 z92yH%5-FHa4-#VYaTAaO2~|lBwf*f-55^T+uUDcIs*)UP`w8`6T(NoO3up%ts*)UP z`*WxVvLKR`*x4 z5c0hWzYpwQvB>u-dX*uct8G?=9wfx(+y(xsA_-N==W6?Ns0ZVU%_AF-0|`}04z>L` z)Pr%w=J^(o0|`}04z>L`)Pr%w*7JOHLRFGOZ9kzNj4L*;7y<1-LRFGOZGR5+U|g~F z${;$SD#@X?pHL6R6M+dN8io^^#fz^c51S8n7vcKFhk=Lde}u-K6^N z5hb?nbI3<cO~T>yZ|nP?h9R+fS$m{z4l0$7jp&pDYwjOEG2~|lBwf%&8Fs|5o zq(vuGB{|gg6Y9aZV(W1eoluqJP}@(a2jhy(S5cN@5M!ZAJ`X0;gM`?6J@2my2~|lB zwf%&8Fs|5oJs+J=mE=&{PpAju7Ur{D>0>NZ6}BUQ;C8qkB*fP1d4E+%s7i9E?I+ZO zamCiF^XP=CB!}95LOmE)Y#!No|CJ2JLX~_TOsEG5vH92x$bp2aB!}AmcBlvAimg}Y z(Fs*a4z>M+dN8ioyjBLZ0|`}04z>L`)Pr%w<~2Vc2NJ519BTV>s0ZVUtykyK2~|lB zwf%&8Fs|5qehg>_5~`9MYWs7j2jhy}?B>aqD}9WGs?i;rJ5!n@TZkjK&vce;>EK?; z@UJEv-7j3;`BB@f3Oz`Ot=B=(2~|lXwf%&8FmBT_)1CE?dCz@=2~U|N*1kedB=P6K zvTl!J-wJlFO7BW9>=GV znWM|TvY~?;9-`2Y?o^}vX%hQ~1I=7}%e4=w&KGaFQw>LQz%ZEyx9_h@Rc?&&StFmjiu0Aw^ zX!1?vP_?Yl&IJdC(S{OLTveww!=n(`C)qn{glg{`MBCdurrB3Wpz8HCl|zSbu1y_#4vQc} z^}(U;?rf;tt6J#n;m*`2@iw=@f@dyut2J{-CF((<(qC0W-HvvnpI(k^2NI}~&t+cu z#{*|y)kW1q6Sj|_$A(3li8vlee7n4QXjShKGY=vFhSQA9NCG{} zo~RyLUUE1UtUcGNkXRn79x8Y9FzT=?G6%K;RpWP54}E@QD0Mm#NuX!I=hZ`J7Y(IQ z`P-u$wU`5m-AAg2HrErLRy`;m_)!{a+2CXZuAG=n0jr5gMC0g!Uz#YgI^8 zt6d}XbJrpC-G;~<*bY=B#?=Vb|70+|@@pi4p2j!U2(@{AFkQ;)B1ST2J9>~fFsVl9 z^#OzF!!hHd^cAWeoL(dJR=2_Q(v(O7Jr`xv2<^XgFg^0%xmJZl>H{@GXUhzxrXNJ+ zz;>Vt*DkZ=bNa=E(jV?cFV~ntJ$Ba$l|R^%hW<9m?JHd|OyZHrv7zC8Zls})PNU`( zV?(>LZXoBKsqXp8UG4aMWfF2GQx6hvZiopT|FaX-*%L|hn;08Qt`?F$0je2*bA77Y8 z<&tAVFWlXgzIlHdRhb_fy6wXrRP&Wc0%QGmO>F3j#=Yo3{c~*x67RQ)4c&KjFZ!TP zWDaZxs(!B(8;YCXi$3~lYQ%V;XF}!J(34Ag(Wnomo@4JK@#|kPp_{k%qO0zY%z;&* z>dF%_p&D=XqPUDm0(%#G^yJLgP}`fk((lhjw!Gyfv7wi%b)jp2o=SCYj17&>?m}NU z(Z&Nutzvd;=&o10(zvgq5m*Tl+w)>W1Ha~~eu%6J2~?Hk8MAJE58BT&#ymdIgM?gP zeP6K$`LD0A7q8qK6UzCj7bV<$t|N%VYahpiJ~-Hmo{Nth4;(>MoqjVW^ze~h)Z&sz z0zK2W#Dr3Q>_w~popO%z3W@XA#Dv!Uz&YNGTp6$`R6VvLCe-|!UbN`hNCK}*@Cr%R zO8W|jo=C!eMTUgfs>0RP9CP#_foo+jfhw`DexaA;-T*yFU>}+}kU&+-2{EBF`Mv0Y zE|I;99wdUt1J`yW@VGInLJty`{2LQ$xVe|8{lPkKnZgJz^{I(u&wnvz9l}(KC_lKmt{XD`P{0yWK>CN=8-MFXs z-r9}oH$B&?ka(Br#H4Q2jmOEHS6CIQ{&_MswD_BDRN<;fV#9s0p`YHlnQESARuVks z=)ru!IgmgV&Ns6i=s{w@Q?a2h|LI0w_}VdULG94>k9VaZm1k1+q}qHH)`dzPn?a@b zH4d$tb|oEJn;X$rZBN988ot$$mV7#$Ivj}&m3pirHGF+Kef^#L%%Py_rAs1+a+$S5 zPo#CDw6emY2m(hCN9{<>+M#PEb)tuxMCOqBdfTcS!)uhBIpun%)jGbj zc=JXYT`%(ZK#$N$U_P_2kU-V2cVa^&uI)$%XGZ2g4-z;l%^bs?jScO8un%3)embpt zgReyg^r3$zOs8S{8@f+F29%1NiReM1^2f2Edn)&#-no%g;TXJeOYP9qXFJo1r)N;` zc%TP~uI*}vK5o#No|qds9!Q`Hd%*|BV$c);d_4T{c*efDe23)UDg)5&q9$4?lp0z{o@9IgF9-ncJGZBeL zhSd(WZQ7H1y&Ktb>?>4ZwPsc5K_X#p?a)(cH`BUu(OQlw>~%B84a;Lfzb1{O{Ku!z zr%Phos=&J<>bbM9=c!zwObKM{5zI& z%U}AL?;0_Z*$(s|@xkKQP+FzF^!QQR6`8gJRT8Ppg?%k8?{u1< z`&`(Me&IX!ttDea6-)J_u`f(L$EuJhe{pOm^mAWYekAfL96evg$A)eW^`&iBpKHsJ zXnt#KsOSBCsr962Ek_mhy4kzfa_s4rpT>k9uiKAGTp!sE^dJ#D=18FG-`8V8`x^G6 zuC*d_pa+S!GGjuM-x^MB7yITF#6s1uc`>1#dxz0=Qz8lU?4BJH%6o7a)x3QQVQ#ap z(1S$w^q5fM*kN?Vu*e)pplbH*F`=4&45j;Sj3iq2jtSM}=h00odf#)EKd)c-JFj22 z4-L4lRgc`UD)IJ=n9$+M{piAxkvT-A1ge6oLJtx@X2paW*X&1omPY140#(=}X77Ig zU(L|oLqq7ZGIzSqTh}Ju;(kLjesZnQLst!?J1>|Naeajzd1|1gctnk~ms zL!wSAemdA=2%Z1_z?c$Of6s-?fx3N2gFmz;KyInaXy&PsDUaK_!$ zqgLp(Z-&yKE#9%BGt?w-?jkXAVy#dduUBwUFC zrw0$GU8B8kOp2}wiQgaQs&aa#6-#!>+Phe=gNOnO_TB-p_uhNgYghCt*`37R+qLWU+I#Q4 zyfZQJeRd%J_%ENF=ey_3?Ck86v%AWawV90yiKRPrq+(=yrQBb<4~z;`FNx05WBhI6 ziMG|WBu`imvG$KR<;8d{S&y2L8IUi*;1j|t-WPn|ddj~jDBOQwxV5Tm3nmL8Sm1f<_TXXUV2a2$RIJhz!PZkr+em(e-9FmR?KWv zNZh`wAt|#5iD^Z79~c#?+|FyrL;7Xi^I3QTTM4#Tyb9EPB3h7mpx2OH4$^X%eE@`#o^w|-j-{Lr>-$xDU z>zpD!Yxyf@V${Xi8AO%SlU}u{L&fv-O6^R4Z&*20Tr&PoEfL$# z>l}&eX&MrJX`s062%nLHZ5LH7R%ytPQ3J(wvv>k6Wl}UmQ<9#KTA7UsiAtUtqIVo1 zeyqZubBqdA?7ng>zPshVqHc-UegbJ*YBjo(sA-$owu?mF+#2%jTPLw_Yd$J$yQtb6 zpdl;bV#IBce)i&5QN{T? z4qg*YFKfxduLH%$?f!Iq;Bk?tcZXgpvj&NV{=5$)P&MnmmQ4LPNW40XCva?lcYPd7 zsLvo;kihYSeF9aJ`f16;DLurL{`^(T%3-@Y%|;FB7?vW+$6}Q(G;i%)pA<1Jl5g#c z_xg|m2a`na@tqXBQx8w|A)~h@iTe`xkqlapuzx>C0#$ews7sC(B*KblNVV@tqA-AO zS4g1Br@V#~`jjN*naUGr>0VbuTwWxJ@#dIJ_C82#ZKffmZzqYlFY`VyDpYlj(~uEI zlf)HH{Q2;otRZ9jC5aAEvC2jIyHuYfaYu*D_C81itksZ^yh)}6KHYUpdq(%C5Z)AWi~1#9?)#VBdLjE)_-^(7!|5E9@dZz6BET+_jv;EGNW>8 zi7XBklcxOXj)Ojs$Vch&Ep;%$^)4o?D#RsE~M5Q$zlK7AJPt{imo(<@Lr-WIre0Qd(fW2m?Vz#&1}zrM9JP7@+dV)92Lk%h1Vdeu&-1{g?&be za~d+ZdZKvlXJ(^9V#QSr`RJ7>dV2k-XF%1LR~q8be7N|j4o~1cJcP~Y>h%@Z(KBfO zevTF-+=^>SnOyxu^Ksq>5~!-PUQ0^v>LJ#9!M8-TAmLd@OKKe;V zQ^Zjt`0*7IsOmYui{$%zzL-sH&#iu-1&O0GeaM066j2D`eIS7{G^F5Ade&JhEq_o-xt6kgu994_xId{%7RMbx9i8bL`(yZ|a@pAFbic_eT zc#Rw(&iatq`#BP~=-nV<(+F|PN&aqt=NwhIx}z=!w)W*$v?M(1aPd`pb<0;1=mUvQ z2esrtmp`FdL6#CBY`SB zPwJ@N(N*A+wIju5(Q(Qgde`sYDN@Wu@A~XWwv~G|ffgjfPH9M#94XFw$B%uGKvlLA z8sfJvQf&Q_CkkZsB`)rf;u+FKkv?ikxi1mo`qjVA;Qx*aiG`_J(r#~r*gIQBXV7*m zRBhOQ9kSy!liz%Hm8x<061Lzt+`6!VT<$YjOsG8PaLsnLd5?2@D39Q8@ z>$GIKF+%M3{8wxL-*tt=h)G&fQ;rZXY|N;&+m3~*5xunJ9wmx(;|a7R#b}A^A=)yU zWHu@!&Ixq=`fh}H_H9P}l`Se%iB+`Z{rw1W!c(5WTI|?MLr9A#adV!`onSU}g|H|L2ICokelj!~fsdnI*L zl{|Fh=9?(7Zo#ff);GSS$>1pQ;KPJW_E$*M``4E^<%kmNr6zFqLA1DB@Flh0w-?8( z%&ZS2R<89WDec;eJF4_f&U#95+yu!mOD;T;fyi|Y{xBy`ioy3GEnT-mG7j1Rq+^UY^fy=xP zEC;IMo9W0wzmB5zAWxu$G}aN}d9=7l&TLdjv~Q#%Pp(IcJ@@cFFe+4a6KFZAM~jVS z@B~^`mC+H0OC3bNftig8iGzi8B>$2Q;^L0H4~z;`*pAihN+{z?B9hWnetVyw49Kb@MecSH_j&%Q9L5ql;`XAm zn6pP$l*0Dh!=6<@SS|gu^bqCPWo1iRy1egiW~p#1U%NF zD4OYVHCCK)C$mu@;oXsDI?at0t3TqS!g8PruYdLVz<9A7cqBD}79`5Q_9clG;>COS z`7?+Fs_@LJec*Xk{B&f0zb<0M>Y1%8B&z!BNQ>TG#1=LFR9C3N)}xMUQ(s>a9iJek z?u%Ex&!j8cLW0=BBS8thVC6gBZKkDs>Zq`U=Y0IgwVcsnt}(wdOl>uy zCa|uMaLVUL+I@}|C$8e_3JFxzpn0!fq>ke5^*n)=Y=!+u?Rg!=z^$2$3W*a%=-Y?} zbrQ>_@;)#sRJj)OBV#o&V)nmz;u;;Xu72HJ?7cccd2q~^9Ld&0%s(l?lJ}Z%?P9$n zF?ut-YAf{+=he@sCEAXKssh7($=lq!+c5qaXrLk7vnP-6%rrn_>z{X zJ;Z&Hybmk~s<6GOTgiNyLmOMUix^IGXb11tkqgh`#j?kKV)%HzZ$}IIs~({v zr|WkU&tKz-T?PF}-z_m>u1(#Q`T>4q;k8(C(fnU+H{+6HRBP!htX5Qav0))~g!bzS ziGDYHNuw*>#reiRwJTI%n^yb4a$w2rUmsZ76M5(}ANOL#A@lxJay%{)CA5BId3>B$ zYCL}pB7rJwZ|ZVjYdA1kN5&;~6}Rd$+Y*rokJgc^WxI(J9`NTJqe7MaR>Fv=*^Mnd z@{n7!z0%)9b97hQ&UlRZN;1UcppfhDz$}IO7eXPT99bh+?Vux)I!WL z=uZTye2V&#Eyr7n-LyP`@p{oK^}&{QVl2H<(Vx1NpaqGK!*!%-^9XTsQNAxh0##X; z=*WR*5#pwF8S!XYyh=xo`b3J)Qo3a_DkO?*){&x(BE|Rf{uC9eu)V2Ejus>;-qDed zC)$fcy)(K7ZEY7->`4E6%z%XaT}S3VjuJhaXXL|nEL7p>OkIw=25-`8VKZ^8dj};g zix27I7cPotqAlwTEZX!r^lT5(;)CYt^Y7BLl#l+e_AzvzmbedXE!G|OYh}}R-1&9s z+pHG17PIE$*G197Mr1a^(N9YT>}@RuugGZS&i_zrOT0)ld!;3wi|Cs+XY;G)XhEXU zSuIITZY}O?z!O-G`EFP46OOD4yqWT`X-;&f?EbGJjKmt|vqr$T`Lq{{g znzs}0G>uWp(Tvv1wc3f*X-2C$s@nA3cI^_|h&k!I?T~)7hUN>8Y9lUOz^|U81qrtH zJ|SD%3|8n5p7$Y_u11JqJ3A@)=-$7pON7{t?)@XJjtVVEZ2aOwuF`jm7S6$!0|``N zEvS89oyhc=kFHDFil<3tqe7x=gof-5Yb&~^dyWO8LY4ixYCVST_tSY)*`FPi>f?P# zA7hmG%$Yvf@#NQ=D*HBw;?5viRKyY=GJJJ=(XBF{oq)txP+_#{xg;$!|2U?KG znv1@v@MLRo)l}XG5~#A@Uw!Q3L%zM~DE2wmQK|LFi!AW!Ad0o4l-t97NXpb0am`ac z_X90REF0lNmePF42Jd(R+ZCRFDT(Id%;+GVdBGECK?41$>k0`}Z64@D4pxX3oBzlA zz>+)m^C82gbri2(P}hRm2ObxRJp+75!qjLn=wIFk5~#8t6+Z9E&Zg~oKK9%8tgSjK zv>;*s4Y5d|3g4Nk_JI~8mUi_fb!IeGYW3~F^$bX$iruwYnbNk}EWcTi)bl31c zkU$mt-}09KbaQ7sx8@H%q<5cK#g~3}0P9U16g`I93897apQYYBv6GtxZ1~= zLf+(XLXy({e3TMS-wPi-XrMAaEn4}UO7G_lhblTFe|=zSr+oIZl(uM(D9d~3GcGyS z2@-CSH|cPrzp~7eZzV{eYD{-8a_H=EWk3-=%Ns`-I2y2D4zwV_eqX;iJA-ivPuNsg zhxTh1kNbjV;QI`mqqL##4!2LB%6`ewg2a>6-eghv`O1S&eC;BEs&hlUNVXI6m6CP% z+O>YIKww`!xco8~iJhkt$GApX)|QHA56)n1iIvu7LE=SPE)q39x9B{HzoN{I-N|+L z$3kJ}Cbq9G2yBeYzCA(T4=Av2PpIn(2~_RTx|5j^uZ4Z1!Z^aQfh%bjT24$g*H$*H z$o4D3tMx2CShVSVu;bb+NVxTMBP}ay#75g2a6XVg6-KBo2U?IAJH(9?AM7JuJdu$P zTb-cFe#w~+wlcv=xcysJ%PK|KS;10rwkDTx$!!)SeC9imo1>eE5o0B;8`>O?jS z2@}U2mNMxBiNZ&nEGvc4?|C1r9JZ)X#s0UQr}VXJvmh~FbR}*V%Za;|*XGKB$3hjh z9<`6KY#td76OPRl52u#m ze4qsh_M3hyCxa`BCu}OLb#+u|!Q)!L%_FjJ^Vla)g{?c$Zw35l6L?{Jt7m@VNFzORP6=Su$16 z?%R*Qe^Q?1nxx-;uB1}D+I!1r>F9`}-1$HY65%aBDQ742Sm~0BA73GXD(nBUT^|+; z5>|gk7NNSX@K~s_md}`eTyodJl`M$aES&ePt*ms>bCh^7qZ1EWF}o>_HW1zz?d zohls_mIeNrZOJDOTSmyN?XvP^ydrF~FqMs1>63%(E^$bh-n}Ik6&?#!7_B-gv>?&5 zM|KibKoJ6eHsX9Bfhs(+Y9D;bZDpFbP-`j2mec$^3N2VBc6Bj2eb0ads@U)C{~gGH zKnoHq55N*(y00i9fhzWUSeQv*`IqXFMYxNLc;pS%m7SkU*7F)l#HJ_K8A~%~Lr7El9kr zSeURYN|-hF4+N?TX-kpiqh|>6DBcHJkf^k{AidJ+2{q->oDU>Wh2Kx8=1A;jNh|uv+zXO zi^l&!u;bcPC#uo!dC{IBAN|ggx*Ygcd22ajR`RAHB}s)%C*;~GQ#b-GNLcGoPG7r7 zph|dJlFW^tA-4?YTM1f_u%1mheJeo%Rd_Y4OO6&KtgTW`-`bHt6<+gdAJ$$*X1$E{ z9LVe(SkJlTn+<9LEj&Tb=Kmn9=iH*gGpqK279^}~Oitf+kw6umf3**5-!8NJgtZU0 ze3R4KYiIC%PP8C_b*T1%1gh9?dfixRT}_|`39NPd1gh|Rerf_ONU-0wZ+55&zOGp8 z>~3kj2g_{qp(fCRwP3yPTE3lXpFkD+O~)u15Y{n+%*KQ4Hy!(0#)j6Blbn8hg%<0G zOolO>4~sU^YWk;52q_p?Oq3}U>f@^#NkRyd9p zCp}5x2(%3TnvW0RpP}0q(XEzG3DYYE-K7p zXT6UtH=q5s%-hqAMbU!9vAupI+G(bkqUp)`Kmt|R7St_q=IUI8eO-Ec+X%~w$E4&1 zmP{AcuGs$>&v9%Prm_*0s(O<1?-wcs`iFB-vAU|bc)I0_8msE~lP=CPl%@51S)Pcn z>|kYBa+`%GF1MO#=lcdWg4Kde#rj9~fBN|cT9DYgh(1X&XqIxg7oY2l1ghBow!JBJ z?Or;c-{QUArjbgBOMY^^!!YHl=~qi+QDuA$+AK)Sev^-M_Z+U2UZ0Xd?b--bouF4# zPx=L=LNE9$3N3dV1(OP&#wd*{BwDTy+mY1eU}w-~L88&70FrmqB*i&D-!mYAs@~V~ zkbgs`C>=rvaOJ?dLfU#oDe12$v>?HLvwW8HwaXJW6@HsXU2?SGaoO*TzY@a}HWhyD zO6`Lki>;oqc>VemCKrD;6t`R%YdIfmEh~LF7-6#@k-vU1%l~cjP2_492~@HFZL^H@ zQQ0g=j4W52Oxl)9+*E2(20m;As(d#VC!~dsG22t7WYN*0mPhWD|`9NYolfstsba^{J6UJkq3eSz&2ODLuUeq?eVpkXY zZQZj_?CyV9ER41hZ8m?k{2ua*U-82IW$fp1KUy6XT9B}RH$Vba>^F-rZtY<^dz+%7Aa?Hg)7!Q7KQD^*uUeT1qrNmwGSjvg%PR=v>;*s3?hLl`z6P7 zi|5?Bd#2dkiL+RcV82;!mwtU0kA*7hE}+780n?Yf`6O4%xqXt)lQiw5Q(79rE#n6^ zd&&5m+bl>}GYVvugOJ{bjX)KPko}*&9B4t}s4+X)VE7@M>GyusKG1Tcts63b-ny=_~(sQN*7!?#~4r>t1P6KENdwo5dy)ljsw?rv z7M8ZeB4KUm-5__;_@B1Qvd(-fK?}ROY{WAkcgycZ$zfbn=%Z9b4l?d9y>i6s*KVJU zR-bb`E)v?FIZ5eqrIa<3+i*URKo$F6-jqLsJ`v+ZdPqe#vNW`h5>=Al8AS^c?6<9V zRhNS&Y%1|)HVZMP3%|FG7Cf%~{t5|HS@&y|^m!Sj9(j`y-&!c*>}X{y{pv#BL#>pO z^s5W2==;K_RBx>`Sj6YUp=CUM$5w8KHcGaDSOt%yE;(9|nAA!`x({ljgx}%w`j9|X zefs|P=>^*=^U}S)9WCqW_Xb*(Y^z+L-y6Uq*^df|51uJfm;P!&tRW0P%M zJ0%~@gH`)L%lD5y4;ENqO|+*PHSFcU>W|i@u$5*TGK8nD>0ofKj0;=WY#IQL`BInb|z@}oIVU@exS*~+uLJ1N!nWHu@! zu56*t+R`WJq%FJ;EFr22(C2HT=~GV^=kWwu*3Z|F?M@w)tiv)J6%rlhYDmC;(TY5P z_kmHN3eS`Jd|)kB9HSvQE<`EXu*^nYMBEQ~-Xlo1Va$w1k*gMdd)N|^r1fJmEgn)$KDIIxlq)*4+ z?xxhEzu&n;E5+{ct7`Zqyt-x`x$~mEa&}*4zru&a7W#F^N>!tj2B&!+7!|4p9MO?A zW1^Iu7kC0KTTbdooVJ5<@K$D{LSiSS4+nKn&QaQa?V<|nO-*1eI-k&yOLe1_m)A2J z6%rQ?(RTt~k5*ov{Zmw^Dou&-m(fb!GdzK<;X?=drV#p8g2cJM-e;MKb_GOoV_#C5 zzTy8$w?DNjR9&TSt@}ZH@b&IIf$<*Nt|JXxIw{LmX11=7sJxuk^s-Khb|_zRY*(ln zGE+x9{bH0h?RWw$1t#lALqm-6cf-s^g~T%Y{o1fAG0O3D->=1}P<6dG{TeMDGo*R& zQK6-FOC6cgmi8T|e!aEsf1g1lcGuC7p!u;%%*L*NXzi$)6`~_qPsJ){M)AbM=f33T zh&ZL*jRYm{O<$s09;XylGTUDv(fhD3Nuy({LZkTi6k%PV3j0d+HHh&>(l`7SFA}G; zu9n%lLSmGUj>MOvQHAg&$EZ++HKLBH@-RPAIJu*8xnB?ZB)lIv6W>wUHYl^-aYw>^ zsvmLK-$4mq#^*-i+C5wGwC(Az-)uIS@jA85f&|-dvCKcy?fl@eP{sadEiq#sHVYE$ zw|Ku(275(#EL33~s%sbPB#ze4t)(55e9JRiyGWdy?nnA;h*IP=eC=XXsH!%Deuq0L zN-?hG34Gd`wU{Q3T`eP7_M6r2pZC0w_(0!nx;|@HWmOTr7sX?t>SnYr>Fv-}nKz#& z(6TDtm#qAjpp4$|>u&JBqe5czAo_0P_X*0Kle`a%3RQUi)n^bbNVs3|CBqgaD5o~^ zJp&S`YOB+c`sEUopP~F!iDz68#w&g!f4x^NCR}DJ6#lgx}8ys3RU0s>c~H} zx+wb(@lm0r(GB{Zvtyl=er~_s-S)quLSpet9eEu`pK&kOox9^;RH&+_^CPY)af;^@ zo)4OfF4~z;`d)v@AN75($4F&n@9N*W*XvztH~OxuMvDexY66+R=gp`_1+Z)91bNgiY0qzDGE2YJG86D&G>(g2!doCZp5$ zK1iUd=bK+o511eE*C1MuV81hd-hd};DtwQdx~|ZI$7R25@5TBvVN=Nw`EYV z-?p`P%*I#yKnoJMs{Ut!-4od^2|E(|o$=EHHVYn?{btu-`aKpr7OL3)jL6uB&4L8` zZQK7$Uk)T}D&~Xz&e(^|g2!dQ=`&w;%7KJU#eA^e>3v`eXTRwgv}BKCt5lZ*Ej+>K z^w$Rx?6*yYPXnucpaluGT5pLk-Ba;Mpo;ybdwOEVdv`Vq68JQ*Ix0LCs;oPIBHJre z6PTaG#zD6IdRA}$J2wgm_S?31ul9k*LKXYp)}y8;Y!)QgZ(H`op9!0a`LOk<=?R+! zkIR0uGnjt7i^oD0``>cT(~YUof`t9Na3oO0{?GWi33jd7o{wTz5sQRfMeKj}JAGe* z79`kjRwL=JL7uRw*#GQz#y)HoJTCjq&TPg$kg%zk5B57_A2tgfm;GjKH)9`2*i_61 z`<<~5n+1={ezT`qGxmXmO~rh$-|2nK8SASgElRupm2W@qCB;HKwsLe_D1@ zYwsS}F|09n)hbWii8)_xc}K6NN=>>`{i5J(xftE49$nalMD~~=j}EHI5vz*&Gao`L zr(Q~s)}Q$hYFzHAtO)XFJ_O-8pV3%;fD>7IbAWt0L{gSVIgv&4ddpj~NXljU_JUKb za>!BXG6x2(@gRQl7Rt|pnk!|VxswMI7t7iEHC1-g=ediHDj-ME=egC_;5)ju@Nj9c z;B87!0-bdv=0Tuv*QcwJP}qk&nAuMMt^ohOr8WcHNX&m%^riPVP#z@ZB)Q{O35ls~ zEWdM9*sEv1)jr0{*~p2&?fP8W`byR&9>l3;Xw_P+n<-U3yO4q|PWm9{+8luvB=TN! zC%a$w+S9r|pC^L^s{R`0LgFvPS1ojxKObm8qG?rk(r3P#@xw)a{~QTaU9IFoPPk01 zqOZmKKnoIc1Ko*-5@dWnhxdU5s+x6lCdFPj8~s~X=jsYANF+SUPM!>iF$U$~eIS9V zarvCdfzS%Z;|Hp7KG1?h%fGV|Z{1Ae;C1};iJ{%ILIvegt7P#o-lm)yG>}8xH+)3%=obt&6O%&{v)Ymy$kT@{Uoz=Rm z-NxszAc3kg+nmV3$;t9iGv7+kf`nsuWUB`p`7^9O@Ycx}0YkH7c z&2(~ak$;YUH2u=ok^O%9?(|Dvcn7$8kFG!$sig0CjGv{V1&Oir3qHNO^wK|{%+HPg3f@=Lb%horLjLh2Q?teCi=OAt2NI~lJCWK4T97yw=t=6$ z4AkGQ$lp1UKo#Dv)IKV@2a&+flZDQWhAL6IAQBccSxAf@s%U_NT6!}xIhxxbB1s!fcFtXzu=ITJ-^^izu@rWoG-ah zA-_;)d4kfdnjh&DzC_6Rj9*(CMOS6%I7+xlS7q<^_9g#~FCfe&@yfpyeaYe-^MzOC z`PEvqAh9$X{jSWN0>Yt_e9iIY+XsNl|&GiT8mPB#f7{ld^|D80Wv^eIS9V zPbVBnw#sGY?^}2uIBUe&WbQ*Qr2not^1jKnxR!_`0QQ?+=Q2M=QC}Z8dO@O5NG@`- z=M;HQ8~*JuNT4d3-fL;^BTr6uuN_|9hy2qtn{jxjjtc3Xi~ZK`yV6eS)!v7!%I9cw zUB%BJ(Sn4jk{4Natdzdi#z?N@NT8~H8JYvTc469;aeRM;79{$0^dgaw74-K!+jBmU zKvmLS4LOvOH!aI$KBovRNOZpHMHV^M)IZ42KfR0us_OXDuS3Ur?QvVp_lamh;$9AK zlJ=v%zV}kz2NI}y+sK=g`W~j=TdD(Bay)~>26?k{VEi(zgX(Om+ZCQQBo0#_w04c{ z()mCFRVSL}Vy#49X+GZ)(SpSJ3zph7w)W#ojs&V&F7sk_Wjwu@Kj%22H*fMJ!w(dY z-zK%lku66t7xT-EK^u9=VcV{%;jOvP4T;`uxwgko@wyn&Fv@ z3W*zeJxP&#`Q@hq?*pSk70zVT=N#u5fq!|hl_EK!NM`3aNDQ0dL8_e&kdMCN=N}jq zs!ERWAkkg{a=QyWftI%eJjjhAdE^S)n`N@DkZ_ChAVqKb%LOL#J}@d&;haicS2)9( zTEc^jzpRntoHH905}SNINYzc=a`B7&iWf$Os=43XN%==P2lfwB?xQYOk{rTYI{xmCOzMH;YTn}Xx z%@CpMV)|w@L!?NPAhLLyvp)PWKO#d568{|XV=G?z;Jo}wDiWv~-93o3Oz_tiD8RxKFgt=ihTktNcemBvyr8~*M2@KBv93Fb}*Uv*8}~GD~a442WME% zU;2@VGfRXHDLoaOk*QlET99}-(VtuumkMnk_TqdXfvPg4b!61XV1e}IS0-?t@yu06 z%CBE2MCb0R;H*y_6+_=RQo^+5<&FasrTP37OK&2r`jh_ zg|)6Ga0T+Drz0s-sI`3hqk1(`P2j2{62(e7l1VG$<>#UNdLk02vOiZt3liTOIFhBY zL*=|F&NYZfPRZ2UAidkKCXg#@au7Ih-E z7tfW4jo}GgbxthgO4>YFFSqMfTeSkME(fknBjK<#8~Lzki+ufTJ+74?fht_TR{Ky{ z;JD)9Y-HoxE%LEa^*J9%pbGcf)IM;-l~eX?&W}sbf<%iDXA=2w zoILt9zaNDJs&IW@T@JJ$Q7XWh-0eA5?zx-yfds1T?;GGQEAGAu|9Y^sMcIE5-xAS+ z#HuasGln97XNlr4l>Ylw!GqWE5-hd9xX_?JLe!9 z?#z{MG~llfBv7?@4V@L;DIgE&$euU66Tc7AWEU-N-q13(KB_E!yXR$Z5_s?fCsV-j6e!CAOEDzqR`Kf4!;$~eDP zBv*1IQ1#?>E>>5@rXD@UA#*eL@>%+(LGcP1i z)o@KP`RC+U{lK66%nL0@9C=Rj!plC@Ck*F(Ac3m4H-gC=O@3kN=p?S>Xh9&GL^CF?ni2jOEA3$1`S|E@-1C{V@Ix;PHknrj! zf1RTR2~%VMDV{oCXxMci7Znny!WvPR94$zkq5EH@3(gnZcJMxsKo!=T+6T_C3t#jn z#B-^j%~1Dixwopw&o@~yDSkV zPvm_dfhw$Zb;;3!#OUF9$dN;fgh8?WxpE+ZDr`M!A2=VFnZ=9DPuwC8E*oiiPin?< z1DrJ=(WSgMIW~KP-0xKs7ZnnyvhH)r>GwJJF3HRCmW1U&Bb1%B3({FiEull}(aP*u zd5PvwIpLP~2+jvukkDQ(L}=cUaHTN+b}=MSmC!CPneU<#$ckjn2S(Lnd0sNEaBE?A zK6QlZ+Qmqa@EVzyOk5c+H2co`Kmt|vXI^MQqH0WDvLtS(;QKf40|`{&tWRAIoCAiv z3?>aiCJLQ4{AoUjK9Cr*DVP+UFij|ui|==lKvl;v!E7x<*uRUvsDtIL7=@<`}&%9v;mcCVFpCG)#vXhGsZ4G%Wh=ElBuWbtCSdm&ha5H{^UEfhw#K^%+D95{t{Z zkwJeik@pp9!1+J|Rd}A%K5&0fex8HnFjNhVZLQd!JEH}O>nzKE?ZT>^(`EJ}fhwH0 ztE0j^va!dtET2~B7@FA?79@sc@n!qSZ^Vw8rLBjqj4z5OY+v`V`-gXey`}9=ouS}o?i61-t$c~d)g*u;maOVRF zR8=@0Od{(v6t=bCN8xBe;`L%bvh0$JVBE+1Kmt{*_6F14_b}l}DDML;NNgYHN7@W_ z6V^}XeIS9Vq0?w~LU^>GJ;l!r(1JuK`m7~=!cDjp!uvo1Rda^~lddJ>g|Q2HA80`$ zB;1cZ(<1cM@jj41RY+JcIW)ev(6$oq11(74^G52niv+3?vIUc~-x7r)bB1%R1T9F| z&$`FG=3dpENW&7d8T$?8l3ycf%dhx2=P7!|5wN;;F%!?%-Vla6cGgnCb!kk=gjEf2hR0UmgB6B*OEgPg53?*lDJ;FE~z zGl&GLI{P~j-?(V`Oh?`aT9Cl!tJOYmE<2`tHZm%8k-Y9oUB&*q7A;8J>*q>(*IgiY z&0B{%gGivNE6p9HyBx9?%^g)og%%`M^>rn;sxOd71@bj^M;WHr6f^*zWyWQCirt#2cp1^ru zTl(%UnsqI7oEM+T9YrK=PoQrX3&}4u_{h&7amIqGh$+4-16ycL--o5HU9^NP@MX`B z3Qu#ZpSx5O=mUvryM5Ucr-Dy3KW;|?RrYto@eY|&awdVfmdf8oKmt{mS*NaDybIqy9z-4} z-PvqgE?ke#zd{04QUAEJ%mFztgeUN-J!W!ed-TSN*)tmz615Jyvpss_uspmEj0#nO zSv^=5yK&nZo=ENQ!JaubHrvuni9Y7Ro>(^i*C(@2C?N5-t0#L7+ITJtpHqZUp=zt_ z$+Csg`mf+Ko$jA3OxV+aTWgF{npO@XO==md*4i;t*%Vxay!A+1Rcqxqu4h0C5(^#% zkrP5QeaHIzI1vd{S$*r7Z*?m{m6#Gt)*e}>FS998u}`1{i4wDdN%Q#a`b8J{SrHPb z!hJk-RA@oMqjX;4SUamwSKxQakU*9F{Xx9eiua;VWanBcRIe~Blh-*CC0hlNMVFQe z6F&1#DByLDD*I2Fq6LXtZb7Vv6I#^geIS7<+;3CYE{~d9szsIkF#}%DK?glqE??U7 zotb?y42ie1bFgRos#KiU>JL$&3fJD%)f*dk*F2pS(u`RoL69 zec;UWojw<7F=(xDB(9w;13QCRD$ZY#z;_m@eIS7YMD!d1)%Ykhd+t}fO zG*4#fEMrJ(ehnEdNLaHkWR`29_JIVdlHTSfrHgJix)kMi_0fU^t`4hxpaltQW`vwR z>mCVIS?>~Z`kV>Ozp2yDhqZQj;6?h?h+pp<$RHO7El6OlqPiSNpvs!(Ag6yH8CsCQ z@~M3wfhudhhRoi)peE3Qgu1Rq$Hkkwe@rtqQ(BpPN4X01TW*reW!oh7z3VJg9&$%s zyXc@;Fv?L#{B+au+rhzoM!fl9c$z8YXG;}tC_@sA_6&-a7j~lk4?l6@jYAu#fs2W0qNclyh%s4*d7M>FMh!CbS^Y z?8-}h{Y4k7KJMITZoZoE)zqTM3>AT@!^>Xj*A-uE_0e2vU~cr()m-S!ViQ`B=sDqv ze)NfxRv)E|HO)mH9khJxmP1xzNiATec9s{Y>l{Z=0# zg$tTzzw49-6uWaaJEQhh;P8pCOnN=3FtM1&Lh^C+J^!%T^z^LmkY{w5ieV`aZwK>t_BAdBkz#(etl z+B>a2a($m^+8ouwY^eI)gcc-*xK+}ZEIY*NV_5t7reW*D%~w0WQxT|on5B~5vHdQq zj}x7Dn6jK{Vt)GWr3o!aY~46iUq5_=)koy?L#BxFjm%?9K2s5>`Z#s4zQwCORv#V8 z-7+OLt7|S+tkx9S$#B3d1MM7Tig6zbI*hp zB=FogIP}`n)jaaYHj{UBBNO&f*mqqUsvL2zg`mv8TWgbMfa5O)ZB!C1^oHUXoL&k=JPT zF|@)E^8)9Frq?~5s0dVz9i3B<@7jD!nK9Hnc4vrb{n>vAT96ny%1cW61tw z^QDdc#Mo!Mia^zd#ykmK^De;5(>GueFqX+Js31rHf5PHsNJ(dcvX{rHU{`gU-5 zvyYaeMefkQD(+BOkSN{ETiEvYf;_V#^YQnOWOLAu?Lw7tjRiawsyama2p=bAv6j5% z@MLrMQ_-QNk7o%*3leQ>dJ8oQU6faqWj;y`PBy32hz)Ig%uz+4s_F|bVb4=ntB=Kf z6U|M|e-2$DP7g&35|#hTB~-tAO@1VApg!8V4L85;lgHqjlp2bbq?b8`hoi5{t7mNx z@kkC118)yCe;ZKN&};t*l@BD^zwi`>ue~YvsKR^%?;B=Lx|G*YX-}GpK-Gr6UcyfA z?ACI;-9FfSwq(9W`kOZw9%~r+Ft-6MNSsd0E_k}!m+vq7iL@xExY6GI5NGKvmKHuk_*l@>qQo zAJWdeH0Yt>dap4Cv>*|q|Du;;UdjL7SVw&n*%xl!SMsx=-}Pw*v=~ag)aTc{lbZ?a zL_Cs%L*@KU&4Jo1QYFthDj!H>HNDW+s`^g8Q<3@D{ica|SXdURe-kxqCCn z%HdR~iMed;tWxvta}8)g;?R^A`c1Xo$y3WSAFT%0H;YHJNwr=tQ4y%BUh$f~*sfq} zU6~VWm=6@qCA}N4)_@iy=7e3+w{`d;k8)W{eMnoXnBR}{mm1aEt|CyC{Le{!wxoPk zAGN<%H0w?TNGm*c8PI~n6z5a=snfp7>(;HIK9+y<_i1VA@|R;O0#&nLuF<#fFKqQO z?nQvPRIxHrz8c33sH!HV>QnFjlv^)fEvkvK290@{xuSGq*I5Hvkm&BRR-bE^gVHKw zHI1s@wQS}Z?FA{N?G+V)s>yvO=?Bd&YK6;tKS?US{<;AzNc1c;Rlii5Rq^Y; ziu!Q;`q;Fhd~K=O&bulCRgG)+*U#Tn%<5z3+B>G}C+bMoC*L=qN`Gg#zQNY4N^R{b zQB52yaoIGpWPOP=d}Kfi5;tn~*Z01fRjK)PC5>w9sY50)v5~YR_?e18)rp7I^tBq5 zutt?uJk3;cN0{Wa>4gC;NHiW=Uw>+YqvA7^`B=YfiK)fQ=2DIsZ&d`UG{dy|DnTW! zK4#unV5-_bTpCgQodH$Ri!10?JaJSWg{>6TM9l4prXMjarB9td7|?=5rIA{FVhtx{ zm=BApe7mluk^i)oR#p70B2dNV44>ZHqT15BwdpTY8)-#2bv;1Bc!RXzNrXQ-3+N;^+)?s){;-WpfioA79lMv@!f!`)VE4ihZ9c9^<67O zHPNEZ9TL?hQaaf4hXE}}lx|hO>bo~iO3no=s*2(`@~Lur>3#2?DgsqMTP9VRzswd@ za!PsfG_k#;?E7gz3lcGtOH?`S>#S5xWoGPTZl(5! z$!pq6yYSC7BkhbefsgqKT~>P6sL& z2GwXM)p7Y|KnoISYqiELwVjmDUaTdqXxGLtb4MF#OqDMx0#$z>&>FLqv9-jZ)5aUl zZfq$%O8a0y3ljgnEMe4mJ1J=)%twtfGYlaMTS%W1-y6`9cXtJ2!%vRNt2!%1JQ7{^ z$vMZ+!M}x6@$oyA4*2A$Ac9c z4R3EYm2_oa8_>O`wX-^o^;%?;nO19}Sa(YDnRQZyC^ngt{El-+D_MCxl2P zm;Ixvs|9zr7zc+sD1k%N^+wk$x95?{eJ>-usdU1C^@Bv;*aOC?6~4>sEF*wITMA0g zNinIm!$B2+D!P_s9KXsolIgUdj8rT z<25>NpH0W@SPKpgFaB#PJuB-V?Qx!MKnoHWp@T!S?9C+o`=5raM`o!ARMC}NW7W&H zaeMgFW>U}N-woTx&NQF}39JzZhcyp6N+%YaHE3`4HehM@RdSL)B|Me0|Gi#Rm)!VQ zoJ8&(Ff1+C$$%Cl%#EGoZOxv_F==cbb#hH-NsQTR=vg>QMWBkVgvr$(X{;lFWu3Z6 z(%-}|IA??bEl7Cxb(UQNpU7|TG9O=R^pG6JtThPwI#EL2cRdfYOez3sFTJjPu$x_ih z3qz-@E6-Mnep`?@8R;z#cz;3e8p3>d-bt2*^}8evTs}xd0#y-1y=Auzww1dZPm(3i z!aK$BPEAF$AmP#7M|KN8Est8me7t^}ES1%bS1uF`RFFW`h;BY|?@!0&Hzyg9!tw9S2 zT9BYCNOE|=Pu5k=l=I2b;_X?H+KB>vlkb@Yt1qnPi4i36mLnZG; zA*PzC{}3clMOUEZ|6kcI=09BeA?7x<@!vtvf&{i62ZuZ*_ZnI!H8#(x_uTYm#RTK< zqQ7={-ul%r{`~%HCx*^Njpeu7_E=_}SZ!GFu$g&m^cxdekjP!9k}?q7*DJ$nrKWk9 z(;XFos{GEAjrxJM9jx^|UK_5Y)HKiCd)tH-BEV`2=7X=#nb3knK*62HvU_biij!9dNN3xXG4~mETt%R2mg_EK zbZMK9{z`y!yg?cB>-gg)v>-uOkc=13+I$RfDJtEqS;SnZ;64?Bs_@EJjh$}IvR)tE zW|o&u{2OG>+iSN8El8}Ze$}{pscnaMt7oXxXSmipZ}BD-fvV!$t{L0bw(an)XdEh~ zN?LQjR+~&{L4vO68RKu-eC#-1N6Nj<-F&wC3KfB>%ZEN1lLy##!=q!GNZY<-F^Boi zHK7HGN&kE_&ZubHardd+M(R-gxruxkuOd)YPWRPVMOkjGtMd+RrT@gIbQyV^2`xy_ zm11L=u&dU#8`wEo+8uw<)V=#a6@e=3#~d6UpNx@wn;bWlTa=*c;gHDT=_vnycEXei z3DWE3yG$O&W-0BR{GLRMGXIG~4d7gF|$=TL!xODzV*Hx*KYw zJJJHn%V4uGx<@Opy)?QLYot58mj4|b=nk);-S|cl+u=nE5_GTFNOzGfw1WfPMK;h~ zWQpw}BY`Tqqim!*)m9(F+s`-9oob2gRHFq6HVdb_;Z`4XH{3vX!=+HV8;%63thHeE zL3i8@bjMv9LwDTKf`qlMtUhQ4ghVqSBx?qQk!Dj^j>TqrG*7~!qInKRngL<;K{FsE zngJnMGa!Cjkf50gMw$U(^+7WrB$@#sSu-Gh6R4tj4n~>*Vf8^XAS9XrAz3pZep`@W zb7z_XVf8^XAS9XrAz3pZeiNvoc@9RJ0b%t)Gaw|I0U=p4Abwkrp!?@WngL<;K{FsE zngJnMGa!BwsKWN<;Ls%Hk%8{fOCRVSJz9{Ud-v=PXZ1nz01Pw_K&ndf0FXcxwn|G* zkwkNf4Az_?nPwqbN=P$=*tKmrF3lX0X-<)~)%poJqDYE*YIYko9DKc1dihf&=VDm(pQ)Kl)bBZLIQ)IB_6#XVp zMKgztG^fbwgXR=TG^a?i<`n(5AVG6~j5Mdn>VxJKNi?TOvgQ>1CQwB)hkjoL4h|EV zR+U`d`$;R8T5^hhTad^%!X<*Rv$EzL!y}+ zhE_C_0|`{otPYuGi&%ZoY!QiOix^n82wIS!c_%W>NU{2$87UIYNHMUC6eLhZvr~Rw z1(vKAiDtbRSk?<#kYF=?nz3i~LG$_~n%8Hr=JowP7OL=CvE*e)G%q8RUnWb_?k`p(@YMl51Pp#(M%3v&E)uPL4xLM$TX8f_?^ii(M%4LHIw7Fh2~|*G?PQH zW^(*Kk|mQvqL~~fYbM8U3lcQrLZ+DK(CpdqslE5vWG{M=0wR)>6>h1la1x}MFiA5Zv}PjkTS$<$A(Au` z?to^(B+Z1-nu!2`UUI!dnh6~%(oC47nGjkt5wIXZ+J;EdOt=G@36nGvLTe@h1bUG& zB9b%{ItPs3zJk9LaQtS79>a+5lJcwBcQVIlFCA8l|_I+FH%NC zlFCAdK`IL`sVsz6SpeBh7>kW5R`WUeZj6MWmTP3lgM;*hl&aL+U4JpSsdb z4{0WZ)J&j-^bGq*Ct*mP1pX3Zv&xP1Y$?}5G#IWl6M@i?2$_<9FDW1lzXD=pzoMRJ z!&``hq?y3qLNC%%>?M_jPRB2U2N+#9wGi`OfAXT&xzm*k98DL;kg5kKk#~1WW9GIN zqSXhbvIzVZ5?UFdXgWpS@jZXIu7zm(%t@dZX(mdOEk||RIglc@@r0BWPGZveS$6Vv^+g|3DIfyBg#>9E zLP#@V1T+&iX(oi$Oaut@qP>$4(oE=Bk!Hds&4kdJiGT$O(jbJ8X2J+)ChWKgY6`8H z2oUH+8iWwiOz1F30U<~MA*2F=PW3}bC!s8~GZ8|n2lY%Uf)LV77=FzJDIjc8KnSgX z2!u|0h7eLf7+L`VVUPmCCIy7h3W$IO31=9jfUrpcA+!P_K%f`xOoWgELZ^ci5H=|w zgjPTVEJ$FQ7$dcaAhn2)Y7z7zKOtSB+{JR5^^#hGxCp; zVRTKNPjuQHEDALd4g$SMMG!&?2pvX_nz@DdRBmza;E!IkAVG?Y5K?lu{Ys9>o4yg- z%Vih2ibpyK^dfaa2$@BA0h#1KhTSGAR(j!acdn25a%}5 z7Qb|3;!#zlX9!r3Al*R-DK6YnaiR1Kg7gfw)-wbM^rBs(5YjW~SmjLGM8pnyXqWYk zmwJYP1qsp}xJjwtmP!T2I^=34n%B5$mw7nEL7*3@7Tl!d&|#3CL6Dxo)_R731qsp} zxJl384(J&K=^1RTX9y7JMY|Mk(lh8VNY5Zh&tPjkL%@OrX%O6`XK)Af41)9ww$?KQ z2=pQif}8XVItAhQ?-qXpro6hCk@?4%yu-&8s&;%(U1SueFt$+xGPI?A6 zDInZh0Rdr<0z!}i!qN(efCULsD!54j;SMMu1Sudat$+v+=tX-nZc;$#SdjukkOIQe z3W$IO2~sM!Nde&wC?EtWAh=dQ1PJtUru_G-;bQBHe|VzplO1`2#Nf=S-0{pa?u29I z{?$Nw6Y2K4_P#U=V!QFT&n}? zULWZh1nC((TF($DHBu+INzdTcdIl&#(lZFsGkCO~Az(oQ!)EN>?JzNBQ-r5xZm-lc z1PJt!@9B`rLdS}98G>{fUa8AK3lel*59uI1gCISFSL+$vq-RijtaM)ICOw1tT~aN$ zNzb77UP;d&NYCKadWL`n3EIVRlb%7xiu4SE^bB6DX9y7JMH&P*=^1nwq-PMMXYgu0 zL%@QBGaaO75Ts}DYCS`MKrhAw`NxA)P^okRnAr%eNy)k)p#OMT$*|6jLiw z0v06bJUWCFDViWficN|XQ!7#e1nEoUTe!-L6e)qQl_JF^MT)5vDFF)-q#Ow$MT!oC z6e%_-QcSH#2@vQ-x|0x6r05bPMT$*|6jLiw0v04_7bk=iDLM>NqzF=^m|Bq%Akd3+ zCn2Or(P5AxMUW!J)QXgV1qo7)gpeXdhe3)IL5dVpD^dakdXerVgcK<{3{s>BQlyw# zkrJ>VK|6OLq)5?WkRnBpBE{5-lmLNVq&o?;W_qLQY#}lAMRs#zET7bu1T09r&H8i5 zzh`$(vz8WFv!^$wo!#mn&{ddW9pNCBbqN`1|OjWC;~as@B`?!E8U>cvKjwKLu8 zZ^Y;FIZK7_+?l$5tDgVax|zmWBwDOZVMwp1Z`!Xc81s!=KHIhJg3?vF;G z7t+_`JXds=^gl);(1OIxUddD#$r>FGamES>^rAE=LZ-<{poMZl#YE-;{*seG3lh_E z|EB2OrY~9;NT8SWl=&wA<_x3!%i79Ptl1%>;FT`w`9+CChD@;}WZIlW#jEixX=ylo zGmm<G`u)iKFB;t5aDSGPVb-u3?==Js5jur>;_$L)cP{;Ps z!pH=cv)c|UuU;STMdB|xV}%wZ=wx5f@f*Ha@pS^dMve(p#FS2QC)NMY-_Fs3#P1Ep zDq{Mu8PN!g74{7OtvryRI;+C?yw&1wp%=AzMFiJ9xYC&p=&yX#dVI2mQ)~JkwFLX6 zl)GaYl6d(+P>=U-KjsVrElBkJkXX?ZhT75c3JLT|y2Kwwu+NG{><-$gQn<&L+4yJn zTJ?N6qK47p_I&mHX2alU1ocfSwX)}tDVFJw{RftlGaYC_0`e_d?}G$-L9Rz5u#YM> zuaD}lG8gz?{T23PNG#5@M$rp5AB>iAB+yIt=`t5&Pwq@PT97D`d7mOei$xCu3G`Yp z{zpZedVe5V7!<2W8M^F|#gX1V`FxmC-s^rB_1yB?L;r&)c`v4-f1Kg>lC-Qv&UDEC zMOl!bXEho`(bCV~&Z7|lFU&*fBmemcwBYY%?0;6#zYY09I+R7G9KCSt@`n%=28?&I zrFvwVQUuNkABGp#S4|js%1etvql%N3S=jE~s>j9}~TnpaqGq z*DLH9us6t1!cslM#myI^wLz?Lp-n?n?aRF zTj+(g(isNTW))xAheO{UiG9A4KnoHumPD&1NT3(=SJ4RUk<%y0WXSxfQ{DF;M*}1l zjLfX)0na0&r%Dy^LCB|dQn?Zge+BO%4w#ja#79=WzR25Pq83? zvRz18wgzVyNT3(Z?G*9FSzo|{1kLBv-{lO@8Ah8b{?%58hQjC^#<+}0(FXffTI92g zsgr;_aS$U4y-;~oEN%346k2L`f3CdtXZi6zhJnPf+m{s`t4;JC4r7I0MSC1j#K&0C z$6B;>__$Yjm8f>`KgJ4)qCffR)77Jgfw4j_?D?FzixwpK&G{;ZdGALL0}1rP*?=<) zsNs%z8^+d2pao}V1Je7~=P@&H`5(0ey_VH1rs~*`yj!CYQy&#nmWDlc8jtJeQO_HV zJ^!&hkhr=mx1vKQ?1>fzrUSiB_Vp8$7DXp&z0atA%dYA(_W9DN=e@u4{}?MIQoc#7 z=x0Ns&)YFp=!I?btL4F={Qu+H843BjvYpFu(isN!iReXt56qlCBOI2f-=*-PW@?{@ z5g^cua>T8BpJ)WupEB+uDn|>rw*SZSK%#8bZxrnvw&Q=)67<3v>P$J-5-iPYpR%Yh z5|58Q)}jT8uh&E*(5pgDf89Oci(YqejG}!FL*}U5@xal?nGS~q2--VQ^yfP)NT3(( z&nQCf=s3f``Nz`wxs}(-d3*lj+y{wS-}~uTL!ze~=RW8~C8)xaeT*|!XhCA;gglBE zoGW@5Fw>WN0II&q*~WisA4t%AMA5QecE$>S3%#QLE_c|zOh^k7SWaIj(2MrxRLZ}& za~H56@%1vN*_|Tfs)1&G>RHYWagO4Q6S*D_UN36^7bppMg|MR?v}RDm7j~n-Li<lSuCsh%;rE=K==$?T?U&0-G z;fkQ&<F^DSy7`~RdI3B9tEIUOzKm{;f}%S47J%gC8mdJLCi zt13n5CBveg+LF(ommpg7j9d{A#=oP1N;#E>Dyd%7_fby!pJ_!0r5P=EAy#UADPtmY zS-0jd=anJ7Wc{J~BzIdB!B|kRe3qr^Ou6&7{`J!HIZgYS5h@*Mk+n|#t{g|4zk~!@ zkdWmrY1w|h9xL?HJrQ@DO{iF*1qoR@WEh{9Ijw6{Udh!D%}dp@T-VSnQ$5RhsWVnI zZ&Mbz&Y*dldY1Dxn%k*o$2?KRN}oq@Id9V^SX|D+pcO=`C1^oHpO|sSj4Y~N`9r6E zNsqN0MrYNJInx0xH3SLWCvwN`pb7&C^pfQ+b61wCGYqsKq5EL&=&4m0NT8Rj9Wo4A zs?IRbf`lF!xExEqPN0{p9Wsp1`x3Mup+`0D7}ZodkU+1m*F>}+p+`~f7;9A+NT3(C z0%ywg>`v7mJ=2e>iBTmOttMh0rOzW(fByCU3N1+JGf(c=Rg0=uT;{v%tI!KufioRw zK|-J1a=D}Tb;9B0KPy&k(@9Y7`edxAB%{s;qsH_9Fd9fo*Cn4EL*z5n-Dt7G@dLf0 z{_a>CsJuc85||^-bRdCV`s|)N)&?pJv>@^I-UoY8$TvBjt9tdtnM}Zfgv=wESF%+* z(}BN*UN}BF39RjujzA69tD-NY9NUCmZL6Arv@;Bc#lPBCgkHCQxh4i;f?m+OMwk{N)yBJ6xFVB4f79?a3txNFp+8!X#3uXh{ znY&o8a74x$<0R061nmK-TyX3ZMfIYp#>pH&FTJwlj(rA2(B1-iKg*)@Dh_dW$*gs69F%{`nPJkcfKzyl40lA-%p{+j0FttxLsSwp8rFowM>l41?DFD!y`e zfL8bFS+4srY$t&hBxrT7Xt^KobppLGr=0}09GH>IJ>)=3a}sDl0@eo6+8`3>MSr(s z+5GQS5fZXDl7y@ipT#QhTj&LSdo%*;56zZTj>=gW);DJuXhDMJbNjZkyIfWwR$%d1llVcTMdA>|Lx9VA*9Anr{ z0xd|;&aI;5Uhmfl^uoTgpaluq#Z$48`+i?1&!yw(O8l$v2R{ichQpaMBI0>|nZY@BN3Qavr-P+d) z^dc3SA{<&Zl@7F!8bWzVeHw=S^)QeiHH4z2e&Xu{dSRV*64(ytB+ihnNS@dIw^$)T zXLpL0=jzTd@VC&5PTv(FPv4ycTIeiY%?9KtJN}ZBKnoIdmab@d`u=qSz341m5snjg zRf41)QuRt|(nw#Vo~7~#!~S|0NRXaM(GCUnXJajTVV!n{f$^mieie6l_W$2vg#?}O zD_Uv-oMGT^p%rlK8M&d=&DdSSb9hJm?=H3P$T z5@+W$C9M2nU?ykIc z4jaj*?i!+=<9$1lU(7Q^6N4u;7ngFxP+^R0xq`nRnN4}6skwk}*jYwBFMK_pkEmQm z6Bnxv7VEROwq>k_1#Rb^znc4GtXvH?^Sx(wtLJLZHt|edcKiIXs?;@Hh|YP7=}9qSLWZv7+!Z?{p$`Y7P0jIv3RQ<5(;B zo!r?BKVd(vDE9x5-5mWokh{w3;i{?p&)-|B=dSgq@-uB)YGUh&B4XCul4i1;Jv{Z7 zcIGDwOjKUFJk+x;4^8BX$SiK>u42k`=yFzGy8P91nqD1w_caqWv4g#}FAb?Bl5AP+ z#km^J;ok45%om-U&BuhvS>No@=k31|RuBgpzW3sq9A}xcr{(64=Pc&k)$H{`?Q`~w z4&}w7+Mm2=K>}y8bPHdFS@!Z3X~p`8vL?=6a31s_RSw>7#614%Sg8=IUh%m#e(Oei zVbY!^j+WSeRJ-}w=Q}cw2PKqaRGS^utr=4)+x7PhF|m)r-fr&YoxTsb7wA@7=*-<+ zdk)WxeEBKd^wfF2CuxmEd>SIJCF}n#S?$UXk<<<_m2k&^upNEZ8u3@+F6^`F!Oic<<)BrL+$Jv;79>!^L^ols{%99}SI0cOafX9HFU%3TOK9~y`&6k4X3=(k zdQmlpF}yRQ692j6ETgN^!#!*DyZs`ljJdSM2M2*(sHS7AbX-7GsDVSB zRDmqPJZZg!M!q_7-ahl6U3R^o!e*s7IZU)5feI+b4ov#dzQ;67FUuT9821EZqiGrHTEh z{uA$tu1*5I!lz~7P296}7&Ehvv3|_o&3kdmAQSbQsQ%QgR*!=Z{#k70t1#NTapM3J zEl8j~m9Y%dBdk43$9wyI>hB=X3-z#!^~<@Q-?)0+bF^=m8E0@iUyLd9)rgELf2YFK z_^GsYub0Q0vG!0$IxvP#V$W|k_|GG5dZsi8Gtq)Xwe4GcYtPSCVKcUBZz2BEi%?I~ zh2ahYy)d?PdxXD-3z0qCkZJQ*Q?I6eOZRrF@6tV-4&%F9iF`d@TrqyVA8w)r31<%% zdNh$Q`PI|Lk92K5xK(qU$LF_m@3ve;?A>F%II`higN|o?NbHzv=kV z9`Iu$6L%wUFGIIx?r-NeCseVQZhvVnn%^|4ohu6x&Nb)7ZDs5eZ~nG_e%jnYpqDdN z*V+}Z+x&LHj&rh|i55(UGgd9UroAchjJ@$}J4YBu=)Od!?9C;d=|C^c z5xNa($WHrZ(QicM_Bl=5Bhh^@m%X!dzhwJ`z4oeOMMSX%SxvMcf%|@pd4IWQ_iIo= zbUb}OY8+H2BRJR6V+r?3|DG|IWwSzz}XUZSV_+-x-Raf-9JJ~T8 z#rY@h?=zOV$45Kvq^2V2nyg;jyT?8KSi?*32RRn=Y`NuI@d-S!Mc#^y#Odn6UbGVgLe^wM)JE>{3Flew2fB%E4bq`BYSgBB!k6~8gm*O}crJKrbwRx?k-^TyeBp9TB@^x2QRsTA3h$ zrODW@qhg5l?dyv>KlFAG=;f?edgUeL$_rP&dKIQ}0rQQqij(q*%kvD;KG$OpT9Cl> zF;?VMF7fewDG@>`M*_VD|J9xk-#R#D3H6#f`oJJyso-el-ZljEcI{hDgwP4 zbeh8JJZY|16C-z36k*9ynE5Gp(SihjJC9e7XKJEu+H&I7q}Zm+T_n(}MDw})>{~;x z4O~V=QGC`t?~S;3y=Xz=khzSH?wDB2D;Un zven|cA9oORjnTO)>+Yp_hS`qlE?SUqmPe;61;pHD#Y||m>bKCVX!8;L*|cf&nX>Mp1qsYU#s-BK6Ych-Q@M)-dR@9ZiSL=&ROgkaaVZheGM@Px6pS|VcmaJ?jnI+%k$3WAB%?Q+|Bm9u*m=6v^U~Ykck!~oaJ$BQcf{@(>Cw3Bi}d( z^tzUKA>Zi^(kuFAEpzRGxYFmd^L}E9bQ58IM_SuTFL!=d;gZ@M4U%CRlkcC zBy>(|BIk`#qTQ2Rs^3Kdy>zbY-X}|wd}46h!m9T{3li8XF?O?GX7O=oA#sP=2NLL2 zWI$WGC3d{(F=$;|DT(;`S}`Hp2U?K8K8CTO5%2BVqYDVxK9E4KR}tlTq7*aKe1)-t zO|RJ*hZhvG1kr+obMCXaFt=OG&L(6DB7t7c-KaTvHrbJvU1HJJZ%nixf%8Yk%EtNL zE;=!*C_BESgFr9b31h5kta)~VwCT;m@4P1N4&e@hbEl|M^0juH_u0&}8^4VTL)ADW zbPRQE-&S+0efC^Bb99{$2Z3IHCM?5KcA2W{ZihBWMB;<>%@1?OdT@USccAo0t$QEu z-85oZXbn@&8PI|R_DYQ9nVnv=%Tz)2K1iUKt}(jz5wTq&cGVK9_dyF1*vBxoH%?B$ ztK~Ii-9-YuroI}^7hUhKd!Ke=@`@M}(wnmGq6G=;V;DPb

$%Cp2ZR=JMB%QtMru)NLDyN7ECC5qG*r?VhV14tqQ2 zxk2_(b;Pq2$pz2x*n<`%upeWLzppGd=18S_I3&K<MjomyItLcdcQf1qnP6V65o6fp+_eu|xg^rI&58cQ|2FMr|uEQ?D(iwR2a&FgtOm$^Jt1ap!73u zjaLmE1bXei;pU?oP10e67G7zW8yLfsd4(1voc(Uxw5#otV{Un?Qy55~*SzA5_@|HI zI*cnd$n@ zpqH+dx)&XBKSM9ev>@SZQRSvr zwZG}TMTLO`dOa;ul2`a=oDQR$+1KtDc|e7M79_A0(4Bf+yW2-{MW`^4K(CVz>+n@O z2kS6aJe*?RFSAR9ffgj3Eh_2lakiCXzBd!)6%y$6XX`Hf_1!i)jQz>p*?V$SG-o|O z6Sdc;&b+X#=y|DbAD(S-McT`yRQo^+64(kDi@7zHINCRlY9C0Tm+td*`{zyt4uaH15y|1C?SDu|!#oUhxgxq043lcbsV(iW~j~M-9 zLbZQ|1bXSYuby8;JS`*&)=s77S7<>3XHkqzKAlDUmM@u_Um<~Bx>oA>)y>^WMdi_{ z)cgu9NZ>4r_IKC4u^T2zs8*0jpw~AansM{;C_TR#TJ);@>PZ42#}Bk1fwL&a{nqwVALtHBG3zUC$z2&7FO()jlAbF2V!MNEf*v*BPzDsC6)dy`|D%6$V<6z!8$g6$V<6z!8-(SKCZ>xfz937)YR(*4*hZ=2oq0R~=tp zg@G0%oTGD%h=O+f@3X2fkU+2M;e&ba>J@Yt?;dxyQ{H`I$PzTJE#b}Qlyl1x#GYE~ z`a=9Fy^u7s?2ZYp7_zpb1qtl)85?`7tKHeP-z~#H0==BtK|LCHphw8+I14W8lCbM&lDI9lm&@&E!Xj1w!YWrQ3Voo5be?kuiO#F-$JiT71nY);XAiq zz4KSoPGXQ);*~qXXhCAnnT@<%>0O#Qo~gAsoqD`i?#Up5UY?g5_=WFwxcw)is}r;m zSq4>A`|W5!;`y4*eAn8>nwa^qj`)#fS3AN;pjY}d8~Lh%4cvY$PCijhWNduIBUck> zLE`28P5k`nX(4{1NypNn>9dg@Ia@*ky&CP>zz-Fg65?NN7a#wPSo>WgLyiV$`2rE? zC#vob5--9NbGe#8LO(07E1%ZzWH~2B`bUFZDHDt16-rxjG(ZaydY0ky6J3+uwg)_{ zXUWk33G~wS*ykS&mK8i|?>{r!lA{4ykO(=tlrQMFS`&ZNnr@GHGsKeZ0}1pxI%y$q z9czWp-=e}Nw6Qa_9Bs+=ffgjnE}g?WCHhShb2knXIXa~G#-!aSRD7a#)T#b#J#m=0 zzV4AH%=OrV79_MLRVz&IaQZd_TM|m+iwr_$S-GmG&&rqG?6wdhGKP zYwFe)t$sgd$vsOX&`Z~8pTD+0-%>?nsUBoQ`%o4nD)(8(Cq-=4#MPz6MZ6z!*w8+d z1-&{qUd=av$ zA80{Bj}n^r<5WwrXYO2EwhtuGYyRNXJgmuUUEAw7t|uOy-)zhFffgk6NvvLfoZD4S zWZSXTmhA%x^wKAPdNnb5%eSJs?|^C_XhA~ny=!96;cTMu7@uk%NT8SA1JbLBR~1u; z<+%>qu&1vqNa$6uCQ3f0mBimW)M^5M3%&FTS=aVz?JnD0m+w^V11(7OtTCeB@`Xs_SWShWu%&`ZxBb!|VA zJeA$0Ln+lh(1L`X)oSAWhykMPqj7eFhotO>_ZYN#N3|8Km5en$+ehTNKF_Y6@v#Rj zNa%TxZc$4zb`z`iEK}_R3G~8R$=H$UZG^GHr`iWvka+oWId7gRt6rZ!d)q+F?0P`8 z4FSG5nc zAfb0vb^FL$KdtE0_nK-SNT3(iO2%S!jVo$g|3kG8v>>7PoOJsrQR0?;qQcLreIS8e zSSw{Z=w85m$5i`33le&#P`8iAjTYHKuh*;gfdqPCtz@i0*P-^>UzVx%ffgk6no75i z?-v)cGoS3L+6NNo<*e=LE_}3(4XdQu2U?KOD@)xzQZ(o-5*A-)$B5g*gEd?$-BkO) zTFF?gn_a}Cy$9^Uv>SyMByi7(vCMWG(In)QY9C0T7uHJBSsrR6HpKtamZuqLK?3)j z7;AQ~s%TT<_dPK*_-nNXxo{YJG9B+v_MC1W?LKew9|eXr(MXh8z^oJdui;iUbh z-%Zs%kU%f2m5en_yV=gX>$)vZu+V}8?m5xB8QCY;%YWai+6NNog|(8gcC(t;Kit}2 z%birTAc1>Mv?Dwvja|6cFx5VgKrd%)PkZ%(m2Y@m)jrUI1nyFic5wYpKI~>wPy1Qn zQM*xwoU3)L_0YF?>NKUa-?r~hU-&lvGpW^|7O?YN{mmQ8)yDB|2A;9tcfA=)TQj4* zb=eVbH{Qua3lg|%#8`}^Z>$MtHhXW+@8KZO%lQ_>^jbe#GwMwAPOR47L<fNN3cb;pogFr8Qzk#vhL0PORgMRZ&`z|bMS55sE63)DGZ63!n#A)kkN4bl? zghd3^%b1FbrSmlsxHA<5k&^4q#$6EAN&|o^ch!Otc_@yKS_K zGxHCgu74dB1`_BMTCO1Po-bU7F{9f6D}T-tDh#wBfxB&_lwBFe>Ug?>3IhrBx<9BA zuavf%4r6@t>DK0cmI?zcNZ@W8V|kyYu||F<>gi7Jz9NBM`kh!EM*4o=Tc)|uv#Lf| z)Z4Pkf&}ii1>Udq!27j|Krj8Stq$W{WI5}!cxBw0A8z*OF@YZ`=D*oCW4%#4`5l+? z(rX`G6LZBlV6AseR4GRb63)H8nkhYYXv`#DSVyVfLN8u;1pj?^6~n*#G4Fj#d*KeR zSFY92f&}g@Qtz{NuAOj0N3G~u^u;E{AkGSHq`@DMMg_8zlK>~FLjQu$9lwE`+HRbvPe+#{|a>VfO8l<{% z*uJznvpP{k3lgY8qq_kcpRyD6ETT>=kwC9bb93`=moC<4shK+*x2t70%*!d0m}o)5 z`A*!U`fjhT?dSj5Zk?{YMAcm+&W7`|{wtu~mOSM6?Ab~B7u{~E-+AZGqQf&|k^un`Z#v0w+Y&Y0HN3}t;Ab~B7 z-dB5d+P;(3Qf&|k^wP5^-3H5#KX0cWbX~PUv><^kjjFn}GkQ7SuiaVYoL#Fyd9%#qPhPYj;cT@({174@tl!|3dzN~Ys=}y|a1~Fu z{kdEAQK;Xhaqwt!Ruv66l56AL<$Qp0~#@E~4r#T9CNAdjS_k?_P)Od)lL_o#Stz7q)-W z4(_>ZZNA|4WUT4zOOU9#U^@Tz&f>`V)vTuxCyYJRC*p6R7k+tzv5QL@S{uf-H2zv1 zPP5lJJo`_p)orb5ZqDLS_X+D02%U}@x2jt^8!tBUtPD5n?VQD1j`H8>J8k()9(89e z#*p6Bi`~ddes+a%iM|wq79{qxnZb8%zoKu7z1q5|wN|V$Hqnd>3G~7=F;=5OE^)qZ zYo*1(`l|QERei-eMk`2fN>ToY!b+=#79{NbEBNx|>vc`snj(%E_U>DyPecN}u#PeI z_x5Y{k-BkIO+*V4`b&cn^?)> zv^T<*(tEyU8t6z1&PK5=JIhpmgsub z)eg0e*6M1Eq%Y7QfnL}O7#qhDi0-N0dE|;7YX)kSurwJP-|`Q8d!;QNIeSG55_mFB z@AkDlY(FWo+ar4)B+v^>lk_Ezr`sEX+Nv@~3leyCPu~Mr-rgRzw2>-vB+v_Ugt0!0 z?pq^g{AkGaAX<=E-);eCi99-Yv({^2H7?)TSWNHgBY|F6vW)#!s7|Zghy;c8NX?H{FOVFafI;4m}D;M$|Y4@pT#@^4lZ*^=~#u!{L z%t4?Rrim24!<$)`x+XFPP@jkvB=i@Lbjq8jYHRJ>p2Rpnu|fj9Fc)aA?^Sy%=!ofS zLIi#>Nj{f69XImxuP05)*}|H6!te!uA4s|St`ZXRIrPq%eUfIZYso*Yqu-P%wT-^E zfNBc#!aSt9OJRKcxtu%uzhNki2NF6wox9Z*x3=EK^|-xD0o&HYsFC@#QgWaL3B6yciFm7Oie=A!Q%Vjb&(~e{uUFsMYS9b7w?^xaC#|e4ed6<- zi^I)>^XKslIY;_r5Ad??0zQ9-sh*LhnSQY@)~7Nl__ws5h!!Mtf2C-~bPva&hg0!I zFK4WL$?93J2Zr*aG*8sMzWObUp&li4$`_5hWpyZS@jW!lKnoHWTbhNZ=w#=am&cO1 ziv)V1;)bz$hiBSLzl;5u76%C|8#@1ZaLi8qG^Qo@+wr&13zb8R{WbHB{i)!7Uvy2; z7YJQ<506bOQZ4@0h^|}0nurQ0`np(wAQ87xBh{kNf&{h|I?X6oNSq$O!4qA7gAMMOOQ_xl3G_lm8hyv>aCPxM*8tVSp#=%-yXc&A zOJnh_<*d*2aOkB^ezoTAe5@wo#ekikY3`7~KA7H1&D2U{9dY6_T_1X(LXfdtiJFN@ zh5q_XJBS31C5*jn*-RXt%G5if_*>|OU*)4Oh0q&^52q(ENB;Z9p&Bibz%h}r4+~mZ zErPo6IkbPJ=e4R07ECagm&&_LJ!89}uf4r)XKfGa#fMPOfEFb5Y+3gVde+Bb)~DJt zdSUx#tX!90tr^=BTd)3IO(;UI2fh%i`q%1M?`AdPay5amLPD=BbgcBcmdkZ566l3F z!r0&swXL8Qi}|Hx)Qhg2!VkxIr+!PXGu5+R73uy;uTnXzQk4Y>y<*j|8o8*xm3rg% zJOTC8_*>|OX=1GVluFi`wMX~{N{3##bJ@3J4E0K%`?XQIOJB71H7jj3q})Xd5*Rk^ zmn>^)M<&~*dQl|MORp2PqVaa)$#&3~J*pQ)3le&jp^1V`4%jCb-B!IQ66mGZK3c2R zHu!gY!ighFnTZx8^f<4HGr1Cqmp4vXa;=60dg;DPE9k!4mrndRdzvNZC1^ncwWCyb zpA{1G-gmZSFNy?uX+>+K{}fftqC6d(G2Rl-b_ctJI(HTj-^AKyLpxAdW8XA$q)>=9TZ`palu7jL^i%=e@+O zrYpVj&3h!!3%^Fh*wOdhM3VZ#`)z{2SBKp4Yb{8iMx3$XT`E~KrXS=jXjSBUH-^{i zn^Cnvy{E69vE4AH&keXdH$V##`aD6=R383s<8t|JTqMv7+dpGJA1Gt>-u9el{`XWy z{T9Yhp9tul;rL(2t*Q0fS*aU^IaHHKVAza3?pWJqcdo0R0e=gBbmR4~M^nJq{|f zsh#KQBF-0H>4~n{b`a41Y30?YugL3p=#jct{4MNPP+`tk|Bd~`YAeJmzlDSrB(VKc znX^HnM*UFLGa!Lp_?=|Nvqqpzf;EM}S66I)NH4eC=w)duw$qxpZeHHyY_B+v`nCSz|#l(H6PzQTlBA`E^T{)GeU} z32bTfMTh*s_RCgzR2xJBy-<@*^O84B?TXdPt2T%hB(SA1mbAxWyW_)=pDE(e3$^u( zm5SVF=YKs;wL!EXfh~>3sQvft8q1feHi!gz;X4A1J&zk(RNJ*s%>dAX1hzEF-9;J1 z)Rt>LdqV-e@LdPS_K(XePAyre+8|nxz?Me3jGZ3g*}X)yK_t*i?`!Bb*wAEU;MN7D?8e{4 zI~(YnGfjHS8&txQI!mn`RBaI3iq!U9?(FlFpxkmt-sV^Xq}}B z11(6Pt~a3NRAC^2URp=0!_azB6$V<6(ArTw1JD{_OKOCXKrgLm)nRC*tRzq1bUug{B=9~3(sHIK%p3gO+UiMXcSxX@{`$8L z<67i;zNFl*R=GZbZ+R;V5_pddea&jx41Vd!F)MVplRz*0N;hNiZzdF1f6EfwB}pSw z-vVvOd!zL|tcJV=T0X~l(^5VEOLQgzE%LeLoEpjtf9YT1OJPJ2lFpYfYqT)FL_~Q> zBI}APZvQ>iQR#?^Rg^`0`J|VQmAZ}ii?LD`B;<4F>n-?~!-%p-ulE)DDX;$?Mie3G z-6a=B3ja2K-Uj$}3_ zWpyz$^tS8Zj0_F}z4Wu;zkB&w&!!@?dDs;c9>+ur5_oen?TcOr6<2QVbp3PXxfcoa z($9wf4(T(uyNZoZX1V^lbHs}lB=81mQsd6(C5|>7>B<+h#X+E#el~(Swx|1Re@Z<_ z{I(;+6}ESn7cEHO9odX!{cDJL{c9Rm!Ru8W1bXRbqu0lKbk}c+$S~1!*Swq;KArHO z1qs?AR`se^#JU`e{jfP)^xBm+=fzLe90YplXCpq{2=Bi?DpfX5Fn!ya?ojymW*EFN zhMr4C-5x{xK9z3y{>yZ~GXEip^EsXhM)QsHd%WODr+YG&&K(ud}HF)>lM&_ua z4S9M#!^pig!f~&RzGv3(-$r|V-%d1&WnO0J8%quUjknd> zWEDp~r3$`Xzp{xIB;KX(%;OE5XjE&sjPmMG|IDIimNdZ+u2gXl=!NMcrBkBR;%(Io z!Dp}5cBBJ|G2KIXvinnvH;qG;BRE^RK; zj6I+4n_j{Ad+Si6{OOte$<=yBu3MuGecP%b?`NeGtg-YB?1=ZSTkrFkXhC9O%&GkQ zL7~RJ7!!%eo;gJPeJw`t2ik8(%b@Dx`SLs6jWn~TMGIr)-4a67iyd4dOEE_nNEB@~ zmgni-$9U0q28D4Yc?nVJdFzF7=Mc_6WxZaKa>qK{F1 zm<*#va6S=KD@pK@N~VKAFRVR`C5&t$Qa?Z9y0|8;S#sK1-m80TQCr zjq3&L82V;fp|Nt}&qrOtc^|X4)#AE-0N*FQ_TSYDn>hqJGxXuEK>9 zI|%gpP<|!9cQupoUHq0rOpmB1cAUK68WlIWiI$*VOL_es-xxi|b&VFQRLyINUT1%G zwau2+5e5?RUd`uckCZhg441WJQlc7S_`sX4GZoW22=v0*!`O*a6~(oTPh5RQ=5Ulb z5|?hx=lMUCHBzdYSh!O~@z?n$uDBna1bSheCbjy2wxa3OO|DrFA9x$q-p=zBuH|mK zG}ve{U>mR0bEvyo*}TzGJ}6;3!EXKF8nEHMgTS&mxP3eCU)=4U|2ik7JaN4?BLCs7 zuC0~+_Tul3yS{}VTf5Z#$LVjPg)w|fsQA0mE?4)^7he2bB!=JI#M_Or+(DyCQW)+5 zt;DV=dtE(Gy>SrewW8oA-fZDf_jh?ih=}*Rr6_-EpDW99oM z5fd{ma80{?GAgf>1&M)|cJMb_c*x)Pvrrf*ySEoZ&#ZOT%zev2pcmFR#?F3dC!S?k z?^<#9wxeDlk@}k*Jm#hh?$(#GQy7K&wiB(lZ*XNxde1?im$Q9L-r7+d{o{LAio;jE z_n&Ryg<~)AecR_7wMc(vhbwXWXHhBVG8d6}RCfdK5%JKsq;myI$B8;^#pM^9Trmef^rGdv zeH(eJ*e89*4!EO*F?dls(ZSr{8rJ8oBMc-G4%x)}bUNt!B~fV#qtes%Vo8}bu7nBy za1iK)IYQr|-`q(Y+PBozIQ*g)^QUNy?L2kCTD~LegQLajO^ME;?5D-97J1G)!a!o- z-R(TGT_NACG_t=+dZx2D8*h>8&#*HN0=;l<$Jkt}fk;&FjLUaBu~{MC3f`e!c3!k( zYvbG=0qn@05|s+>sA@JA!DxcUj#@%e#KO<9oGSZEEOJ1h}Tl&vnss?owG zB3rqmuC>?VM)f6%Krbv!YEiq(hz1{CyK;=lV-B4;jsG0pocC`t-YC&zF260R@Ls;~ zs96U0&t%FS4-xO{#Rz_#^cx3(x67MN#`Cau-Fce@(zS9xtni7P0=m1tj6vo&Nb;bR`mtAu%rf?AG zg(XX?jxsK>A$f}6BF!t9xg)!A_xiZ=|mtThQGrdOe4KwFO&5*f&hFp9d-T(1A zaq!i%-l*AAPYM0==+o=%o5W36ZUJ?BKeE z1G7GrS4bTHc0B*7UJrhP%Mz^lLrG!Vv4Y3cFY3r$^m3MY-qjgJWbU-VvCCA8np1PR zGWnx#C~xw33cucbMYNQ^os(JgN}MKm>i)n?U!@!g_xGK7p@I|n;&gItkUv*8QFKbG z;NE+`bEF)-FxMIT=21*Bacqv@G9Q|mcpH>nL8utwy;6*=>GsKfd_QM!?Hesjv><`E zUD5t-?0Dk9=4`<+M>KJSal)>`=TfW6cVL}?G_`YYVllB)mf$D(8ana{iA&p>@ms%7 ziqduz2$}zw5#AP7VUSaGYoC z((^tdynPSX!Nx11W-@BdfP`~iawlF-aj5HfSJj%%Sq6IHd?os>f#c>yxgVfzUc@^U z)vkdXb`AD`SAfua0P3Du#%R}IAM6?g2=vlB2%5-pF<3l}Ti%?RI{9i`%i`J@ZwVsJ zc70RyN|Vp5RP$W~uFr5ih_^P;4ojz;;%TyqV&L2q!FXF1)+M|@jJ{=&F`KCO<9Fh~ ztW?2hK>}+fW5+&b5RAUlIC*SZ2Z3JB8`+j0N+n_>t|OB6$`FheB(SZJ%HnMj5gw<3 z*xxF%gFr8A|Md29kuqXw#=Ii;uWwvqS3shei89{7}ef36w5v(6cs{Gy3m3I&YbA(%!3WY_tz4O`B~362=u~Sr<%B= ztw`DEfxSBGCKtvR=RTM|`X+hjR$|<{H+G!OdmSl90%OS7sKRYTp<{pBvxB!e2=u~l zpwrIw-sYmtmKdV>QsF`i5}1dK)nD6L6fb_(4xhHjg=K(o$JsLNC+6-Zs;oO~$BaA6 zg%%|6TUa!|dedEG+r#ZET_!sS^m5L^n|OPRO?7^-CuAS)LJJc3wJy2^<4td|D#uzo z-m?J?0=;lW#@LLGL&Wh%_3iK)nO*qpM_fDM7xNgqkZh1B5_h;=>8}tMT9Ck17-O$T z4G?KFOtP~lsqP@q3uDMwhXegZg%;E8Rp;xu(1HZ64N0q3yPuf&aDkoiX=?|8Ue1(% z_z*6Z)MZAFMb--3TfkA@sbLWx!^MzG$9)H`&drV%Byj#ftGk!sqQmc#xT|Q59B9G) z68t6l!ua3eVrS$&p1H)t9B4rT_h;z6yW8R7`i#H$?vYy@1bWF|YI$;Yr2qEQ&C9|? z)10lWWLI4|(F<3mPNG4UaMAnpdh6QVAvw{41g>#OTRSUE6u)uVN%!@v28!dve7a4g$TfPSa_|-C?4@#Vq#B%@1;-1qs|6 zpn1uap(6FplJ=|J@f_^~y|CufJtkpcqRW$CJvCmgT7~(_P;0==-M(dgVfObi)x&-0A^;7Erq zf2B{wJS5!`mHEXUX}wJ<-f-kD61rp+O*d4W9VX)5%jWH6{pBFg3-^|3G}tp#WSbJ= zJ%1)a1X_^5{bahau<#J^=+DO9Kg?_qXh8z^lSxN5cCaXNyPY>z`n(ZnLBgruoqcnF zDBWqi_gsp~4g$S!H=1;0tp?t;;*x?;kb&P{R zFXvu(hk~%iLKNf#1`|6B<2It9Q)k&6gt`#k5XWy*-zHAAuGm@DzyDRP=S@ zbR|xB+h?2SAkYhANcVqK>m~}kJ>+dYc4h=xkifGks=FC_i0a9?cfsG290YnfQ(hx4 z-JHEUp}F<>&k^{3ot^=z)H=^`_D^dho(Cl~`z8800xfv*gTKVsviFU|@7)rZMU$Lx zgnD#cbLa~{yx!a+#SGO1HAW{u~o?mi_TX{o5`vtSdA7WoaePaA1fv1i4o)6OsGSn+x=E`q&z4_izg6M^N9CTOXmYm}4 zg$m}~&M6%GC726%!cTi-opXxO$ts$`b5pEF3leyXGh>@yWf2qCS2k;UQ#%Osaw-Q7 zTu3ike_!29R3P1Iv><`Etk!W9d2#k5L7UC?c)Yj%br`GWnX>v2LPI_ru;vzs!u7lpu$7vHegLE8}8Lt5|4P z$MeXGqbUrLzLRjpy5em!cX>pVm$bAC%VFKQGtgLGWfaF>Vyte}HeyT1zr9m_-RcMf zi9zqOTfF>Gqxbfa6vnldO~su>am*r}4m$|+!aQVbN0a*E&$mg<+U3qWauy+7V`5a@+DO}n+BJ;Z>`k#>;>6J0vxT&6tgS@uzv&gZbC z2Db9XQ4~h!>Yc^pW9RJR`xd*lZKBe7E^<|?N3;D*!DvBZ zRi*S+$2c?jvMRC{EuJN{nE7*UQMhad2Z3JBl-GT*&ptA)hiF@}aIhY6R5~6+q_h?n zUBK_YZWS%%!O70q-3N3QTLu?!qyve^qtjTa2F&G+7s+vO!eG1~1bShv zlg2BJY2O$zRIEK&I=BSQan8S3#B=tm$L0KCa`-|nXBK+?pvz-*txk6FdV|HrBBg@S zg2b$d##g?bc5 z_K&BmPFur7t~^FCT9D9lIGtC+8S6~{cj@5ONZf;Iqf9y zx8!rw7x%tSpalv2OOcoBim zqP!$QHRda^in2(rsILxT*#A3>C_>Uyr@s&e{uX-4XR7U*INEx?cY68OqIU<|`*L4g zYh#5Ud>h=A`Ng8~tRWRP`0`Dv$d6@AXqCOR&sQW-ZEEM+YmM+O8Qf9KOufyE7966p0TIE_ljlZl;)SijP1%UIR;O?c3P zggG&dKOJl281-ZMnYK)MMB?-g0=*(>H7U!3{o0#|hQF-0W$qq&l-WQF5-YN#SLNaU zs|OJ=MqjlTQwf$|{jG%rdQHiZN!5k%8wV4SX6_SP){_6D>#U=rNZKwQBqUe}nMo$N z1$T!`rwa@27IzN>5*z|7u(vygU!Ind zr=)92{yv4Ff<$b3VOxnYZRsb7Wewc;&_x~j;GFLi0$qiw7i0H^{+4ksY?vUnZt&)V zs<-6p=6D#WAQ3gH81tV$JLA9(nI~oxti;_T>hgrX;&=7nf1zvfg%T{;Z)nCpNpi%p zqhM{m`g0{-NAGN)g2Wr2lC04F!5M*fWrjQ}!JoIB=*9Ei8>kTIn)$JmC|CX&OYe>n z#Gvi1d8ZM%`1puX1}aEw_xBOys!2vfz(_&FM+fmwt?wGYXPc=I=;}DJH1lodl5t`C z7(sMD7|!djIclt`|GR+-5}ub!vzvo+WLzmTS`Y_%Ch#IlrW)yf%M}7$Gkz8GBVptA zc0D&%5T=Y|{>#8bqe1S~1}aG0KUs!-n=*FqrbhCrB1-n;IU7D^Z;EeF2y|V(REE`E zICW`yjd6kq)>8$M%&sSHG*CfeeX+9aQtc^An=F+v?1bO{66msDt#9Ui*ssbDuF9q$ zVUOpVc^~r5hYn2C;m&OYy6jKgn)yELPgfuG-_x}zNZ6m7HS>LR6K~LW%~2iRpp8J6 zz4TZ!%ay&9=uk>*3KI7BZ_O-M_L4}({Z|rg1iI|Cz?xY?Gg>!4NEZIwt}Q-ojL=TFwnFZypixBV|9n&m0V8s}YN zz0-D(C?!vanRvTlZOP;_ITQk2_IAvg*~0a^?#dfZ?@BtBx$$p%WmAx_w?x*=7S7%# z5@-``1iI|4t2MKwb`tHb=s5|ryEX+0dy8t#Y^eh>+jatNyNy7Xy(6Zp684_jnwbIEa|QxAgN;C!JzueAW-{)Xc?p5M#HJu&&p51^ znT$R65xXXT<~}w8UG^->DzhkYu3Bb(MIgVjDM;8eC#%f0#5qN64(g)kB+U+7{x>7D z5$H--mreGZ)^3#=3c^zEik@D*CDBjb(@{aknP@oMgW5XN5r5 zU6(Af=d?zet%7hH?n*?@Nrtz}N>D+f>9{Pi=d@1lS5FYnPk9s3bCTV=b1MY8t{?qI zMbBw{Riu&4M7|(UxUbY_h@KAf(jDNH-4d_=d@0KR#gy%F8LDCbL!i|izx)UZf^NVMbGIw zvT-#*bT6S3(R1pv{7Vp2kXU`-6BRwD@9iCx1+jZ8JX|H{&Wp^x;6y~`*X|4d>@B0-=J~qzc*+j&}A<@8JXqE zUP=roB{l^K`}@zxELZlD$e|?K2z1$NK}Kf%u$Oke>%Y=&Q;@Ki-&xxLnMsI@i)3449a$gJn~mVradU?b3lqdqZHbmx>VdQQIe=#76{AKQ2k ziPuYZaF9G2j+=Lpli*+5ACT5&nH9n!g4+_G^Oc_< zFndJ;T`5nUnA^i&GCo}J6$EC;s35Ul%fdEo8J2PBa9u%Q7LEkEj*a_9C%ZMvAlGUO z;@?bPjyX|5!o}x1jjq!?W6vSk58`M733Opi`#I*cjaX1YV$$o+)cvh%#!<7ZAM3g% z@b971^zS~)m0F7~tdF8xwQZ^o^Xx%lpDohAp7gerxOSh?=!pgeY-Op0*3-6rp5E5T z$Xv}>y~N z)T^iw`j>a{gpsW}Do6~dRoGT*A77L+MdpOL`o>L>WcUcK5a{Z0iYJYSZu z)$;}8CaWLOS0$p!vm0_|D zT4zWC^IcSsaN1a!$sTq0H95nA`7RRZ@~>K!$)2-m=4=$?yNUw;_x8#%O!m&+U*y~p z=DSFsYwE9MS0iY?B&>+SwAq}MFL&+x@pa<=a}!Jf`q+3S~Kf8=DSFs%ihLV zmDY#L(Kaeb*xMDW(!z1s!Xbe!ds}H$T2T(Is7*n_-lAG%Zzpy@WVY0Nh-j(tf1%6X zf?H*u__N31a=ygg1K4tBd;ejT{gS;WvgO+1w4TgfjYF?yQ;@Lta8}tTijyg3J@-dtTxzM;78dEr)GmpxOnW@df3Zh#6B_Uz1>nf3j3Fu%m$!uxoU_EYsm`Pd<|ly)68N6f7)YQ?oe{OHL2`m}vN(06~1qrpsaYUf&e^yN3ouh(;+T&mh zB+#X<{2+k}64+Afu{a{oWshxNqelW2B<%6*BQHk;y6n%;zSjT=RFJSgY5NG$5rHmyS+MV! zKtfSq1ZjW&_K~n70$uhpZQuKW1S&|_%W+2Lh{X|sE_>ay?_og#6(sESF(Y%t;)p<( zy^YDpT&YF^6(sEKN=D|0#Swunds}JWQ-lO6NZ8xQjLZ>>BLZEx14{UzMxla)y`8tu z+&Lo9W$(M}vua47^1sBtb7%6R{;TIm*n2hG|F!qQ_PuIIpn``&d?0JxVhTai@E_DS92~?1<=X3TMdPfAh)Rj0SP(cD` z)rBA4ITGknR}_&z1qqy0S7RW7E_G!TW1xZr&cmxQkU*EZ!izCbK?2vp)EG#h3)iDn z0u>~1EzB{2E_-bIiu?a_A2tOE9Ji}6@PDDp{tWFq2QUUINZ`0#je!KZ>}A2e0|H~9 zf&`A+)fh;i%U-7KJ2@~0DoEhCU5$YRx^N7q5~v`7<2Lb)d(mp72R~<+vKJt+*>kgp zmx8oNpN=&4YfiR$WvsUOKs&0rlWAz7DR zF>-hIRtR*dSJm;nA30kl)foP)IGLE;gEhYK!CIwVG@ZRQKP!JPi}qkz6s_0agMGU3 z)*55TeaJr^_>odudl;`i7AL46(Q2IsGmUs-UFsrX6P{EWPEXg3KExJxU<;b zEZQiSP(cjcZY324k2j|6EJjd4B8$H}dp@>+w%A|pbuP?&NvWdK4foP2fv)F!+*$b8 zf|~P$5J8w1`jU#dW*CJ{#Rw`$gw%Ftv!V)WLrTaP-f_NU^Uj$@hu1|F0$rUF+?o7E zj0Pv=H@rEIRU@tmr;Q$Q1qeR(mA<%X9LSA-%n6FlRxm?xHrqw3n@9i|wJ{2OU zAn{wE8}r)atDVl>RS>m$)gjd;Z!)&8Evyjes?b2}0~lOebDbX~h@E@tkdJ?EFtS}J zEPiR@KLrWb3vR4%?%LYleC{bZRDv#W?gpbOuo`1K+8`s7FRg+_d}q68Hr zBsVK`afmkiX-B1% z5T|$mfvo`&ZC&%QPMe2lU$@DxAc|Z5(Cc}&=li-|)6vzT{wLbG_H6CRt!mUUfeI3r z_kE({j?dPPY?Hgf`abH(dpw-yS1xp;fvzfZztG;BFS!%2&AMnl;_GI8v&SMMTT2%f z>{nge#{KCW&4uN>SY6w(*q`2ik%Rf(=C~gACRJ#&#~IbT{$<4n*G>X z?@>F-+vH}~bN^#4StiG8r|ZeRAI+SGgUD+IbsbF#BrBim^q zqlqA<9Pf7R5?5Ob*XgRf^D_Rie8Z`g`npGp4OEcu|KY;cPxsND zRcIxMp&R44UVVXnar{z+Kv&KlIa!ywX07!W*{hAN6VJDbb$aiz%M4VI7+oeOn>*X2 z{c%Bl!NcCg^YwRT=tW$XD+Ibm56sCb3@~XIPskYa#PRhr>B|jNkl1@QC!5hM zr?$M8+*72DOXPQr~%-B}sfpk-_>k?^OmWNWA?!7n}P2nf1su*|s+g zNap>Wdg?LHRRUdD-kh8s_=NJL#~1WcBY!jSJ+IKSv#GJ|wSL1IQT3gBjS1shADq&! zm7Hs!f<%=z*_qeDcACr5M&ha(E(_zix}4I(8>%brUh|jOAb=d~fZ~ z=Uu4!K9E2KiN_`Kvi8vyt&1+dOLat`3)>a3|LRvOf4tj=%-bDfU`B?ymh62xPH?gJ zQAptb#jA2mpn?SEkLpz+fiApSH4Df71N$rNA5{Vs%$D&ARRR?x)Qn6pKW9=E0}Mhj&b%3rmbj;1k8x z&hgVl1qtj$)fh;i3rna#Q&rcs34)XiGulm z>j%2<8LBZ*K?2)g#{{~tru}SvxNH;c_d#XrY;WzTY-{bUlI>Ikm9V#*8FKt;Z=*6| z#pu^DfeI3`?2;QFGOCI(wHgBnbm7(h>WduJF@Y|7kCP!YS#fg9)52NlfU6O{jtn7234V~&9e5>E$aXPfJ_qk9_2EaSGweHPt4WgILuS0T_5EGJ!J%M;UTB=b$X(~SKG zRvGvd@#!M%pO!Pq38R%w`V;@nDwK$m(|lS@VL=W&OP zEFXS1@DB0L_layN%eLC|i!EF7=o-oAA2f^x!SfANkQg{L2b*@pmoEFKv3ORiK1T7& zzB`P~jTb5ey0(dN)C$)c^w2Juk>yBB;2r8rHLA>9Zs7GUE1Q!gk2cYe%WWt=b#cO9 zgLwX|*jyvL#xmu7AR*hXKc@T8r?&CO&Renk%kibg%-Ks60$syeyRdmhtJ7YGoHf8YXzyjH9BpImQVCR$u#b>w=4jhKqGxhMj|vij8@||nZFS(&s^UJ7 zKm`eV|48MWgJS|+_PGI?InQ99%OG+t16}q!k;?fJ#{?=!*ylKC=6s2Lp27BX(Pi(i zsGPZVOrU~L+)LNG#k4~ zZ@8{7sT|_Q#;ozBNAq{3^DgFP-TM2|H!A{Z8!;31X;5t%Y?~vSE9Q6Sl}Ods*ynfu z?TfIFnk(jdOWw;upNqL(F*EVdkC2T$^n9O+6I77E{?W-P?u`X4pj+sd5GEC z%VP`Bqqf=FeGjc9>z`xwcbAG0RFK%e(49SOS&%krEoW<;7yFX_U#9C;vr3?=KwWp% zND#l4mb0~ah%YH{c9y>2dQpN360#4@SYOhf0p!YGpG<1JQ2#3C`j9}E`gFI}uSfdk zS+0NCT7;m2glCU@tV;FDbj3tDFM6V2UD7jdoxUQEN}vnhtT@xDcWq)_utT5ZU6|l| zM%M~4zuU4?3%bHKzx&x#n`FPROK)_i5J3frAxHAExvv}2#J!!xRdtQ8NkWtN>!%+V zR0woU$&s7g;XyRAyqpo%2h|{1`ySD&#uOx|An~?;Zr0{(5M2~6bB58W)yR{QXZ7@& z1r!2ZVPf?pYGo{4B34hFoMNj~Bh}K*>80|DU$p`SiKnLAwwz(!FLGAx)!-_m8U0J& zYxY(Mbg4D!m!p-5SHYXQdHv5-8C%^(VqmSDY@uHo4X-3;ijMcGMCOyf^>Poq{$0nh z5$M9&{QqXJHUirfY{ygrvn9-G)cX+3&nz6XNvy$`KdLcMK?3WhV**`RZ&U&mtScB> zB~U>EYk^||U04fL0u?OB7+WP!K>|ytV**`{-yptobYVZQ#y|xL$K?tMbYV}e#=v|B z^DBHJDuD_TnAty$lr(eF;GFm z>5z#nX&6k$1j_FR&(o%SSb~|G2M$pPbX7E&*{c^pG^44E5x7YF23Gq#JWubDhN8g# zZM4V4@{J6pyNQgE^rbC#3CY0+HXExD=!*SnVyJlBqI#)FF!4OEc8 zXDH4#9NmR4&-KQ*e{YIHpzGTQ6Z^I)n7(t7F;-m<idYg>&~O5 zwdY=X7Gv}uX4dO)S6b)t<*cDgH{)xfP4`Sqi9c?%a} zpn?R+Zf0F>2hs;mYqV1|-t^3leFG!k+Ay zQxaXWHjb7YYGwoOC(sz%mq@PhpN*Cs!bvu_RSXp*2JbbqIt3DG@#FG+6fB*CuNn|Y zo}M|Q5a=o$WoFqXC(yKm@_m%9l#5?o)P+1Ae~+PpM4{bgRwaKTU3yT)sF;zDpBd1B zxL*FM5a{Yy%gm1ENTAO`WQ@xf%)C}&8&bAnE&~-LW{x+r)cy%{Xt0d2aYQVC60^c! zPD>1|2iRT(a}!(FB8-+FCEKeRD--yr)02%2i)yZ&im z%>AJf=*qL#WXnY#50EiN^iJWqa#S$Vx~(%%L83~siM3c9P792aF>)r+-q*yM9f_hZ#oabPCWv9t^ypj}BiE(`K00Z#9&v2BfeI4WhnZNm zxM(_%$r#79cwUgq)nArhrV!{lblk*h&WxsY7swdC4O01}mSKK%mTokh6HP2*W&|xf zGL9xCnAp)uk#zfrIGVUkT;Xq#bY_wyvMuY$%bNE3t#jIFpn^nmapx&xB54=foi7!? zQd!9Dh2O$f8x#Uv^S7H=_?t)?++D`__C1CBv4XlO`+5TvB;KZ(*sg(5G|xPF=QB5U z=S$}M>E*|*RS0z9Qy0IwFuEJBG&Vp#ps!Kh2NEZGiC%PO6#X_|#+a0~8;>p-t$VIm ztq|zKcjM&LWl$BzkNz zvBz-{G&WK`tE}Ov{8CUg_UsS!4WjEW@n*Li3a754<$b))mda`EsqALlMgtWjLbsUM z#gpOmYOIWLvrkW6F6sokeQbk5pi3?7PXc=K>-{dWTPrshs30*xl&i?8;q<<(T*Zs? zmV4aDY2;qNULnwhHBJ1w%F9^3I%28*VEGaQOEs4E>gP?YoyZqHZwdA`P6zuaKHLZIs}k&z7<6+{0yC1ccm9nNj&(DlO8%WGa3veB&WM+Tgi=)?v%NQ*}8*+~sg^7_r z%|Hc-`}a+3=k7Rq+I9wA>ya8i9$t!E%N?%}=(<|h%=&r9)1LEW3@>jh-`}h>IejGB zKn01|2PXDrZybHIO5TUlsoI=-RU%r8t_p#!auH@`J|9o(y_Ye%cB#g%&Z|L=t!!bS zf<&o2W>z>po)-HdW5gUU$IIOEC6jvAQwVew=q@rG_XJwNEc^4cEM<6lh9Bwixw?T0 z5(A5xS))DibU=BTGg!M7=jE$6CabfRRtR*dIYSfwB0RlNQ?he^5d#$@8dNp2^bhg0 zZhINyU}8Z&N&FJcmdX}|Ko{mKPEH|LcKAKq)Q>oM4A;lTd$H_!lW6N6-D&PCUMziH z5_0^MgOG=_g2Fe)6J1()VTrr5uBJFilkXV-J#g=|eq9fPJ7>k47WH@C{ zC*xl>R|s^)zx8B^DM@s9yo|A-Uk&=PP&#S)cT*h|ByL4|u~esI`r8~CBY2>heO#SR zqVm*J2z0$W;>k+(OrnRsB@3c{LU(rdZ93^6RZ&OR`>I}Sb=G9MtZX7xiKYpg+3Z4t zNsB=RbySd$U*WgQmTdcl0r4AExo11EACw@qvtJE}47Thg~rVp1f8Wk;UJP1uE zJ7XXCp@Kxz2T#`SdlG%WT*esrw7GFI`yjGn_%?+=S6yFE_PuHn<-6sHK=THq8l{^J zAZ@RX@!M-u?O#r>un)0$q8_da`CFaUT<9jKg(i8h_mD zLk?YX^+N>-*Rh`L$&w^`cA1P3y=twIJ2;J0t(i+h0$n&-62Go8ff_r$rI6e08&Fh` zz!8%8eYL!rKEbOe3C^-W$9jh~ILKmQEvhHcAAa(Ew7u9)&sQ*ol-;#dM+J$SOTCzN zl^At@>Mn?tJNxKeza$cu;0+3au8XxS?A(t;>ODfnC^Gd|z4Fd@Qh5DV9Tg;2?ek(^ z`y|qCdWs-swiD+|)QToCU8q8!t5RnR8@@4-4){aHxH)vbUg=x}IhA+6jtUawx);-` zBvPNDGREmOoAepGf=HJNClvx+`Y;PCrzKKSO|}dRLigzJg1eID##tQ|BqDxzvGNxZ zXyel|#^#~N^!Yp6lbs2FDFnKnPO`9YZEOL4R zo&QP3*pqZoU)--1>GIbdg+SLx@p~g#?j}%Q@p~iUs;=DA*W~pl#XCRNQ9)vTBMaMk zH=b@xmM4rKt@K(yTtO#;roUDQbbZ}tVP~5p&;y5MjOLrZ>Ze#evUTD|9Tg;oHny;7 zH{%!sb=&N|Up8qpN0HSl#7a>5mv$cDrP) zO;+o>^`@5!DKYT>%JXZq`_cB_;JI_9F6j`kQg1ZA2tfsjVQ(yKNnjMsn=Mtu@H=-z zuid2szcS^ja#eUGMl%a@+a5q;`^j?kG2?D(;Kt>~evD7mi6(lxZv9N?+18DkJ86$7# zYkixi&O5Altq|y1m11H0S_IP9r(}$k^FQcot`O+*5cT8HlR(Of$#?Fv*p<9|REhU)nw6k}L{<-Pc5YlCy){h6U@P26 zMgP*=Ym2i&psVB@3u}-kh~}*(W0cs{-ktQ)G-5As!^Y zMse+oP&!B)?o&GsQ>Vzct3R1bm*62Wb~*#Wm;s^yXOJh*>3Vhnj_ge@{F z1iD6x7>NEdIUTT36(JG(b)b0mybuaHX5Px7|SI-XmYLX%v*S>X6^ z8ctP7`; zYRDMr1)GqxuMaZfC;AXnkT^Hho29J{rx`0`jPD;Cle@XTYSTum1iDr`d$VOzBj~qE zGRB~#jmgvD!~C4P_z+Z(h@0%qZZC|WB^JvVuHPDwGM7*IoqkkGA<)%K#K^lNf)=vH z7;~=?$+78zU$wtV5mb=KEn+wwh@hPo$r#7|8Ie-v$+L*7T7 zE`$uVw%2PvDM3&{;?7`ib~-VNZtgE*WId^op;5#2h~F;=Wkq` zpn^o*bZ=JXmneFZ>Ij*xtKzr3)_4rr%nUQk!gM386y^(36|ID?YvoG zOE9hImO|CC`&ZkFq$~NyNNMFoP*Dicc)+Jf4h!ucrMHB*ENzX;j za3O@Y{vczxkFHCWZd`5jZB>Mzg2aVB-faBuA=E2Q#z@{+kJNv^*!cQRCD2vwm4z*G z4yDV!$r!sT)hDmUEij(wMF}cMgbeUzr^Je~Uy6)z=7p6chK@D({bCA%u5sTi?83cJ z>RV8j_EGo!h*#wv#*Z8&2r5V%9_7ut9}cB;CdwGq-5Zdi)f*b7dL}=&%M~1OF=Z~u^d5S3?$HXUySaq{2fFux=7+~pa*Z8 z+>U4?vK#2a7)9@RvA#aRG-jN<^RsPw@;>vg_*GxL!Pq`R3K3AJvzoXHh;B&3KADY zj6>HW>8mp`hS$b!oLV{?tNX1{2z0giMcg@$q}$%h7=_F!yzs7?2G6?AKm`fs6Bc%< zStNaNUB;+o?ZI!BG#MkK)++?MxOnINgCl9sR~h5flAiox?+mu~#RdZvBz#6$So)t4 zv|4uAUKM=WlUJWPkL_>0(Le=>=BF&|ZH`D<{;s^LN-?S2ziBDf;f_k6>&Zw9^J5Wo zeKr{*ta~coK24l-@XtmA6(qbxjCXq@=$<<=#+C7@{CKwMn#&iJKo`~m@e6q^Qh6Q! z_I^V)ZB*)qLWsI@q-X>^C+dngS#@tue)8KUzb9o>Vmr97t~fc}pW2R(ZthIZzZh#2 zS!rQ;u7uL0*=+LZ zo*Q0^|FWhsY23GyLZC~1y0={F^AkVHlGB&N3{;S~SHr?;jtZgHrZUEWzJz~nU5wnK z-4y~|_-4htsFuv9HcrzY?ObJGTf0$=;_K88r!D^!GZRX?yU;(8JFgk1Umd=}Kn00r z+`{fY52I)H%Tm(jeLSy!dxlP&mn#Iimh`c(^I|7QzMJwsE^UtIZ640jU3M%pP(k7a zv)IN|I}I7*#&g%Z9=O_faqC-U;ToOv%SIQWry9V)s!FToEb!Qr=Ac1X+lT$ZS zS3Y3dOFe1ARE0p-KS36DZ%QZ)SuA7B{oH|v?r}MPG1r&Bo!+2Q3ST;5 zslFuIlP$5vQSr`QI+QLp>)xhsCrQ9+_wVJ}wnM;!h5NyeBnw4|SB`+@w=SFs9# zu93SuS(9n;w9sEN#+_`vG}?X;|Cq0kwSwNwanCI0Ej4vC$npWI|gG}dNid}cat^SiH(3KGAx z@nThS$I~m_WQ@n@sqFp7biQSI1%*J@w|iohY(YFd+d#(P&gA z#kS>(r$c7T7!Oh(u#Ml+d5d?s6arnV-Mv^x@$1|lSIHP-+PNE-=ce##~7y;_Tyi6_$vguTm!w>XR*@oXKNXw$JSZK@C|+V%7Iz^P(dQ~ zh!@+#<7nw$WegXeWyYd~z4*REV>BetwN|X%Uuzpr=ZLj?F@kIn!pD`oYMdH2+rZ2l zbNIT8MfSQVntBeBPxpAkAiizOUE@=^nFcCIoa@3Z5RG3fOq zg+SN9=@ypPJB9`Z%NSkqb>I;Lv+@?J#~Y|1v0KcAx9Jc=18j5Q8^^ZhRWfq%SHFx> z2y~U2Xko4N7`n5SjB#;a0sca7!DsaGG`3{1u)mMR(nS|iXpdW7Y=ziO^UJ6dI-|CQ zWjz&3PycFb8FqT`A4S@6mjTWODoFIZ;l=WHh@-EE$xPL9z8lWZLV42*TNDCazna9n zXmwFaYReeTuJ4Uu%OiO6#03l$B#y51VuSC-(REp6jO4oyjea{~`1{ub6arljpLwxc z!^D2eo3bQEzPM)WzZTD}0gV_cNaUL9#Tts1`sH0&5}z)+V3b;u$eW!jt`O)-o#w?F zixw{WtRyz(E5cLSH05I|7E#{EE|IGjofAuA)+JMXvtq?0q7-)zYQTdYR#e_O68>E* zY*LWexpPWBtB04$@l$7fdA;fN6arlh-7IX&+*rE!m3&tIZ>#Wqm1^-*lbaf-AaOla zWZ`0m_nthmB)Ye(&8KXu#9g~|Q3!P1DwQw&s)P;1n| zTK+uYv=<+DW1vEytEZnB*G`L}v%_VKoKsuzhTZb;rx7C!RFJ?LEY>EP?=%Y3@5wW^ zEXcr?3|lz0l(fEL7^_C5aJNS(6cr?ji#l&v97oGhS$6-XCyh?OCiC;+_vVm57nW%; z#%WfEj2^pLe>(xl0Q&yYVwCtfYV^J*Km*31*&IzTSd1PMFtYlqM zsp>j?mq!tT3KEqUi2dy%>q{FY_mM5B;Y$u=ovru2Ra7C+^);uNy{i~T%YK&oOMX9W zB~SP`z4VD<1QjH1PcySQ?ZhtcZZZb95R$b+SDkGyp%CaQmqmP`a6XJ4zAs~}H8&tG zwHoNt{7Vvac}y^~1Tj0bG$fX)gznRjgr}C)ul`k%pn}9Wu_IodYY=PO5#N1sLo&Np z0ez--DTP4SPA4-XFT!ZX-}0(z>}*K>-eT5IR4qkNL1Obb@jkMJ)3iW&=kKmJA_vpX z`z4F@4#oOI z^I<*&6(nj2+U-I(^=vDzD!aJ}88f?|W|^Q8=xQRq;5nZ)g7*JQUeyuTCd6gVCOS{7 zE}?=%=P_n>uy+Lg-ciO_cBC;mP&b(6jaCVCt^ICd@xMgSthZ&1XNMb+KZaaqg)WpL zs32j8Qc|T@BrWn#5)1#HuJ4>1%{?b&D5D7+f5bHPWQ~`^(t3F$QKime-PjV&7u7nb zqk_bmQ)afccpS}R*mBXDoAhaq#ffh_PACMrDiTlTKQ)$4`XcuTS6{eA4=WJFGYX#4 zQ9I|JXWI#z+jjtzTT*lzWgz zIx0xi7B%X8n^@YUq`Z$MU!Uk@NkcyP(Q}1B*VgQwtn--|I--w^arf9W-8Z5EPk#ME zM+J#bqs`2tVJtmWP{t^c`;Bhe@5eoVyjBQwjrwF}&6dT`ZNV}|=_YUWWhMQ%>$W#K zDo70Y)yx{yjHNq0WQY<{!Ic`3r?s4ossl?A zEU$E|nWf!`pnhFrsakg1x-}$D@5>sKPLw35AR+hMK5&nuzu4NVxnT`Rvzzq|ElwrS zH7J{zjc*=Fi#?I0{r(R^ifw3Qe5z8Cpn`<^L^J!XLL_|}CTnfqg@okp-pc6lzJx-c z%T;_CcB)GxO|*R(w&kQB$#cD@(ei6?f(jB5v&CNL8<8}luZ-cn*Gl?)A7@k*{Ra~0 z>YLBZcIS+ue~2%h#2!eO`lNH}LSvCQ4*(S;R?jiBE!m@J)^r)8$JM%|Y3fQN$FD^c z0$paYzr9&>6g^^+G2%+pCOsl|8C%~JBB&ryYK56aj*X%hf0HqWUaLXYh8!|N7Zy|q zba@psGyPB$y;niT$o8Z%>C^s(k?WL&pn}BBDrS}u9!2ha< zK-ZD8W|rl4G=214-uc{#CgM7_D9;$?N>D-KU@OtW6^^0##Qs4!C*w(?R~F(iD{?9X zx^{?mcgLYnD!#$8&HFTZSB&Jjmy0)``4j?O z`F5Gvib~>(s{JxX*TFvI=GLs-ySWEJ1&P)oM(Dt3N&@74WQi(G!ah6k?59)$U6sZ6 zqcc3BX@lJ|MpJVc@=x6##@<>cf(jDqJLi9vB}bZlG`Y+2pnd{mBYJQbK#~kxy1y2RggY^>V zaIt6myGtOgcv7|{EltP#-j(b}=88SGc|@N&qiq1qe<6t?om1?N?i><8JKJ_g$7K27 z=QpMgX%|0UM+FHrhH=?TFW9XYc|@iw1iEU9-OJ#HcF@fv#QK&8+UAK$WGu!*}upsVv`Gy6Uvn6ljR&O?qAAyrnpkrut( z2r5X-?rdfaYX{TRm9`d+d6BAr79hQoaw!D5F8pI=+r|E(esyGwPk(xl9V3g8on>4J zDo6|${Z)zGL9~b1u`X8P((;fU#mf=WH@iZhE6;l~yM7~xZtN&yTqu`|6wXnR{Nt02 zpn}AmzM>@d3!)w0$QY;EWG89)YLJ!_f9Ob{i@AETm{CFW>JS;@$Dpj_beUSDX394m z6(sKbVrIkrgJ^OtSrVUle$)?^vXZjj->C$+)RO3}z1AO!U%mah@U@N#{@*-eeBS(G zAU)bf#+cChwtj1KQ*yKRBZWX0)&jAkv6x0;ij2`Gyb}E(wA3qlda}#&I@1!hl9g6l zC9riyB2|2kv#e5QdUua}x)=iqbYWj2PRD<|-|twLe*E;x5jy_gzs(-(p|t~j+9#SK ztrDmpu`t<#HJ#R;Ht7{1uBv&H2tI1VA>)~kScwA#iC=2ux6J|c5o>EIfeI2nr`_42 zLJ@S?$p4Lj1iG@hEb0WtCy71f=mB8~WaNZBU z;a3S%kiZ!|#{|0YECQ9lo(#{E!Tw4mP(i}+og;xRwI38wexAgJ3KICF)vLn$zzhJd zP$f`70&^6{1iJ8y9F;%?3Cy(|6X?QIbyNZsBrs=mOrT3Wtw%6F-v=s4VD78NKtgfB zIaMlwXI>%UxMe^BU3gBF8Uqz1uq9Fnbm0mOwqq)R3KF>X;+Q}eo~ok~s33tWDUJzr zVXLGPs33vsB8~}kVcVq=*n45GhTqq#1S&}2P8G)ly6~I;l|Tgv+^OQ2Ko_2Opc42s z2Yz*dyTw!jzgNTEhWM?VN}z%S?uT?tpbNkGQwda%z+T%ifiC=ZQ6*48!f^(G{T=p$ z>WM%i%Fh-K6(n$FOT8*2(1oWpsRSxW;Cg~%0$q4olS-fq*AN^Ns33uJ{b~#((1qta zsRSxW;Oc-%;G90rz2jLwDuD_Tcyf!#XC=g(vr@1kU5*iU6Mbq7ryA0q%Oi z(*#rk6(n$%jbj2`c$$Dppn?SM7II9W3r`bJ2~?24T~Ce)bm3_NDuD_TxO>Ynfi65v zKqXK?LfwTVn4hf=66nIy1k@Pl!u>^#2~?24okMC2B+!ND52yqxNZ`&P#{|0Y`~j6f z1qs|a(#kP`F8qF2B~U>EzqE2ppbNi)RtZ#)z;Cl06X?S4 zxm5xcB=FlT#{|0YyL6Snz7|jT!(Lk@P(eaH)lo1%YZMaba-1`uf&`u-sa_Ql=)!zO zB`~|kUFD85eN>RZ{o-m2B+!LtFR277NZ{^o#{|0Y>?M^z1qs}L>6kzlW;iN=3KF>g z(lLQ9%!5<{OE`XI=(x0_f&_kdtHwYAU3i*=N}z%Ses}AbK$rRzwqSnNC{&QZFUHgu zNT3V98CMBZkihT1924jor+gKU_kju$_{EqS0||8DH~cDr3KICmm}3H6cou<5pn`sst)X;E9rs33RDnP73B{X-5SKJReex zfdsm6r?g6-f&`u@>6kzl?vz#uRFJ^4{2deM!kyA8feI3MmcL^HUAR+PB~U>^JsVdr zKi?n{=yF`zQ9%OF;#IE-33OrIR0*83!X1r{=dVyf0{2|1F_1tPo;}0u>~153FMXU3l`eN}z%S&H*|m(1j;Ys{|@YU<)ozjmW4%#{70wZ(7HjbTT~H z^WfgJ?$;Q4Oq{^}EV&yc;+wwv9ZamfXKxxMc1WuPDoBL*m|0VC#zeOs^3?1>m!{}1 z`^WHS+xO_`YM$T3(mN#6lNqtpF@Xva`Ma5zzt}4};()xW(5fL^+=mg;W43{=bGio` z-LMxua50)XCQw0Q-W(6sc5oUUa9!>Y^0_)iuO;qdz|K87x*|urGvB^F=$z}})G>hy z5~Xjuvrn5+sQ*3rD|}`ALij(OuNuvV&Nk4M+}xc7pG>90+JsZb1S&|(5LcMXBaL=9 z%NUdPKQhF9kZK2pFjSD3^eMmX*AmO6$Q?pRpn}9*Cl9u5P9M6fsXT$-5rM9p#DhiL z>_Zpjl~4E2x*^=?an&e1V77s-@GALPfeC}@q{v9>m_P-IQQh;i!)FH5zGcHijK7UX zhA4^T-i{#*T{k!6XXBR-p-y9>sAB>ZBuQU(jy}xEruK~HI$*tMH72OM-8NVQWB_R z0u>}aiT&+OTMeR?y>b`pt7BEjqs~`#P4_0~`XJ^M9*Iwnv-Vtih)5BZ;d z^yOH&Gt>Y16kXg0Uw2@SjtUY{*Tio@H0eYCJ}k=>5~v`7?U-W%UD%GPtthr7*mhz4 zR|!;*z<4Twr36bQzFCz(1qrM-DuFc>+ZD$IDoEh{sWFg17hbJOpn`_-9>B!<5c z=Vi2Qsa@M9zb1D?psPbmaaP>q7TS(&@;=fJC+OnN$<%3UbaXux=YzEjYNdU5?nxaJ zs36f!oLl?Nxs{e;JGXY*gIYw~xl#W}A%agApBvInPDr4F#K7AY+p`+vCco}?M4(H( zDp5{E7GA3K~-1mtI(nnh?|#kqiv33N4il%LJbAE9Zs-*@ig{)c|e(w^M!cuhywTz?Z=5D}*> zs1-*Y6R04uNc@u7!a}iH%eOM8-jy7~hefT|J+Ch^MlUe2!OO$6oOPpV!?7lowl`dR z>Ksi=cQmn>n_=2-;tUhOtv7N@>DISp&tlSl0T z%Wvd@4aRQqD{M)VBekN}qG-oTCboHgq~`ZImTu^0Vuxx*Y8`LLt2*4J2k++TuCMOB z-arM3TD44U(1r-DR~{K-R?!qbYC;XYpk4)}DOt+8r$H%?1M%Bt}&*u@A}7ny2^;DRCx8 z?^Ispoip41c%wp~E1URj!1O6m+Vu-E#)(m>e0ua|dhYW^0~I7vM2tIvxM};!bU<1v z?{qh>U(gMeKo^!b@g-~BRNi4wyx)f<81MxAB~=1l zSSp>IKK#~PzkDHul-jjeZ&TEZW&04Q4LRD4&YI!HmiGwMwu#?JTEIQokjOyo%v0Gr zcL*)7|9v`@yx;PhjtUZ4YIv~<=L59hN;1pf6SC|7-0V%R*90BBQ{jq zzfIP`a%bD}W6N`pzkS9k1iB81--)|)HAHK>UBV5ef)U5r6gHWHqk%@iK1&wtajrN z?LcAM*O`6m@iMF&=`w6zf}+zy7TzNxRidA<$L5koc;xNwC&1NXFRtyb2GgR*PI+-PAw@iS6RIGskTT z)?#90jB1JH`1-Hh_=T6YERWp_IVjKSm(7JghQniJfeCCB;o0EM=iDu(;RFIIT zFBUi)pmnnSp74g1%xg*4Pmz4swhY_-+URYy-->`rBlgV59>Zl;m z;iV_bJ1;<6HB-KiJ8NHSxr~8i>c?<}K-c0JPqxq_P>b-EF)E!3)vg5(B6?C69Tg;6 zpYdedehJXFx0Es7vcdFoy>wF3zllPiYkeC}mXJSC+i+iwInP$VPj3xRCm%0qIx0vs z-0jJ#4Gqw$*-qGS&pU&y&NrBZl`N$Y=o;+p$@;nlYFCnFjI2Y?v8`@{N!nR=9TggUOFix|z)WsEvks~g8o3?k*`o>B;Oox3Ma3aJvP)qf@X+T9CV8hPFiB<#m#KU9#I z(@dPUFh4-cDo(+4a;oez#ArUhKdIR{MIq4Tzf+u-(LPXf9V=tBcr)IZBF<-6>r=}Q z6(q9Br@JpeE4D<|k4l~98d{k?WJmS88WQO0u}Pe_6%wdv;+M6>7t&;&(c*eZOs;(r>Lupli=yGh4qlP%EBI#^}>h9<)OdI6Uokmu$u$;?6wHYORwf0@ryd4-elbKTnd4%rQ*E4F+D@IXxn*xOOw3F z-7W=5-paWMDoD&c@5t4AjRUy!Iw4jBRX%?zYc9ZwfsiTQp zy;PLsighKZAdz)}g&lkvqOBJvnv1!m7jDG)nh*K=Z)b%-m)kcnf3-VA`{%fvjf#rO zO$HAxPxf5NMo>ZG!(a<*-!VknP)^2Jw;>zx`J)C&J@s8j0$tAHSNPTz2+@$26z1iFr2@?tezLbS1IGDd;Z zZ}q;{HPSfCTOAc7wuxU844D(GZ9XAe>b>*s=@&})laZ|+D+IcpOz~os@&;=+Ps#bK z%OU6WJdIkDhyUExQ9+_&ZVUT5wv13xceJBkva!ZDaGy%_MAO-cOil_0wRh5 z5{h7VcX!v7YvGwac3!*ds@J-9cfB(_zu)t&@qN$r-?cujvk&|1iT$0K0CK04%(z*L z>+|$(w2R|qg+SN7bkVBa41_C^Jeb|2+abp76S z`nUE$binpw3V|*h$%yv+z+C-HN*JyFfGJ}fByjX%XXkUX8ufc}O*cBaQ~VX-?{S}~ z@tXT2nAmrb*U>#!P1>%?89jPRaf%8OLx#Gs?WIG=><990KhUB!^(%EyuX?3~LZGX` zFEPI>=C6izml@;p)uk7T@6iX|E=f^AV&5pS&-RKC^2$!0Z;<-H()Q;{h0!c7vR_xsUp3uhQrsW(LhiOObowmc?^ zR2?rr)jbED&YT`+q&b&T2z1Sy<;D&ii6kS-%8awSbUJ2Duu*JqDT)dbr%H-bVje`2 zlzB2^`cO(Io$g>fyQ3258a>;M&Djx2vdYVhA0sKPe!jht@u(C<1&P)k?rh61 zy8%t<_KR!TvQlLf0$okTUd85o5#&M>nc=m$DfROm#)@|?Ls3DZKt*>p))YYs?~)m- z?3>Y_`IcLci}SpYK$rb8alT1fI4RIbW|R;ofL*`0)^FR4G87dgPL&rY77h(3HL_#| z;o>~6s9;O8D3w5$w|G*YSQ!!5GzD<^oK4mB>NE8$&FE*bSMm)F4jQu^E zP`75kEZLKM6#`u+7P_(SJ;F%UdNN~C(IzzMLm^%4kxNlQqKPJKiUA4r%&XM&)Nt#J!+`VX_#+(6q@2@@-6(laWxU(A$p~P{F%ou*dkM1cm zLtmkJD+IdKC&S%Q4QZGKa{%=)8Xy z8bh88=7-K)B&Z;fQcav}T`Qj46(_lhzem|+Mqrb{yvyI46#`uWjl^D)9pXvzpR%8r zHgJ?tqu5Y>>QWEoQ(@lYre>DcH=cN&l`T$*@9{=pOfuJMkGG(LM2q!iR&8fIY4uWm zs-KxnjP^}ZxnILA&FrKV+lPzbDkXnX*Je8Nc^_K+|BqEQA{mA}`C%*M$ z&(imYtFa|Hji<&wR|s^?OEfcQzj$)1vCR1MVNoM)LmD6M^4Wq45(RIYS+UdN%41|k zdYx0OpUW^_|ADiP1iDVGGqWI(@z+k7k#cD!``|E)uPg7XqpPvAE2C%PNx}QkR+acE z<|!6zOyi&bt*@hk#7G}kHbc;FbNcPw&)>1WOi$w>)h!Bvu6Mi4Y>@a=r?1IR6;Bsh z3wBK7FRL}tQ9(kEipz+M{~2vR8dTp})+>$g&1#_#=xTV-%x2e(Czs#Kj0uDG?wjx_ zl}CJTt)qfO*D9`T(}{Ru@s{I{>}NwshxVzwd+Qzwfv%wIVkfpz@uWpgU-aRy=VbS> z6h1R5SVskkk1bqT_pEqwAV_A6(`Q@8ZyL(`HceItbj67?@3TMkBQqDs{_can&R7aP zP2|63j@D5@qFtIR8!|4QEW0c-F1qK}OCB1`<2p`J2y}fe>dGd5=tq*4$&8fY`St$$ z2J@l)rs$|3;XBNg?H?OYrd*X7c6EI9q~L*k!=*V2fv)6+u58riexzZ3`MfGxT-RIP z@6Tr}TB4(Z#ON)q>|nikGOxA#ofkFw>P{8<^7Mfl6#`w>?yk%`y&uVJDKoD2O4VaK z#PHkix9X@M@#usrJ615Bl%6CrK2962?~ae+7c+M%1iCJW6DpR*^dl#OWyYsclXMpz z$s7LMrK5txjZ0#-{!KrUuv%sub)2F9=@Y?g#APc4y27GeSz5P#q;bx(ecOOp`naTU z{^Z0y9Tg-7|Lw}!UF%2YXUmM1+gItu7WU@pt&S)Jx|Ys#Wj*i3krJ2WbtJvrt{-m^ zz)!yXOGgEXwME@nv*3QDZCUw?GS@h$=PKQmXB@er5a_BTPN-Oz9Y?Z0$PD`Sh`uDN zGq3gfnvMz*lf{^GTEl)MqPfhN=5#^#x!#U9_;N=f(DfwSm1XpbBNc1Pk=N&!*Y&QW zTJsB|9_XkbF}}Vy5#dZ6={jC!^zwYJH?7o|?=JF6A<%V1oVpNktuNV-DKp$AebAc? zCA{A7_c|&_G!`SsGp*yu#hel35l=gM=0ZLGa`sn+Kv&0muI&ENzT|SwxqSoH+Rp$d6>ms!3 zf{NVwS00KA5{JZzY~zOaCENVulcCu`M>;pIG(Y`seuY3+wL)%eL$1E$=|h>}(btLk zk1oYev@SqVL88?}QI`?km&CV}8I4xD)9{Pmsh#`%FGs&{a{KmR4zH3~8EkTH1-iW$CCT zxp=pw&J-0Sk`Id0HebY$8Yg7N!+sSh4}4>kYiL#obm6E^?10(5DxH`2uCY2*Y?BY; zK_qabC+3z;M)7ie7VCMot~9V0mR8ryLO#cmb6aAq*w<1CRFE(Rnpx$vSYjD2dl{I4 z1iI8d91^G?@p8PGEoc)<9;}f)vSWYEy4BYh>z6mK2tE`{^%% z{E+ps-lfMpBkY$e>s-DMX?Zr@x=z$8WxR|c!~X1Ree&LwJ)Yc$6yGiH#J2+j_@%$@ z>8Ijm8>k@hs-YYEI-w7_Geu_X%IL;hHT|R)HKr;Ax_*i$!*feCsWwt(^t{uF=Q^I7 zHeE5%Kn02H%3^l#Wgp^@bK+F~#CCk!#lm#x%rOdqE|X|KMoo++t>R?Hf#I#V=VT{Z z`gw+d3K9*AyRmKw(WF}wc^zy0oACl}?zC+8WQ9Q2nd72gaw3}Oon^*2u}k{738m?} zUeN|BNVNXLm4&y9AumcuV$)~BpNqNCly7|uRFJTWlV}bOjwW?-`n#v+*XQM~RHUoY zdnp9E3X6;p?PEyqoQ$aP_4$vd73o9&UIr>iB<6NwK`M9 zyc{Pp8ZFJwE0pg^_w~ELP(dPMs4Lr5CYCgqBQy57+w+R4U1|8X*9w8IkTo) zey+^e)y|RMEYO)gPX5JELBf*Z%4QdhB^z>1u)j6ImGAu7mX7;nZy*6YiC*h zxu8x%8`m^YK?3hF@g{D}cFV_`NpwuT3>}}Z_(Y93WoFYx#gbqupY8P4NK2E_$@Hy0 zSVsj3^|{-0dI1Yrm_k>*4^;?s?Yd)TUuVaX_WfnXjy}zZM@%ZcG_ISD3KF@-nc2%4 zeTliR{MFWcdfyr_B8}c~wkQO;Mi&z&H7$)LeQwB%<>&gc4e!%v@$r>)RFJ5*Mzo1F zMc-$e%t+X^OYG%3jMiM?t`O*wW5Yr#WB<>Xlai+_`AZtDbFGk$3KH|hxBEh5q!pAs zfL%4u8i(J;(te8yD8IoTqI&0`Uo7zz)jRn67gaCAPZ@_#^`%$Jy-*Y+eu#cM)nZAv zqVi5`mC1}#r{d|l+T9caT`x^y{2{78ul^xFm3{11zRl46@>M)LT1#-`XI^k%?2f(jDFB3;?3VX@@( zGMTYIe1f5OPoh^wX%-~VRsN-!EiBQOwCyP~2HGVVjeiZLpQjGDpn}Aq&aUjx_*k+d zQDz*n1{jY6Qs~CeWeS0=ySKzlQKh~lqK3>kDY_$#qEczm!rX!i5?Xav7Pu^yyelg+ zR@EtMlq{P@@8!Ft5a?3xl8C?TjTvjwXx(2QEvO*jAWnDeA@0O$g=9wUtUSixGih{O z_gp#>=)yZxv})&{8GV<8^L~GhVdq|m^JCryl1%?NYo#`>%s(}Vl#7h94y-5Ij}<}0 z@=IQMfmWZ5VjqLK_lA`W6(nNC`>495dlRR;@=iQ?FfTtC6TsuYom2>P{n6Hy^}Q5C zI@FNQ_Ka->xLc$@KRWapLj{SI;+(k5UcJeVoIU&V1vv9JeLM2!1M(V3plizrSLQUT zHwns_L%!Xj1fOuC6}N5^^Kqackze$$ntkX^#;lar(LT5||D#J|-gZqzg+N!>7+2;u zw>KHTQ(njP@xDB~MkD@b_bLV|NVK}?%JLQqCatn$#;KhZ_@eiIJib-~g+SMlWnvb` zF_@&il^M_ORpB#J>+uqI8XKq}k^8MH>zEu&4nLL|@fYjxTFtBS3zlvQfv!$s>>NHR zm>jDv`#x8HM)Lg5D|OSd6$bW-v46cNSe%i2J(A4$M?OVs%!=j@J5SSxEn01$g2X$M z8yopGk`&J+$7&Z=_2r4JV)fYO>lFfB&S7E>U~VL7{IAT&7!b!_G!M|HRNG*ng2W^@ zG1|_GB(4QyM*fBIe6eFWz3bFX3W2Vk(c(<+=MlvCC^J4D?$2Kz&84@wzu7p1iFTaj9b?uh|?#T@%GpNzR|qN(ya1U0~I8ui;Pnb zB1pTOjLty`{J{Hq7U#VxfvzlZ0)oa*Y!rM7Q0P(h-N7_ofI6Hd++lo^|= z#__~FA;uzOy+WYtWq=#Iuquokx+*jJU5VvA4<{R^YOFI*LE@Z)8|$1FMzjy|H+b-9 zAO6pPImXhps}urVF`eDmVfQd%J}fi(KaS-0cdj&CN31YVL84}UF>`k}l;pi5Gdgq( z=d~JT8NKE#RS0yk_HImj5lR;AlNo$P7=PDcx3T%m5(5<^mWq*=WmhOUa7AWJJsHZo z*0LI5*B2`Ux_Y;BV^42|lKy*SMvsA^{9rZ1C^C4lfeI3T*txOg%R))VoO9e)&h5>Y zZ#ivDHZM>Jbj4}n@6kAvw3{I_1{~?d@2^NLz$AkZ~WoHOd1JA@poC^PC0Y|1MSE6#7cO*BwJBF+$P)EcpZr=iTKJ5A@e zCi?Iz&-y9^x+>fMPt8PnIhpb9wuMj5EX8|tjx|t0LT#h|jB~ z^_{oDq-7bIao43GU-hCqPjLx0P(cFQL{aHf&5cg3Qk*-jC`_jfF|n0(g30Rgkycrm zTdh`bPR;I#w=S&Nwccd*VL5-b`->~RmsXsw9$A>8f<(`EVg=Ww-sJWXNzAKJoepYq z)mWL~P8S_@Vc{i0$fRI#?)9H8Y}v68va?Pf>mxr=*Jmf*JFk?r&P)0qGYV$K@jNS! zD*ZO>&&gij6fNlgj94z`*=r2?qdyYomaI^Bz+R{mb3wcsfeb3YJ7{9i>{OLaA|E0!SQvPzD;Ol|h-pDuOfbnj&y6(l-{ z^Spxh1(A90W&Q5O9$XKt-i@!Xq7vw;E;81Nj9NJvrO#RQ8y?;HfISy=RFJq5U}E8w zM6KEm`KdbHt4is-+eTNzjpDahO;nGUni)bSS|hCZt=rj+GF750HoP?MOfxHg4E7l@^&Il%Drpdo~@pr!T*QPvtOKxY13KBCy zOl-=TU{dLm%&2eirtQ3n@)1286arm%zlq;@Qx96o*NLBBWUt(bNQ4bAG1e`ZY$+-K z9-oLiT|Lc>2kS)?0$unk5T9z&Ilb|~_PkSrJIY;xfB&d0Cbpz}$yU4#_h~H~{PZ`Rm4|t;x=o-5~oVAtMo8%rYGrF5U==ZXS z_*Cz8RFL>4&dxpfD2V)1JLfLBVMiPMsLQiPd{YQ?9h)Z3yIbFzWcHC6PF{KFy@c9) zw$D!;6(mfKCKlDCH}NYdGm2yurQ!K1@FL^#QY6rYPYFA_YttR+$`z&gmRtELDo8y0 z;=(R$=}qh}%lj(+4>Ro*S(2YUQb-}tr9OR{y?e}NeoNysXB5^ev@^5$l>pIO-$_BE9^n0Cp63KARtFtZ&-Ao-L>{snt_ z)ioAmrSfv4PACMr8h0==|Ehr`f6mA&BeR~de7&d~cyi2w3K9#m%&gabaUD5#$x63S zT-sqNu_c6ljBi*5C2m~1&R0H zMElr0h;$B>8QIkK;?4t=CaOVu9Jr zwv-GalNZU1o@v$fzndiR83_v%0$oc_npmZ-fh6BnM@`vSrcUME){xjE)KtQ$>%XnyB)wwpV5pUiZLKu2v!^OUEe$x<~^v z`|vQ3On4?UKK=F3@}+ztXUE6ss34(!S3T=|vKSMF@aG*SDg?Tk)D-U^Uj~wXH)Te} z{_gtYmV@|OK2t{p3H;lLy4Nkf)T3rz`uM7ovbrDF?GF&W!5Nu-NLkSv6g6I}%hCIP zf7hSScA=;s@wTan?Rp+XLUzkOLycUOsB?i=`h*O#LZGX<;ll3M6mLe`%8WIGt5e6j z;#BAz?i3Xyx^5BcAg4u99Ls7tl2 zJM_*G9twf3(d%7UwT@B5p}5S*x4a%560lXzJmo>rwOaHOx>buJCnrW&Ria)%1Da@A zrQbN@Nl`)Kuj(eY$~%f&9WOuCpI;hK^XsL0p;BH7fv!_)#FbZ$B1fF%r#d}aqZ77I z(g$zyrl=s{=WAlV%_GUVIGJ((h=ul!PtXs2^ic?OEnVco%n^~KdCs}v=|?C{=PmVc zr_vM^ByRbb*hjJQ-oKB`s5+_8@i4I!Q4wT&kjzMVUXRAk+iYBY>7n$gal|sHiivGG5lTvAN+NM#13Gi-3d8cZ zCq)H``r_N|wnWSUILUAKXLpURyf(#HALFeM=&D%O#NJm6Bdro-#_%D89@;$GDC8*C z*n)yYL9rLXd517EA*aIh^HH6K?dfd<4JoA%==vzW-8QSk$ef&ScfuP=_r7jwEGb`_ zqJqTI`7UhFq%hL+z5I4_KWI$LY!fTcI{GREx>kwRvd#^|NvmG+I;L!DLd`=SvW5qJ zDJn?Zoaw@*Rt+ZwAIppb?S?cqlXMi!`IveRf#uO;8DRwJc#`-@k{Ga{lr<0$rQY!#%26eW#Y8s36g0 zh70S+!%6ymnX&hCQ#!M49?OxDDuFKbPF!%LDZN^uhh=$88Hx%L-m_g;uR#&y;}e-N z{$djvb?TaB!&P5}Ko|ZB)SX*!9}e6#1ozQU2~?24y-aKq=)#>BR03VNi;Han6(n$< z88rh5bYV-R5?HZ=6-iiOt`hivVe5n0DuD_T*b><$(1oppO5jR8Tv3O!Mk;{{68N^p zHi0u{5uo4h!n6L^_ zB~U>E>zQm5=)!7Bl|TgvtY=aQtj5KvS*)2+2~?24dRW^8y0B(OB~U>E>tSsZ=)#&A zl|TiFj!LDhVE%VkE+o)}H8W}kDoEhp$u@y5tQJ!VRFJU!H^-+aJ~^>wM$N#r8Ca2m z>q1ll6(q1`#x{X2ToI!Zs32kcI*>pYuIy1WP(cE}HESAg3l(1o=vDuD_TxB}cZfiA4-Q3+I#z!l)O33TC`CY3-1 z33Y9_VE*^njs&`JW>U>S1qs|2%Qk^7oG(=g?2F)AWZV4`RFJ^;+-e3A=)%>fDuD_T z_`cpYfi7G{s}iUnfprJA33TCVV3j}x30$MB5~v`76&JP%bm3ZSl|TgvtQ@gTpbJ-k zs|32R>cuvJ3KCeCqh=t1E?h0I5~v`7^+mP`bm6Lhl|Tgvtdp`$pbK{|Pzh9!zTi|6-XzY$+3s1Qf&|VKsu@V23wPX93EXQC-_hg#fGU9s5?DoGn?M)t52zBTAc55o zwh46M{(vfhy%*fU&UQ}*6(n$PIyD0cbm2R1l|Tgv+?&oefi8S^uM(&rfqT>0CeVeI z3MzpL61dZxZ312RR#qiYK?3)tvrV82-`%PNDoEhobhZg};k#RvKm`fhY0fr*E_`>Z z5~v`7JI&c9(1q`ARRR?xaBn)>1iJ8Tze=Ej1nx~|n?M&s33v+ zXxJvug{xIm0u>~19}U|Cx^SJ2N}z%S?xSIwKo_nzQVCR$zGoHXPqU+HTKLK?2{Bsu@V23-{bs2~?24x4pIrbg6rJ z3+8`&WT+s4Z>`k~B+!LB%&P<{NZ^c~Z311m!@NqMf`skaL7YRx8d%!|DoChxui|t4 z@3)Htx^O3O^*T^NLamy_3?$HnJAtbi_;kiSMQuN+Q9%NCQ&uyOKo{1@sRSxW;I7cN z33Orgo=TvCgzerd66nI}Z#4rIB(S%v5;!)%eb2GiuM(&rfjhI?CeVeoyefeT61MLv zB+!M`ziI|5NZ@^JXIJfFAm5U5MIT#vp3$$b1G_7Bnz__2$hz}S2X?bZ3<>)jWZk;n zfgK$hN4~fOh$;&tP(h+@F-MkfW;7Y}Qxc^HPtiMhN7Bz-_vok~vBJ%f4PP5gYMXlf zMxcVk01d}yIn1KYkYKvWgC*&STQuE6y?;rK+(rzbq=_m7f&~nYpY{Zl# zvQ6wY=OgyLZt*6G#6F0%cDgFoB7aLFPkPCk)MuCK)1p(?>hT$#6cr>UcM^LpR~$+@ zJ(sI9lPCL8$A+`?XCB@Pfv#5nh#lo-4JG;znNgy=g^q2Nrng$}Ls3CO3l=-d6;38k zi^v*b&qPW$H0+=+cv(sz&^7C!nN9sPlw41f8QW?%qJ`^NbW1>KiV70ZBI8e|WYW2) z%m~=tm`0Cu(ciT6RS0x#7AuYeUnG;sQ)R~H>rH5X?Sf_6TVIL_63<1I_pUrC#Id-{ z@ZHjsn$0PeN!`jQ1iF@qjALJuN&lRTH`kleTK9=1WI!2;3KBb_%&cSQ6jI((W`sF3 zqkk5-q~%+v66jj=+|2UjN+ssW@;W>}Hl;nv7GMWO-4ZHD^b*&x;Zq7Ra&{369NCnf z9X6ZYtFIF1YAQ1B_Dm&hC&`Rvuba^1(P!A)r@j;wB=&@w*`6J#WTTV3j_>aq(*{$D z8XJ151iHFDGPARJ)5z?c{e2c!XiN|PQ^r{RcWH_W66eLm5x?MTwTF>G;umaZH-A?HI&$W6 z<77TBg+SNm!)A8HcQ~0;LuRxgb?J#?y9}DkgQ9{&d=)cu+diB;nlCf_XN%ouUL7&M z4Je@y=<2Y;%=pXUWMICWjJZp6o)$v0vJdF^T*Bv7-DhGq_Ev+)x`wj4t#H74{cx!u z+VRCP9Tg-9nkNxW)-F{{( znt1r3jtUZ+_M2D@V=yVQTxJC9d!R2`-;5qT`BWj$^|XhXMQ$5RB5KJDea*jmz6(w0 zdB+zzDoA)=H?cLPhLF+MWCoA^qUVeEqYW>9R0wqSNH?=CU5AkVQ*ttjcDQgskIh?LY1NQue8kMA_#~0KHRYYS_-9r6 zr|GsH@RyrHplduavvwVlh^ry5qg6^3+P%^P-SLSlMFokr2hD7Kp(GMqNoEW+SD?pV zf7COEm=pqCZsJbtxigVu%#s;Hu9v2lm*%7K$xaj%B%ZGoPoH{;q{1`#UHLupp!uB~ z>DMpz3W2W3Qf9U@Gm*rNkQpWXOVY0Eoatl-dx{DYf2|g48Y(4{Mvr91&`Pd!)zT6) z&Zn?KplelrGrRQ95VEYX%=pvSkxs7eOAD^ePf`-aL~mYA&zb`{_)^#V)i3j+E9>L1N%}7na>3lgt<@iE&~5 z+3YWAyxoyXIx0wnG&HfZ(=*A3rLwBnBiMnttV`ollNu-ly1t6FmS*v(9_OsJymjrh z_4=eVKI53Cqk=@QW+v83TvNwAGGpJ&&-)hS7rW4Aw^9gnjeRCgwW68iOqRTkNl#~L z(>A8^dG|Z&s30+@r-?NfpGo#Sk{PelyI9^HO6ISg#VG{3n6rtUu8~PXipk$c-WKaD zy?lo98P|sEs34Ju4Is;eW6yT@6PPnlMHftqRi;n>WopeVqYF` zDmOy~iTb_7>2=jI$-G7KM7Hmnb{Z!C0sKvo@%xZK*V+0m?3hO;IbxD6PS5-s4X>nu zJgcG$K?RB9qFVh>sJL=3c>-9!RdbAk+lKI2Q*&F8K-YWmscKirB(I}n#+5y8M#7LZ z{%-v<3*Nh*C%dq+O)|;A>rqzx6^PZ#P3s$-SEce6r;b`sL88?paUNvjOfvDZ%{L)&zlh;x6d^h9L)D*tH>>3LyNT}D*y;Xv7zD+X!HDZiH zpv#|$YZ{VCMrFv1!zHI0sbUS*yv}7Us33vgo7gX-Z$;`B{l@53-%PQ`f<2kUQQ}FR zG=el)Ab%f&TbHHV9CGn?)=4(!W0!G3j8hBNa-gd>`100b7gtn}_$k)i9VwYXf=@4opD#1sJhh`opVj5Xr+?FtK-XQ-ItOmf zAY1>E8O=|8(_QN|!=_xQS=l04$L5xbNY#|uD#H!bZ^9Y?$-)|t}9|4S2(^oL=c_~WNHbX1T?8)0Ha4`-0{oL#x{AK$B=)_U-%f1g(fbbWkkVuMYY z#3iTSPJ?&qc~1HBn_bT8s35U-VNrS{~lBbbRDsp*t@ow zB>IeeQV-lURd?7Q!6R$#)zMX;m5CiHkV*Pah_xO|m? z?O^ajXZG&TbQ0DhQfU)a0^2?$f=i1NcFU)ei528?7c&$BTpt^{u;s6Zlaiff%js=y zrC+}nPan)&uH*lO86HhsSgXb($h0c*-W{Lot8p(Om==1whFx?K<0UeJ+;NPy)~;h> z#a^eAHG$FA%acv4>cDieBSd~zUW2|E4;Kg10h?DdREi7N*um+_qYi(p>bywsjWkgzu%35?5va>dNZrMuUh%dZ&iF z1r;PJieByUfg{K$Lq2!+ja_L}+cStxn>>Xefv!GLCYEtLovg?!uOq(gZlhs=0rYnJ z1N%@xLcNY|wN4q^ZuO;2+dj1-fv$4#CU!SFos4sp89pU08lwutQog4+Lj?)^-o)8X z2YT{ZuOH~GR?af2tr5S@>BGph&=~7iu@c^{%P{g;tb{+YNPJfhhLPKCBM* z{!wrDcB+925-Y?=_>+`uYpy#!lO7QvRTTz$J z?h1jf8N|eDUQZ{Va(0NV($|TPt<;HTIOjG{K?0vj;=AfokOw{JL05&}WJsWEK|K?T zdzwzFhRG{;wHNzqjqgeS9(RtRf&@Mv#U4Uk+UvjkQ zmCyDUPb=v$n-b`16p=nbBZtg5`Ga zWO1%uf{qFj1;k0pKItP!iDNS3{(%YPY~55^{rwQKt{y4|mdLZHiCjGd#tq!YcF%s4Qv?4!V_W^vG0F~J`m?lDoEVgD^7~Nl0>#2lNpOw zmF6cL8}seeD=7rJ{KS5A`<5h;b8lqE<9y}$`yGV0?O4Y^1&PUGcbKCtLy6x@nPGWf zmG5a?mtTr(rV!{VCcfRt*OJ6u)v`T*TfQbAyQ(ICc($#93KE4bn%HA~D7lzRJ{eXn zXuut(R^Xp62Pp))_RSP;GinSa@9N5o-Ipyqa84=y{cenb3KI9ksk)i7hmyS&WX9`N z&3N?CKLB5mTsVeMDZskmS@*ca=ebr@O;~f zA3pEM_XKAu1iIRY{?)-K@u^zNjAaj6^R?807fBjvpn}9%`5x!kP*OPON!@EmC*FTU z9^U@!1cgACrx-gMUx$*KIXhZ^Z{LG2xc16$UOe4E1&QikO>ChhnOK74b)*&!B4f!9allPZM#4<-``dig$oFclfeI2!#0*Q%*2!c-h|Fl$CY1NA#*N65 zixmQ0hxVD+_9e+=*KGM+tz8(&%m207&`c`~RFG&VX3q zH41^QT4E&JWnD7aIY(xUZWhDWubW_0p0LJ11&Jpj_%(~SvyWef; zSAggtU(T0GDr}J%i~1$-w_l30s%N(vs31|w!OUvqPbG^c%Z&F^68N6kZY05Vn?j)L zgveN0JC#)4Dl;CW3*zlxWPPq}1}aF55*hnQDoLLrGg{dv@Wmx2TXM&2RS0x-6yH^$ zovCEddYN%CVE{k6>9i&9pIZ!6kmzG?W*b+gk|pD1hU-}|fw}%@Q0$t<8y<0Xc zjik<%*Reezj$fM>pf9!GV4#9TKXLCiB55Qe=lAhqZww!FZ;bwz{aS@U*JIJ*?46fJ z;-<@tb{C>~V||J~J04De~R-Udpt6>`$Y0na|bbO^|AjTt9ovT6WRW!LI?>|kidE-H3JEB zVLg*tO@%!q?2+M{EtSCeJ)BR(k&H@UjStoo;qzD}P(cD)36;Qf{8TvVQwda%zE$BDKHbg9)Mg8AR7dsL9XaiW@m?Gn~1*>0my zK>}-y)C?rhg(EVRKm`e`HL^{h3rChJfeI2>Yh;^17mkos0u>~%*2p%2F57=WRFJ@0 zBQ*mFbm85j64+Yen96p`i3$=pT2eERKo{2Xsst)X;AqJ33OpCuS%eT1df($6X?QPUX?%v2^=liCeVcyFe-t) zVyv04-9ttN39RZ+GmtDVUFh4rv1feI2hk7AoZ7uNNv1S&}U|BZ3-l)akOo35Se z$r^lHriFhPX0?Cg$u?D8qOH6(+!}MslZ|<^Nc*sUxR~)0|HOUuKScBsFBUyzrsi5C z!|Gu2W?LIi*8)g}^-5`PmVfnREv9|OZv-kxG>P$MkBtf1j3xg?pzF`B-mKW+@!I7v zzZ3X*uTAn~Kl(4#p1d4p#p_eA0~I9xNbzLGqovyS!^3{N4kXZ(+{J?}f4EkwQ!@28 z0u>~P#e;P|yGE<@H03`CbiH!&V6J!8X%)x*PN0HB;*XMS)Z%KR6BuJo%8Y)6|l+MZUuf6G7xiDx$)*nsP+v=yEHi$IrCJqLDf!%FS> z#lYV(Q2CvBU3SI)4}mQUwm5wQyxFT#ie{XS6L89pxZ?-XGoaV^?i$K@It={ZX zhvAya@OO)K{P_Y72!@Vy~3QZ=Vizh@wU zF8e3m>es3lM%n&yQm;hbh#J%HDa!IwBLUb=(@Mv zi;bN%OItJRcLEh8uve=-cacC>*Xv#^%yWiT^v&-Xs33v;U^N4;d}u>2wkdnQ_Vplj%NPZoP) zv1a$~_t69@NZ?pRyra*3Mh_m{fxldETc7*4Xjxt_*HWejSnr>7W@8IZ)#h~ywKfv1 z!Lc$cv?u3fYk&kQNDK{iW*HkMYeRfxwV^EnU9w&2<@oH@Z=#maQbtkp4q1$-<-LNQHDr~269Y}v_>&Uk4Ua2`vk^6qUt1(8u(!LM%osp%Zf`poJ zcGe(07m1~Xjm-*yF7tRN*7nL;%_Ca2wO@CH>iJv8(KmC}>8K!qEw!k?og$B?U z6_zLjx<>32D<=!rSw4S7+f&})Q#QLcGn=IdR52aqYMkoZjx_X&ey&>DQ z9ouB>$HF-wmYxff>BUF!Ix0wD575qTY0Or#&pDMo_!^)P=t>mp?vhq+(>!z5-SrqS zo~+VS=}h9Uqk;tXWbN#t@1|Q5>Zj4yVa*f*U2o62vXbk!Yb6)RJ~f?NhmAa*MyF)d z)=@zMd*pU@os-wF^b*5pxjCK+fv!&$H|7z$U8^=v?#a<4Yd1Slau~hV$z4YU2^?A2 z*|j}i*f_N;_MRLrsX>zGae2LG%mMDq4nx7v7mwkj`YNe+|8qmviXP7b;bM@ z0$t7rO0cv=o3vS3gG9#b`SXo?jfT+dbI%DXNZ^Q7tTH{m)!4Z-f$CjDH6+mGaK8j| z?7B&F$~{hDM(Y$R zXAJ_%TsI=7N7G5qYBN-jz!?NlpSbd+@$cC%dUNn(g+SM|Ssv`%jn&%ye`QA3%WsU6 z|Af-ES7tF(kieM`@%Jc_hd-Rvi+;IsKq1go?VKm;`+kY$c394rJWMFU2kq)c*DU*& zp@Ia?=!pFp#)opdWlX=ic(H+FgYK)n+2`%!H2Pz>6-OC%c1;fi@z?Lq>yKRL8>k?0 zw6!bZz4;IY*YA*`ELXt04U@wpT#{UD%7Vvn#N%HD9&DfljVD z(m(}?l7D-#YyD?yNwsChqh-zcYj0QjsY;qcpbL9ZVnyz)CcJ2m5_I9&AqFZ)lsWCi zj{48hS{9WVKmB#C-S(l?YxPwKbYWjh?1ZqSAuq0#r;j^^7^omIZlV|4`fQ$-FepuA zSS!`x0glyZw{u+-0$teG5|zufYVcpY7CkeiwSfu}fvvq*^MMPsS2yJh_?=HP@sCT})3f^vDFnLI-ym<9z@IH_$Eu&)YT(Gk zU5snqJ~3-)B{Hoz_7T(CK%jzznfkEU+PbzhT=w+a^-ti9uiCShFSi;^%~0S z_|j_t@3ildC1&*&g+Le14T$vytNQZ;LHYH9#%2Q*B)Ylyu*6q`wOK#ph^1Ejcz$(h z4LzyYCWSy3&RB>OhzG^-&UFIxJ*77os2~yW#hcB3m8#7;ATydy?aSxqkJI~>Uat`7 z!kHI4JM+{S9+^5$=eyS!s36gbd$XZ!#%O7p%$E# zkI&K*7cNy=93=d=d9w=F#%h~fWkz`YFy3tYUj0SX5`{n)wm#xq%S0D0MqV_fegR|K zYzG$7>abt@)*$P|Db8%#k^X*@Cq-COayc?*-S8`PFF<4cb zX&KI^BxD(P$1gR04lTl5ip|UpsNU7O{816sW7+WRx_vrXo1QMh=KSoP-Ryl=LEL8{ z{9?(2M(fp!3{;R9?NyW+Zh_gYA9oVO`M$w?bMq5M(NYT)0$o={#{SX0vlo7l8UMI- z;CVk5;PGw88DGlTvt`LE_vUTW)%xOMQ5JN0S)piluVP(927A(p7ucVh@5q>_ z5a_~BEA}s$*PlnE70_oN-E1__iZHvkPWyhX>|*^ZqzJpPIoG~R)jC=y*%x8qMLuVb zYA7?D`V8Pp+Mc)AZ`@*_f<()1MVN2r_t}1?j)M3lo+Xo4Pq4%#Z&e6%Efg79DQ~h@ z=VWAS34Gt&P>a{btp+McB#8|7J#VttQk^J4<)kZ+e6$*hayz|8#TZabl!+zV?R=ceRe)a(YMc9Cz z7qiRwbhN71@$+zherjHBkU+pz`v87-6qpmV+Bj%^AEML;ByI|SMS?8Gt;?#enTqD=hb)f zOru}*M4mj@#exbFeV;k8E-NGaN}J_dnXQ2v4ZrAtJYQW0f&{u&-*RHFpGWvbR0&vK-XF^@8fYZz^`wN zocFm}@wCw^t}maM|BDq}huS(Zp4r`R;ObDTN*wgLW{f)*&1=V0XQ&|2xvCRO&DGhj zRIr@)2{!$0-0RebU%K8#An?j)L;6X=r>Xx5h%rZGUcquMF_iNpgugyNsP(h+_2S+yO zS9QPiUNYl=Q(>NOXLoLy^^ZcJE4I5MEBdg4-#;tm%-y{$j(m-^6StpYXP|<_yj2cj zrFK!jo9BWAQNN`tKTx|Jf4SOTA<#APivXoE8%lC)izK;V%R^$*wsPV4IeqnjJpM^@!9q2@~^#`DFnKT zr4(Zk%W5|~(W8eT?8emMmx|TkZ?ifWs338^OfhyT*t6l?Ao*RzM>gP=^A)&#j98Hi z{};NPZrL-x=s6Ak{!@NeWJ*h3yR-|h<2u5?Rv+6}m9X}1%I7UF&KIO78mJ)g&kcL# zo*K71<4HG>(bUlRl=w0{xW}wL(cm=dfkyXnVFYw?>E6f1&No}O0uYCL$Yg(kX05p zmUiYv!*cPnA(ISrd0r^VJaeUHm#dU$Rf+21U3vC}Z$`7&DF!M?v})qPiuZ4vU9GB| z#WALL<8cK(84Zq3RS0zD?(V@F#aGEL_*xP%4*tA(`g5bs>KO(qNIY}#WEWf(@9pfA zEQlHT0{Hy{_l@EI&Qb_;RWB|ookHUF)~GM%eO@f@#Y;E2Wo$Sx$3O*%88toG&-9qR zr@G6GhC>7S5AB-KX8&A;K-Z@rF}HMb@t!Sqa_qdfbTA)u@}!|1T411pMEQFUc2RFEj*}=a)$tMTJLYSzYe^#gd=I^FU_W~C=xQAmBwlYdv-{H)XdRBqw*WP1RlQwG0$s=ED+Icp z7jR>>)-TjTOGsixzLI)lr$Mwz>MR`TS>2{>uFt-mN~4|ZYAXb~ zUQH~{u9Kx&z+?HT<{cQx?D7nw!3WFhs2~yIUYzxhT&BgW8zhJ}hYql+I6 zRqk?e#_X4B)|m-{IM?DTn^|-ijcDbdqk=@g_~LAP&1Kr9IN5T}tm$U(#58(y<8uoV z=vuR=1T&^B(aQFgpXyR-UE|l*RJv>R2@5Jn+^JE5xw55Nt?II^ef!SeI24~kw{}>e z5a{Z#tpxisdWkl9qRdF@8EEtod)DlVSYkm1iH>bcu!`fCYK{8I4DU@Njh$tN((+{j z6#`wOhm~Zr+V+(hxsx6lCEX(FzLG;2DoAt?)wt!(FVM#3RO9~P`oh>i!|AkM z6BGhnXVW}bwKDUyLOW!}P_f&|*u*gUaQ8HZ3K9i8J=lOo3$)|QS0Z#eCwp0tPBbEWRx=zRlLg1<5``a~}_$=G&5v zFIQ3_&~s~fg2y|5y74eUcPu2dqBQpw2t;)x-x-_O&Qv($ws*Lqy^Vl@)%srX0TfF({?Oct1 z-`PbW&{e017xVlwS?kkIe!CH|_4t%dm1)gK{st;YIPdmkd;XrHu`aT=G!GhH zc%VX{>(xvz)@0yV?baCi7t9~hlHZDTpk@R-rS4THILKwE|fjXd`sH%`ezH$ z3a7>@1iCt`_F}CTjnTetkr^*)bl_n}3ed7i;|x@gSliW$`9_TWe;9kus3?|r>l-A> z01_lg4rVcdX&SmjFk?V5VZwwcDyWzMvmSFqQ4|z2DxzYZp6W8^oO8}OhhuuX&Ryr+ zUEamBUO&0k-aq#AbWL|xb^WWP_C}u3|7#oedeTq%k z-k#a*dL@4$^HfxjIIYb*3u!n`O8aN#*~Oc2%+BwIT-GH^Akfv%+LxaFFcA`s}R)zX(9nwlbYs?E>f z*qJ?;`Q=@*{l;7s6(r`F`BL8&gQXS~`Fzn|llrg=otMeO+O8A`bY+e5rTwcUN`Eck z8Kw3nuw`Qw%CFT`Dk?~{tm;cMy!uJ&;&?{qdx=cWog`lfT`LgiN}HqgWVHDXE~j|L zy8ZoF_Ki_;RGoDyDo9Le=u11_h?hnT;~Dcj2Qb&t&E@r1)(Zr>+V9nfGcBd(;k=bh zjUUK%m#rc{jozrDf<*iXUwR{;m1MPzzy2)DsDGHDBXP&z=0PAO4%4^IJj5 ztWL`(bZ(nXDk?}+?BYu&x_{Sa&*2$!b`N9|q5{BXoPQ{ zf$Vj7Wp&EHjVdZgyln1EL((7XuVwIzLwA!{WxLjDNbY)pKo|DHwYTBZ`m^?9lGIsF z`9l93iQZRy=&oPO^;s|Z@BC#}BGa2qQ9C>ld-UkSzPgD?Xgfk0&1^02e&|o4wK0I% z8}{hU8;>)-xT>|K=Ppvd?|37==hjx=bFE3nW*(JamMcSA*YTmPq73z-iqeeO`^8?d zHalTN2$^rSPu~AYB+!-p#D|`cV)Q+l@+(}mN};5I_E2}ZvnN3p_RmFP^pINQ%HkdJ z)-qlM6(n#3L0idlL>+SOTfV%ciMK$YD{Qf%jsLa3A*qb z6^RX9>yf)(AZg zuwniL6(qz~@@7_jviftVoH;2#Akft>&W|p(bd%@`p3!?#0NG_{NeUtz362gP9r4a=)yCr z^*?@=B_03zEkCW|ESz&BMt$<6!xNJXr_*^aby| zPOlq~y`HDS-+c%a2y|i9g+^F4AXm+7fT;S3^y z)jZl-lanIIw}~EVR-j0rt6ncZn%gH$a^1ZJy^_7@0rwQJ!=mBVADsS|ldz>9F=A3I1r^uv#!f&^AqX>Y@WB~mYCwmNgTuRx&d zrOuDue>p`O`I0|hwV`#%u=aUs6+0h-3KCc)rj0r~*CJ+jcBxsnJp}??E#LUkX0@hE zJvZ=-Oy^KSHc)k>w!a!GNMN;_HVzk6os55VP7Uz)5D0WlF3@HnO`9W?ci$XIFv>5?Cj$J(uK^Bi_zG)xlGo1p-~i2WZDpIaB(U!S9@Z9SbCtN|>`r4;%?9 zNMLP_iHX@~AM$RUE!*r z&y8d?@?ZlqZ3F^cvHrevVDKVo+i9LL=$Q){>gLJj+$l*=K>}-~OiYH1a3n+f`Lk)A ztpoyHkB%1 zi&Ku2sPg`KdOb5D#fGq(b$`jIAc56G+9=M~pYl(ex~x^JZvug?Gvj@zO-8QNsvFOE z+wZG<@VB1ba{Vl$f&|tZX>$j6eU#ImhB5Px9|Qtjm6EkF8HZ(3LZsdUcWEvCN*TK$}<@iBycSP z?Ol=i75U4)X3X{WeStvN-I6|Z=Bqp@wkglpRd`>0;n|0!FYZCHTK4gnQnXB;Rnq8f z9gSG2tIgyne_P$wEP>_cM^jXg_^5ZFu_M+>NBYER8NXuBs%1C#V*{q!3Iw{a;#iv} z6LCbnU`%3j$RQ&tNSsf1q{kL)kWMt~s%2!g-=TKwo6Lq^8?7LLF07o^p5c58RN_9E zjaz(4LIsI+1x|F)=tAj`O}v&-E;~nEv~DQ78GkSg33OovxVAS(`7HHePO7$_*Y7Y? zkXVtb?K1dnvy^?chnCTxaJ<^F!3cJ%Zuf8`(1n%k+75Yx64a=}BblSsyl_;I@bz|~ zq5j*X7X|$N;JJ5^>b6>G>|4@qfj}2lNci z1iEmg2d(<-XoO_klE$_SZ6%|EgpZ2{jeS)lHMqjxt9?0HIXt88DAv_CK_JkDD^{48 ztjP%t@9#T`-S6F3Mg@sg6+GzC{Y6rHbN*hfjOo_!ljn!Clp*5;0$sTBhSpd6VJc6z zN@ZRHX3D4_@$*R;y75DyG|Z0oyzZq|mDTPkEY31pAkc*?h?tlRYgkjhX_3NW{Fcb5 zAfb2gq@R}-NwKBE{JF8vzd$v64y_8QLF3gq>0JAujX=o zlbq8kj=6=N5D0YPRa@J~y{0NRpC8Ng`4?qWkPxr!MRQVEcKXcKk=~nCtP{oRRsR36 zomKt+tet=a-VONw|E*-j>%55x5~v`7*~Js+;(y6LWUrpzef}@;uY!bl9L+Z|x>u`F zoc!KJj?1&7;~xhqL+8gDtLEF$TCW3@gSoNBoHcfIc69{z0pR=Rgtb>%97dWx1Ykhj`Vmdj!wuX!f z5`oV4w6_wd^iOK15k0Crp=Q6*$2Rhv7cT-zKrf>yfr}_8}j|>}y-2%{W^+@r$oA?r4mbk*gk6uO=puqV*R9 z1&Q4DwsdnHUnTo3|E}C08P$Xr14&X)Gb1XW=GoFcd45XSYky{V8;ewnN6Ex%UIzoF zBcW#7QunidisNOT5o*6ho!%>j%>C#jA%QOQvs#`_fD$sE&%nMCm#f~LHk53=WDG+E zi62{S>GAsh%BQP5Z>FDB1r4^Sgt&BGt>S#B~S(&S}F{(>+G}GNh`Mk50mNE5s zWmc)M4p~%}sHh;(e5#JNo9?Fkisk2{YS|!mc@ZIoRlx#*uE)1@^m-c)#jXvng82H? zlg*E4O!kI)s;D3lJxfQs+;UT<$McNXQDvB8Ruj_J=q3>8GCtQ)=3hoBO6D2Peol;L zwIUCk%~e#82sy8#e>r<98-MeR4M8^S(3*B+chd(H33TE4H!+zhnX(ysJClqB28s$2 z=kMsK{Z3EC-$0Pv71__NomIRGk z>8@Y?sDqY~<<^Y#d2P?`E}I|_=sNFhN1M#|*53=|XRuk1Xg1kQ$Ern5R#8DB>!L07 z+Ezy2GnOBD&95=6wZVk7**rra&{d+9Ej5n}uNT#U{|3Fh+Od-tKB{WW92FHLR+g}( zI;l#%$;teDMIAkgJ^T}OAlOWxg~DQ~-_{_4!`eZ8W(AJ0-zK_YC9 zj(!+4f44;+e&orm;+f8bsWWQl2n4!X*VEC#i%S|lUuvllo}s8HoYxFU^TF5i*A538NV-~6br?i;^pdjIR z!G>n<^fwGI;u$5CL^k^AWc9JBHgf<7boF~`L!S@pW$^Lj87tiTvlfSks@oT=Q&B-8 zVwnxi8{Ee*t}f5WpFMyjOC2kN1bhX=QL!I2_8%C~cp%H$W+MYI27~qvViPu*s+&t}5(so{+G<0q*yk8_=kSc>rpc^K@>^QJ*8lH^j8D&GY*$Kn?g|}T(sG@>I z+b%XVChN2zJdbD0tDVd)8}Eg;OxPq4=qhitp>?i3Hay?XGbU9X#HQDFk$cxFP*FjG z46&glO&%L=pXV7_{RgnuS&?#!HX8&2T|@WUP^;=M43|`%QM1|rw)s^P+1q}DiV701 zQf=s+n@5In73Fp?Ts37sz zEE~FP^e4j&NB;Y`*ffD1ezsU{TYZ&4pzHK2jku?6V_u&B2D8=Ptm&3j^3Z-OR8)`% z%Cn(=+x|A(2;&*!ynC`c-M7mzNy`KRUD7ujT6D66@+E?2#)Mmk0#9nmX#}^2?UWq)|L$%f>EjWsCE2w#Q->6(mCU z+tB6l7Rp~Uc*gOc9hvKs2lCaMnF4{XspWLEv!G|*#Olx>fj}2NqiTJF0ea?Bqa0cEDqeVcMIyI>_UvQftT=7w z88>MNE1XxA9DEZa5a_}uS?%t8p^tG@<#e)Qa6>uK#F_eAch#4<*2BnaK_1VK)AL%8 zRz@c}>uP)b>#BSVdE4_)<>sw4($PFxj&A8h&t!GikNej1pNf%7(Y^G%Vg&z^HUgP^ zOYZu;F>5^ev5bAdDwAz#yrY*AcQMA8uJ!clpY~FYzUAlq?3;6PpC{2Q|KS~hKo|BC zO-ybdx*<>BsjU|?dr?mLfPIwj+GpGLLktEJ#XzTa-Tf;TYfj@R{MaA3KH0l)>`}Z7?g=N~Ih8$aj{SAUpf@Wi3{06$o@;&s(d`l={hUJNIY%uCA9+K|<`GZ!qg1 z_wF%(nap1;qk_bX(sp#wHGidzAAjDxUKlRh|2>E`sgWxX=)!R(trnnSsC@E%GW$Mo ziHxq>es;9He}M8r`g6qVc=gKi*BvR${=y;|{}vLRg6!yzS^>((NdBp&|MrkK*BrvW z-=8lK=)#dH6O+p2P34{yQd!#W88RwJ+-qS+TVD-OZmr@O<5Dh$Z#_JWwX~Tm5a`0O zEN#?T*4Fhjq_f7qYssv@j%FMPR6dLmM^bTw)x<=3vdH+ZbvoN@-#{SHl{ZcsdtDZ& zIC$_rPN+US?Azcp=6JEKj0zGsmT6)V9Nj&<(%O-%V%dQLfi65I?cLq4<>A$Pj$l`Q zrOBuuA&%T-9N8OwCviBNUt@wmpiBI&oF+um;0Nif^rUJsjvM3mhGV^2z1oF^RCdW= z^FH~@s35WJfgSDmE>OAklYdvAGN04N-_qIA-6aJAUE&yW@YV*TOU_-|^Ku~hyjMrP zMwux3Qmu{qYw74qhu?-CS#693yL7Z~wYP>t-}v2m)sRS1*Cva;iwYvBAn~KBj#lpd z)?oaL|IWL9iX>Y$n9)&xi3GalZP(G>3!fXZ-}8*JC8LP4VX^W4ydZ+E1(mh+UCf^u z?v80=6p5quQKZeC24U+L1`$+{XcnxaQ;**^oS(oy)u*qKq-4UEu=uGWfv#?QbaYg$ z+lH+_`KR(b5lOCYZxcQ~A&8)Ygibs1O7CwO=1t-mmq$jDA9u3CC+I~2UB^@%^{ju^ z5NgAp!XG|sK<*4b8{YD1AVCF*WTK;;M;|vR1w3O*NCT33+g!F9CKBk1I;^e35^%zh z?#VMQw~Zjf?fm47uK@%VB&KLjeKYnL42@3ljGA2uvA)|%_I>6r5a{yOMkX?9t~6{} z!!wG$gpt)`tZbd(M^Hh+O)1GQPRv7xM z=NV<3P06s6wOEtI-(|dqk&Q$_`eZjW@7PVrRUR_4Db%lFn~ z=b|bsxJwCw1iH#JvZcQ!yD8fm@Mi|+*>7$KVYjd{Sdy*fgoS5lTTY?G_m-2P=SD>pBn8!0t%=aT% zUrMsrH>CsuT?MYTv|fReQt1*ugJYfrkvnfq+0Ri<1QjH{P0~@x-$`lHf@h>XsYK#p zU#QLAxd;ThvVQ1j&8POttHnHHf2FF#Ipd~U=bSdH3KS$HZ9S=(w@WEm!8{{St47XA zJ*{R8_YeqlxxLrXI=$_b!f`yK@T}98e)=|TLYvuOE zHb%Ub_C8mzse zUlBqY)!eI&vhpPO*^OOwG`~QnY;b#bo6~|WydA{ zsm7hIOFleXuFfm%BM|7yxu&BpN?R-Cn(*(+vav+yyIE>}sxLtW3H%nccaSDwWKgN8 z>W6zGfv#@nbhK=9OU1hu&)6L;lcdrK>hPxi1QjIkJZUY_xGya4^C&V$=`8fsuz!X< zGVOWy_vG-)wj+t5YO2szL*nf!Z3VNR?euFtch^2u(|a4kJN_I_u7`{j2z15TIne_% zy6A`Z;wu8(`S>#2{cb90R&tt*3KAcpooMjSmioQHJi{)mlw&t}nj{~J7GP+m{DxkC~uQ8iyi1&M@f zj&!M6r2cUL&sY>PQ8qcAKz2+k5(sp;y>Or(tR#K)L;SnCQNfba zCG`@tIR(lqdwOWRU%l|&9gK;A_H@&uJ$3Us@pluqmgq=qy^5s#dozNHKsab?)+CLq zs|IsoqN6RTv7!R;u47ITK|$if0()Acw`1MVMf|GmODu~Y(r2%!snnJb=fv{&#UeHu2%1~C-HmdNL-rQ2?V+}D|R&C z)RaA`D>$+9`fPd4u3qG#yhp}wbZ8Gp+NDc~{-Ir0qxkKPHC-l8?cSY?d$dnR1qrpb zBVB$hSRb{qiW zi4(0I=qi6ReeK0O<6XIHa>c7n$r{&(0)eh0GfUC!@~3*0bNG?xhCPv&YqR2qHGL_g zf&{iu?R><2kaHJ=lREkj0)ej6CZ%YVi2QmlJ9gGG)Z-;cr4u2<>eNpe6(q1tYn4a? z^<+x?0{Qk2AA(O_!V{Uce&UOR3k-YzSwC^Sq$hPREtHSn(FjnGNSdIdD-P!vk{a`S z?UMd=NVUrAW!q-n0)eh=skStwZ?Yk#kUy71yT zw!5WKbrOC5oLoD=LmT!1>bJQfHy!IvP(fn2lP!IJyQRTt z0na#DRGFA$YiBXTRUpu{)5?w>+3#*RZ_1Cn{Lo4y*6EdObJ&HTf`ro~Tbk3lv|-2+ zKHsNXP!RbZX+}O(a1sb~iND(JTm4DvGghRU;y_SAV(%+kT79dsXZ&n_^_jcGo2>e5 zPdwV$3k16G8lznkTSt(?WBueG9|K6jA{!c)I@7SBLX7c%ua1_gHp}pFNlW9JEE_uW z;Y`EJa{LVbh;Be`hnUEj^8*PgNVL@Hs9R`(VS5rE*>1AC1{s=mTwVIngW&p-xKgEG zE3L=6=cggon)lV5twPD=<5V?krCsSjK_YWCX;7um+OM*Pa;~RZQLC;&0$qS)^WbB3XbJmYHF2INx{b5%Dhkf4IZxJfp2!1K!ni=X@%?zt369(OOK56cD#1iDUI z>8SO!qlTruc*cyhNV3>tK2@6r5mb;kIL?Ot<#f!@_ao0Z`#q98+Ir16a*jx#YrmQH zWVw2mp-CLi_~95u8f;CfXPX^FP(h+Yx()sIdb{D)Ki9+;Zz9RZryk+!Mu`Nv#Ma*C zR3!QQt4;XiUO@yEB*u-`-o!oLXmJ0`kK=@EB>9lR!uME+1iJ8-ruA`}mLx~~st{vt z34$y3;#$1Nw%OC8AM^Bf>-b%*qr(v z`;)?+Rsw-8eO-I%9x+Y7eHwpSnysz>;Jn?3^dD+XP(fnq9(&qh#9#W&FZlIp^$mAY zYJn?hw?Zcn=qlxJM;G=jum5SzKh?b(UL>=U1Nr^dj-Z0X^aXa*xrV3St}(y1H)-cj ze8*dpWoZrqfiAb_w)B1vo!;&*{;7@!2N2W0Ey<`a4g?h>UJbCLF$I?T`7ik0VE5nU zNcAD#<&ZPZ0)ehhmvpqS;`N@KUqN5d-`xw%v^NgxF zVI;ZL1bIqVKY>6O-tDw?SfU8&F*QaeS{*$qNPO1ri68IHH1u1_uO;ctBFN}k{&L56 z;++#+cu&;UTk?z|Ha$C4RAvPcz9!ti?*wsuIPv`;5~v`7YtxAtNT3VfU~0X)&5>lr z)im0$RS>~SPh3F&SFslfRFF{4`qD*xe5G2hJj3&ReR5-Qu-a^UfIy%t^t~?) z+#fGFZylo%eYO!&?o$)>j(q?@1&QbVeQ8YncxiPW&uFDRGb|b~T8*CNClKgbc)*t? z%ukm3HRKsBVkI(BKTF%s!k3_e#J76BbY|CN$v2T_)Q_o4)<>^W>m2hI2y|W7j(kIv z5t89PueGf0T!$16+o+au^d_hv5#yxo4cK|O)Lzds+IxnOE*JN!!Dq_|1iEfS`_k7P zCrJ7bp0T%7bu#+Oc{Rk&gP?-Mqk}&5jOhgF);@j)?^#zSUuQg53p`u}0$o$weCd!e zlO?C!85+^QOhvN%`g^tO_tFFvB>Xb9D!P}Gq*pC@#_YoZ4Cv|23f@@@1iEGp(^d<0 zoh|*0;2Bp>JCVD&zN}+OYk~?ABR+c5Bb{eSlkf5~_}!N$!J}CgkYy+N@Ik-!dvlqz?6_NBhs07VPA$WcAw5vilE-S>5<35a^2E>`j{n zEtJ}i9HkNAXWq!W1{3z^(OVf6Bob=Nx*Beaat4Ed_VrXYjen203?CXBM&bs6e1=+DR{3 z^2ict!~mYL+jN~gVM!O(=Idb@6(r`xdeMj@*^;dv&*(RHv1~By!A|W_1p-~WTYAwC zZ*rukO^0j5@xYmK{}H`e^zvOYDo9kh=1J3TFO^)(cq?gdF-(5=A(7Qj*d!3>dg$Rr zy{_g;&(84mGRD^LCp*OUXDKB%$fzKpEc2vaZ{$ec8T<^YQfqmh!$7v{)JlOs*Pi2^ zbl%owl9LC|h|Y?ThtC?sp3Gk+qk@EMM^BowBv<-+m4CbKbKT`V4Ti9#m*xuux=gEi z(x|R^((tWAHG-LZ2|qYFl^si&E~A3P`CVmbndZx->k0hZ&CXjGUbJEaBO6Bw1iF&6 zH8bayTp^wPXU)u#k2{2q+CGxaS~);Q1qsUrWoYBa%cV2z`H@eUJt3@dR2nOLzr8@9 zt5dx)w8Z)qQc&7pjY!vKnmFA~V>L~qWmJ%;c+7*2o}4FbCaD^+w|q-u*_SVd zBZ02J9azc_u{NA3Xs_F>lxOPZ5Do9vYaHHc2mr0d^`H`Q9n5_=lK8zVx z2MGka{O-C^N2_Jh2$k0&mwK0_=8a8dbt`-eLj{RtV_m7k%N$9{=SQwuZ&0@k)9TM- zodp72A&G+!z@$Sc;@Kl!R& zI;72qd$md+(1km?nwU(RZo*h-7xvf9ofH)$a7R~h|5|*Lk243bZbl@qG6>(F9<9;H6R{*>+;Og%pfp=%T zBV!e%NT7lQj@%bdpbM)gMFJHh#5Zvo^WXIf33Oo*V68Pq?cmiEmMJW=fAc5~A zizm>9Rg@xu3KIBUwRi$uSVbuks33vwhl?lBRs7Q{DoEgaZZQK1bX^tR>TAq@tpx9P zI4cnEk75QYNZ@?G;t6!&4uB$o3KF>MpGaU&2%lJS_OD2wf&{MaP&|Pyoc${js30NM z_G!$2=K~3J75|)w3KCdLD1Is=(1mwYkw66rtZ*!zKo|C}L;@8guu`*l0$tea6A8Qn z;Mi;NcLP+Az|mnb0||8DULYcY3KBTVT|9v<+zUh`uqT8wE{g9Jp@Ia?r4TcaKo_oS zArhz{fpaN}C(woKT8IQHNZ?$G;t6!&x)vgV3KBS%qId#bxUPjrpn?R>r6`_27mhiI z1S&}2T#Diebm4Q5NML^ecP1^qZ-5FCxOb|Ufdsm6?yyLpf&}gXTRed-oMA2!s37tG zxU0cDc68xPc`*YOB=9aO64?E!s7RoKggBQ|WB$9VA%QO3<5bK*1qqxxT0DU+ z+~r&(P(cD`v=&dG3-?|Z2~?24nYqOi=)zs+MFJHhaE5X51iHk1!!_o=Gl&WjI8$28 zKmuLjUf7s{3KBTuTg*TLUAPaoNZ`)zxZgU~U5W(uGjX4v;`^MaAb~p(i5W>f#A>jdRc{)(>7Vbg2Jl1}aEkow%5R1iJ95EfT08f%Wdi z6X+`bZh*>y%Ky890Nz)`3{;T7wFrtQ(1l~r2|4sbs!m<8;iNJs6$zUy!e~nVK%fsXK z?*Hy!v>#H8;k{ewWIOM)Zar?%7UJ-Yt?{8UKn z-|s+A+|=t6mv{an13wkIu%b>pa#WD$*Uo|3KB}Ofz^0gEHhg}(xkKn01*q!iu#>O#F6{(Scc%s>KN`0EmhouhQLY1TGFVgFV} ztkm44t!%U)x5&^snb(qG1}aF1bzVqdtH#!jwQFJqDo8Y4W=mIAurFj|6Cc6 zKo{1oi5aLMF-fcXSKT@rn*LM!ipPNjy0F?!%s>T+yvI7)e)(uatpr~CiWx|ttN3ph z6(lV7>*%zZa}66E|I9!FU3g~2Pc=MNN8NY7GpsA!%Gg-@e_+f};W#SA3Sg};B1Km`e`884nd7hWYq0;`0uny2bnZ`%K3uH<%*SBz-? z{(AzzdbJLlwcQr4{v~a69b?2=IgvmG32il4I-=QRDP7`~VVHpgy0GR?Bv3)3(>Gtb z;7yv8x$n;mB+!Mmi(&>UNW?n((P3|fN|`_Z%s>KNSc55Mpn^pCU_a{R)my4vk5>a~ z|Nc84NT3UANksw`B+`i=?R2-JG_%*A8AzZDYhuL=RFG(-WhCmFOOF310||6trLLG! z>OmRm&~~HbSYoJgKu0gyl&+Cl#}7AR^^i!+$@HRUudkLKJRNStS}CMO0u>~%3aWSl zUB!PY{H?91;X^z4FO>qc!$PUCEw53;3?$Hnm7yYm3KE{TedyIe z3#8#8e`X+oF061BGf+VyzPvB}JZ`SE;pU$iNT3TVb;S%+kT~4bm+sD=EtRRl>r%CU z|DAIr(1llUkw68Bc3O@5*DX^d^7GFOB+!M|c`*a;GFaP*zXFj!1qrO$ES^9Y{{BS* z6(q1~vv>ksc$E+dyaHhLAzsHs0u>~%uCRClT~7PT(DbDnrOa)-QcwH$Un@Zc39KtD zoicJJ8wqq_jhUE%pB?KJi$4xjkignSF#`#7 zeF=A?Uj4R6RTuF}J?-Cr=NuIzuy(O{0$uOVxKhvjEs|$8uhhc~RFJ^h#o`Hc4eRbg zhp*f$c{k$qgP4H|5?F~?Jb|vZJ}$I&>Sn2EGp`233{;T7O2py`bd4SEOb1B?(zBa< z%}mTd1&QL@6%yzgyTgfIJ+MKl;T!*F1}I2iI~I4s{2@E=kw(MrI^B%?|8)k=RQUhT zO>y9RPZ*lH@sT3jpA(foi4yx~DE~v;saZ?yy)})QJv$bj(o9D?oy=7N54SOfXnXr4 zR#~p>)b{rARBdR(3%SaGJ$#p#mDfz!mblKWg)61ewH)Z3L9>+I9pnD_B>(T zsO2R{a3?2%3KDg{S<)a&bG?s6LydSWmm^Du{F1+Saux`5MIW}JH5#Vst%DkC#4%Qh zQmQ>)*o0!zpQE_jd-;_ zggk%9LtiwbHG=RL>e z(XTuRDoD(*v80F3<ZC(M%V#`qFckTB_JPCqmqW_Z!HfkwF3 z)D!BKCHvm+5eRfm@wcD{!b1$l57gI)_EB}URoGX_MuRsI6!^Oz@0inmXFUyb_wtP4 z_iB?PXA0yhFTDf;U3g|qOlrl{CSyBnkryxa63#gi^-5aMS@X;chu-mwO0#N_1k)Yz z>hdCiECF7Ne8T`nr z(F(+}%|~_7iP8iWB*cs+DM4hXu>`vw?IaNBI+krtSCpKhylcac<8ntIA}Mw(gxV8S zkicUyF&Sn0m;AyvfhFGCCYSnYNozG;qU2s~VthE%il#KqR{HxjGR9h4(T!u5D68H! z(K6<5Ops^i^k*yDu9s0kVscGuI&s@lW!+VN_1R&YCofjJv0t7CmUR7rEXAyDVN%PZ}QrKdbV!wXMsT1oy!)~>ho+RD}lH6M>)Ub6`Sj@x;wtf zs35U+s09r;GFNeK#xurlw*S8&Q6V3m(JQO{1T2&EchhTuCEPUTw|GH^^Rvu z4z*KXYDBwzU&2vA!lHu>^{KjC`IX7v8+@K}gC4cYU?pnU%SfP0_(n{A#cZR4Ju=wO z>mI^)g~YW%CFytX<;t1#mRd$&ZV;WX?ZLBaV=aLYT=2b_n2enFN%cC`osIjvRCpr8 zr?3wN_H?-20%gT%{uX)D*k|gm$X=}K*Rd28B$me5)6!KJDywPzI^M;a{tnAgBK7>P7P0VDc*=)iY+}+R85Ja! zytks=l5&+zcG~aXM{-D^ebp3G4u zE#cRavOW>=ysSY?8MjOz(1rJ4Z699maPrH4w46EFPk0u^r%dBnGuk5FU|2CBLd!Uv zA5OAr4wX|b`w>)-SfV{MuAZtG4tq|NZhkDr{&LoH8d0|_cfTzzdueY#pHQ-6nR#JG@1;&WkJcz5?8fk2n8xf$&pRY7^sf@kC# zBS}a5?%_lF1`$+{*md5FZfR9PnXmGUc=sss__JA9z-*B~SD#2TdQ4YS(TDMjkTOx^ zrOk0eS#4csRFL?3!i-wisjmDikBwI*iUhj)HPw!MV7TJdjAyhs5J}ej zj-x+%2N6_|@VRbA&u@%UHk{!Zm#rhooC$~Mfp38Vfvz_F%&4<>E9G=1&xlKCK8r(o1QjHDzcr)T$6G3%X8fF6$Ppy6c7PiCHb5ZIbxmtmH?lh`myYm^PJZ=?nH^Cl zvdOb?#XtalhGS};j1T|xUr0fDZ}Q)cvaWQx)*o&N@D13mdZe4#q_ zl@CD$iM(#+bm^iLrO=f3AcLRPAsLm{s*V%A1p-~&FPhOeNrM&Z89bxe7-H4mXzgv6OG z=Jepqu}T`_86NwB$%YoU)romxKMGygLozX0_qsbfX0=Z>eXvwrb=aIft`}o?@QxUt z4Y!~%QHDL=rbZaCH>tJ6ym(gVN!4jZIVvjHOU1vWJu^J(!6szyP`6iECS)LiJ#Vcy zq3s@-_jkV9b4;E0aW}6?CU^fR%7YKB9iL#=BR>Ar;Mf@rJQdC>^ zv&j$jQNvj(DoBWNCg>4-?FT6$bLUsP}60~lcR!WVs#JKZh2|D#lcg4RFF;=W%MrW){R9=OLX-7UK zI+@M8el2|9>`f{vNW8gKg1YxkRG!B0-=MY4AXagrhuqSxKp@cdvzZxP);mq{o6Ix% z+#JB3#MP5ScWzKoK_b3{8J$}@O>tbyGakR~&un`2k_(pR3k13z#hcMRhsP>AckztF z@%`EAc7tU5&+AlFkT~jUM&oLaRcc(~8P7KNW!;l!%Sq~Lfk0QYm1cC@%PESnCBLg3 zmiw?fv3c@{w<}askZ91sj0TLKqPX|xcLU?(9xU(HF8SusT!BE>OVx}vtu)plh=>&UkF<9L1(Gzm{zN z){!mz{y^?@DN{uSiNvF3G$vxMl90^r21yQW*>{JZ@=T9e0)ejN2y@!Ja;6fc@{Gs& z)-2D|oJ3xmrlNv``v>jYoi$(ievW7S=--_ETxUxzL`)J0bUhnoPIG!?DMj`98Qim= zF?&$bnXFqpRz(Gg6m3+^dR&&$C7q8mteqRlyc>IvHmSn}0$q=1YNMRNi=}>O(k7?B`F?8}$inW!ce!_P)GKSslSMuDtMO z^(QqX%R+orRFJsU!h+WQu8mB*=NaFBy0Mk}nvsQb90dYhajPxp%vX8Jvv)k>PG|}X zG$w~P8(Sz`MNit9(Q0KoD5t+jM!bS+SJBBStivW_SdF*hwH=9(4rX*jw^quJpOThQ zAv1+tZ|P^e|3xIwWp}g$?Y2=;y7}_fexpYUGv265_bP=dDoEs)F{4us)KJE|@at~h zp~s338+t@fmE>86a&<{4Gv z2C|kds;Gep8wCPg8$8WujYhW0h`T(aL(u>>_*a-(J#T}G3KBKPnNdSz3FY^1oM5C#%bUu2E4zqLimO?U=aLu&NKgCa(FK zz^-4+R9lo-EfDB>a@vgk-d<$rGlpjrtw>;5U9;4ixvNxEkPx2}-(K#+j(X;(leexE z2y_YWjZB`b>&@CltyT-#u24}y0-sAwOj;k9Ccp6PLnhSTDGy%jOwX=gsWdE|U~F5h zG%eF-m9lS2FJlP{XKHM=MoC@XTRV;vX|lYdSprGS-X^1hM5Ce3G&gjzlgS<19DzXB#)S^Fa+^)cv)`OJ*`b`=)O|2{YRHmNL1MnCBV9bYP#Iahi$;8E zZzboh8%mt_%@PQ7^*>gMp1oSAgjVRP5suG3hCj+lB^#}$%cvl+xSj)j`fanarYEmZ zFl=8L-nqdDa&2OUK%nb&d3zf5Wvk-Yn~zyGD~Jhiad;$oawbVe1&K2A>}ja~Hl@u! zyQQh`=Z5XCl}4JL=pYd2I(SX1W2s!E%-+n$EI0Wz30u-Pjl7=~E2Dx$g+}(YU7Kx6 z_&q*y_dO@yc(#2yS=2Q`AkY<+U`vMvZBugEaiYnU##FtQPV%=_mr+4t<`G*O*kZe~ zY9JpMbVBH1`2*8(*No}5Sv&&@l`uXAHO!Za*fvyV))^x_rO^Q<){@&nKnI-Bxt5ovz`0X%MkO(_$ zO*eihRE`DnUTXEgEh_7tLcCJH>XAU#^hj$OJa?0lb(D{!PSzEvw=7bK!->gzP(i|E znKk{qv{1QumXFp_$0O>MBT2;O&0ZrC=vr{xl6u@(r&#yoM03mQs#V9nB+#KQ6%_cp zqsv;+j*s(|xFp^aW*KkPvh#Y7-N~~B0$n!KE$PZfYn2}-`P;q+ciyWL7Q~bMh%AZ< z65a1wQp@Y>6vGMrlyP{l8C%sVja z-PZGcm+;!o|39{~YWVXy|3AAZ{Y&8W{7=F@WUqnW8MM7Q?yjPH%Ve+zU%lm2GgmtP zaiH||ZC|6?PZwJ2b)YoqMqlGHYgfAQexP*dWM7SloLEHHcxA8(2Rvj{ka+OYg`PDH zk{+z)#Oc9DXtG-dtIeDR0$tZ`y3lUcLDJT~obWhpsvf-1M$5m>yV8px0aDq# ze#V>$t~9Z0fHdW2KV!vVuC#YvfOJyn$3NBPDd8EW+MAz^sRDtni6dNTg^7XEos&GH z!a&pTI~zx_Qy;s_s30+-iz|)u43zvMdB%v68^WG@q_ORjItc{2@R+n6B!Be?%Zp26 zo{8;bRFG&N<4TXW36vCDp3$ZHcj@b#G!}I%Mj+57epd|-B+8$9_GckC*2_aLyV4KC zeWWWB2N;7cxYF5&e54<71B}(Gy3vVWd?h-B&rj@?-(9|%n8X@|t&>qfqT2~qy19<8 z)ZCTtZ&2!TV>#i)K=yQCo{Y-jB3HU6&rkXtmh?x)$>AZg#iL~AxL}EpfyB(suGIak zpOoRpcXkMJtSV3MmBOCbWD5kkYTefIYyu>mfqz#;&#dLU(}uFuRc6bmAaQD?_U+d9 zmp+~1NB(}Ysa)uh%4(OKDG=zw_NI+3ReTZt`g1CaUNlu`S4ebU=t?K-@|P?|@QmB` zN5XGZ9?sS$OcV%oVLR4#ifyz+?w%gch8<*b+axzSr;LyE_IH2d*$HlRo6cJbuAO9T zrtMHsVV1Yl=_fxQncWx5ze@ICQh_R?g2dl1wKLe=OR`!rP$ObD43od!Nn}s6HVLf+ z&p-YpZH%n{c-beiFFV(3tB`@jjuvjTY&l2Ujdqiqr4?0@jTz4FG}GNhYBGr*dETO5a;3sL z?1}nKMg@sFv2L{8bT=s^lh0i4*zS#dWf5TywVj%fKv(QpH+sE|hg9PkZ;AVZ@5u8b z8nbhqp2(;mQKyv~?Q+XaT04bj^b5WzJ7zUugO@)N32==*;6|B$8EM7|o?#brLZ(@* z*ly>WGAj6YTiLkLznnd#$xrzi43AUfLu=Zx;G5?K0$q6iwP&Ba_43TUo!PmGM`cuy z*z&`b+VAv~9FFmfx}#Rgjm*2T!AS=N0$pOe%G|zG?%^EIawhDRQ9d7(UBve6-mKoGs5q+|K3yaUOPnRLJJz?7(6ER(Fot;_T+_qS<>K?1wjP~|B0pP zoiR%cFC6)`eWRxf(MevU)v%HRfi8<%E_AkaAA@TmzjG#(btk(wxsh&lbOaS7s>Qj` z3v0R?=9l2Dz5Y^f(&x23`Tr<;@31J62HJZRb3{RyK_wY6gAs=5Qi&=cU``k?gMfe{ z!GI!Qz?|2db67K0cbT(mcFlRsx`s8UTRqHpPx&(Udp`f-@tj|ust(oF)zvi%yO$9N zbPb$lCkM``oZF*_+FnKe<3z?=l_VLP%Mw(Ocv;j=uC(1D_v}pdEa^C+8flxWA+Mj6 z7YKAU>uE0+@-giF@<1(By+t+2nT!8PlX7hdDoEVBW+#`_*V(&qgnB&g_Nz-?+`c2V zA7(EQ=+a%Xmv_I3ZT9$$S}J{+`sCiHzoqEGT7n7^{=8*)7c-+-?Q!b$;c~hmDXC%7 z_(l~40$ooNwerw;#k~UisinHLwFwz@e3Mk^ZY6>W64PGV%dSbKygI*Ee@ke>Wl!RG zWu8=gsiQ!kYsECJT#7n+g{@LE3Wa(R5;j{p^T?5)f<%0Atvr91i`Tx!ahzC1yvfKX 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

b+U(?87LCyY7pl~a{DAJWp?trPy0>{ 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 O+{8cvT{wyw#{UCWK9%MG diff --git a/alr_envs/mujoco/reacher/alr_reacher.py b/alr_envs/mujoco/reacher/alr_reacher.py deleted file mode 100644 index e27e069..0000000 --- a/alr_envs/mujoco/reacher/alr_reacher.py +++ /dev/null @@ -1,88 +0,0 @@ -import os - -import numpy as np -from gym import utils -from gym.envs.mujoco import MujocoEnv - -import alr_envs.utils.utils as alr_utils - - -class ALRReacherEnv(MujocoEnv, utils.EzPickle): - def __init__(self, steps_before_reward=200, n_links=5, balance=False): - utils.EzPickle.__init__(**locals()) - - self._steps = 0 - self.steps_before_reward = steps_before_reward - self.n_links = n_links - - self.balance = balance - self.balance_weight = 1.0 - - self.reward_weight = 1 - if steps_before_reward == 200: - self.reward_weight = 200 - elif steps_before_reward == 50: - self.reward_weight = 50 - - if n_links == 5: - file_name = 'reacher_5links.xml' - elif n_links == 7: - file_name = 'reacher_7links.xml' - else: - raise ValueError(f"Invalid number of links {n_links}, only 5 or 7 allowed.") - - MujocoEnv.__init__(self, os.path.join(os.path.dirname(__file__), "assets", file_name), 2) - - def step(self, a): - self._steps += 1 - - reward_dist = 0.0 - angular_vel = 0.0 - reward_balance = 0.0 - if self._steps >= self.steps_before_reward: - vec = self.get_body_com("fingertip") - self.get_body_com("target") - reward_dist -= self.reward_weight * np.linalg.norm(vec) - angular_vel -= np.linalg.norm(self.sim.data.qvel.flat[:self.n_links]) - reward_ctrl = - np.square(a).sum() - - if self.balance: - reward_balance -= self.balance_weight * np.abs( - alr_utils.angle_normalize(np.sum(self.sim.data.qpos.flat[:self.n_links]), type="rad")) - - reward = reward_dist + reward_ctrl + angular_vel + reward_balance - self.do_simulation(a, self.frame_skip) - ob = self._get_obs() - done = False - return ob, reward, done, dict(reward_dist=reward_dist, reward_ctrl=reward_ctrl, - velocity=angular_vel, reward_balance=reward_balance, - end_effector=self.get_body_com("fingertip").copy(), - goal=self.goal if hasattr(self, "goal") else None) - - def viewer_setup(self): - self.viewer.cam.trackbodyid = 0 - - def reset_model(self): - qpos = self.np_random.uniform(low=-0.1, high=0.1, size=self.model.nq) + self.init_qpos - while True: - self.goal = self.np_random.uniform(low=-self.n_links / 10, high=self.n_links / 10, size=2) - if np.linalg.norm(self.goal) < self.n_links / 10: - break - qpos[-2:] = self.goal - qvel = self.init_qvel + self.np_random.uniform(low=-.005, high=.005, size=self.model.nv) - qvel[-2:] = 0 - self.set_state(qpos, qvel) - self._steps = 0 - - return self._get_obs() - - def _get_obs(self): - theta = self.sim.data.qpos.flat[:self.n_links] - return np.concatenate([ - np.cos(theta), - np.sin(theta), - self.sim.data.qpos.flat[self.n_links:], # this is goal position - self.sim.data.qvel.flat[:self.n_links], # this is angular velocity - self.get_body_com("fingertip") - self.get_body_com("target"), - # self.get_body_com("target"), # only return target to make problem harder - [self._steps], - ]) diff --git a/alr_envs/open_ai/__init__.py b/alr_envs/open_ai/__init__.py index 1e531cf..b9e53b4 100644 --- a/alr_envs/open_ai/__init__.py +++ b/alr_envs/open_ai/__init__.py @@ -1,3 +1,130 @@ -from alr_envs.open_ai.mujoco import reacher_v2 -from alr_envs.open_ai.robotics import fetch -from alr_envs.open_ai.classic_control import continuous_mountain_car \ No newline at end of file +from gym import register +from gym.wrappers import FlattenObservation + +from . import classic_control, mujoco, robotics + +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} + +# Open AI +# Classic Control +register( + id='ContinuousMountainCarDetPMP-v0', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.classic_control:MountainCarContinuous-v0", + "wrappers": [classic_control.continuous_mountain_car.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 4, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "motor", + "policy_kwargs": { + "p_gains": 1., + "d_gains": 1. + } + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ContinuousMountainCarDetPMP-v0") + +register( + id='ReacherDetPMP-v2', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.mujoco:Reacher-v2", + "wrappers": [mujoco.reacher_v2.MPWrapper], + "mp_kwargs": { + "num_dof": 2, + "num_basis": 6, + "duration": 1, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "motor", + "policy_kwargs": { + "p_gains": .6, + "d_gains": .075 + } + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ReacherDetPMP-v2") + +register( + id='FetchSlideDenseDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchSlideDense-v1", + "wrappers": [FlattenObservation, robotics.fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "position" + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchSlideDenseDetPMP-v1") + +register( + id='FetchSlideDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchSlide-v1", + "wrappers": [FlattenObservation, robotics.fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "position" + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchSlideDetPMP-v1") + +register( + id='FetchReachDenseDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchReachDense-v1", + "wrappers": [FlattenObservation, robotics.fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "position" + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchReachDenseDetPMP-v1") + +register( + id='FetchReachDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + "name": "gym.envs.robotics:FetchReach-v1", + "wrappers": [FlattenObservation, robotics.fetch.MPWrapper], + "mp_kwargs": { + "num_dof": 4, + "num_basis": 5, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "position" + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("FetchReachDetPMP-v1") diff --git a/alr_envs/open_ai/classic_control/__init__.py b/alr_envs/open_ai/classic_control/__init__.py index e69de29..b998494 100644 --- a/alr_envs/open_ai/classic_control/__init__.py +++ b/alr_envs/open_ai/classic_control/__init__.py @@ -0,0 +1 @@ +from . import continuous_mountain_car \ No newline at end of file diff --git a/alr_envs/open_ai/mujoco/__init__.py b/alr_envs/open_ai/mujoco/__init__.py index e69de29..3082d19 100644 --- a/alr_envs/open_ai/mujoco/__init__.py +++ b/alr_envs/open_ai/mujoco/__init__.py @@ -0,0 +1 @@ +from . import reacher_v2 diff --git a/alr_envs/open_ai/robotics/__init__.py b/alr_envs/open_ai/robotics/__init__.py index e69de29..13c65b3 100644 --- a/alr_envs/open_ai/robotics/__init__.py +++ b/alr_envs/open_ai/robotics/__init__.py @@ -0,0 +1 @@ +from . import fetch \ No newline at end of file diff --git a/alr_envs/utils/__init__.py b/alr_envs/utils/__init__.py index b811354..bb4b0bc 100644 --- a/alr_envs/utils/__init__.py +++ b/alr_envs/utils/__init__.py @@ -47,7 +47,7 @@ def make_dmc( task_kwargs['time_limit'] = time_limit register( id=env_id, - entry_point='alr_envs.utils.dmc_wrapper:DMCWrapper', + entry_point='alr_envs.dmc.dmc_wrapper:DMCWrapper', kwargs=dict( domain_name=domain_name, task_name=task_name, diff --git a/alr_envs/utils/make_env_helpers.py b/alr_envs/utils/make_env_helpers.py index 755b8ce..fc73b05 100644 --- a/alr_envs/utils/make_env_helpers.py +++ b/alr_envs/utils/make_env_helpers.py @@ -76,7 +76,7 @@ def make(env_id: str, seed, **kwargs): else: # DMC - from alr_envs.utils import make_dmc + from alr_envs import make_dmc env = make_dmc(env_id, seed=seed, **kwargs) assert env.base_step_limit == env.spec.max_episode_steps, \ @@ -123,11 +123,11 @@ def make_dmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwargs Returns: DMP wrapped gym env """ - verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) + _verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) - verify_dof(_env, mp_kwargs.get("num_dof")) + _verify_dof(_env, mp_kwargs.get("num_dof")) return DmpWrapper(_env, **mp_kwargs) @@ -143,11 +143,11 @@ def make_detpmp_env(env_id: str, wrappers: Iterable, seed=1, mp_kwargs={}, **kwa Returns: DMP wrapped gym env """ - verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) + _verify_time_limit(mp_kwargs.get("duration", None), kwargs.get("time_limit", None)) _env = _make_wrapped_env(env_id=env_id, wrappers=wrappers, seed=seed, **kwargs) - verify_dof(_env, mp_kwargs.get("num_dof")) + _verify_dof(_env, mp_kwargs.get("num_dof")) return DetPMPWrapper(_env, **mp_kwargs) @@ -191,14 +191,7 @@ def make_detpmp_env_helper(**kwargs): mp_kwargs=kwargs.pop("mp_kwargs"), **kwargs) -def make_contextual_env(env_id, context, seed, rank): - env = make(env_id, seed + rank, context=context) - # env = gym.make(env_id, context=context) - # env.seed(seed + rank) - return lambda: env - - -def verify_time_limit(mp_time_limit: Union[None, float], env_time_limit: Union[None, float]): +def _verify_time_limit(mp_time_limit: Union[None, float], env_time_limit: Union[None, float]): """ When using DMC check if a manually specified time limit matches the trajectory duration the MP receives. Mostly, the time_limit for DMC is not specified and the default values from DMC are taken. @@ -218,7 +211,7 @@ def verify_time_limit(mp_time_limit: Union[None, float], env_time_limit: Union[N f"the duration of {mp_time_limit}s for the MP." -def verify_dof(base_env: gym.Env, dof: int): +def _verify_dof(base_env: gym.Env, dof: int): action_shape = np.prod(base_env.action_space.shape) assert dof == action_shape, \ f"The specified degrees of freedom ('num_dof') {dof} do not match " \ diff --git a/alr_envs/utils/mp_env_async_sampler.py b/alr_envs/utils/mp_env_async_sampler.py deleted file mode 100644 index b24e908..0000000 --- a/alr_envs/utils/mp_env_async_sampler.py +++ /dev/null @@ -1,122 +0,0 @@ -import gym -from gym.vector.async_vector_env import AsyncVectorEnv -import numpy as np -from _collections import defaultdict - -from alr_envs.utils.make_env_helpers import make_rank - - -def split_array(ary, size): - n_samples = len(ary) - if n_samples < size: - tmp = np.zeros((size, ary.shape[1])) - tmp[0:n_samples] = ary - return [tmp] - elif n_samples == size: - return [ary] - else: - repeat = int(np.ceil(n_samples / size)) - split = [k * size for k in range(1, repeat)] - sub_arys = np.split(ary, split) - - if n_samples % size != 0: - tmp = np.zeros_like(sub_arys[0]) - last = sub_arys[-1] - tmp[0: len(last)] = last - sub_arys[-1] = tmp - - return sub_arys - - -def _flatten_list(l): - assert isinstance(l, (list, tuple)) - assert len(l) > 0 - assert all([len(l_) > 0 for l_ in l]) - - return [l__ for l_ in l for l__ in l_] - - -class DummyDist: - def __init__(self, dim): - self.dim = dim - - def sample(self, contexts): - contexts = np.atleast_2d(contexts) - n_samples = contexts.shape[0] - return np.random.normal(size=(n_samples, self.dim)), contexts - - -class AlrMpEnvSampler: - """ - An asynchronous sampler for non contextual MPWrapper environments. A sampler object can be called with a set of - parameters and returns the corresponding final obs, rewards, dones and info dicts. - """ - - def __init__(self, env_id, num_envs, seed=0, **env_kwargs): - self.num_envs = num_envs - self.env = AsyncVectorEnv([make_rank(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) - - def __call__(self, params): - params = np.atleast_2d(params) - n_samples = params.shape[0] - split_params = split_array(params, self.num_envs) - - vals = defaultdict(list) - for p in split_params: - self.env.reset() - obs, reward, done, info = self.env.step(p) - vals['obs'].append(obs) - vals['reward'].append(reward) - vals['done'].append(done) - vals['info'].append(info) - - # do not return values above threshold - return np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples], \ - _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] - - -class AlrContextualMpEnvSampler: - """ - An asynchronous sampler for contextual MPWrapper environments. A sampler object can be called with a set of - parameters and returns the corresponding final obs, rewards, dones and info dicts. - """ - - def __init__(self, env_id, num_envs, seed=0, **env_kwargs): - self.num_envs = num_envs - self.env = AsyncVectorEnv([make_env(env_id, seed, i, **env_kwargs) for i in range(num_envs)]) - - def __call__(self, dist, n_samples): - repeat = int(np.ceil(n_samples / self.env.num_envs)) - vals = defaultdict(list) - - obs = self.env.reset() - for i in range(repeat): - vals['obs'].append(obs) - new_samples, new_contexts = dist.sample(obs) - vals['new_samples'].append(new_samples) - - obs, reward, done, info = self.env.step(new_samples) - - vals['reward'].append(reward) - vals['done'].append(done) - vals['info'].append(info) - - # do not return values above threshold - return np.vstack(vals['new_samples'])[:n_samples], \ - np.vstack(vals['obs'])[:n_samples], np.hstack(vals['reward'])[:n_samples], \ - _flatten_list(vals['done'])[:n_samples], _flatten_list(vals['info'])[:n_samples] - - -if __name__ == "__main__": - env_name = "alr_envs:HoleReacherDetPMP-v1" - n_cpu = 8 - dim = 25 - n_samples = 10 - - sampler = AlrMpEnvSampler(env_name, num_envs=n_cpu) - - thetas = np.random.randn(n_samples, dim) # usually form a search distribution - - _, rewards, __, ___ = sampler(thetas) - - print(rewards) diff --git a/setup.py b/setup.py index 55a1a95..beb2095 100644 --- a/setup.py +++ b/setup.py @@ -3,8 +3,7 @@ from setuptools import setup setup( name='alr_envs', version='0.0.1', - packages=['alr_envs', 'alr_envs.classic_control', 'alr_envs.open_ai', 'alr_envs.mujoco', 'alr_envs.dmc', - 'alr_envs.utils'], + packages=['alr_envs', 'alr_envs.alr', 'alr_envs.open_ai', 'alr_envs.dmc', 'alr_envs.meta', 'alr_envs.utils'], install_requires=[ 'gym', 'PyQt5', From 5e33259cb1fc292a5342f1cbad2f001ac3136146 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 25 Aug 2021 17:16:59 +0200 Subject: [PATCH 49/56] added more fine-grained test cases --- test/test_dmc_envs.py | 2 +- test/test_envs.py | 110 ++++++++++++++++++++++++++++-------- test/test_metaworld_envs.py | 2 +- 3 files changed, 88 insertions(+), 26 deletions(-) diff --git a/test/test_dmc_envs.py b/test/test_dmc_envs.py index 4eb1589..a7cd9be 100644 --- a/test/test_dmc_envs.py +++ b/test/test_dmc_envs.py @@ -12,7 +12,7 @@ MANIPULATION_SPECS = [f'manipulation-{task}' for task in manipulation.ALL if tas SEED = 1 -class TestEnvironments(unittest.TestCase): +class TestStepDMCEnvironments(unittest.TestCase): def _run_env(self, env_id, iterations=None, seed=SEED, render=False): """ diff --git a/test/test_envs.py b/test/test_envs.py index bf12693..f8d7269 100644 --- a/test/test_envs.py +++ b/test/test_envs.py @@ -10,7 +10,7 @@ ALL_SPECS = list(spec for spec in gym.envs.registry.all() if "alr_envs" in spec. SEED = 1 -class TestEnvironments(unittest.TestCase): +class TestMPEnvironments(unittest.TestCase): def _run_env(self, env_id, iterations=None, seed=SEED, render=False): """ @@ -68,6 +68,18 @@ class TestEnvironments(unittest.TestCase): del env return np.array(observations), np.array(rewards), np.array(dones) + 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, obs2, rwd2, done2 = time_step + self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] {obs1} and {obs2} 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} " @@ -79,31 +91,81 @@ class TestEnvironments(unittest.TestCase): def _verify_done(self, done): self.assertIsInstance(done, bool, f"Returned {done} as done flag, expected bool.") - def test_environment_functionality(self): - """Tests that environments runs without errors using random actions.""" - for spec in ALL_SPECS: - with self.subTest(msg=spec.id): - self._run_env(spec.id) + def test_alr_environment_functionality(self): + """Tests that environments runs without errors using random actions for ALR MP envs.""" + with self.subTest(msg="DMP"): + for env_id in alr_envs.ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS['DMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) - def test_environment_determinism(self): - """Tests that identical seeds produce identical trajectories.""" - seed = 0 - # Iterate over two trajectories, which should have the same state and action sequence - for spec in ALL_SPECS: - with self.subTest(msg=spec.id): - traj1 = self._run_env(spec.id, seed=seed) - traj2 = self._run_env(spec.id, seed=seed) - for i, time_step in enumerate(zip(*traj1, *traj2)): - obs1, rwd1, done1, obs2, rwd2, done2 = time_step - self.assertTrue(np.array_equal(obs1, obs2), f"Observations [{i}] {obs1} and {obs2} 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.") + with self.subTest(msg="DetPMP"): + for env_id in alr_envs.ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS['DetPMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) - def test_environment_functionality_meta(self): - """Tests that environments runs without errors using random actions.""" - for id in alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS['DetPMP']: - with self.subTest(msg=id): - self._run_env(id) + def test_openai_environment_functionality(self): + """Tests that environments runs without errors using random actions for OpenAI gym MP envs.""" + with self.subTest(msg="DMP"): + for env_id in alr_envs.ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS['DMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) + + with self.subTest(msg="DetPMP"): + for env_id in alr_envs.ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS['DetPMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) + + def test_dmc_environment_functionality(self): + """Tests that environments runs without errors using random actions for DMC MP envs.""" + with self.subTest(msg="DMP"): + for env_id in alr_envs.ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS['DMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) + + with self.subTest(msg="DetPMP"): + for env_id in alr_envs.ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS['DetPMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) + + def test_metaworld_environment_functionality(self): + """Tests that environments runs without errors using random actions for Metaworld MP envs.""" + with self.subTest(msg="DMP"): + for env_id in alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS['DMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) + + with self.subTest(msg="DetPMP"): + for env_id in alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS['DetPMP']: + with self.subTest(msg=env_id): + self._run_env(env_id) + + def test_alr_environment_determinism(self): + """Tests that identical seeds produce identical trajectories for ALR MP Envs.""" + with self.subTest(msg="DMP"): + self._run_env_determinism(alr_envs.ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"]) + with self.subTest(msg="DetPMP"): + self._run_env_determinism(alr_envs.ALL_ALR_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"]) + + def test_openai_environment_determinism(self): + """Tests that identical seeds produce identical trajectories for OpenAI gym MP Envs.""" + with self.subTest(msg="DMP"): + self._run_env_determinism(alr_envs.ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"]) + with self.subTest(msg="DetPMP"): + self._run_env_determinism(alr_envs.ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"]) + + def test_dmc_environment_determinism(self): + """Tests that identical seeds produce identical trajectories for DMC MP Envs.""" + with self.subTest(msg="DMP"): + self._run_env_determinism(alr_envs.ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"]) + with self.subTest(msg="DetPMP"): + self._run_env_determinism(alr_envs.ALL_DEEPMIND_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"]) + + def test_metaworld_environment_determinism(self): + """Tests that identical seeds produce identical trajectories for Metaworld MP Envs.""" + with self.subTest(msg="DMP"): + self._run_env_determinism(alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DMP"]) + with self.subTest(msg="DetPMP"): + self._run_env_determinism(alr_envs.ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"]) if __name__ == '__main__': diff --git a/test/test_metaworld_envs.py b/test/test_metaworld_envs.py index 0a05ffc..a6bd244 100644 --- a/test/test_metaworld_envs.py +++ b/test/test_metaworld_envs.py @@ -10,7 +10,7 @@ ALL_ENVS = [env.split("-goal-observable")[0] for env, _ in ALL_V2_ENVIRONMENTS_G SEED = 1 -class TestEnvironments(unittest.TestCase): +class TestStepMetaWorlEnvironments(unittest.TestCase): def _run_env(self, env_id, iterations=None, seed=SEED, render=False): """ From 6e34c99e5bdffaa4a9f9984a11aea688945b135f Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 25 Aug 2021 17:17:25 +0200 Subject: [PATCH 50/56] alr_reacher task --- alr_envs/alr/mujoco/reacher/alr_reacher.py | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 alr_envs/alr/mujoco/reacher/alr_reacher.py diff --git a/alr_envs/alr/mujoco/reacher/alr_reacher.py b/alr_envs/alr/mujoco/reacher/alr_reacher.py new file mode 100644 index 0000000..e27e069 --- /dev/null +++ b/alr_envs/alr/mujoco/reacher/alr_reacher.py @@ -0,0 +1,88 @@ +import os + +import numpy as np +from gym import utils +from gym.envs.mujoco import MujocoEnv + +import alr_envs.utils.utils as alr_utils + + +class ALRReacherEnv(MujocoEnv, utils.EzPickle): + def __init__(self, steps_before_reward=200, n_links=5, balance=False): + utils.EzPickle.__init__(**locals()) + + self._steps = 0 + self.steps_before_reward = steps_before_reward + self.n_links = n_links + + self.balance = balance + self.balance_weight = 1.0 + + self.reward_weight = 1 + if steps_before_reward == 200: + self.reward_weight = 200 + elif steps_before_reward == 50: + self.reward_weight = 50 + + if n_links == 5: + file_name = 'reacher_5links.xml' + elif n_links == 7: + file_name = 'reacher_7links.xml' + else: + raise ValueError(f"Invalid number of links {n_links}, only 5 or 7 allowed.") + + MujocoEnv.__init__(self, os.path.join(os.path.dirname(__file__), "assets", file_name), 2) + + def step(self, a): + self._steps += 1 + + reward_dist = 0.0 + angular_vel = 0.0 + reward_balance = 0.0 + if self._steps >= self.steps_before_reward: + vec = self.get_body_com("fingertip") - self.get_body_com("target") + reward_dist -= self.reward_weight * np.linalg.norm(vec) + angular_vel -= np.linalg.norm(self.sim.data.qvel.flat[:self.n_links]) + reward_ctrl = - np.square(a).sum() + + if self.balance: + reward_balance -= self.balance_weight * np.abs( + alr_utils.angle_normalize(np.sum(self.sim.data.qpos.flat[:self.n_links]), type="rad")) + + reward = reward_dist + reward_ctrl + angular_vel + reward_balance + self.do_simulation(a, self.frame_skip) + ob = self._get_obs() + done = False + return ob, reward, done, dict(reward_dist=reward_dist, reward_ctrl=reward_ctrl, + velocity=angular_vel, reward_balance=reward_balance, + end_effector=self.get_body_com("fingertip").copy(), + goal=self.goal if hasattr(self, "goal") else None) + + def viewer_setup(self): + self.viewer.cam.trackbodyid = 0 + + def reset_model(self): + qpos = self.np_random.uniform(low=-0.1, high=0.1, size=self.model.nq) + self.init_qpos + while True: + self.goal = self.np_random.uniform(low=-self.n_links / 10, high=self.n_links / 10, size=2) + if np.linalg.norm(self.goal) < self.n_links / 10: + break + qpos[-2:] = self.goal + qvel = self.init_qvel + self.np_random.uniform(low=-.005, high=.005, size=self.model.nv) + qvel[-2:] = 0 + self.set_state(qpos, qvel) + self._steps = 0 + + return self._get_obs() + + def _get_obs(self): + theta = self.sim.data.qpos.flat[:self.n_links] + return np.concatenate([ + np.cos(theta), + np.sin(theta), + self.sim.data.qpos.flat[self.n_links:], # this is goal position + self.sim.data.qvel.flat[:self.n_links], # this is angular velocity + self.get_body_com("fingertip") - self.get_body_com("target"), + # self.get_body_com("target"), # only return target to make problem harder + [self._steps], + ]) From f54025406bfc5acf3bed9637fbe94b89969b0091 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 25 Aug 2021 17:31:05 +0200 Subject: [PATCH 51/56] Added short mountain car --- alr_envs/open_ai/__init__.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/alr_envs/open_ai/__init__.py b/alr_envs/open_ai/__init__.py index b9e53b4..46fdbe6 100644 --- a/alr_envs/open_ai/__init__.py +++ b/alr_envs/open_ai/__init__.py @@ -5,8 +5,40 @@ from . import classic_control, mujoco, robotics ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} +# Short Continuous Mountain Car +register( + id="MountainCarContinuous-v1", + entry_point="gym.envs.classic_control:Continuous_MountainCarEnv", + max_episode_steps=100, + reward_threshold=90.0, +) + # Open AI # Classic Control +register( + id='ContinuousMountainCarDetPMP-v1', + entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', + kwargs={ + kwargs={ + "name": "alr_envs:MountainCarContinuous-v1", + "wrappers": [classic_control.continuous_mountain_car.MPWrapper], + "mp_kwargs": { + "num_dof": 1, + "num_basis": 4, + "duration": 2, + "post_traj_time": 0, + "width": 0.02, + "zero_start": True, + "policy_type": "motor", + "policy_kwargs": { + "p_gains": 1., + "d_gains": 1. + } + } + } +) +ALL_GYM_MOTION_PRIMITIVE_ENVIRONMENTS["DetPMP"].append("ContinuousMountainCarDetPMP-v1") + register( id='ContinuousMountainCarDetPMP-v0', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', @@ -16,7 +48,7 @@ register( "mp_kwargs": { "num_dof": 1, "num_basis": 4, - "duration": 2, + "duration": 19.98, "post_traj_time": 0, "width": 0.02, "zero_start": True, From 382134b63fb81ea359cd925ef1e8d902fdb3331e Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 25 Aug 2021 17:35:50 +0200 Subject: [PATCH 52/56] fixed merge bug --- alr_envs/open_ai/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/alr_envs/open_ai/__init__.py b/alr_envs/open_ai/__init__.py index 46fdbe6..51dd712 100644 --- a/alr_envs/open_ai/__init__.py +++ b/alr_envs/open_ai/__init__.py @@ -18,7 +18,6 @@ register( register( id='ContinuousMountainCarDetPMP-v1', entry_point='alr_envs.utils.make_env_helpers:make_detpmp_env_helper', - kwargs={ kwargs={ "name": "alr_envs:MountainCarContinuous-v1", "wrappers": [classic_control.continuous_mountain_car.MPWrapper], From 20132e54d39fd2b6df0dac2d284400d900dcac76 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Fri, 27 Aug 2021 17:19:56 +0200 Subject: [PATCH 53/56] added missing metaworld environments --- alr_envs/meta/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/alr_envs/meta/__init__.py b/alr_envs/meta/__init__.py index 8cf1784..fa63c94 100644 --- a/alr_envs/meta/__init__.py +++ b/alr_envs/meta/__init__.py @@ -7,7 +7,8 @@ ALL_METAWORLD_MOTION_PRIMITIVE_ENVIRONMENTS = {"DMP": [], "DetPMP": []} # MetaWorld -_goal_change_envs = ["assembly-v2", "pick-out-of-hole-v2", "plate-slide-v2", "plate-slide-back-v2"] +_goal_change_envs = ["assembly-v2", "pick-out-of-hole-v2", "plate-slide-v2", "plate-slide-back-v2", + "plate-slide-side-v2", "plate-slide-back-side-v2"] for _task in _goal_change_envs: task_id_split = _task.split("-") name = "".join([s.capitalize() for s in task_id_split[:-1]]) From cc01ca2d18ce1e63681e452971e57f089bd514a3 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Tue, 14 Sep 2021 14:52:03 +0200 Subject: [PATCH 54/56] fixed setup.py --- setup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index beb2095..8045d36 100644 --- a/setup.py +++ b/setup.py @@ -8,10 +8,11 @@ setup( 'gym', 'PyQt5', 'matplotlib', - 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', + # 'mp_env_api @ git+https://github.com/ALRhub/motion_primitive_env_api.git@dmc_integration', + 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git@dmc_integration', 'mujoco-py<2.1,>=2.0', - 'dm_control' - 'metaworld @ git+https://github.com/rlworkgroup/metaworld.git@master#egg=metaworld' + 'dm_control', + 'metaworld @ git+https://github.com/rlworkgroup/metaworld.git@master#egg=metaworld', ], url='https://github.com/ALRhub/alr_envs/', From 1983e9d96e6eb1010e1c1e775becef51b3eb621d Mon Sep 17 00:00:00 2001 From: ottofabian Date: Thu, 16 Sep 2021 11:48:14 +0200 Subject: [PATCH 55/56] fixed issue of incorrectly retrieving the current position for metaworld tasks --- alr_envs/meta/goal_change_mp_wrapper.py | 2 +- alr_envs/meta/goal_endeffector_change_mp_wrapper.py | 2 +- alr_envs/meta/goal_object_change_mp_wrapper.py | 2 +- alr_envs/meta/object_change_mp_wrapper.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/alr_envs/meta/goal_change_mp_wrapper.py b/alr_envs/meta/goal_change_mp_wrapper.py index 15f4de9..a558365 100644 --- a/alr_envs/meta/goal_change_mp_wrapper.py +++ b/alr_envs/meta/goal_change_mp_wrapper.py @@ -53,7 +53,7 @@ class MPWrapper(MPEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray]: r_close = self.env.data.get_joint_qpos("r_close") - return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + return np.hstack([self.env.data.mocap_pos.flatten() / self.env.action_scale, r_close]) @property def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: diff --git a/alr_envs/meta/goal_endeffector_change_mp_wrapper.py b/alr_envs/meta/goal_endeffector_change_mp_wrapper.py index 95c29e3..8912a72 100644 --- a/alr_envs/meta/goal_endeffector_change_mp_wrapper.py +++ b/alr_envs/meta/goal_endeffector_change_mp_wrapper.py @@ -53,7 +53,7 @@ class MPWrapper(MPEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray]: r_close = self.env.data.get_joint_qpos("r_close") - return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + return np.hstack([self.env.data.mocap_pos.flatten() / self.env.action_scale, r_close]) @property def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: diff --git a/alr_envs/meta/goal_object_change_mp_wrapper.py b/alr_envs/meta/goal_object_change_mp_wrapper.py index 6811ace..63e16b7 100644 --- a/alr_envs/meta/goal_object_change_mp_wrapper.py +++ b/alr_envs/meta/goal_object_change_mp_wrapper.py @@ -53,7 +53,7 @@ class MPWrapper(MPEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray]: r_close = self.env.data.get_joint_qpos("r_close") - return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + return np.hstack([self.env.data.mocap_pos.flatten() / self.env.action_scale, r_close]) @property def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: diff --git a/alr_envs/meta/object_change_mp_wrapper.py b/alr_envs/meta/object_change_mp_wrapper.py index c7e506b..4293148 100644 --- a/alr_envs/meta/object_change_mp_wrapper.py +++ b/alr_envs/meta/object_change_mp_wrapper.py @@ -53,7 +53,7 @@ class MPWrapper(MPEnvWrapper): @property def current_pos(self) -> Union[float, int, np.ndarray]: r_close = self.env.data.get_joint_qpos("r_close") - return np.hstack([self.env.data.mocap_pos.flatten(), r_close]) + return np.hstack([self.env.data.mocap_pos.flatten() / self.env.action_scale, r_close]) @property def current_vel(self) -> Union[float, int, np.ndarray, Tuple]: From c1dfb583feb93e3bfb694fab98aea5fb630e8c96 Mon Sep 17 00:00:00 2001 From: ottofabian Date: Wed, 29 Sep 2021 16:14:42 +0200 Subject: [PATCH 56/56] Update setup.py --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 8045d36..793864e 100644 --- a/setup.py +++ b/setup.py @@ -8,8 +8,8 @@ setup( 'gym', 'PyQt5', 'matplotlib', - # 'mp_env_api @ git+https://github.com/ALRhub/motion_primitive_env_api.git@dmc_integration', - 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git@dmc_integration', + # 'mp_env_api @ git+https://github.com/ALRhub/motion_primitive_env_api.git', + 'mp_env_api @ git+ssh://git@github.com/ALRhub/motion_primitive_env_api.git', 'mujoco-py<2.1,>=2.0', 'dm_control', 'metaworld @ git+https://github.com/rlworkgroup/metaworld.git@master#egg=metaworld',