Example #1
0
    def __init__(self):
        """ Set pygame stuff up for running the simulation."""

        pygame.init()
        grid = GridWorld(20, 20, 30)
        ideal_grid = Grid(20, 20, 30)
        ideal_grid.grid = [[1 if x <= 10 else 0 for x in range(20)] for _ in range(20)]
        grid.set_ideal_grid(ideal_grid)
        width = grid.width() * grid.gridsize()
        height = grid.height() * grid.gridsize()
        self.grid = grid
        self.window = pygame.display.set_mode((width, height))
        self.printer = VirtualPrinter(10, 10, 9, 1, pygame.color.Color("darkorange"), grid)
        self.camera = VisualCamera(self.grid, self.printer, 3)
        self.grid.draw(self.window)
Example #2
0
class AnnRunner:

    def __init__(self, ideal_grid):
        self.gridworld = GridWorld(ideal_grid.width, ideal_grid.height, ideal_grid.gridsize)
        self.gridworld.set_ideal_grid(ideal_grid)
        self.printer = VirtualPrinter(10, 10, 9, 1, pygame.color.Color("darkorange"), self.gridworld)
        self.camera = VisualCamera(self.gridworld, self.printer, 3)
        self.ideal_camera = Camera(self.gridworld.ideal_grid, self.printer, 3)

        #gui stuff
        pygame.init()
        width = self.gridworld.width() * self.gridworld.gridsize()
        height = self.gridworld.height() * self.gridworld.gridsize()
        self.window = pygame.display.set_mode((width, height))

    def run(self, n):
        self.printer.position = Vector(270, 150)
        while True:
            self.printer.setPenDown()
            actual = self.camera.camera.all_cell_values()
            ideal = self.ideal_camera.all_cell_values()
            pattern = [i - a for i,a in zip(actual, ideal)]
            result = n.propagate(pattern)
            result = [int(round(x)) for x in result]
            result = ''.join(map(str, result))
            self.printer.v = Vector(self.get_velocity(result[:2]), self.get_velocity(result[2:]))
            self.printer.simulate(1)
            self.redraw()
            pygame.display.update()

    def get_velocity(self, instruction):
        if instruction == "10":
            return -100
        elif instruction == "01":
            return 100
        else:
            return 0

    def redraw(self):
        self.gridworld.draw(self.window)
        self.printer.draw(self.window)
        self.camera.draw(self.window)
Example #3
0
class AnnRunner(object):

    camera_size = 3

    def __init__(self, ideal_grid, units_per_cell=10):
        self.gridworld = GridWorld(ideal_grid.width, ideal_grid.height, ideal_grid.gridsize)
        self.gridworld.set_ideal_grid(ideal_grid)
        self.printer = Printer(10, 10, 9, 1, self.gridworld, units_per_cell) #TODO: shouldn't be giving location values here when it's determined somewhere else. that smells a lot
        self.camera = Camera(self.gridworld.grid, self.printer, self.camera_size)
        self.ideal_grid = self.gridworld.ideal_grid
        self.ideal_camera = Camera(self.gridworld.ideal_grid, self.printer, self.camera_size)
        width = self.gridworld.width() * self.gridworld.gridsize()
        height = self.gridworld.height() * self.gridworld.gridsize()

    def run(self, n, iterations=10000):
        self.printer.set_position_on_grid(self.ideal_grid.starting_point[0], self.ideal_grid.starting_point[1])
        for i in xrange(iterations):
            self.printer.setPenDown()
            actual = self.camera.all_cell_values()
            ideal = self.ideal_camera.all_cell_values()
            pattern = [i - a for i,a in zip(actual, ideal)]
            result = n.propagate(pattern)
            result = [int(round(x)) for x in result]
            result = ''.join(map(str, result))
            self.printer.v = Vector(self.get_velocity(result[:2]), self.get_velocity(result[2:]))
            self.printer.simulate()
            self.update()
        return (self.ideal_grid, self.gridworld.grid)

    def update(self):
        return

    def get_velocity(self, instruction):
        if instruction == "10":
            return -1
        elif instruction == "01":
            return 1
        else:
            return 0
