tensor-network-visualization 1.5.0__tar.gz → 1.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. tensor_network_visualization-1.5.2/PKG-INFO +474 -0
  2. tensor_network_visualization-1.5.2/README.md +423 -0
  3. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/pyproject.toml +5 -3
  4. tensor_network_visualization-1.5.2/src/tensor_network_visualization.egg-info/PKG-INFO +474 -0
  5. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_visualization.egg-info/SOURCES.txt +19 -0
  6. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/__init__.py +48 -2
  7. tensor_network_visualization-1.5.2/src/tensor_network_viz/_core/_draw_common.py +9 -0
  8. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/contraction_edges.py +3 -0
  9. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/dangling_self_edges.py +53 -17
  10. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/edge_labels.py +14 -5
  11. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/edge_orchestration.py +7 -1
  12. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/fonts_and_scale.py +184 -182
  13. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/graph_pipeline.py +72 -45
  14. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/hover.py +22 -11
  15. tensor_network_visualization-1.5.2/src/tensor_network_viz/_core/draw/label_descriptors.py +56 -0
  16. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/labels_misc.py +158 -154
  17. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/plotter.py +312 -304
  18. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/render_prep.py +76 -15
  19. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/scene_state.py +5 -0
  20. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/tensors.py +30 -6
  21. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/viewport_geometry.py +19 -1
  22. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/graph.py +5 -0
  23. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/graph_cache.py +60 -0
  24. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/direction_common.py +528 -477
  25. tensor_network_visualization-1.5.2/src/tensor_network_viz/_core/layout/free_directions_2d.py +920 -0
  26. tensor_network_visualization-1.5.2/src/tensor_network_viz/_core/layout/free_directions_3d.py +495 -0
  27. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/geometry.py +21 -0
  28. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/renderer.py +17 -10
  29. tensor_network_visualization-1.5.2/src/tensor_network_viz/_input_inspection.py +157 -0
  30. tensor_network_visualization-1.5.2/src/tensor_network_viz/_interaction/__init__.py +3 -0
  31. tensor_network_visualization-1.5.2/src/tensor_network_viz/_interaction/bridge.py +164 -0
  32. tensor_network_visualization-1.5.2/src/tensor_network_viz/_interaction/controller.py +662 -0
  33. tensor_network_visualization-1.5.2/src/tensor_network_viz/_interaction/scheme.py +245 -0
  34. tensor_network_visualization-1.5.2/src/tensor_network_viz/_interaction/state.py +88 -0
  35. tensor_network_visualization-1.5.2/src/tensor_network_viz/_interactive_scene.py +493 -0
  36. tensor_network_visualization-1.5.2/src/tensor_network_viz/_matplotlib_state.py +55 -0
  37. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_registry.py +2 -4
  38. tensor_network_visualization-1.5.2/src/tensor_network_viz/_tensor_elements_controller.py +605 -0
  39. tensor_network_visualization-1.5.2/src/tensor_network_viz/_tensor_elements_data.py +576 -0
  40. tensor_network_visualization-1.5.2/src/tensor_network_viz/_tensor_elements_payloads.py +658 -0
  41. tensor_network_visualization-1.5.2/src/tensor_network_viz/_tensor_elements_support.py +47 -0
  42. tensor_network_visualization-1.5.2/src/tensor_network_viz/_ui_utils.py +69 -0
  43. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/config.py +14 -19
  44. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/contraction_viewer.py +153 -119
  45. tensor_network_visualization-1.5.2/src/tensor_network_viz/einsum_module/contraction_cost.py +150 -0
  46. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/graph.py +22 -7
  47. tensor_network_visualization-1.5.2/src/tensor_network_viz/interactive_viewer.py +7 -0
  48. tensor_network_visualization-1.5.2/src/tensor_network_viz/tensor_elements.py +99 -0
  49. tensor_network_visualization-1.5.2/src/tensor_network_viz/tensor_elements_config.py +60 -0
  50. tensor_network_visualization-1.5.2/src/tensor_network_viz/viewer.py +149 -0
  51. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_ci_workflow.py +9 -2
  52. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_contraction_cost.py +105 -6
  53. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_contraction_groups_once.py +1 -1
  54. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_contraction_viewer.py +38 -4
  55. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_demo_cli_scheme.py +23 -67
  56. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_draw_performance.py +4 -1
  57. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_einsum_backend.py +41 -1
  58. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_engine_detection.py +3 -3
  59. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_engineering_baseline.py +54 -0
  60. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_examples.py +191 -0
  61. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_graph_cache.py +45 -0
  62. tensor_network_visualization-1.5.2/tests/test_interaction_state.py +165 -0
  63. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_label_draw_metrics_perf.py +4 -1
  64. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_layout_core.py +591 -9
  65. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_lazy_imports.py +4 -1
  66. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_node_degrees_perf.py +2 -0
  67. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_plotting.py +445 -11
  68. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_public_api.py +19 -4
  69. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_render_performance_controls.py +8 -8
  70. tensor_network_visualization-1.5.2/tests/test_show_tensor_network_throughput.py +172 -0
  71. tensor_network_visualization-1.5.2/tests/test_tensor_elements.py +1104 -0
  72. tensor_network_visualization-1.5.2/tests/test_tensor_elements_perf.py +75 -0
  73. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_verify_script.py +1 -1
  74. tensor_network_visualization-1.5.0/PKG-INFO +0 -458
  75. tensor_network_visualization-1.5.0/README.md +0 -407
  76. tensor_network_visualization-1.5.0/src/tensor_network_visualization.egg-info/PKG-INFO +0 -458
  77. tensor_network_visualization-1.5.0/src/tensor_network_viz/_core/_draw_common.py +0 -6
  78. tensor_network_visualization-1.5.0/src/tensor_network_viz/_core/layout/free_directions_2d.py +0 -493
  79. tensor_network_visualization-1.5.0/src/tensor_network_viz/_core/layout/free_directions_3d.py +0 -250
  80. tensor_network_visualization-1.5.0/src/tensor_network_viz/einsum_module/contraction_cost.py +0 -79
  81. tensor_network_visualization-1.5.0/src/tensor_network_viz/interactive_viewer.py +0 -595
  82. tensor_network_visualization-1.5.0/src/tensor_network_viz/viewer.py +0 -224
  83. tensor_network_visualization-1.5.0/tests/test_show_tensor_network_throughput.py +0 -57
  84. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/LICENSE +0 -0
  85. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/setup.cfg +0 -0
  86. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_visualization.egg-info/dependency_links.txt +0 -0
  87. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_visualization.egg-info/requires.txt +0 -0
  88. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_visualization.egg-info/top_level.txt +0 -0
  89. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/__init__.py +0 -0
  90. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/_label_format.py +0 -0
  91. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/_nodes_edges_common.py +0 -0
  92. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/axis_directions.py +0 -0
  93. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/contractions.py +0 -0
  94. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/curves.py +0 -0
  95. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/__init__.py +0 -0
  96. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/constants.py +0 -0
  97. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/contraction_scheme.py +0 -0
  98. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/disk_metrics.py +0 -0
  99. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/edges.py +0 -0
  100. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/pick_distance.py +0 -0
  101. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/draw/vectors.py +0 -0
  102. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/graph_utils.py +0 -0
  103. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/__init__.py +0 -0
  104. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/body.py +0 -0
  105. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/force_directed.py +0 -0
  106. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/parameters.py +0 -0
  107. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/positions.py +0 -0
  108. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout/types.py +0 -0
  109. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_core/layout_structure.py +0 -0
  110. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_engine_specs.py +0 -0
  111. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/_typing.py +0 -0
  112. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/__init__.py +0 -0
  113. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/_backend.py +0 -0
  114. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/_equation.py +0 -0
  115. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/_trace_state.py +0 -0
  116. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/_trace_types.py +0 -0
  117. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/renderer.py +0 -0
  118. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/einsum_module/trace.py +0 -0
  119. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/py.typed +0 -0
  120. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/quimb/__init__.py +0 -0
  121. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/quimb/graph.py +0 -0
  122. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/quimb/renderer.py +0 -0
  123. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tenpy/__init__.py +0 -0
  124. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tenpy/explicit.py +0 -0
  125. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tenpy/graph.py +0 -0
  126. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tenpy/renderer.py +0 -0
  127. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tensorkrowch/__init__.py +0 -0
  128. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tensorkrowch/graph.py +0 -0
  129. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tensorkrowch/renderer.py +0 -0
  130. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tensornetwork/__init__.py +0 -0
  131. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tensornetwork/graph.py +0 -0
  132. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/src/tensor_network_viz/tensornetwork/renderer.py +0 -0
  133. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_contraction_scheme.py +0 -0
  134. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_edge_index_label_2d.py +0 -0
  135. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_edge_index_label_3d.py +0 -0
  136. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_einsum_autotrace.py +0 -0
  137. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_examples_structure.py +0 -0
  138. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_integration_einsum.py +0 -0
  139. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_integration_tensorkrowch.py +0 -0
  140. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_integration_tensornetwork.py +0 -0
  141. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_label_format.py +0 -0
  142. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_packaging_metadata.py +0 -0
  143. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_quimb_backend.py +0 -0
  144. {tensor_network_visualization-1.5.0 → tensor_network_visualization-1.5.2}/tests/test_tenpy_backend.py +0 -0
