예제 #1
0
 def setUp(self):
     super(MetaAggregatedTest, self).setUp()
     self.subtasks = [
         tasks.FindGoalPosition(filter_distrib=distribs.Continuous(
             'c0', 0, 100),
                                goal_position=np.array([0.2, 0.2]),
                                terminate_distance=0.1),
         tasks.FindGoalPosition(filter_distrib=distribs.Continuous(
             'c0', 100, 200),
                                goal_position=np.array([0.5, 0.5]),
                                terminate_distance=0.1,
                                terminate_bonus=5.0),
         tasks.FindGoalPosition(filter_distrib=distribs.Continuous(
             'c0', 200, 256),
                                goal_position=np.array([0.8, 0.8]),
                                terminate_distance=0.1,
                                terminate_bonus=10.0),
     ]
     self.success_sprites = [
         sprite.Sprite(x=0.2, y=0.2, c0=50),
         sprite.Sprite(x=0.5, y=0.45, c0=150),
         sprite.Sprite(x=0.85, y=0.75, c0=250),
     ]
     self.success_rewards = [5., 7.5, 11.5]
     self.failure_sprites = [
         sprite.Sprite(x=0.2, y=0.8, c0=50),
         sprite.Sprite(x=0.3, y=0.45, c0=150),
         sprite.Sprite(x=0.9, y=0.75, c0=250),
     ]
     self.failure_rewards = [-25., -5.3, -0.6]
예제 #2
0
    def testFilterDistrib(self):
        sprites = [
            sprite.Sprite(x=0.45, y=0.45, c0=64),
            sprite.Sprite(x=0.45, y=0.55, c0=128),
            sprite.Sprite(x=0.55, y=0.45, c0=192),
            sprite.Sprite(x=0.4, y=0.4, c0=255),
        ]

        filter_distribs = [
            distribs.Continuous('c0', 0, 65),  # selects sprites[:1]
            distribs.Continuous('c0', 0, 129),  # selects sprites[:2]
            distribs.Continuous('c0', 0, 193),  # selects sprites[:3]
            distribs.Continuous('c0', 0, 256),  # selects sprites[:4]
            distribs.Continuous('c0', 65, 256),  # selects sprites[1:4]
        ]

        task_list = [
            tasks.FindGoalPosition(filter_distrib=x,
                                   goal_position=(0.5, 0.5),
                                   terminate_distance=0.1)
            for x in filter_distribs
        ]

        rewards = [1.5, 2.9, 4.4, 2.3, 0.9]
        successes = [True, True, True, False, False]
        for t, r, s in zip(task_list, rewards, successes):
            self.assertAlmostEqual(t.reward(sprites), r, delta=0.1)
            self.assertEqual(t.success(sprites), s)
