def make_object_under_test(self, renderer): self.environment = environment.Environment( task=tasks.NoReward(), action_space=action_spaces.SelectMove(), renderers={'obs': renderer}, init_sprites=lambda: [sprite.Sprite(c0=255)], max_episode_length=7)
def make_object_under_test(self): """Environment creator used by test_utils.EnvironmentTestMixin.""" env = environment.Environment( task=tasks.NoReward(), action_space=action_spaces.SelectMove(), renderers={}, init_sprites=lambda: [sprite.Sprite(c0=255)], max_episode_length=7) return env
def testMoveSprites(self): """Take a series of actions and repeatedly check sprite motions.""" action_space = action_spaces.SelectMove(scale=0.5) sprites = [sprite.Sprite(x=0.55, y=0.5), sprite.Sprite(x=0.5, y=0.5)] # Move second (top) sprite action_space.step( np.array([0.52, 0.52, 0.5, 0.48]), sprites, keep_in_frame=False) self.assertTrue(np.allclose(sprites[0].position, [0.55, 0.5], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.5, 0.49], atol=1e-5)) # Move first (bottom) sprite action_space.step( np.array([0.58, 0.5, 0.9, 0.9]), sprites, keep_in_frame=False) self.assertTrue(np.allclose(sprites[0].position, [0.75, 0.7], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.5, 0.49], atol=1e-5)) # Move neither sprite action_space.step( np.array([0.58, 0.5, 0.9, 0.9]), sprites, keep_in_frame=False) self.assertTrue(np.allclose(sprites[0].position, [0.75, 0.7], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.5, 0.49], atol=1e-5)) # Move second (top) sprite action_space.step( np.array([0.5, 0.5, 0.2, 0.5]), sprites, keep_in_frame=False) self.assertTrue(np.allclose(sprites[0].position, [0.75, 0.7], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.35, 0.49], atol=1e-5)) # Move first (bottom) sprite action_space.step( np.array([0.78, 0.74, 0.9, 0.9]), sprites, keep_in_frame=False) self.assertTrue(np.allclose(sprites[0].position, [0.95, 0.9], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.35, 0.49], atol=1e-5)) # Move first (bottom) sprite action_space.step( np.array([0.92, 0.9, 0.9, 0.5]), sprites, keep_in_frame=True) self.assertTrue(np.allclose(sprites[0].position, [1., 0.9], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.35, 0.49], atol=1e-5)) # Move first (bottom) sprite action_space.step( np.array([0.98, 0.9, 0.7, 0.9]), sprites, keep_in_frame=False) self.assertTrue(np.allclose(sprites[0].position, [1.1, 1.1], atol=1e-5)) self.assertTrue(np.allclose(sprites[1].position, [0.35, 0.49], atol=1e-5))
def testTaskTermination(self): task = tasks.FindGoalPosition(goal_position=(0.5, 0.5)) action_space = action_spaces.SelectMove() env_renderers = {} init_sprites = lambda: [sprite.Sprite(x=0.25, y=0.25, c0=255)] env = environment.Environment(task, action_space, env_renderers, init_sprites) donothing_action = np.array([0.25, 0.25, 0.5, 0.5]) success_action = np.array([0.25, 0.25, 0.75, 0.75]) timestep = env.step(donothing_action) self.assertTrue(timestep.first()) timestep = env.step(donothing_action) self.assertTrue(timestep.mid()) timestep = env.step(success_action) self.assertTrue(timestep.last()) timestep = env.step(success_action) self.assertTrue(timestep.first())
def testMotionCost(self, scale, action, motion_cost, true_cost): action_space = action_spaces.SelectMove( scale=scale, motion_cost=motion_cost) cost = action_space.step(action, sprites=[], keep_in_frame=False) self.assertAlmostEqual(cost, true_cost, delta=0.01)
def testGetMotion(self, scale, action, true_motion): action_space = action_spaces.SelectMove(scale=scale) motion = action_space.get_motion(action) self.assertTrue(np.allclose(motion, true_motion, atol=1e-4))
def testNoiseScale(self, action, noise_scale): action_space = action_spaces.SelectMove(scale=0.1, noise_scale=noise_scale) action_space.apply_noise_to_action(action)
def action_space(): return action_spaces.SelectMove(scale=0.25, noise_scale=0.05)
def get_config(mode='train'): """Generate environment config. Args: mode: Unused task mode. Returns: config: Dictionary defining task/environment configuration. Can be fed as kwargs to environment.Environment. """ # Factor distributions common to all objects. common_factors = distribs.Product([ distribs.Continuous('x', 0.1, 0.9), distribs.Continuous('y', 0.1, 0.9), distribs.Continuous('angle', 0, 360, dtype='int32'), ]) # train/test split for goal-finding object scales and clustering object colors goal_finding_scale_test = distribs.Continuous('scale', 0.08, 0.12) green_blue_colors = distribs.Product([ distribs.Continuous('c1', 64, 256, dtype='int32'), distribs.Continuous('c2', 64, 256, dtype='int32'), ]) if mode == 'train': goal_finding_scale = distribs.SetMinus( distribs.Continuous('scale', 0.05, 0.15), goal_finding_scale_test, ) cluster_colors = distribs.Product([ distribs.Continuous('c0', 128, 256, dtype='int32'), green_blue_colors ]) elif mode == 'test': goal_finding_scale = goal_finding_scale_test cluster_colors = distribs.Product([ distribs.Continuous('c0', 0, 128, dtype='int32'), green_blue_colors ]) else: raise ValueError( 'Invalid mode {}. Mode must be "train" or "test".'.format(mode)) # Create clustering sprite generators sprite_gen_list = [] cluster_shapes = [ distribs.Discrete('shape', [s]) for s in ['triangle', 'square', 'pentagon'] ] for shape in cluster_shapes: factors = distribs.Product([ common_factors, cluster_colors, shape, distribs.Continuous('scale', 0.08, 0.12), ]) sprite_gen_list.append( sprite_generators.generate_sprites(factors, num_sprites=2)) # Create goal-finding sprite generators goal_finding_colors = [ distribs.Product([ distribs.Continuous('c0', 192, 256, dtype='int32'), distribs.Continuous('c1', 0, 128, dtype='int32'), distribs.Continuous('c2', 64, 128, dtype='int32'), ]), distribs.Product([ distribs.Continuous('c0', 0, 128, dtype='int32'), distribs.Continuous('c1', 192, 256, dtype='int32'), distribs.Continuous('c2', 64, 128, dtype='int32'), ]) ] # Goal positions corresponding to the colors in goal_finding_colors goal_finding_positions = [(0., 0.5), (1., 0.5)] goal_finding_shapes = distribs.Discrete('shape', ['spoke_4', 'star_4']) for colors in goal_finding_colors: factors = distribs.Product([ common_factors, goal_finding_scale, goal_finding_shapes, colors, ]) sprite_gen_list.append( sprite_generators.generate_sprites( factors, num_sprites=lambda: np.random.randint(1, 3))) # Create distractor sprite generator distractor_factors = distribs.Product([ common_factors, distribs.Discrete('shape', ['circle']), distribs.Continuous('c0', 64, 256, dtype='uint8'), distribs.Continuous('c1', 64, 256, dtype='uint8'), distribs.Continuous('c2', 64, 256, dtype='uint8'), distribs.Continuous('scale', 0.08, 0.12), ]) sprite_gen_list.append( sprite_generators.generate_sprites( distractor_factors, num_sprites=lambda: np.random.randint(0, 3))) # Concat clusters into single scene to generate sprite_gen = sprite_generators.chain_generators(*sprite_gen_list) # Randomize sprite ordering to eliminate any task information from occlusions sprite_gen = sprite_generators.shuffle(sprite_gen) # Create the combined task of goal-finding and clustering task_list = [] task_list.append( tasks.Clustering(cluster_shapes, terminate_bonus=0., reward_range=10.)) for colors, goal_pos in zip(goal_finding_colors, goal_finding_positions): goal_finding_task = tasks.FindGoalPosition(distribs.Product( [colors, goal_finding_shapes]), goal_position=goal_pos, weights_dimensions=(1, 0), terminate_distance=0.15, raw_reward_multiplier=30) task_list.append(goal_finding_task) task = tasks.MetaAggregated(task_list, reward_aggregator='sum', termination_criterion='all') renderers = { 'image': spriteworld_renderers.PILRenderer(image_size=(64, 64), anti_aliasing=5) } config = { 'task': task, 'action_space': action_spaces.SelectMove(scale=0.5), 'renderers': renderers, 'init_sprites': sprite_gen, 'max_episode_length': 50, 'metadata': { 'name': os.path.basename(__file__), 'mode': mode } } return config
def action_space(): return action_spaces.SelectMove(scale=0.25)
def noisy_action_space(_noise_std, _prop_motion_noise, filter_distribs): return action_spaces.SelectMove( scale=0.5, noise_scale=_noise_std, proportional_motion_noise=_prop_motion_noise, filter_distribs=filter_distribs)