Skip to content

Introspection

import pathlib

import networkx as nx

from vizopt import introspection
src_dir = pathlib.Path().resolve().parents[1] / "src" / "vizopt"
file_tree = introspection.build_file_tree(src_dir)
file_tree.edges
introspection.plot_treemap(file_tree, padding=0.025)

output

import_graph = introspection.build_import_graph(src_dir)
introspection.plot_treemap_with_imports(
    file_tree, import_graph, padding=0.025, arrow_props={"color": "k"}
)

output

Star-shaped Euler diagram

An alternative to the nested-rectangle treemap: each directory becomes a convex star-shaped boundary (an Euler diagram) fitted by gradient descent, with files as rectangles and import edges overlaid the same way as above.

This is quite bad at the moment.

from vizopt.base import OptimConfig

euler = introspection.build_euler_diagram(
    file_tree, padding=0.025, weight_area=10.0, weight_position_anchor=0.01
)
euler.optimize(OptimConfig(n_iters=15000, learning_rate=0.003))
introspection.plot_euler_diagram_with_imports(euler, import_graph)

output

class_hierarchy = nx.DiGraph()
for node in file_tree.nodes:
    if file_tree.nodes[node]["is_dir"] or node.suffix != ".py":
        continue
    tree = introspection.parse_module_ast(src_dir / node)
    class_hierarchy = nx.compose(class_hierarchy, introspection.build_class_hierarchy(tree))

sorted(class_hierarchy.edges)
sorted(import_graph.edges)