fix: find runnable predecessor for every successor that is not runnable (#2996)

* refactor: add find_runnable_predecessors_for_successor method

* feat: refactor find_next_runnable_vertices method

Refactor the `find_next_runnable_vertices` method in the `Graph` class to improve readability and simplify the logic. Instead of using a list comprehension, the method now uses a for loop to iterate over the `vertex_successors_ids` and determine if each vertex is runnable. If a vertex is not runnable, it calls the `find_runnable_predecessors_for_successor` method to find the runnable predecessors. The runnable vertices are then added to the `next_runnable_vertices` list. This refactoring improves the clarity and maintainability of the code.
This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-07-26 18:14:09 -03:00 • committed by GitHub
commit 612b1ff768
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -992,10 +992,14 @@ class Graph:
return self return self
def find_next_runnable_vertices(self, vertex_id: str, vertex_successors_ids: List[str]) -> List[str]: def find_next_runnable_vertices(self, vertex_id: str, vertex_successors_ids: List[str]) -> List[str]:
direct_successors_ready = [v_id for v_id in vertex_successors_ids if self.is_vertex_runnable(v_id)] next_runnable_vertices = []
if not direct_successors_ready: for v_id in vertex_successors_ids:
return self.find_runnable_predecessors_for_successors(vertex_id) if not self.is_vertex_runnable(v_id):
return direct_successors_ready next_runnable_vertices.extend(self.find_runnable_predecessors_for_successor(v_id))
else:
next_runnable_vertices.append(v_id)
return next_runnable_vertices
async def get_next_runnable_vertices(self, lock: asyncio.Lock, vertex: "Vertex", cache: bool = True) -> List[str]: async def get_next_runnable_vertices(self, lock: asyncio.Lock, vertex: "Vertex", cache: bool = True) -> List[str]:
v_id = vertex.id v_id = vertex.id
@ -1461,6 +1465,13 @@ class Graph:
This checks the direct predecessors of each successor to identify any that are This checks the direct predecessors of each successor to identify any that are
immediately runnable, expanding the search to ensure progress can be made. immediately runnable, expanding the search to ensure progress can be made.
""" """
runnable_vertices = []
for successor_id in self.run_manager.run_map.get(vertex_id, []):
runnable_vertices.extend(self.find_runnable_predecessors_for_successor(successor_id))
return runnable_vertices
def find_runnable_predecessors_for_successor(self, vertex_id: str) -> List[str]:
runnable_vertices = [] runnable_vertices = []
visited = set() visited = set()
@ -1476,10 +1487,8 @@ class Graph:
for pred_pred_id in self.run_manager.run_predecessors.get(predecessor_id, []): for pred_pred_id in self.run_manager.run_predecessors.get(predecessor_id, []):
find_runnable_predecessors(self.get_vertex(pred_pred_id)) find_runnable_predecessors(self.get_vertex(pred_pred_id))
for successor_id in self.run_manager.run_map.get(vertex_id, []): for predecessor_id in self.run_manager.run_predecessors.get(vertex_id, []):
for predecessor_id in self.run_manager.run_predecessors.get(successor_id, []): find_runnable_predecessors(self.get_vertex(predecessor_id))
find_runnable_predecessors(self.get_vertex(predecessor_id))
return runnable_vertices return runnable_vertices
def remove_from_predecessors(self, vertex_id: str): def remove_from_predecessors(self, vertex_id: str):