def test_prop_default(self): self._randomizing_method = Method.ABSOLUTE variations = Variations() variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_range(self._lower_bound, self._upper_bound) \ .add() assert variations.get_list()[0].default is None
def test_prop_mean_std(self): self._randomizing_method = Method.ABSOLUTE variations = Variations() variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.GAUSSIAN) \ .with_mean_std(self._mean, self._std_dev) \ .add() assert variations.get_list()[0].mean_std == (self._mean, self._std_dev)
def test_exception_uniform_dist(self): self._randomizing_method = Method.ABSOLUTE variations = Variations() with self.assertRaises(ValueError) as context: variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_mean_std(self._lower_bound, self._upper_bound) \ .add() assert "Need to call with_range when sampled from Uniform" \ in str(context.exception)
def test_dynamics_rand(self): variations = Variations() variations.randomize() \ .at_xpath(".//geom[@name='torso']") \ .attribute("density") \ .with_method(Method.COEFFICIENT) \ .sampled_from(Distribution.UNIFORM) \ .with_range(0.5, 1.5) \ .add() env = randomize(SwimmerEnv(), variations) for i in range(5): env.reset() for j in range(5): env.step(env.action_space.sample())
def test_xml_attrib_exception(self): fake_attrib = "fake_attrib" self._randomizing_method = Method.ABSOLUTE variations = Variations() variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(fake_attrib)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_range(self._lower_bound, self._upper_bound) \ .add() with self.assertRaises(ValueError) as context: randomize(self._env, variations) assert fake_attrib in str(context.exception)
def test_exception_bad_sampling_method(self): # Use unused Enum value for test self._randomizing_method = 3 variations = Variations() variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_range(self._lower_bound, self._upper_bound) \ .add() randomized_env = randomize(self._env, variations) with self.assertRaises(ValueError) as context: randomized_env.reset() assert "Unknown method" in str(context.exception)
def test_env_step(self): self._randomizing_method = Method.ABSOLUTE variations = Variations() variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_range(self._lower_bound, self._upper_bound) \ .add() second_var = "torso" # Add a second variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(second_var)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_range(self._lower_bound, self._upper_bound) \ .add() randomized_env = randomize(self._env, variations) # step() shouldn't error out (so it actually steps the wrapped env) for j in range(5): assert randomized_env.step(randomized_env.action_space.sample())
def test_absolute_method(self): self._randomizing_method = Method.ABSOLUTE variations = Variations() variations.randomize() \ .at_xpath("//body[@name=\'{0}\']".format(self._bodyname)) \ .attribute("{0}".format(self._attribute)) \ .with_method(self._randomizing_method) \ .sampled_from(Distribution.UNIFORM) \ .with_range(self._lower_bound, self._upper_bound) \ .add() randomized_env = randomize(self._env, variations) randomized_vals = [] for i in range(5): with unittest.mock.patch( 'garage.envs.mujoco.randomization.variation.Variations.' 'get_randomized_xml_model', self.create_randomized_xml): randomized_env.reset() body_id = randomized_env.wrapped_env.sim.model._body_name2id[ self._bodyname] randomized_val = np.array( randomized_env.wrapped_env.sim.model.body_pos[body_id]) randomized_vals.append(randomized_val) # check if within range assert all(self._lower_bound <= randomized_val), ( "Randomised {1} < lower bound {0}".format( self._lower_bound, randomized_val)) assert all(randomized_val <= self._upper_bound), ( "Randomised {1} > upper bound {0}".format( self._upper_bound, randomized_val)) # check that you have actual variation randomized_vals = np.array(randomized_vals) assert np.std(randomized_vals) > 0, ( "Std Dev of randomized values " "not > 0. Getting the exact " "same numbers?\n {0}".format(randomized_vals))
from garage.envs.mujoco import SwimmerEnv from garage.envs.mujoco.randomization import Distribution from garage.envs.mujoco.randomization import Method from garage.envs.mujoco.randomization import randomize from garage.envs.mujoco.randomization import Variations variations = Variations() variations.randomize() \ .at_xpath(".//geom[@name='torso']") \ .attribute("density") \ .with_method(Method.COEFFICIENT) \ .sampled_from(Distribution.UNIFORM) \ .with_range(0.5, 1.5) \ .add() env = randomize(SwimmerEnv(), variations) for i in range(1000): env.reset() for j in range(1000): env.step(env.action_space.sample())
def test_prop_get_list(self): variations = Variations() assert variations.get_list() == []