Example #4
0
class TestCamera(unittest.TestCase):
    def setUp(self):
        self.gridworld = GridWorld(20, 20, 10) 
        self.printer = VirtualPrinter(0, 0, 10, 1, pygame.color.Color("darkorange"), self.gridworld)
        self.grid = self.gridworld.grid
        self.camera = Camera(self.grid, self.printer, 3)

    def test_camera_has_correct_values_at_init(self):
        self.assertIs(self.camera.grid, self.gridworld.grid)
        self.assertIs(self.camera.printer, self.printer)
        self.assertEqual(self.camera.n, 3)
        self.assertEqual(self.camera.cell_width, self.gridworld.gridsize())

    def test_num_cells_in_view_isnt_wrong(self):
        #one cell
        self.printer.position = Vector(15, 15)
        self.assertEqual(self.camera.num_cells_in_view(Vector(1, 1)), 1)
        #two cell
        self.printer.position = Vector(15, 12)
        self.assertEqual(self.camera.num_cells_in_view(Vector(1, 1)), 2)
        #red cell
        self.printer.position = Vector(12, 12)
        self.assertEqual(self.camera.num_cells_in_view(Vector(1, 1)), 4)
        #blue cell

    def test_cells_in_view_independent_of_camera_size(self):
        local_camera = Camera(self.grid, self.printer, 4)
        self.printer.position = Vector(30, 30)
        self.assertEqual(local_camera.num_cells_in_view(Vector(1, 1)), 1)
        #two cell
        self.printer.position = Vector(30, 32)
        self.assertEqual(local_camera.num_cells_in_view(Vector(1, 1)), 2)
        #red cell
        self.printer.position = Vector(32, 32)
        self.assertEqual(local_camera.num_cells_in_view(Vector(1, 1)), 4)

    def test_cells_have_same_result_for_cells_in_view(self):
        #one cell
        self.printer.position = Vector(15, 15)
        self.assertEqual(self.camera.num_cells_in_view(Vector(3, 3)), 1)
        #two cell
        self.printer.position = Vector(15, 12)
        self.assertEqual(self.camera.num_cells_in_view(Vector(3, 3)), 2)
        #red cell
        self.printer.position = Vector(12, 12)
        self.assertEqual(self.camera.num_cells_in_view(Vector(3, 3)), 4)
        #blue cell
    
    def test_region_aligned(self):
        self.printer.position = Vector(15, 15)
        self.grid.set_loc_val(1, 1, 3)
        self.assertEqual(self.camera.percent_in_view(Vector(1, 1)), 3)

    def test_region_over_two_cells_horizontally_aligned(self):
        self.printer.position = Vector(15, 20)
        self.grid.set_loc_val(1, 1, 1)
        self.grid.set_loc_val(1, 2, 0)
        self.assertEqual(self.camera.percent_in_view(Vector(1, 1)), 0.5)

    def test_region_over_two_cells_vertically_aligned(self):
        self.printer.position = Vector(20, 15)
        self.grid.set_loc_val(1, 1, 1)
        self.grid.set_loc_val(2, 1, 0)
        self.assertEqual(self.camera.percent_in_view(Vector(1, 1)), 0.5)
        self.printer.position = Vector(22, 15)
        self.grid.set_loc_val(1, 1, 1)
        self.grid.set_loc_val(2, 1, 0)
        self.assertEqual(self.camera.percent_in_view(Vector(1, 1)), 0.7)

    def test_region_over_four_cells(self):
        self.printer.position = Vector(20, 20)
        self.grid.set_loc_val(1, 1, 1)
        self.grid.set_loc_val(2, 1, 0)
        self.grid.set_loc_val(1, 2, 0)
        self.grid.set_loc_val(2, 2, 0)
        self.assertEqual(self.camera.percent_in_view(Vector(1, 1)), 0.25)

    def test_region_over_four_cells_with_arbitrary_camera_size(self):
        localcamera = Camera(self.grid, self.printer, 5)
        self.printer.position = Vector(20, 20)
        self.grid.set_loc_val(1, 1, 1)
        self.grid.set_loc_val(2, 1, 0)
        self.grid.set_loc_val(1, 2, 0)
        self.grid.set_loc_val(2, 2, 0)
        self.assertEqual(self.camera.percent_in_view(Vector(1, 1)), 0.25)
class Generator:
    movement_constant = 3

    aquire_data = True

    def __init__(self, ideal_grid=None, ideal_grid_path=None):
        """ Set pygame stuff up for running the simulation."""

        assert ideal_grid or ideal_grid_path, "must provide at least one ideal grid"

        self.gridworld = GridWorld(ideal_grid.width, ideal_grid.height, ideal_grid.gridsize)
        self.gridworld.set_ideal_grid(ideal_grid)
        self.printer = VirtualPrinter(10, 10, 9, 1, pygame.color.Color("darkorange"), self.gridworld)
        self.camera = VisualCamera(self.gridworld, self.printer, 3)
        self.ideal_camera = Camera(self.gridworld.ideal_grid, self.printer, 3)
        
        #gui stuff
        pygame.init()
        width = self.gridworld.width() * self.gridworld.gridsize()
        height = self.gridworld.height() * self.gridworld.gridsize()
        self.window = pygame.display.set_mode((width, height))

    def generate(self, outputfile):
        inputs = []
        outputs = []
        self.printer.setPenDown()
        self.printer.v = Vector(0, 0)
        self.printer.position = Vector(270, 130)
        while self.aquire_data:
            actual = self.camera.camera.all_cell_values()
            ideal = self.ideal_camera.all_cell_values()
            inputs.append([i - a for a,i in zip(actual, ideal)])
            outputs.append([self.printer.v.x, self.printer.v.y])
            self.act_and_refresh()
        outputs = [[self.encode(x) + self.encode(y)] for x,y in outputs]
        self.aquire_data = True
        with open(outputfile, 'w') as output:
            writer = csv.writer(output)
            writer.writerow(camera_headers + output_headers)
            for inval, outval in zip(inputs, outputs):
                writer.writerow(inval + outval)

    def encode(self, velocity):
        if velocity >= 100:
            return "01"
        elif velocity <= -100:
            return "10"
        else:
            return "00"

    def act_and_refresh(self):
            self.act_on_key_input()
            self.printer.simulate(1)
            self.redraw()
            pygame.display.update()

    def act_on_key_input(self):
        for event in pygame.event.get(pygame.KEYUP):
            if event.key == pygame.K_p:
                self.print_all_camera_values()
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.printer.v = Vector(-100, 0)
        if keys[pygame.K_RIGHT]:
            self.printer.v = Vector(100, 0)
        if keys[pygame.K_UP]:
            self.printer.v = Vector(0, -100)
        if keys[pygame.K_DOWN]:
            self.printer.v = Vector(0, 100)
        if keys[pygame.K_SPACE]:
            self.printer.v = Vector(0, 0)
        if keys[pygame.K_q]:
            self.aquire_data = False

    def redraw(self):
        self.gridworld.draw(self.window)
        self.printer.draw(self.window)
        self.camera.draw(self.window)