Exemple #1
0
def setup_fixtures(fixture):
	before = fixture.pop('before')
	after = fixture.pop('after')
	boids = Boids()
	boids.positions = np.array(before[0:2])
	boids.velocities = np.array(before[2:4])
	return boids,after
Exemple #2
0
 def test_init(self, case):
     args = case["args"]
     b = Boids(**args)
     for arg, val in args.items():
         self.assertEqual(b.__getattribute__(TestBoids.ARGS_TO_ATTRS[arg]),
                          val)
     self.assertEqual(sum(b.rules.values()), 1)
Exemple #3
0
    def __init__(self, config):
        self.x_axis = config['x_axis']
        self.y_axis = config['y_axis']
        self.frames = config['frames']
        self.interval = config['interval']
        self.boids = Boids(config)

        self.plot()
Exemple #4
0
 def test_perceive(self, case):
     """
     Tests the correctness of perceptual matrix when neighbors are
     within or outside of perceptual range
     """
     b = Boids(**case[INIT])
     b.state = np.asarray(case[ARGS])
     self.assertEqual(np.asarray(case[EXPECTED]),
                      b._perceive())
def test_bad_boids_regression():
	regression_data=yaml.load(open(os.path.join(os.path.dirname(__file__),'fixtures','regression.yaml')))
	boid_data=np.array(regression_data.pop("before"))
	boids = Boids()
	boids.positions = boid_data[0:2]
	boids.velocities = boid_data[2:4]
	boids.update_boids(boids.positions, boids.velocities)
	for after,before in zip(regression_data["after"],boid_data):
		for after_value,before_value in zip(after,before): 
			assert_almost_equal(after_value,before_value,delta=0.02)
Exemple #6
0
def test_animate():
    with patch.object(Boids, 'update_boids') as mock_get:
        new_flock = Boids(2, config_filename)
        """new_flock.positions[0][0] = 0
        new_flock.positions[1][0] = 0
        new_flock.positions[0][1] = 1
        new_flock.positions[1][1] = 0"""
        new_flock.animate('something')
        print mock_get.mock_calls
        mock_get.assert_called_with()
Exemple #7
0
def test_separations_square_distance():
	fixtures = yaml.load(open(fixtures_file))
	for fixture in fixtures:
		fix_separations = fixture.pop('separations_square_distances')
		positions = fix_separations['positions']
		sq_distances = fix_separations['sq_distances']
		fix_separations = fix_separations['separations']
		boids = Boids()
		boids.positions = np.array(positions)
		separations, square_distances = boids.separations_square_distances(boids.positions)
		assert_almost_equal(separations.all(),np.array(fix_separations).all())
Exemple #8
0
 def test_init(self, case):
     """Verify that all args are passed in correctly."""
     ARGS_TO_ATTRS = {
         "dims": "dims",
         "num_boids": "num_boids",
         "environ_bounds": "env_bounds",
         "max_velocity": "max_vel",
         "max_acceleration": "max_acc",
         "perceptual_range": "p_range"
     }
     args = case[ARGS]
     b = Boids(**args)
     for arg, val in args.items():
         self.assertEqual(b.__getattribute__(ARGS_TO_ATTRS[arg]), val)
     self.assertEqual(sum(b.rules.values()), 1)
Exemple #9
0
 def test_correct_coordinates(self):
     boids = Boids(TestBoids.config)
     old_x_coordinates = boids.properties["x_coordinate"][:]
     old_y_coordinates = boids.properties["y_coordinate"][:]
     old_x_velocities = boids.properties["x_velocity"][:]
     old_y_velocities = boids.properties["y_velocity"][:]
     boids.correct_coordinates(0)
     new_x_coordinates = boids.properties["x_coordinate"][:]
     new_y_coordinates = boids.properties["y_coordinate"][:]
     new_x_velocities = boids.properties["x_velocity"][:]
     new_y_velocities = boids.properties["y_velocity"][:]
     self.assertListEqual(old_x_velocities, new_x_velocities)
     self.assertListEqual(old_y_velocities, new_y_velocities)
     self.assertListEqual(old_x_coordinates[1:], new_x_coordinates[1:])
     self.assertListEqual(old_y_coordinates[1:], new_y_coordinates[1:])
     self.assertFalse(old_x_coordinates[0] == new_x_coordinates[0])
     self.assertFalse(old_y_coordinates[0] == new_y_coordinates[0])
Exemple #10
0
 def __init__(self, center: List[int], environ_bounds: List[int]):
     self.center = center
     self.boids = Boids(num_boids=200,
                        environ_bounds=environ_bounds,
                        max_velocity=2,
                        max_acceleration=1,
                        perceptual_range=150,
                        origin=center)
     self.cube = Cube(self.center, size=max(environ_bounds))