예제 #3
0
def get_config(mode='train'):
    """Generate environment config.

  Args:
    mode: 'train' or 'test'.

  Returns:
    config: Dictionary defining task/environment configuration. Can be fed as
      kwargs to environment.Environment.
  """

    # Select clusters to use, and their c0 factor distribution.
    c0_clusters = [CLUSTERS_DISTS[cluster] for cluster in MODES[mode]]
    print('Clustering task: {}, #sprites: {}'.format(MODES[mode],
                                                     NUM_SPRITES_PER_CLUSTER))

    other_factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['square', 'triangle', 'circle']),
        distribs.Discrete('scale', [0.13]),
        distribs.Continuous('c1', 0.3, 1.),
        distribs.Continuous('c2', 0.9, 1.),
    ])

    # Generate the sprites to be used in this task, by combining Hue with the
    # other factors.
    sprite_factors = [
        distribs.Product((other_factors, c0)) for c0 in c0_clusters
    ]
    # Convert to sprites, generating the appropriate number per cluster.
    sprite_gen_per_cluster = [
        sprite_generators.generate_sprites(factors,
                                           num_sprites=NUM_SPRITES_PER_CLUSTER)
        for factors in sprite_factors
    ]
    # Concat clusters into single scene to generate.
    sprite_gen = sprite_generators.chain_generators(*sprite_gen_per_cluster)
    # Randomize sprite ordering to eliminate any task information from occlusions
    sprite_gen = sprite_generators.shuffle(sprite_gen)

    # Clustering task will define rewards
    task = tasks.Clustering(c0_clusters,
                            terminate_bonus=0.,
                            reward_range=10.,
                            sparse_reward=True)

    config = {
        'task': task,
        'action_space': common.noisy_action_space(),
        'renderers': common.renderers(),
        'init_sprites': sprite_gen,
        'max_episode_length': MAX_EPISODE_LENGTH,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
예제 #4
0
 def testkeys(self):
     dists = [
         distribs.Discrete('x', [1, 2.5, 3, 12]),
         distribs.Continuous('y', 0, 5),
         distribs.Continuous('z', 2, 10),
     ]
     d = distribs.Product(dists)
     self.assertEqual(d.keys, set(('x', 'y', 'z')))
예제 #5
0
 def testKeys(self):
     d_base = distribs.Product(
         (distribs.Continuous('x', 0, 2), distribs.Continuous('y', 0, 1)))
     d_filter_1 = distribs.Continuous('x', 0, 1)
     d_filter_2 = distribs.Continuous('z', 0.4, 0.6)
     distribs.Selection(d_base, d_filter_1)
     with self.assertRaises(ValueError):
         distribs.Selection(d_base, d_filter_2)
예제 #6
0
class IntersectionTest(parameterized.TestCase):
    """Runs tests for Intersection of distributions."""
    @parameterized.named_parameters(
        ('ContinuousContinuous', distribs.Continuous(
            'x', 0, 2), distribs.Continuous('x', 1, 3), [1.5], [0.5, 2.5]),
        ('DiscreteDiscrete', distribs.Discrete(
            'x', [0, 1]), distribs.Discrete('x', [1, 2]), [1], [0, 2]),
        ('DiscreteContinuous', distribs.Discrete(
            'x', [1, 3]), distribs.Continuous('x', 0, 2), [1], [0.5, 1.5, 3]),
    )
    def testSamplingContainmentIntersectionTwo(self, d_0, d_1, contained,
                                               not_contained):
        d = distribs.Intersection((d_0, d_1))
        contained = [{'x': value} for value in contained]
        not_contained = [{'x': value} for value in not_contained]
        test_sampling_and_containment(self, d, contained, not_contained)

    def testSamplingContainmentIntersectionMultiple(self):
        dists = [
            distribs.Discrete('x', [1, 2.5, 3, 4, 6]),
            distribs.Discrete('x', [1, 2.5, 3, 12]),
            distribs.Continuous('x', 0, 5),
            distribs.Continuous('x', 2, 10),
        ]
        contained = [2.5, 3]
        not_contained = [1, 4, 8]
        d = distribs.Intersection(dists)
        contained = [{'x': value} for value in contained]
        not_contained = [{'x': value} for value in not_contained]
        test_sampling_and_containment(self, d, contained, not_contained)

    def testRaisesError(self):
        d_0 = distribs.Continuous('x', 0, 1)
        d_1 = distribs.Continuous('x', 2, 3)
        d = distribs.Intersection((d_0, d_1))
        with self.assertRaises(ValueError):
            d.sample()

    def testIndexForSampling(self):
        d_0 = distribs.Continuous('x', 0, 2)
        d_1 = distribs.Discrete('x', [1, 3])
        d = distribs.Intersection((d_0, d_1), index_for_sampling=1)
        d.sample()
        with self.assertRaises(ValueError):
            d = distribs.Intersection((d_0, d_1), index_for_sampling=0)
            d.sample()

    def testKeys(self):
        d_0 = distribs.Product(
            (distribs.Continuous('x', 0, 2), distribs.Continuous('y', 0, 1)))
        d_1 = distribs.Product(
            (distribs.Continuous('x', 0, 1), distribs.Continuous('y', 0, 0.5)))
        d_2 = distribs.Continuous('x', 0.4, 0.6)

        distribs.Intersection((d_0, d_1))
        with self.assertRaises(ValueError):
            distribs.Intersection((d_0, d_2))
예제 #7
0
 def testDType(self):
     d_int = distribs.Continuous('x', 0, 1, dtype='int32')
     d_float = distribs.Continuous('x', 0, 1, dtype='float32')
     self.assertTrue(d_int.contains({'x': 0}))
     self.assertTrue(d_float.contains({'x': 0}))
     self.assertFalse(d_int.contains({'x': 1}))
     self.assertFalse(d_float.contains({'x': 1}))
     for _ in range(5):
         self.assertEqual(d_int.sample(), {'x': 0})
예제 #8
0
    def testKeys(self):
        d_0 = distribs.Product(
            (distribs.Continuous('x', 0, 2), distribs.Continuous('y', 0, 1)))
        d_1 = distribs.Product(
            (distribs.Continuous('x', 0, 1), distribs.Continuous('y', 0, 0.5)))
        d_2 = distribs.Continuous('x', 0.4, 0.6)

        distribs.Intersection((d_0, d_1))
        with self.assertRaises(ValueError):
            distribs.Intersection((d_0, d_2))
예제 #9
0
 def testMoreSprites(self, positions_0, positions_1, reward):
     sprites = [sprite.Sprite(x=p[0], y=p[1], c0=75) for p in positions_0]
     sprites.extend(
         [sprite.Sprite(x=p[0], y=p[1], c0=225) for p in positions_1])
     cluster_distribs = [
         distribs.Continuous('c0', 50, 100),
         distribs.Continuous('c0', 200, 250),
     ]
     task = tasks.Clustering(cluster_distribs=cluster_distribs)
     self.assertAlmostEqual(task.reward(sprites), reward, delta=0.1)
예제 #10
0
 def testSamplingContainmentSetMinusMultiple(self):
     base = distribs.Continuous('x', 2, 10)
     hold_out = distribs.Mixture([
         distribs.Discrete('x', [1, 4, 6]),
         distribs.Discrete('x', [3, 8, 9, 12]),
         distribs.Continuous('x', 3, 5),
     ])
     contained = [{'x': value} for value in [2.5, 5.5, 7, 9.5]]
     not_contained = [{'x': value} for value in [4, 6, 9, 11]]
     d = distribs.SetMinus(base, hold_out)
     test_sampling_and_containment(self, d, contained, not_contained)
예제 #11
0
 def setUp(self):
     super(ClusteringTest, self).setUp()
     self.sprites = [
         sprite.Sprite(x=0.2, y=0.2, c0=64),
         sprite.Sprite(x=0.3, y=0.3, c0=128),
         sprite.Sprite(x=0.8, y=0.9, c0=192),
         sprite.Sprite(x=0.9, y=0.8, c0=255),
     ]
     self.cluster_distribs = [
         distribs.Continuous('c0', 0, 129),
         distribs.Continuous('c0', 190, 256),
     ]
예제 #12
0
 def testSamplingContainmentIntersectionMultiple(self):
     dists = [
         distribs.Discrete('x', [1, 2.5, 3, 4, 6]),
         distribs.Discrete('x', [1, 2.5, 3, 12]),
         distribs.Continuous('x', 0, 5),
         distribs.Continuous('x', 2, 10),
     ]
     contained = [2.5, 3]
     not_contained = [1, 4, 8]
     d = distribs.Intersection(dists)
     contained = [{'x': value} for value in contained]
     not_contained = [{'x': value} for value in not_contained]
     test_sampling_and_containment(self, d, contained, not_contained)
예제 #13
0
class MixtureTest(parameterized.TestCase):
    """Runs tests for Mixture of distributions."""
    @parameterized.named_parameters(
        ('DisjointContinuous', distribs.Continuous('x', 0, 1),
         distribs.Continuous('x', 2, 3), [0.5, 2.5], [1.5, 3.5]),
        ('OverlappingContinuous', distribs.Continuous('x', 0, 2),
         distribs.Continuous('x', 1, 3), [0.5, 2.5], [-0.5, 3.5]),
        ('DisjointDiscrete', distribs.Discrete(
            'x', [0, 1]), distribs.Discrete('x', [2, 3]), [1, 2], [-1, 4]),
        ('OverlappingDiscrete', distribs.Discrete(
            'x', [0, 1]), distribs.Discrete('x', [1, 2]), [0, 1, 2], [-1, 3]),
        ('ContinuousDiscrete', distribs.Continuous(
            'x', 0, 2), distribs.Discrete('x', [1, 3]), [0.5, 3], [2.5]),
    )
    def testSamplingContainmentMixtureTwo(self, c_0, c_1, contained,
                                          not_contained):
        d = distribs.Mixture((c_0, c_1))
        contained = [{'x': value} for value in contained]
        not_contained = [{'x': value} for value in not_contained]
        test_sampling_and_containment(self, d, contained, not_contained)

    def testSamplingContainmentMixtureMultiple(self):
        dists = [
            distribs.Continuous('x', 0, 2),
            distribs.Continuous('x', 1, 5),
            distribs.Continuous('x', 9, 12),
            distribs.Discrete('x', [7, 10]),
            distribs.Discrete('x', [14]),
        ]
        contained = [0.5, 4, 11, 7, 14]
        not_contained = [5.5, 6, 8, 13]
        d = distribs.Mixture(dists)
        contained = [{'x': value} for value in contained]
        not_contained = [{'x': value} for value in not_contained]
        test_sampling_and_containment(self, d, contained, not_contained)

    def testRaisesError(self):
        c_0 = distribs.Discrete('x', [0])
        c_1 = distribs.Discrete('y', [1])
        with self.assertRaises(ValueError):
            distribs.Mixture((c_0, c_1))

    def testProbs(self):
        c_0 = distribs.Discrete('x', [0])
        c_1 = distribs.Discrete('x', [1])
        d_0 = distribs.Mixture([c_0, c_1], probs=(0.3, 0.7))
        d_1 = distribs.Mixture([c_0, c_1], probs=(0.0, 1.0))
        for _ in range(5):
            self.assertTrue(d_0.contains(d_0.sample()))
        for _ in range(5):
            self.assertEqual(d_1.sample(), {'x': 1})
예제 #14
0
 def testSamplingContainmentMixtureMultiple(self):
     dists = [
         distribs.Continuous('x', 0, 2),
         distribs.Continuous('x', 1, 5),
         distribs.Continuous('x', 9, 12),
         distribs.Discrete('x', [7, 10]),
         distribs.Discrete('x', [14]),
     ]
     contained = [0.5, 4, 11, 7, 14]
     not_contained = [5.5, 6, 8, 13]
     d = distribs.Mixture(dists)
     contained = [{'x': value} for value in contained]
     not_contained = [{'x': value} for value in not_contained]
     test_sampling_and_containment(self, d, contained, not_contained)
예제 #15
0
 def test4Sprites(self, positions, reward, success):
     sprites = [
         sprite.Sprite(x=positions[0][0], y=positions[0][1], c0=64),
         sprite.Sprite(x=positions[1][0], y=positions[1][1], c0=128),
         sprite.Sprite(x=positions[2][0], y=positions[2][1], c0=192),
         sprite.Sprite(x=positions[3][0], y=positions[3][1], c0=255),
     ]
     cluster_distribs = [
         distribs.Continuous('c0', 0, 129),
         distribs.Continuous('c0', 190, 256),
     ]
     task = tasks.Clustering(cluster_distribs=cluster_distribs)
     self.assertAlmostEqual(task.reward(sprites), reward, delta=0.1)
     self.assertEqual(task.success(sprites), success)
예제 #16
0
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 physics_environment.PhysicsEnvironment.
    """

    # Factor distributions for the sprites.
    factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['circle']),
        distribs.Discrete('scale', [0.1]),
        distribs.Continuous('c0', 0, 1),
        distribs.Discrete('c1', [1.]),
        distribs.Discrete('c2', [1.]),
        distribs.Continuous('x_vel', -0.03, 0.03),
        distribs.Continuous('y_vel', -0.03, 0.03),
        distribs.Discrete('mass', [1]),
    ])

    num_sprites = _NUM_SPRITES[mode]
    sprite_gen = generate_sprites.generate_sprites(
        factors, num_sprites=num_sprites)

    graph_generator = graph_generators.FullyConnected(force=forces.NoForce)

    renderers = {
        'image':
            spriteworld_renderers.PILRenderer(
                image_size=(64, 64), anti_aliasing=5)
    }

    config = {
        'graph_generators': (graph_generator,),
        'renderers': renderers,
        'init_sprites': sprite_gen,
        'episode_length': 20,
        'bounce_off_walls': False,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
def get_config(mode='train'):
    """Generate environment config.

  Args:
    mode: 'train' or 'test'.

  Returns:
    config: Dictionary defining task/environment configuration. Can be fed as
      kwargs to environment.Environment.
  """

    factors = distribs.Product([
        MODES_SHAPES[mode],
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('scale', [0.2]),
        distribs.Discrete('c0', [0.9, 0.55, 0.27], probs=[0.333, 0.334,
                                                          0.333]),
        distribs.Discrete('c1', [0.6]),
        distribs.Continuous('c2', 0.9, 1.),
    ])
    sprite_gen = sprite_generators.generate_sprites(factors,
                                                    num_sprites=NUM_TARGETS,
                                                    fix_colors=True)
    # Randomize sprite ordering to eliminate any task information from occlusions
    sprite_gen = sprite_generators.shuffle(sprite_gen)

    task = tasks.FindGoalPosition(terminate_distance=TERMINATE_DISTANCE,
                                  sparse_reward=True)

    config = {
        'task':
        task,
        'action_space':
        common.noisy_action_space(MOTION_STD_DEV, PROPORTIONAL_MOTION_NOISE,
                                  None),
        'renderers':
        common.renderers(),
        'init_sprites':
        sprite_gen,
        'max_episode_length':
        60,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
예제 #18
0
 def testNoFilteredSprites(self):
     sprites = [sprite.Sprite(x=0.45, y=0.45, c0=255)]
     filter_distrib = distribs.Continuous('c0', 0, 254)
     r = tasks.FindGoalPosition(filter_distrib=filter_distrib,
                                goal_position=(0.5, 0.5),
                                terminate_distance=0.1).reward(sprites)
     self.assertTrue(np.isnan(r))
예제 #19
0
 def test3Clusters(self):
     sprites = [
         sprite.Sprite(x=0.2, y=0.2, c0=64),
         sprite.Sprite(x=0.3, y=0.3, c0=64),
         sprite.Sprite(x=0.8, y=0.9, c0=128),
         sprite.Sprite(x=0.9, y=0.8, c0=128),
         sprite.Sprite(x=0.8, y=0.9, c0=255),
         sprite.Sprite(x=0.9, y=0.8, c0=255),
     ]
     cluster_distribs = [
         distribs.Continuous('c0', 0, 100),
         distribs.Continuous('c0', 100, 150),
         distribs.Continuous('c0', 200, 256),
     ]
     task = tasks.Clustering(cluster_distribs=cluster_distribs)
     self.assertAlmostEqual(task.reward(sprites), 17.5, delta=0.1)
예제 #20
0
 def testIndexForSampling(self):
     d_0 = distribs.Continuous('x', 0, 2)
     d_1 = distribs.Discrete('x', [1, 3])
     d = distribs.Intersection((d_0, d_1), index_for_sampling=1)
     d.sample()
     with self.assertRaises(ValueError):
         d = distribs.Intersection((d_0, d_1), index_for_sampling=0)
         d.sample()
예제 #21
0
    def testCubeWithTunnel(self):
        cube = distribs.Product([
            distribs.Continuous('x', 0, 1),
            distribs.Continuous('y', 0, 1),
            distribs.Continuous('z', 0, 1),
        ])
        tunnel = distribs.Product([
            distribs.Continuous('x', 0.25, 0.75),
            distribs.Continuous('y', 0.25, 0.75),
        ])
        cube_with_tunnel = distribs.SetMinus(cube, tunnel)

        contained = [{
            'x': 0.2,
            'y': 0.2,
            'z': 0.2
        }, {
            'x': 0.2,
            'y': 0.2,
            'z': 0.5
        }, {
            'x': 0.2,
            'y': 0.5,
            'z': 0.5
        }]
        not_contained = [
            {
                'x': 0.5,
                'y': 0.5,
                'z': 0.5
            },
            {
                'x': 0.5,
                'y': 0.5,
                'z': 0.2
            },
        ]
        test_sampling_and_containment(self, cube_with_tunnel, contained,
                                      not_contained)
예제 #22
0
def get_config(mode=None):
    """Generate environment config.

  Args:
    mode: Unused.

  Returns:
    config: Dictionary defining task/environment configuration. Can be fed as
      kwargs to environment.Environment.
  """
    del mode  # No train/test split for pure exploration

    factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['square', 'triangle', 'circle']),
        distribs.Discrete('scale', [0.13]),
        distribs.Continuous('c0', 0., 1.),
        distribs.Continuous('c1', 0.3, 1.),
        distribs.Continuous('c2', 0.9, 1.),
    ])
    num_sprites = lambda: np.random.randint(1, 7)
    sprite_gen = sprite_generators.generate_sprites(factors,
                                                    num_sprites=num_sprites)
    task = tasks.NoReward()

    config = {
        'task': task,
        'action_space': common.action_space(),
        'renderers': common.renderers(),
        'init_sprites': sprite_gen,
        'max_episode_length': 10,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
예제 #23
0
def get_config(mode=None):
    """Generate environment config.

    Args:
        mode: Unused task mode.

    Returns:
        config: Dictionary defining task/environment configuration. Can be fed
            as kwargs to physics_environment.PhysicsEnvironment.
    """

    # Factor distributions for the sprites.
    factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['circle', 'square', 'triangle']),
        distribs.Discrete('scale', [0.1]),
        distribs.Continuous('c0', 0, 1),
        distribs.Continuous('c1', 0.5, 1.),
        distribs.Discrete('c2', [1.]),
        distribs.Continuous('x_vel', -0.03, 0.03),
        distribs.Continuous('y_vel', -0.03, 0.03),
        distribs.Continuous('mass', 0.5, 2.0),
    ])

    sprite_gen = generate_sprites.generate_sprites(
        factors, num_sprites=lambda: np.random.randint(4, 8))

    # The collisions are simulated by applying an invisible rigid circular shell
    # around each sprite. The shell_radius of 0.08 is eye-balled to look
    # reasonable.
    force = forces.SymmetricShellCollision(shell_radius=0.08)
    graph_generator = graph_generators.LowerTriangular(force=force)

    renderers = {
        'image':
            spriteworld_renderers.PILRenderer(
                image_size=(64, 64), anti_aliasing=5)
    }

    config = {
        'graph_generators': (graph_generator,),
        'renderers': renderers,
        'init_sprites': sprite_gen,
        'episode_length': 30,
        'bounce_off_walls': True,
        'physics_steps_per_env_step': 10,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
예제 #24
0
class SetMinusTest(parameterized.TestCase):
    """Runs tests for SetMinus of distributions."""
    @parameterized.named_parameters(
        ('ContinuousContinuous', distribs.Continuous(
            'x', 0, 2), distribs.Continuous('x', 1, 3), [0.5], [1.5]),
        ('DiscreteDiscrete', distribs.Discrete(
            'x', [0, 1]), distribs.Discrete('x', [1, 2]), [0], [1]),
        ('DiscreteContinuous', distribs.Discrete(
            'x', [1, 3]), distribs.Continuous('x', 0, 2), [3], [1]),
        ('ContinuousDiscrete', distribs.Continuous(
            'x', 0, 2), distribs.Discrete('x', [1, 3]), [0.5, 1.5], [1]),
    )
    def testSamplingContainmentSetMinusTwo(self, d_0, d_1, contained,
                                           not_contained):
        d = distribs.SetMinus(d_0, d_1)
        contained = [{'x': value} for value in contained]
        not_contained = [{'x': value} for value in not_contained]
        test_sampling_and_containment(self, d, contained, not_contained)

    def testSamplingContainmentSetMinusMultiple(self):
        base = distribs.Continuous('x', 2, 10)
        hold_out = distribs.Mixture([
            distribs.Discrete('x', [1, 4, 6]),
            distribs.Discrete('x', [3, 8, 9, 12]),
            distribs.Continuous('x', 3, 5),
        ])
        contained = [{'x': value} for value in [2.5, 5.5, 7, 9.5]]
        not_contained = [{'x': value} for value in [4, 6, 9, 11]]
        d = distribs.SetMinus(base, hold_out)
        test_sampling_and_containment(self, d, contained, not_contained)

    def testRaisesError(self):
        d_0 = distribs.Continuous('x', 0, 2)
        d_1 = distribs.Continuous('y', 1, 3)
        with self.assertRaises(ValueError):
            distribs.SetMinus(d_0, d_1)
예제 #25
0
 def testSamplingContainmentProductMultiple(self):
     dists = [
         distribs.Discrete('x', [1, 2.5, 3, 4, 6]),
         distribs.Discrete('y', [1, 2.5, 3, 12]),
         distribs.Continuous('z', 0, 5),
         distribs.Continuous('w', 2, 10),
     ]
     contained = [{'x': 2.5, 'y': 12, 'z': 3.5, 'w': 9}]
     not_contained = [
         {
             'x': 2.5,
             'y': 12,
             'z': 3.5,
             'w': 1
         },
         {
             'x': 3.5,
             'y': 12,
             'z': 3.5,
             'w': 9
         },
     ]
     d = distribs.Product(dists)
     test_sampling_and_containment(self, d, contained, not_contained)
예제 #26
0
def get_config(mode='train'):
    """Generate environment config.

  Args:
    mode: 'train' or 'test'.

  Returns:
    config: Dictionary defining task/environment configuration. Can be fed as
      kwargs to environment.Environment.
  """

    shared_factors = distribs.Product([
        distribs.Discrete('shape', ['square', 'triangle', 'circle']),
        distribs.Discrete('scale', [0.13]),
        distribs.Continuous('c1', 0.3, 1.),
        distribs.Continuous('c2', 0.9, 1.),
    ])
    target_hue = distribs.Continuous('c0', 0., 0.4)
    distractor_hue = distribs.Continuous('c0', 0.5, 0.9)
    target_factors = distribs.Product([
        MODES_TARGET_POSITIONS[mode],
        target_hue,
        shared_factors,
    ])
    distractor_factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distractor_hue,
        shared_factors,
    ])

    target_sprite_gen = sprite_generators.generate_sprites(
        target_factors, num_sprites=NUM_TARGETS)
    distractor_sprite_gen = sprite_generators.generate_sprites(
        distractor_factors, num_sprites=NUM_DISTRACTORS)
    sprite_gen = sprite_generators.chain_generators(target_sprite_gen,
                                                    distractor_sprite_gen)
    # Randomize sprite ordering to eliminate any task information from occlusions
    sprite_gen = sprite_generators.shuffle(sprite_gen)

    task = tasks.FindGoalPosition(filter_distrib=target_hue,
                                  terminate_distance=TERMINATE_DISTANCE)

    config = {
        'task': task,
        'action_space': common.action_space(),
        'renderers': common.renderers(),
        'init_sprites': sprite_gen,
        'max_episode_length': 20,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
예제 #27
0
def get_config(mode=None):
    """Generate environment config.

    Args:
        mode: Unused task mode.

    Returns:
        config: Dictionary defining task/environment configuration. Can be fed
            as kwargs to physics_environment.PhysicsEnvironment.
    """

    # Factor distributions for the sprites.
    factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['circle', 'square', 'triangle']),
        distribs.Discrete('scale', [0.1]),
        distribs.Continuous('c0', 0, 1),
        distribs.Continuous('c1', 0.5, 1.),
        distribs.Discrete('c2', [1.]),
        distribs.Continuous('x_vel', -0.03, 0.03),
        distribs.Continuous('y_vel', -0.03, 0.03),
        distribs.Continuous('mass', 0.5, 2.0),
    ])

    sprite_gen = generate_sprites.generate_sprites(factors, num_sprites=4)

    force = forces.Spring(spring_constant=0.03, spring_equilibrium=0.25)
    graph_generator = graph_generators.FullyConnected(force=force)

    renderers = {
        'image':
        spriteworld_renderers.PILRenderer(image_size=(64, 64), anti_aliasing=5)
    }

    config = {
        'graph_generators': (graph_generator, ),
        'renderers': renderers,
        'init_sprites': sprite_gen,
        'episode_length': 30,
        'bounce_off_walls': False,
        'physics_steps_per_env_step': 10,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
def get_config(mode=None):
    """Generate environment config.

  Args:
    mode: Unused task mode.

  Returns:
    config: Dictionary defining task/environment configuration. Can be fed as
      kwargs to environment.Environment.
  """
    del mode

    shared_factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['square', 'triangle', 'circle']),
        distribs.Discrete('scale', [0.13]),
        distribs.Continuous('c1', 0.3, 1.),
        distribs.Continuous('c2', 0.9, 1.),
    ])
    target_hue = distribs.Continuous('c0', 0., 0.4)
    distractor_hue = distribs.Continuous('c0', 0.5, 0.9)
    target_factors = distribs.Product([
        target_hue,
        shared_factors,
    ])
    distractor_factors = distribs.Product([
        distractor_hue,
        shared_factors,
    ])

    target_sprite_gen = sprite_generators.generate_sprites(
        target_factors, num_sprites=NUM_TARGETS)
    distractor_sprite_gen = sprite_generators.generate_sprites(
        distractor_factors, num_sprites=NUM_DISTRACTORS)
    sprite_gen = sprite_generators.chain_generators(target_sprite_gen,
                                                    distractor_sprite_gen)
    # Randomize sprite ordering to eliminate any task information from occlusions
    sprite_gen = sprite_generators.shuffle(sprite_gen)

    # Create the agent body
    agent_body_factors = distribs.Product([
        distribs.Continuous('x', 0.1, 0.9),
        distribs.Continuous('y', 0.1, 0.9),
        distribs.Discrete('shape', ['circle']),
        distribs.Discrete('scale', [0.07]),
        distribs.Discrete('c0', [1.]),
        distribs.Discrete('c1', [0.]),
        distribs.Discrete('c2', [1.]),
    ])
    agent_body_gen = sprite_generators.generate_sprites(agent_body_factors,
                                                        num_sprites=1)
    sprite_gen = sprite_generators.chain_generators(sprite_gen, agent_body_gen)

    task = tasks.FindGoalPosition(filter_distrib=target_hue,
                                  terminate_distance=TERMINATE_DISTANCE)

    renderers = {
        'image':
        spriteworld_renderers.PILRenderer(image_size=(64, 64),
                                          anti_aliasing=5,
                                          color_to_rgb=color_maps.hsv_to_rgb)
    }

    config = {
        'task': task,
        'action_space': action_spaces.Embodied(step_size=0.05),
        'renderers': renderers,
        'init_sprites': sprite_gen,
        'max_episode_length': 50,
        'metadata': {
            'name': os.path.basename(__file__),
            'mode': mode
        }
    }
    return config
예제 #29
0
from __future__ import print_function

import os
from spriteworld import factor_distributions as distribs
from spriteworld import sprite_generators
from spriteworld import tasks
from spriteworld.configs.cobra import common

TERMINATE_DISTANCE = 0.075
NUM_TARGETS = 1
NUM_DISTRACTORS = 1
MODES_TARGET_POSITIONS = {
    'train':
    distribs.SetMinus(
        distribs.Product((
            distribs.Continuous('x', 0.1, 0.9),
            distribs.Continuous('y', 0.1, 0.9),
        )),
        distribs.Product((
            distribs.Continuous('x', 0.5, 0.9),
            distribs.Continuous('y', 0.5, 0.9),
        )),
    ),
    'test':
    distribs.Product((
        distribs.Continuous('x', 0.5, 0.9),
        distribs.Continuous('y', 0.5, 0.9),
    )),
}

예제 #30
0
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