in mae_envs/modules/construction_sites.py [0:0]
def build_world_step(self, env, floor, floor_size):
self.curr_n_sites = env._random_state.randint(self.n_sites[0], self.n_sites[1] + 1)
self.curr_n_elongated_sites = env._random_state.randint(
self.n_elongated_sites[0], self.n_elongated_sites[1] + 1)
env.metadata['curr_n_sites'] = self.curr_n_sites
env.metadata['curr_n_elongated_sites'] = self.curr_n_elongated_sites
self.site_size_array = self.site_size * np.ones((self.curr_n_sites, 2))
if self.curr_n_elongated_sites > 0:
n_xaligned = env._random_state.randint(self.curr_n_elongated_sites + 1)
self.site_size_array[:n_xaligned, :] = self.site_size * np.array([3.3, 0.3])
self.site_size_array[n_xaligned:self.curr_n_elongated_sites, :] = (
self.site_size * np.array([0.3, 3.3]))
successful_placement = True
for i in range(self.curr_n_sites):
if self.placement_fn is not None:
_placement_fn = (self.placement_fn[i]
if isinstance(self.placement_fn, list)
else self.placement_fn)
pos, _ = rejection_placement(env, _placement_fn, floor_size,
self.site_size_array[i])
if pos is not None:
self._mark_site_square(floor, floor_size, f'{self.site_name}{i}',
(pos[0], pos[1], self.site_height),
self.site_size_array[i])
else:
successful_placement = False
else:
# place the site so that all the corners are still within the play area
pos_min = self.site_size_array[i].max() / (floor_size * 1.1) / 2
pos = env._random_state.uniform(pos_min, 1 - pos_min, 2)
self._mark_site_square(floor, floor_size, f'{self.site_name}{i}',
(pos[0], pos[1], self.site_height),
self.site_size_array[i])
return successful_placement