Exemple #11
0
class Animation(object):
    """
    This class creates an animation based on the inputs specified in the config
    file.
    Parameters
    ----------
    config: yaml file with specified:
        - x_axis
        - y_axis
        - frames
        - interval
    """
    def __init__(self, config):
        self.x_axis = config['x_axis']
        self.y_axis = config['y_axis']
        self.frames = config['frames']
        self.interval = config['interval']
        self.boids = Boids(config)

        self.plot()

    def plot(self):
        """
        This method plots the graph of boids.
        """
        figure = plt.figure()
        axes = plt.axes(xlim=tuple(self.x_axis), ylim=tuple(self.y_axis))
        self.scatter = axes.scatter(self.boids.properties["x_coordinate"],
                                    self.boids.properties["y_coordinate"])
        anim = animation.FuncAnimation(figure,
                                       self.animate,
                                       frames=self.frames,
                                       interval=self.interval)
        plt.show()

    def animate(self, frame):
        """
        This method updates the graph with the new coordinates of boids.
        """
        self.boids.update()
        self.scatter.set_offsets(
            list(
                zip(self.boids.properties["x_coordinate"],
                    self.boids.properties["y_coordinate"])))
Exemple #12
0
 def test_init_boids_state(self, case):
     args = case["args"]
     b = Boids(**args)
     self.assertEqual(b.state.shape,
                      (args["dims"], args["num_boids"], len(Boids.Attr)))
     for idx, limit in zip((Boids.Attr.VEL, Boids.Attr.ACC),
                           (b.max_vel, b.max_acc)):
         self.assertLessEqual(np.max(b.state[:, :, idx]), limit)
     for dim in range(b.dims):
         self.assertLessEqual(np.max(b.state[dim, :, Boids.Attr.LOC]),
                              b.env_bounds[dim])
Exemple #13
0
 def test_init_boids_state(self, case):
     """Verifies state shape and state values are within bounds."""
     args = case[ARGS]
     b = Boids(**args)
     self.assertEqual(b.state.shape, tuple(case[EXPECTED]))
     for idx, limit in zip((Boids.Attr.VEL, Boids.Attr.ACC),
                           (b.max_vel, b.max_acc)):
         self.assertLessEqual(np.max(b.state[:, :, idx]), limit)
     for dim in range(b.dims):
         self.assertLessEqual(np.max(b.state[dim, :, Boids.Attr.LOC]),
                              b.env_bounds[dim])
Exemple #14
0
def test_bad_boids_regression():
    #    open(os.path.join(os.path.dirname(__file__),'boids.py'))
    config_filename = os.path.join(os.path.dirname(__file__),
                                   'fixtures/config.yaml')
    regression_data = yaml.load(
        open(os.path.join(os.path.dirname(__file__), 'fixtures/fixture.yaml')))

    boids = Boids(10, config_filename)
    boid_data = np.asarray(regression_data["before"])
    boids.positions = np.array([boid_data[0], boid_data[1]])
    boids.velocities = np.array([boid_data[2], boid_data[3]])
    boids.update_boids()

    new_boid_data = np.asarray(regression_data["after"])
    new_positions = np.asarray([new_boid_data[0], new_boid_data[1]])
    new_velocities = np.asarray([new_boid_data[2], new_boid_data[3]])
    new_boids = (new_positions, new_velocities)

    for after, before in zip(new_positions, boids.positions):
        for after_value, before_value in zip(after, before):
            assert_almost_equal(after_value, before_value, delta=0.06)
Exemple #15
0
def test_match_speed(
):  # Check that velocities match. Should change in y-direction but stay constant in x-direction for input values.
    new_flock = Boids(2, config_filename)

    new_flock.positions[0][0] = 0
    new_flock.positions[1][0] = 10
    new_flock.positions[0][1] = 0
    new_flock.positions[1][1] = 10

    new_flock.velocities[0][0] = 0
    new_flock.velocities[0][1] = 0
    new_flock.velocities[1][0] = 0
    new_flock.velocities[1][1] = 10

    old_velocities_x1 = new_flock.velocities[0][0]
    old_velocities_x2 = new_flock.velocities[0][1]
    old_velocities_y1 = new_flock.velocities[1][0]
    old_velocities_y2 = new_flock.velocities[1][1]

    new_flock.match_velocity()

    assert (old_velocities_x1 == new_flock.velocities[0][0])
    assert (old_velocities_x2 == new_flock.velocities[0][1])
    assert (old_velocities_y1 < new_flock.velocities[1][0])
    assert (old_velocities_y2 > new_flock.velocities[1][1])