@@ -0,0 +1,474 @@
1
+ Metadata-Version: 2.4
2
+ Name: tensor-network-visualization
3
+ Version: 1.5.2
4
+ Summary: Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks.
5
+ Author: Alejandro Mata Ali
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization
8
+ Project-URL: Documentation, https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/blob/main/docs/guide.md
9
+ Project-URL: Changelog, https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/blob/main/CHANGELOG.md
10
+ Project-URL: Repository, https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization
11
+ Project-URL: Issues, https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/issues
12
+ Keywords: tensor-network,visualization,pytorch,numpy,tensorkrowch,tensornetwork,quimb,tenpy,einsum,quantum-inspired,matplotlib
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Scientific/Engineering :: Visualization
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: matplotlib>=3.7
23
+ Requires-Dist: networkx>=3.0
24
+ Requires-Dist: numpy
25
+ Provides-Extra: dev
26
+ Requires-Dist: build; extra == "dev"
27
+ Requires-Dist: pytest; extra == "dev"
28
+ Requires-Dist: ruff; extra == "dev"
29
+ Requires-Dist: pyright; extra == "dev"
30
+ Requires-Dist: ipython; extra == "dev"
31
+ Requires-Dist: tensorkrowch; extra == "dev"
32
+ Requires-Dist: tensornetwork; extra == "dev"
33
+ Requires-Dist: quimb; extra == "dev"
34
+ Requires-Dist: physics-tenpy; extra == "dev"
35
+ Provides-Extra: jupyter
36
+ Requires-Dist: ipympl>=0.9.0; extra == "jupyter"
37
+ Requires-Dist: ipywidgets>=8.0; extra == "jupyter"
38
+ Requires-Dist: jupyterlab>=4.0; extra == "jupyter"
39
+ Requires-Dist: notebook>=7.0; extra == "jupyter"
40
+ Provides-Extra: tensorkrowch
41
+ Requires-Dist: tensorkrowch; extra == "tensorkrowch"
42
+ Provides-Extra: tensornetwork
43
+ Requires-Dist: tensornetwork; extra == "tensornetwork"
44
+ Provides-Extra: quimb
45
+ Requires-Dist: quimb; extra == "quimb"
46
+ Provides-Extra: tenpy
47
+ Requires-Dist: physics-tenpy; extra == "tenpy"
48
+ Provides-Extra: einsum
49
+ Requires-Dist: torch; extra == "einsum"
50
+ Dynamic: license-file
51
+
52
+ # Tensor-Network-Visualization
53
+
54
+ [![CI](https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/actions/workflows/ci.yml/badge.svg)](https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/actions/workflows/ci.yml)
55
+ [![PyPI version](https://img.shields.io/pypi/v/tensor-network-visualization.svg)](https://pypi.org/project/tensor-network-visualization/)
56
+ [![Python versions](https://img.shields.io/pypi/pyversions/tensor-network-visualization.svg)](https://pypi.org/project/tensor-network-visualization/)
57
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
58
+
59
+ Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced
60
+ PyTorch/NumPy `einsum` tensor networks.
61
+
62
+ **Repository:** [https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization](https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization)
63
+
64
+ ## What This Library Does
65
+
66
+ Tensor-network libraries expose very different Python objects, but this package gives them two
67
+ aligned plotting entry points:
68
+
69
+ ```python
70
+ fig, ax = show_tensor_network(...)
71
+ fig, ax = show_tensor_elements(...)
72
+ ```
73
+
74
+ Internally, the library:
75
+
76
+ 1. normalizes backend objects into one graph model,
77
+ 2. computes a layout,
78
+ 3. draws the graph in 2D or 3D with Matplotlib,
79
+ 4. optionally adds figure controls for view/label/scheme toggles.
80
+
81
+ The goal is to keep the public API small while still being useful for notebooks, papers, debugging,
82
+ and saved figures.
83
+
84
+ ## Install
85
+
86
+ PyPI package name: `tensor-network-visualization`
87
+ Import package: `tensor_network_viz`
88
+
89
+ **Requires Python 3.11 or newer.**
90
+
91
+ ### Base install
92
+
93
+ ```bash
94
+ python -m pip install tensor-network-visualization
95
+ ```
96
+
97
+ Base dependencies are only `numpy`, `matplotlib`, and `networkx`.
98
+
99
+ ### Optional extras
100
+
101
+ | Need | Install |
102
+ | --- | --- |
103
+ | TensorKrowch support | `python -m pip install "tensor-network-visualization[tensorkrowch]"` |
104
+ | TensorNetwork support | `python -m pip install "tensor-network-visualization[tensornetwork]"` |
105
+ | Quimb support | `python -m pip install "tensor-network-visualization[quimb]"` |
106
+ | TeNPy support | `python -m pip install "tensor-network-visualization[tenpy]"` |
107
+ | Traced `einsum(...)` support | `python -m pip install "tensor-network-visualization[einsum]"` |
108
+ | Interactive Jupyter widgets | `python -m pip install "tensor-network-visualization[jupyter]"` |
109
+
110
+ ### Windows and Linux quick start
111
+
112
+ **Windows (PowerShell):**
113
+
114
+ ```powershell
115
+ python -m venv .venv
116
+ .\.venv\Scripts\Activate.ps1
117
+ python -m pip install -U pip
118
+ python -m pip install "tensor-network-visualization[quimb]"
119
+ ```
120
+
121
+ **Linux / macOS:**
122
+
123
+ ```bash
124
+ python3 -m venv .venv
125
+ source .venv/bin/activate
126
+ python -m pip install -U pip
127
+ python -m pip install "tensor-network-visualization[quimb]"
128
+ ```
129
+
130
+ ## The API in One Minute
131
+
132
+ ### `show_tensor_network`
133
+
134
+ Use `show_tensor_network` for figure lifecycle:
135
+
136
+ ```python
137
+ show_tensor_network(
138
+ network,
139
+ *,
140
+ engine=None,
141
+ view=None,
142
+ config=None,
143
+ ax=None,
144
+ show_controls=True,
145
+ show=True,
146
+ )
147
+ ```
148
+
149
+ - `engine`: optional backend override. If omitted, the library auto-detects it.
150
+ - `view`: `"2d"` or `"3d"`. If omitted, it starts in `"2d"`.
151
+ - `config`: all visual behavior lives here.
152
+ - `ax`: render into an existing Matplotlib axis.
153
+ - `show_controls`: if `False`, the figure is saved/rendered without the embedded control panel.
154
+ - `show`: if `False`, nothing is displayed automatically.
155
+
156
+ ### `show_tensor_elements`
157
+
158
+ Use `show_tensor_elements` to inspect tensor values:
159
+
160
+ ```python
161
+ show_tensor_elements(
162
+ data,
163
+ *,
164
+ engine=None,
165
+ config=None,
166
+ ax=None,
167
+ show_controls=True,
168
+ show=True,
169
+ )
170
+ ```
171
+
172
+ When several tensors are present, the figure keeps one tensor active at a time and uses a slider
173
+ to switch between them. The interactive controls are grouped: `basic` (`elements`, `magnitude`,
174
+ `log_magnitude`, `distribution`, `data`), `complex` (`real`, `imag`, `phase`), and
175
+ `diagnostic` (`sign`, `signed_value`, `sparsity`, `nan_inf`).
176
+
177
+ - `data`: single tensor, iterable of tensors, supported backend-native tensor collections, or an
178
+ `EinsumTrace` with live tensor values.
179
+ - `engine`: optional backend override. If omitted, the library auto-detects it.
180
+ - `config`: tensor-inspection behavior lives here.
181
+ - `data` mode now includes global stats, per-axis summaries, and top-k coordinates by magnitude.
182
+ - `ax`: render a single tensor into an existing Matplotlib axis.
183
+ - `show_controls`: if `True`, add compact Matplotlib `group + mode` controls and, when needed, a tensor slider.
184
+ - `show`: if `False`, nothing is displayed automatically.
185
+
186
+ ### `PlotConfig`
187
+
188
+ Use `PlotConfig` for visual behavior:
189
+
190
+ ```python
191
+ from tensor_network_viz import PlotConfig
192
+
193
+ config = PlotConfig(
194
+ show_tensor_labels=True,
195
+ show_index_labels=False,
196
+ hover_labels=True,
197
+ show_contraction_scheme=False,
198
+ tensor_label_refinement="auto",
199
+ )
200
+ ```
201
+
202
+ This is where you configure:
203
+
204
+ - labels,
205
+ - hover tooltips,
206
+ - contraction-scheme overlays,
207
+ - styling,
208
+ - layout iterations,
209
+ - custom positions,
210
+ - label-refinement policy,
211
+ - static/export-oriented rendering choices.
212
+
213
+ ### `TensorElementsConfig`
214
+
215
+ Use `TensorElementsConfig` for tensor inspection behavior:
216
+
217
+ ```python
218
+ from tensor_network_viz import TensorElementsConfig
219
+
220
+ config = TensorElementsConfig(
221
+ mode="auto",
222
+ max_matrix_shape=(256, 256),
223
+ histogram_bins=40,
224
+ topk_count=8,
225
+ robust_percentiles=(1.0, 99.0),
226
+ shared_color_scale=False,
227
+ highlight_outliers=False,
228
+ )
229
+ ```
230
+
231
+ This is where you configure:
232
+
233
+ - the active inspection mode,
234
+ - row/column axis grouping for rank > 2 tensors,
235
+ - heatmap downsampling limits,
236
+ - histogram sampling and bin count,
237
+ - data-summary depth (`topk_count`),
238
+ - optional robust/shared scaling and outlier overlays.
239
+
240
+ If you want to start in a specific grouped view, pass `mode="real"`, `mode="imag"`,
241
+ `mode="phase"`, `mode="log_magnitude"`, `mode="sparsity"`, `mode="nan_inf"`, `mode="sign"`, or
242
+ `mode="signed_value"` directly in
243
+ `TensorElementsConfig(...)`.
244
+
245
+ ## Most Common Workflows
246
+
247
+ ### Interactive figure with controls
248
+
249
+ ```python
250
+ from tensor_network_viz import PlotConfig, show_tensor_network
251
+
252
+ fig, ax = show_tensor_network(
253
+ network,
254
+ config=PlotConfig(
255
+ show_tensor_labels=False,
256
+ show_index_labels=False,
257
+ hover_labels=True,
258
+ ),
259
+ )
260
+ ```
261
+
262
+ ### Clean export with no embedded controls
263
+
264
+ ```python
265
+ from tensor_network_viz import PlotConfig, show_tensor_network
266
+
267
+ fig, ax = show_tensor_network(
268
+ network,
269
+ config=PlotConfig(
270
+ show_tensor_labels=True,
271
+ show_index_labels=False,
272
+ ),
273
+ show_controls=False,
274
+ show=False,
275
+ )
276
+ fig.savefig("network.png", bbox_inches="tight")
277
+ ```
278
+
279
+ ### Inspect tensor values
280
+
281
+ ```python
282
+ from tensor_network_viz import TensorElementsConfig, show_tensor_elements
283
+
284
+ fig, ax = show_tensor_elements(
285
+ trace,
286
+ config=TensorElementsConfig(mode="auto"),
287
+ show=False,
288
+ )
289
+ fig.savefig("tensor-elements.png", bbox_inches="tight")
290
+ ```
291
+
292
+ ### Faster render for large graphs
293
+
294
+ ```python
295
+ config = PlotConfig(
296
+ tensor_label_refinement="never",
297
+ layout_iterations=120,
298
+ )
299
+ ```
300
+
301
+ ## Copy-Paste Examples by Backend
302
+
303
+ The library supports auto-detection, but using `engine=...` in examples is often clearer.
304
+
305
+ ### TensorKrowch
306
+
307
+ ```python
308
+ import tensorkrowch as tk
309
+ from tensor_network_viz import PlotConfig, show_tensor_network
310
+
311
+ network = tk.TensorNetwork(name="demo")
312
+ left = tk.Node(shape=(2, 2), axes_names=("a", "b"), name="L", network=network)
313
+ right = tk.Node(shape=(2, 2), axes_names=("b", "c"), name="R", network=network)
314
+ left["b"] ^ right["b"]
315
+
316
+ fig, ax = show_tensor_network(
317
+ network,
318
+ engine="tensorkrowch",
319
+ config=PlotConfig(show_tensor_labels=True),
320
+ )
321
+ ```
322
+
323
+ ### TensorNetwork
324
+
325
+ ```python
326
+ import numpy as np
327
+ import tensornetwork as tn
328
+ from tensor_network_viz import PlotConfig, show_tensor_network
329
+
330
+ left = tn.Node(np.ones((2, 2)), name="L", axis_names=("a", "b"))
331
+ right = tn.Node(np.ones((2, 2)), name="R", axis_names=("b", "c"))
332
+ left["b"] ^ right["b"]
333
+
334
+ fig, ax = show_tensor_network(
335
+ [left, right],
336
+ engine="tensornetwork",
337
+ config=PlotConfig(show_tensor_labels=True),
338
+ )
339
+ ```
340
+
341
+ ### Quimb
342
+
343
+ ```python
344
+ import numpy as np
345
+ import quimb.tensor as qtn
346
+ from tensor_network_viz import PlotConfig, show_tensor_network
347
+
348
+ tensors = [
349
+ qtn.Tensor(np.ones((2, 3)), inds=("i0", "b0"), tags={"T0"}),
350
+ qtn.Tensor(np.ones((3, 2)), inds=("b0", "i1"), tags={"T1"}),
351
+ ]
352
+ network = qtn.TensorNetwork(tensors)
353
+
354
+ fig, ax = show_tensor_network(
355
+ network,
356
+ engine="quimb",
357
+ config=PlotConfig(show_tensor_labels=True),
358
+ )
359
+ ```
360
+
361
+ ### TeNPy
362
+
363
+ ```python
364
+ from tenpy.networks.mps import MPS
365
+ from tenpy.networks.site import SpinHalfSite
366
+ from tensor_network_viz import PlotConfig, show_tensor_network
367
+
368
+ sites = [SpinHalfSite() for _ in range(4)]
369
+ mps = MPS.from_product_state(sites, ["up", "up", "up", "up"], bc="finite")
370
+
371
+ fig, ax = show_tensor_network(
372
+ mps,
373
+ engine="tenpy",
374
+ config=PlotConfig(show_tensor_labels=True),
375
+ show_controls=False,
376
+ show=False,
377
+ )
378
+ ```
379
+
380
+ ### `einsum`
381
+
382
+ ```python
383
+ from tensor_network_viz import PlotConfig, pair_tensor, show_tensor_network
384
+
385
+ trace = [
386
+ pair_tensor("A0", "x0", "r0", "pa,p->a"),
387
+ pair_tensor("r0", "A1", "r1", "a,apb->pb"),
388
+ ]
389
+
390
+ fig, ax = show_tensor_network(
391
+ trace,
392
+ engine="einsum",
393
+ config=PlotConfig(show_contraction_scheme=True),
394
+ )
395
+ ```
396
+
397
+ For fuller backend examples, see [docs/backends.md](docs/backends.md).
398
+
399
+ ## `PlotConfig` Fields You Will Actually Use Often
400
+
401
+ | Field | Why it matters |
402
+ | --- | --- |
403
+ | `show_tensor_labels` | Draw tensor names on nodes. |
404
+ | `show_index_labels` | Draw index labels on bonds and dangling legs. |
405
+ | `hover_labels` | Enable hover tooltips in interactive sessions. |
406
+ | `show_contraction_scheme` | Draw contraction-step regions. |
407
+ | `contraction_playback` | Start with playback controls enabled when controls are shown. |
408
+ | `contraction_scheme_cost_hover` | Show contraction details in the playback panel. |
409
+ | `tensor_label_refinement` | `"auto"`, `"always"`, or `"never"` for the expensive label-fit pass. |
410
+ | `layout_iterations` | Force-layout effort. |
411
+ | `positions` | Supply custom node coordinates. |
412
+ | `figsize` | Matplotlib figure size when the figure is created internally. |
413
+
414
+ ## Example Launcher
415
+
416
+ The repository ships a typed demo launcher:
417
+
418
+ ```bash
419
+ python examples/run_demo.py <engine> <example> [options]
420
+ ```
421
+
422
+ Useful examples:
423
+
424
+ ```bash
425
+ python examples/run_demo.py quimb hyper --view 2d
426
+ python examples/run_demo.py tenpy chain --view 2d --save tenpy_chain.png --no-show
427
+ python examples/run_demo.py einsum ellipsis --view 3d --scheme
428
+ ```
429
+
430
+ More details, including an exhaustive copy-paste command list for every CLI example:
431
+ [examples/README.md](examples/README.md)
432
+
433
+ There is also a minimal inspection example that only uses base dependencies:
434
+
435
+ ```bash
436
+ python examples/tensor_elements_demo.py
437
+ ```
438
+
439
+ ## Troubleshooting
440
+
441
+ | Symptom | What to try |
442
+ | --- | --- |
443
+ | Saved figure includes buttons/sliders | Use `show_controls=False`. |
444
+ | Hover tooltips do nothing | Use an interactive Matplotlib backend; hover is not useful for PNG-only runs. |
445
+ | Big graphs are slow | Set `tensor_label_refinement="never"`, reduce `layout_iterations`, or pass `positions`. |
446
+ | `Unsupported tensor network engine` | Install the matching extra or pass the correct backend object. |
447
+ | `show_tensor_elements(...)` fails on TensorKrowch nodes | Materialize the node tensors first; shape-only nodes do not expose element values. |
448
+ | `show_tensor_elements(...)` fails on manual `pair_tensor(...)` lists | Use an `EinsumTrace` with live tensors instead; manual trace steps only describe contractions. |
449
+ | Blank / duplicate Jupyter figure | Assign `fig, ax = show_tensor_network(...)` instead of leaving the tuple as the last line. |
450
+
451
+ ## Documentation Map
452
+
453
+ - [docs/guide.md](docs/guide.md): workflow-oriented guide to the public API.
454
+ - [docs/backends.md](docs/backends.md): copy-paste backend-specific examples.
455
+ - [examples/README.md](examples/README.md): demo launcher and batch-render usage.
456
+ - [examples/tensor_elements_demo.py](examples/tensor_elements_demo.py): minimal tensor inspection
457
+ example.
458
+ - [CHANGELOG.md](CHANGELOG.md): release notes.
459
+
460
+ ## Development
461
+
462
+ Create and use a local virtual environment:
463
+
464
+ ```powershell
465
+ python -m venv .venv
466
+ .\.venv\Scripts\Activate.ps1
467
+ python -m pip install -r requirements.dev.txt
468
+ ```
469
+
470
+ Run the project checks:
471
+
472
+ ```powershell
473
+ .\.venv\Scripts\python scripts\verify.py
474
+ ```