in mae_envs/modules/walls.py [0:0]
def split_for_doors(self, num_doors=1, door_size=1, all_connect=False,
random_state=np.random.RandomState()):
'''
Split this wall into many walls with 'doors' in between.
Args:
num_doors (int): upper bound of number of doors to create
door_size (int): door size in grid cells
all_connect (bool): create a door in every wall segment between pairs of points
where other walls connect with this wall
random_state (np.random.RandomState): random state to use for sampling
'''
edges = np.unique(self.left_edges + self.right_edges, axis=0)
edges = np.array(sorted(edges, key=lambda x: x[1] if self.is_vertical else x[0]))
rel_axis = edges[:, 1] if self.is_vertical else edges[:, 0]
diffs = np.diff(rel_axis)
possible_doors = diffs >= door_size + 1
# Door regions are stretches on the wall where we could create a door.
door_regions = np.arange(len(edges) - 1)
door_regions = door_regions[possible_doors]
# The number of doors on this wall we want to/can create
num_doors = len(edges) - 1 if all_connect else num_doors
num_doors = min(num_doors, len(door_regions))
if num_doors == 0 or door_size == 0:
return [self], []
# Sample num_doors regions to which we will add doors.
door_regions = np.sort(random_state.choice(door_regions, num_doors, replace=False))
new_walls = []
doors = []
new_wall_start = edges[0]
for door in door_regions:
# door_start and door_end are the first and last point on the wall bounding the door
# (inclusive boundary)
door_start = random_state.randint(1, diffs[door] - door_size + 1)
door_end = door_start + door_size - 1
# Because door boundaries are inclusive, we add 1 to the door_end to get next wall
# start cell and subtract one from the door_start to get the current wall end cell.
if self.is_vertical:
new_wall_end = [edges[door][0], edges[door][1] + door_start - 1]
next_new_wall_start = [new_wall_start[0], edges[door][1] + door_end + 1]
door_start_cell = [edges[door][0], edges[door][1] + door_start]
door_end_cell = [new_wall_start[0], edges[door][1] + door_end]
else:
new_wall_end = [edges[door][0] + door_start - 1, edges[door][1]]
next_new_wall_start = [edges[door][0] + door_end + 1, edges[door][1]]
door_start_cell = [edges[door][0] + door_start, edges[door][1]]
door_end_cell = [new_wall_start[0] + door_end, edges[door][1]]
# Store doors as inclusive boundaries.
doors.append([door_start_cell, door_end_cell])
# Check that the new wall isn't size 0
if np.linalg.norm(np.array(new_wall_start) - np.array(new_wall_end)) > 0:
new_walls.append(Wall(new_wall_start, new_wall_end))
new_wall_start = next_new_wall_start
if np.linalg.norm(np.array(new_wall_start) - np.array(edges[-1])) > 0:
new_walls.append(Wall(new_wall_start, edges[-1]))
return new_walls, doors