in mae_envs/modules/walls.py [0:0]
def build_world_step(self, env, floor, floor_size):
# Outside walls
walls = outside_walls(self.grid_size, use_low_wall_height=self.low_outside_walls)
if self.scenario in ['quadrant', 'var_quadrant']:
q_size = env._random_state.uniform(0.3, 0.6) if self.scenario == 'var_quadrant' else 0.5
q_size = int(q_size * self.grid_size)
env.metadata['quadrant_size'] = q_size
new_walls = [
Wall([self.grid_size - q_size, 0], [self.grid_size - q_size, q_size]),
Wall([self.grid_size - q_size, q_size], [self.grid_size - 1, q_size])]
if env._random_state.uniform(0, 1) < self.p_door_dropout:
wall_to_split = env._random_state.randint(0, 2)
walls += [new_walls[(1 - wall_to_split)]]
walls_to_split = [new_walls[wall_to_split]]
else:
walls_to_split = new_walls
elif self.scenario == 'half':
walls_to_split += [Wall([self.grid_size - 1, self.grid_size // 2],
[0, self.grid_size // 2])]
elif self.scenario == 'var_tri':
wall1_splitoff_point, wall2_splitoff_point = [
int(self.grid_size * env._random_state.uniform(0.4, 0.6)) for _ in range(2)
]
wall1_orientation = 'vertical' if env._random_state.uniform() < 0.5 else 'horizontal'
# if first wall is horizontal, 'left' means below and 'right' means above
wall2_orientation = 'left' if env._random_state.uniform() < 0.5 else 'right'
env.metadata['tri_wall_splitoff_points'] = [wall1_splitoff_point, wall2_splitoff_point]
env.metadata['tri_wall_orientations'] = [wall1_orientation, wall2_orientation]
if wall1_orientation == 'horizontal':
walls_to_split = [Wall([self.grid_size - 1, wall1_splitoff_point],
[0, wall1_splitoff_point])]
if wall2_orientation == 'left':
walls_to_split += [Wall([wall2_splitoff_point, wall1_splitoff_point],
[wall2_splitoff_point, 0])]
rooms = [[(1, self.grid_size - 1),
(wall1_splitoff_point + 1, self.grid_size - 1)],
[(1, wall2_splitoff_point - 1),
(1, wall1_splitoff_point - 1)],
[(wall2_splitoff_point + 1, self.grid_size - 1),
(1, wall1_splitoff_point - 1)]]
elif wall2_orientation == 'right':
walls_to_split += [Wall([wall2_splitoff_point, self.grid_size - 1],
[wall2_splitoff_point, wall1_splitoff_point])]
rooms = [[(1, self.grid_size - 1),
(0, wall1_splitoff_point - 1)],
[(1, wall2_splitoff_point - 1),
(wall1_splitoff_point + 1, self.grid_size - 1)],
[(wall2_splitoff_point + 1, self.grid_size - 1),
(wall1_splitoff_point + 1, self.grid_size - 1)]]
elif wall1_orientation == 'vertical':
walls_to_split = [Wall([wall1_splitoff_point, self.grid_size - 1],
[wall1_splitoff_point, 0])]
if wall2_orientation == 'left':
walls_to_split += [Wall([wall1_splitoff_point, wall2_splitoff_point],
[0, wall2_splitoff_point])]
rooms = [[(wall1_splitoff_point + 1, self.grid_size - 1),
(1, self.grid_size - 1)],
[(1, wall1_splitoff_point - 1),
(1, wall2_splitoff_point - 1)],
[(1, wall1_splitoff_point - 1),
(wall2_splitoff_point + 1, self.grid_size - 1)]]
elif wall2_orientation == 'right':
walls_to_split += [Wall([self.grid_size - 1, wall2_splitoff_point],
[wall1_splitoff_point, wall2_splitoff_point])]
rooms = [[(0, wall1_splitoff_point - 1),
(1, self.grid_size - 1)],
[(wall1_splitoff_point + 1, self.grid_size - 1),
(1, wall2_splitoff_point - 1)],
[(wall1_splitoff_point + 1, self.grid_size - 1),
(wall2_splitoff_point + 1, self.grid_size - 1)]]
env.metadata['tri_room_grid_cell_range'] = rooms
# this is used when we want to consecutively place objects in every room
# e.g. if we want object i to go in room (i % 3)
env.metadata['tri_placement_rotation'] = []
elif self.scenario == 'empty':
walls_to_split = []
# Add doors
new_walls, doors = split_walls(walls_to_split, self.door_size,
random_state=env._random_state)
walls += new_walls
env.metadata['doors'] = np.array(doors)
# Convert doors into mujoco frame
if len(doors) > 0:
self.door_obs = construct_door_obs(np.array(doors), floor_size, self.grid_size)
else:
self.door_obs = None
walls_to_mujoco(floor, floor_size, self.grid_size, walls, friction=self.friction)
add_walls_to_grid(env.placement_grid, walls)
return True