|  | #!/usr/bin/env python3 | 
|  | # Run `python3 -m unittest utils.lib.rr_graph.tests.test_channel` | 
|  | import unittest | 
|  |  | 
|  | from ..grid import Site, Tile, Grid, check_grid_loc, EAST | 
|  |  | 
|  |  | 
|  | class TestGrid(unittest.TestCase): | 
|  | def test_good_grids(self): | 
|  | check_grid_loc({ | 
|  | (0, 0): None, | 
|  | }) | 
|  |  | 
|  | check_grid_loc({ | 
|  | (0, 0): None, | 
|  | (0, 1): None, | 
|  | }) | 
|  |  | 
|  | check_grid_loc({ | 
|  | (0, 0): None, | 
|  | (1, 0): None, | 
|  | }) | 
|  |  | 
|  | check_grid_loc( | 
|  | { | 
|  | (0, 0): None, | 
|  | (1, 0): None, | 
|  | (1, 1): None, | 
|  | (0, 1): None, | 
|  | } | 
|  | ) | 
|  |  | 
|  | def test_bad_grids(self): | 
|  | self.assertRaises(ValueError, lambda: check_grid_loc({})) | 
|  | self.assertRaises( | 
|  | AssertionError, lambda: check_grid_loc({(0, 1): None}) | 
|  | ) | 
|  | self.assertRaises( | 
|  | AssertionError, lambda: | 
|  | check_grid_loc({ | 
|  | (0, 0): None, | 
|  | (1, 0): None, | 
|  | (0, 1): None, | 
|  | }) | 
|  | ) | 
|  |  | 
|  | def test_round_trip(self): | 
|  | grid_loc_map = {} | 
|  | NUM_X = 5 | 
|  | NUM_Y = 8 | 
|  | for x in range(NUM_X): | 
|  | for y in range(NUM_Y): | 
|  | coord_idx = x + y * NUM_X | 
|  | grid_loc_map[(x, y)] = Tile( | 
|  | root_phy_tile_pkeys=[coord_idx], | 
|  | phy_tile_pkeys=[coord_idx], | 
|  | tile_type_pkey=coord_idx, | 
|  | sites=[], | 
|  | ) | 
|  |  | 
|  | empty_tile_type_pkey = NUM_X * NUM_Y | 
|  |  | 
|  | grid = Grid(grid_loc_map, empty_tile_type_pkey) | 
|  | output_grid_loc_map = grid.output_grid() | 
|  |  | 
|  | for x in range(NUM_X): | 
|  | for y in range(NUM_Y): | 
|  | coord_idx = x + y * NUM_X | 
|  | self.assertEqual( | 
|  | coord_idx, output_grid_loc_map[(x, y)].tile_type_pkey | 
|  | ) | 
|  |  | 
|  | def test_tile_split(self): | 
|  | grid_loc_map = {} | 
|  | NUM_X = 5 | 
|  | NUM_Y = 8 | 
|  | for x in range(NUM_X): | 
|  | for y in range(NUM_Y): | 
|  | coord_idx = x + y * NUM_X | 
|  |  | 
|  | sites = [ | 
|  | Site( | 
|  | name='{}, {}'.format(x, y), | 
|  | phy_tile_pkey=coord_idx, | 
|  | tile_type_pkey=x, | 
|  | site_type_pkey=x, | 
|  | site_pkey=2 * x, | 
|  | x=0, | 
|  | y=0, | 
|  | ), | 
|  | Site( | 
|  | name='{}, {}'.format(x, y), | 
|  | phy_tile_pkey=coord_idx, | 
|  | tile_type_pkey=x, | 
|  | site_type_pkey=x, | 
|  | site_pkey=2 * x + 1, | 
|  | x=0, | 
|  | y=1, | 
|  | ), | 
|  | ] | 
|  |  | 
|  | grid_loc_map[(x, y)] = Tile( | 
|  | root_phy_tile_pkeys=[coord_idx], | 
|  | phy_tile_pkeys=[coord_idx], | 
|  | tile_type_pkey=x, | 
|  | sites=sites, | 
|  | ) | 
|  |  | 
|  | empty_tile_type_pkey = NUM_X * NUM_Y | 
|  |  | 
|  | grid = Grid(grid_loc_map, empty_tile_type_pkey) | 
|  |  | 
|  | grid.split_tile_type( | 
|  | tile_type_pkey=3, | 
|  | tile_type_pkeys=[ | 
|  | NUM_X, | 
|  | NUM_X + 1, | 
|  | ], | 
|  | split_direction=EAST, | 
|  | split_map={ | 
|  | (0, 0): 0, | 
|  | (0, 1): 1, | 
|  | }, | 
|  | ) | 
|  |  | 
|  | output_grid_loc_map = grid.output_grid() | 
|  |  | 
|  | assert (NUM_X, NUM_Y - 1) in output_grid_loc_map | 
|  | assert (NUM_X + 1, NUM_Y - 1) not in output_grid_loc_map | 
|  | assert (NUM_X, NUM_Y) not in output_grid_loc_map | 
|  |  | 
|  | for y in range(NUM_Y): | 
|  | self.assertFalse(output_grid_loc_map[(0, y)].split_sites) | 
|  | self.assertFalse(output_grid_loc_map[(2, y)].split_sites) | 
|  |  | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(3, y)].root_phy_tile_pkeys, | 
|  | [3 + y * NUM_X], | 
|  | ) | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(3, y)].phy_tile_pkeys, | 
|  | [3 + y * NUM_X], | 
|  | ) | 
|  | self.assertTrue(output_grid_loc_map[(3, y)].split_sites, y) | 
|  | self.assertEqual(1, len(output_grid_loc_map[(3, y)].sites)) | 
|  |  | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(4, y)].root_phy_tile_pkeys, | 
|  | [], | 
|  | ) | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(4, y)].phy_tile_pkeys, | 
|  | [3 + y * NUM_X], | 
|  | ) | 
|  | self.assertTrue(output_grid_loc_map[(4, y)].split_sites) | 
|  | self.assertEqual(1, len(output_grid_loc_map[(4, y)].sites)) | 
|  |  | 
|  | self.assertFalse(output_grid_loc_map[(NUM_X, y)].split_sites) | 
|  |  | 
|  | def test_tile_split_progressive(self): | 
|  | grid_loc_map = {} | 
|  | NUM_X = 5 | 
|  | NUM_Y = 8 | 
|  | for x in range(NUM_X): | 
|  | for y in range(NUM_Y): | 
|  | coord_idx = x + y * NUM_X | 
|  |  | 
|  | sites = [ | 
|  | Site( | 
|  | name='{}, {}'.format(x, y), | 
|  | phy_tile_pkey=coord_idx, | 
|  | tile_type_pkey=x, | 
|  | site_type_pkey=x, | 
|  | site_pkey=2 * x, | 
|  | x=0, | 
|  | y=0, | 
|  | ), | 
|  | Site( | 
|  | name='{}, {}'.format(x, y), | 
|  | phy_tile_pkey=coord_idx, | 
|  | tile_type_pkey=x, | 
|  | site_type_pkey=x, | 
|  | site_pkey=2 * x + 1, | 
|  | x=0, | 
|  | y=1, | 
|  | ), | 
|  | ] | 
|  |  | 
|  | grid_loc_map[(x, y)] = Tile( | 
|  | root_phy_tile_pkeys=[coord_idx], | 
|  | phy_tile_pkeys=[coord_idx], | 
|  | tile_type_pkey=coord_idx, | 
|  | sites=sites, | 
|  | ) | 
|  |  | 
|  | empty_tile_type_pkey = NUM_X * NUM_Y | 
|  |  | 
|  | grid = Grid(grid_loc_map, empty_tile_type_pkey) | 
|  |  | 
|  | for y in range(NUM_Y): | 
|  | grid.split_tile_type( | 
|  | tile_type_pkey=3 + y * NUM_X, | 
|  | tile_type_pkeys=[ | 
|  | NUM_X * NUM_Y + 1, | 
|  | NUM_X * NUM_Y + 2, | 
|  | ], | 
|  | split_direction=EAST, | 
|  | split_map={ | 
|  | (0, 0): 0, | 
|  | (0, 1): 1, | 
|  | }, | 
|  | ) | 
|  |  | 
|  | output_grid_loc_map = grid.output_grid() | 
|  |  | 
|  | assert (NUM_X, NUM_Y - 1) in output_grid_loc_map | 
|  | assert (NUM_X + 1, NUM_Y - 1) not in output_grid_loc_map | 
|  | assert (NUM_X, NUM_Y) not in output_grid_loc_map | 
|  |  | 
|  | for y in range(NUM_Y): | 
|  | self.assertFalse(output_grid_loc_map[(0, y)].split_sites) | 
|  | self.assertFalse(output_grid_loc_map[(2, y)].split_sites) | 
|  |  | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(3, y)].root_phy_tile_pkeys, | 
|  | [3 + y * NUM_X], | 
|  | ) | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(3, y)].phy_tile_pkeys, | 
|  | [3 + y * NUM_X], | 
|  | ) | 
|  | self.assertTrue(output_grid_loc_map[(3, y)].split_sites, y) | 
|  | self.assertEqual(1, len(output_grid_loc_map[(3, y)].sites)) | 
|  |  | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(4, y)].root_phy_tile_pkeys, | 
|  | [], | 
|  | ) | 
|  | self.assertListEqual( | 
|  | output_grid_loc_map[(4, y)].phy_tile_pkeys, | 
|  | [3 + y * NUM_X], | 
|  | ) | 
|  | self.assertTrue(output_grid_loc_map[(4, y)].split_sites) | 
|  | self.assertEqual(1, len(output_grid_loc_map[(4, y)].sites)) | 
|  |  | 
|  | self.assertFalse(output_grid_loc_map[(NUM_X, y)].split_sites) |