| #!/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) |