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)
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)
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
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)