|
|
@ -316,4 +316,52 @@ class DBController: |
|
|
traverse_predecessors(start_node, [], True) |
|
|
traverse_predecessors(start_node, [], True) |
|
|
traverse_successors(start_node, [], True) |
|
|
traverse_successors(start_node, [], True) |
|
|
|
|
|
|
|
|
return full_paths |
|
|
return full_paths |
|
|
|
|
|
|
|
|
|
|
|
def propagate_gender_relevance(self, gender_relevant_nodes): |
|
|
|
|
|
""" |
|
|
|
|
|
Propagate gender relevance through the evolution graph and update the SQLite database. |
|
|
|
|
|
:param db_path: Path to the SQLite database file. |
|
|
|
|
|
:param gender_relevant_nodes: A set of nodes that are initially marked as gender-relevant. |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
# Traverse from each gender-relevant end node backward to propagate relevance |
|
|
|
|
|
for node in gender_relevant_nodes: |
|
|
|
|
|
# Use breadth-first search or depth-first search to traverse backward |
|
|
|
|
|
visited = set() |
|
|
|
|
|
stack = [node] |
|
|
|
|
|
|
|
|
|
|
|
while stack: |
|
|
|
|
|
current_node = stack.pop() |
|
|
|
|
|
if current_node not in visited: |
|
|
|
|
|
visited.add(current_node) |
|
|
|
|
|
|
|
|
|
|
|
# Update the gender_relevant flag in the database |
|
|
|
|
|
self.update_pokemon_field(current_node, "gender_relevant", True) |
|
|
|
|
|
|
|
|
|
|
|
# Add predecessors to the stack to keep traversing backward |
|
|
|
|
|
if self.graph.has_node(current_node): |
|
|
|
|
|
predecessors = list(self.graph.predecessors(current_node)) |
|
|
|
|
|
stack.extend(predecessors) |
|
|
|
|
|
|
|
|
|
|
|
self.save_changes() |
|
|
|
|
|
|
|
|
|
|
|
def get_gender_specific_evolutions(self): |
|
|
|
|
|
""" |
|
|
|
|
|
Get a list of nodes that have evolution methods indicating gender relevance (i.e., '(male)' or '(female)'). |
|
|
|
|
|
:return: A list of nodes involved in gender-specific evolutions. |
|
|
|
|
|
""" |
|
|
|
|
|
gender_specific_nodes = [] |
|
|
|
|
|
|
|
|
|
|
|
for from_node, to_node, edge_data in self.graph.edges(data=True): |
|
|
|
|
|
method = edge_data.get("method", "") |
|
|
|
|
|
if method and ("(male)" in method.lower() or "(female)" in method.lower()): |
|
|
|
|
|
# Add both nodes involved in this gender-specific evolution |
|
|
|
|
|
gender_specific_nodes.extend([from_node, to_node]) |
|
|
|
|
|
|
|
|
|
|
|
return list(set(gender_specific_nodes)) # Return unique nodes |
|
|
|
|
|
|
|
|
|
|
|
def get_gender_relevant_pokemon(self): |
|
|
|
|
|
self.cursor.execute(f"SELECT PFIC FROM pokemon_forms WHERE JSON_EXTRACT(data, '$.gender_relevant') = true") |
|
|
|
|
|
results = self.cursor.fetchall() |
|
|
|
|
|
return [row['PFIC'] for row in results] |