in data/envs/babyai/bot_agent.py [0:0]
def _breadth_first_search(self, initial_states, accept_fn, ignore_blockers):
"""Performs breadth first search.
This is pretty much your textbook BFS. The state space is agent's locations,
but the current direction is also added to the queue to slightly prioritize
going straight over turning.
"""
self.bfs_counter += 1
queue = [(state, None) for state in initial_states]
grid = self.mission.unwrapped.grid
previous_pos = {}
while len(queue) > 0:
state, prev_pos = queue[0]
queue = queue[1:]
i, j, di, dj = state
if (i, j) in previous_pos:
continue
self.bfs_step_counter += 1
cell = grid.get(i, j)
previous_pos[(i, j)] = prev_pos
# If we reached a position satisfying the acceptance condition
if accept_fn((i, j), cell):
path = []
pos = (i, j)
while pos:
path.append(pos)
pos = previous_pos[pos]
return path, (i, j), previous_pos
# If this cell was not visually observed, don't expand from it
if not self.vis_mask[i, j]:
continue
if cell:
if cell.type == "wall":
continue
# If this is a door
elif cell.type == "door":
# If the door is closed, don't visit neighbors
if not cell.is_open:
continue
elif not ignore_blockers:
continue
# Location to which the bot can get without turning
# are put in the queue first
for k, m in [(di, dj), (dj, di), (-dj, -di), (-di, -dj)]:
next_pos = (i + k, j + m)
next_dir_vec = (k, m)
next_state = (*next_pos, *next_dir_vec)
queue.append((next_state, (i, j)))
# Path not found
return None, None, previous_pos