[package] use digraph to back dependency visualization (#57338)

Summary: Pull Request resolved: https://github.com/pytorch/pytorch/pull/57338

Differential Revision: D28114190

Test Plan: Imported from OSS

Reviewed By: astaff

Pulled By: suo

fbshipit-source-id: 78b15edae3b991307fd3656ac7b374d4d218b460
diff --git a/torch/package/package_exporter.py b/torch/package/package_exporter.py
index 209b830..455ddfe 100644
--- a/torch/package/package_exporter.py
+++ b/torch/package/package_exporter.py
@@ -21,13 +21,14 @@
 import torch
 from torch.serialization import location_tag, normalize_storage_type
 
-from .file_structure_representation import Directory, _create_directory_from_file_list
-from .glob_group import GlobPattern, GlobGroup
+from ._digraph import DiGraph
 from ._importlib import _normalize_path
 from ._mangling import is_mangled
 from ._package_pickler import create_pickler
 from ._stdlib import is_stdlib_module
+from .file_structure_representation import Directory, _create_directory_from_file_list
 from .find_file_dependencies import find_files_source_depends_on
+from .glob_group import GlobGroup, GlobPattern
 from .importer import Importer, OrderedImporter, sys_importer
 
 
@@ -106,6 +107,8 @@
         self.serialized_storages: Dict[str, Any] = {}
         # Only a dict for uniquing and deterministic ordering, the value is meaningless
         self.extern_modules: Dict[str, bool] = {}
+
+        self.dependency_graph = DiGraph()
         self.provided: Dict[str, bool] = {}
         self.verbose = verbose
 
@@ -123,7 +126,6 @@
             Tuple[Any, Callable[[str], None], bool]
         ] = []  # 'any' is 're.Pattern' but breaks old mypy
         self.matched_patterns: Set[int] = set()
-        self.debug_deps: List[Tuple[str, str]] = []
         self._unique_id = 0
 
     def save_source_file(
@@ -279,7 +281,7 @@
         if dependencies:
             deps = self._get_dependencies(src, module_name, is_package)
             for dep in deps:
-                self.debug_deps.append((module_name, dep))
+                self.dependency_graph.add_edge(module_name, dep)
 
             for dep in deps:
                 self.require_module_if_not_provided(dep)
@@ -304,7 +306,7 @@
             return False
 
     def _write_dep_graph(self, failing_module=None):
-        edges = "\n".join(f'"{f}" -> "{t}";' for f, t in self.debug_deps)
+        edges = "\n".join(f'"{f}" -> "{t}";' for f, t in self.dependency_graph.edges)
         failing = "" if failing_module is None else f'"{failing_module}" [color=red];'
         template = f"""\
 digraph G {{
@@ -426,7 +428,7 @@
                         all_dependencies.append(module)
 
             for dep in all_dependencies:
-                self.debug_deps.append((package + "." + resource, dep))
+                self.dependency_graph.add_edge(f"<{package}.{resource}>", dep)
 
             if self.verbose:
                 dep_string = "".join(f"  {dep}\n" for dep in all_dependencies)