mirror of
https://github.com/huggingface/transformers.git
synced 2025-07-03 21:00:08 +06:00

* update exampel * update * push the converted diff files for testing and ci * correct one example * fix class attributes and docstring * nits * oups * fixed config! * update * nitd * class attributes are not matched against the other, this is missing * fixed overwriting self.xxx now onto the attributes I think * partial fix, now order with docstring * fix docstring order? * more fixes * update * fix missing docstrings! * examples don't all work yet * fixup * nit * updated * hick * update * delete * update * update * update * fix * all default * no local import * fix more diff * some fix related to "safe imports" * push fixed * add helper! * style * add a check * all by default * add the * update * FINALLY! * nit * fix config dependencies * man that is it * fix fix * update diffs * fix the last issue * re-default to all * alll the fixes * nice * fix properties vs setter * fixup * updates * update dependencies * make sure to install what needs to be installed * fixup * quick fix for now * fix! * fixup * update * update * updates * whitespaces * nit * fix * simplify everything, and make it file agnostic (should work for image processors) * style * finish fixing all import issues * fixup * empty modeling should not be written! * Add logic to find who depends on what * update * cleanup * update * update gemma to support positions * some small nits * this is the correct docstring for gemma2 * fix merging of docstrings * update * fixup * update * take doc into account * styling * update * fix hidden activation * more fixes * final fixes! * fixup * fixup instruct blip video * update * fix bugs * align gemma2 with the rest as well * updats * revert * update * more reversiom * grind * more * arf * update * order will matter * finish del stuff * update * rename to modular * fixup * nits * update makefile * fixup * update order of the checks! * fix * fix docstring that has a call inside * fiix conversion check * style * add some initial documentation * update * update doc * some fixup * updates * yups * Mostly todo gimme a minut * update * fixup * revert some stuff * Review docs for the modular transformers (#33472) Docs * good update * fixup * mmm current updates lead to this code * okay, this fixes it * cool * fixes * update * nit * updates * nits * fix doc * update * revert bad changes * update * updates * proper update * update * update? * up * update * cool * nits * nits * bon bon * fix * ? * minimise changes * update * update * update * updates? * fixed gemma2 * kind of a hack * nits * update * remove `diffs` in favor of `modular` * fix make fix copies --------- Co-authored-by: Lysandre Debut <hi@lysand.re>
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import ast
|
|
from collections import defaultdict, deque
|
|
|
|
|
|
# Function to perform topological sorting
|
|
def topological_sort(dependencies):
|
|
# Create a graph and in-degree count for each node
|
|
graph = defaultdict(list)
|
|
in_degree = defaultdict(int)
|
|
|
|
# Build the graph
|
|
for node, deps in dependencies.items():
|
|
for dep in deps:
|
|
graph[dep].append(node) # node depends on dep
|
|
in_degree[node] += 1 # increase in-degree of node
|
|
|
|
# Add all nodes with zero in-degree to the queue
|
|
zero_in_degree_queue = deque([node for node in dependencies if in_degree[node] == 0])
|
|
|
|
sorted_list = []
|
|
# Perform topological sorting
|
|
while zero_in_degree_queue:
|
|
current = zero_in_degree_queue.popleft()
|
|
sorted_list.append(current)
|
|
|
|
# For each node that current points to, reduce its in-degree
|
|
for neighbor in graph[current]:
|
|
in_degree[neighbor] -= 1
|
|
if in_degree[neighbor] == 0:
|
|
zero_in_degree_queue.append(neighbor)
|
|
|
|
# Handle nodes that have no dependencies and were not initially part of the loop
|
|
for node in dependencies:
|
|
if node not in sorted_list:
|
|
sorted_list.append(node)
|
|
|
|
return sorted_list
|
|
|
|
|
|
# Function to extract class and import info from a file
|
|
def extract_classes_and_imports(file_path):
|
|
with open(file_path, "r") as file:
|
|
tree = ast.parse(file.read(), filename=file_path)
|
|
imports = set()
|
|
|
|
for node in ast.walk(tree):
|
|
if isinstance(node, (ast.Import, ast.ImportFrom)):
|
|
module = node.module if isinstance(node, ast.ImportFrom) else None
|
|
if module and "transformers" in module:
|
|
imports.add(module)
|
|
return imports
|
|
|
|
|
|
# Function to map dependencies between classes
|
|
def map_dependencies(py_files):
|
|
dependencies = defaultdict(set)
|
|
# First pass: Extract all classes and map to files
|
|
for file_path in py_files:
|
|
dependencies[file_path].add(None)
|
|
class_to_file = extract_classes_and_imports(file_path)
|
|
for module in class_to_file:
|
|
dependencies[file_path].add(module)
|
|
return dependencies
|
|
|
|
|
|
def find_priority_list(py_files):
|
|
dependencies = map_dependencies(py_files)
|
|
ordered_classes = topological_sort(dependencies)
|
|
return ordered_classes[::-1]
|