Exemple #16
0
 def test_distance(self):
     boids = Boids(TestBoids.config)
     self.assertTrue(boids.distance(0, 1) > 0)
     self.assertTrue(boids.distance(0, 0) == 0)
     self.assertTrue(type(boids.distance(0, 1)) is float)
Exemple #17
0
 def test_update(self):
     boids = Boids(TestBoids.config)
     boids.update()
     self.assertTrue(type(boids.properties) == dict)
Exemple #18
0
 def test_properties(self):
     boids = Boids(TestBoids.config)
     self.assertTrue(type(boids.properties) is dict)
     self.assertEqual(len(boids.properties), 4)
     self.assertEqual(len(boids.properties["x_coordinate"]),
                      TestBoids.config["number_of_birds"])
Exemple #19
0
 def test_align(self, case):
     b = Boids(**case[INIT])
     b.state = np.asarray(case[INIT_STATE])
     self.assertEqual(np.asarray(case[EXPECTED]),
                      b.align(np.asarray(case[ARGS]))) 
Exemple #20
0
def test_avoid_collissions():
    new_flock = Boids(2, config_filename)

    new_flock.positions[0][0] = 0
    new_flock.positions[1][0] = 0
    new_flock.positions[0][1] = 1
    new_flock.positions[1][1] = 0

    new_flock.velocities[0][0] = 0
    new_flock.velocities[0][1] = 0
    new_flock.velocities[1][0] = 0
    new_flock.velocities[1][1] = 0

    old_velocities_x1 = new_flock.velocities[0][0]
    old_velocities_x2 = new_flock.velocities[0][1]
    old_velocities_y1 = new_flock.velocities[1][0]
    old_velocities_y2 = new_flock.velocities[1][1]

    new_flock.avoid_collisions()

    print new_flock.velocities

    assert (old_velocities_x1 > new_flock.velocities[0][0])
    assert (old_velocities_x2 < new_flock.velocities[0][1])
    assert (old_velocities_y1 == 0)
    assert (old_velocities_y2 == 0)
Exemple #21
0
def test_zero_boids():
    with assert_raises(ValueError) as exception:
        new_flock = Boids(0, config_filename)
Exemple #22
0
 def test_update_loc(self, case):
     b = Boids(**case[INIT])
     b.state = np.asarray(case[ARGS], dtype=float)
     b._update_loc()
     self.assertEqual(np.asarray(case[EXPECTED]), b.state)
Exemple #23
0
 def test_update_acc(self, case):
     b = Boids(**case[INIT])
     b.state = np.asarray(case[INIT_STATE], dtype=float)
     b._update_acc(np.asarray(case[ARGS]["acc_delta"]), case[ARGS]["coeff"])
     self.assertEqual(np.asarray(case[EXPECTED]), b.state)
Exemple #24
0
def test_bad_input_file():
    with assert_raises(IOError) as exception:
        new_flock = Boids(10, 'file_that_does_not_exist')
Exemple #25
0
def test_wrong_boid_no_type():
    with assert_raises(TypeError) as exception:
        new_flock = Boids('string', config_filename)
Exemple #26
0
def test_fly_towards_middle():
    new_flock = Boids(2, config_filename)
    # Set initial positions
    new_flock.positions[0][0] = 0
    new_flock.positions[1][0] = 0
    new_flock.positions[0][1] = 0
    new_flock.positions[1][1] = 10

    new_flock.velocities[0][0] = 0
    new_flock.velocities[0][1] = 0
    new_flock.velocities[1][0] = 0
    new_flock.velocities[1][1] = 0

    old_position_x1 = new_flock.positions[0][0]
    old_position_x2 = new_flock.positions[0][1]
    old_position_y1 = new_flock.positions[1][0]
    old_position_y2 = new_flock.positions[1][1]

    old_velocities_x1 = new_flock.velocities[0][0]
    old_velocities_x2 = new_flock.velocities[0][1]
    old_velocities_y1 = new_flock.velocities[1][0]
    old_velocities_y2 = new_flock.velocities[1][1]

    new_flock.fly_to_middle()

    assert (old_velocities_x1 == new_flock.velocities[0][0])
    assert (old_velocities_x2 == new_flock.velocities[0][1])
    assert (old_velocities_y1 < new_flock.velocities[1][0])
    assert (old_velocities_y2 > new_flock.velocities[1][1])
Exemple #27
0
def test_initialise():
    with patch.object(numpy.random, 'rand') as mock_get:
        new_flock = Boids(10, config_filename)
        print mock_get.mock_calls
        mock_get.assert_called_with(2, 10)
Exemple #28
0
def test_negative_boid_no():
    with assert_raises(ValueError) as exception:
        new_flock = Boids(-10, config_filename)