tensor-network-visualization 2.0.2__tar.gz → 2.0.3__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.
- {tensor_network_visualization-2.0.2/src/tensor_network_visualization.egg-info → tensor_network_visualization-2.0.3}/PKG-INFO +5 -1
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/README.md +29 -29
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/pyproject.toml +5 -1
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3/src/tensor_network_visualization.egg-info}/PKG-INFO +5 -1
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/SOURCES.txt +1 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/requires.txt +4 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/hover.py +2 -2
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/renderer.py +2 -1
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_input_inspection.py +2 -2
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/controller.py +6 -3
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/views.py +4 -2
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_data.py +8 -4
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_rendering.py +2 -1
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/contraction_viewer.py +8 -4
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_ci_workflow.py +35 -2
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_engineering_baseline.py +12 -9
- tensor_network_visualization-2.0.3/tests/test_security_config.py +31 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_translation_api.py +300 -300
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_verify_script.py +27 -1
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/LICENSE +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/setup.cfg +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/dependency_links.txt +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/top_level.txt +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_auto_display.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_contraction_viewer_style.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_contraction_viewer_ui.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/_draw_common.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/_label_format.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/_nodes_edges_common.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/axis_directions.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/contractions.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/curves.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/constants.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/contraction_edges.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/contraction_scheme.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/dangling_self_edges.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/disk_metrics.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/edge_labels.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/edge_orchestration.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/edges.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/fonts_and_scale.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/graph_pipeline.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/label_descriptors.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/labels_misc.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/pick_distance.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter_2d.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter_3d.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter_common.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/render_prep.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/scene_state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/tensors.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/vectors.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/viewport_geometry.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/focus.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/graph.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/graph_cache.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/graph_utils.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/body.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/direction_common.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/force_directed.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/free_directions_2d.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/free_directions_3d.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/generic_coarsening.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/geometry.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/parameters.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/positions.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/types.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout_structure.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout_structure_coordinates.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout_structure_sparse_grid.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_engine_specs.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_import_state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/bridge.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/controls.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/scheme.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/tensor_inspector.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interactive_scene.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_logging.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_matplotlib_state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_registry.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_comparison_support.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_controller.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_inputs.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_models.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_payloads.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_support.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_translation_codegen.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_translation_models.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_typing.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_ui_utils.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_widgets.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/config.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_backend.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_equation.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_trace_state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_trace_types.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/contraction_cost.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/graph.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/renderer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/trace.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/exceptions.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/interactive_viewer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/py.typed +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/quimb/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/quimb/graph.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/quimb/renderer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/snapshot.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/explicit.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/graph.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/renderer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_comparison.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_comparison_config.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_elements.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_elements_config.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/_history.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/graph.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/renderer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensornetwork/__init__.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensornetwork/graph.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensornetwork/renderer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/translation.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/viewer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_bench_user_workflows.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_cost.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_groups_once.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_scheme.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_scheme_api.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_viewer.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_demo_cli_scheme.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_documentation_gallery.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_draw_performance.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_edge_index_label_2d.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_edge_index_label_3d.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_einsum_autotrace.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_einsum_backend.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_engine_detection.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_examples.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_examples_structure.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_graph_cache.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_integration_einsum.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_integration_tensorkrowch.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_integration_tensornetwork.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_interaction_controls.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_interaction_state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_label_draw_metrics_perf.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_label_format.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_layout_core.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_lazy_imports.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_logging_and_exceptions.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_matplotlib_state.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_node_degrees_perf.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_packaging_metadata.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_plotting.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_public_api.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_quimb_backend.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_render_performance_controls.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_show_tensor_network_throughput.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_snapshot_api.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tenpy_backend.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tensor_comparison.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tensor_elements.py +0 -0
- {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tensor_elements_perf.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tensor-network-visualization
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
4
4
|
Summary: Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks.
|
|
5
5
|
Author: Alejandro Mata Ali
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,10 +27,14 @@ Requires-Dist: matplotlib>=3.7
|
|
|
27
27
|
Requires-Dist: networkx>=3.0
|
|
28
28
|
Requires-Dist: numpy>=2.0
|
|
29
29
|
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: bandit; extra == "dev"
|
|
30
31
|
Requires-Dist: build; extra == "dev"
|
|
31
32
|
Requires-Dist: pytest; extra == "dev"
|
|
32
33
|
Requires-Dist: ruff; extra == "dev"
|
|
34
|
+
Requires-Dist: setuptools; extra == "dev"
|
|
33
35
|
Requires-Dist: pyright; extra == "dev"
|
|
36
|
+
Requires-Dist: pip-audit; extra == "dev"
|
|
37
|
+
Requires-Dist: twine; extra == "dev"
|
|
34
38
|
Requires-Dist: ipython; extra == "dev"
|
|
35
39
|
Requires-Dist: tensorkrowch; extra == "dev"
|
|
36
40
|
Requires-Dist: tensornetwork; extra == "dev"
|
|
@@ -62,20 +62,20 @@ Tensor-network libraries expose different Python objects. This package gives the
|
|
|
62
62
|
visualization API so you can inspect structure, tensor values, contraction playback, and normalized
|
|
63
63
|
graph exports without rewriting plotting code for every backend.
|
|
64
64
|
|
|
65
|
-
The common entry points are:
|
|
66
|
-
|
|
67
|
-
```python
|
|
68
|
-
show_tensor_network(...)
|
|
69
|
-
show_tensor_elements(...)
|
|
70
|
-
show_tensor_comparison(...)
|
|
71
|
-
translate_tensor_network(...)
|
|
72
|
-
normalize_tensor_network(...)
|
|
73
|
-
export_tensor_network_snapshot(...)
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
If you want code for another backend rather than a figure, `translate_tensor_network(...)` can turn
|
|
77
|
-
supported TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced `einsum` inputs into executable
|
|
78
|
-
Python for `tensornetwork`, `quimb`, `einsum`, or `tensorkrowch`.
|
|
65
|
+
The common entry points are:
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
show_tensor_network(...)
|
|
69
|
+
show_tensor_elements(...)
|
|
70
|
+
show_tensor_comparison(...)
|
|
71
|
+
translate_tensor_network(...)
|
|
72
|
+
normalize_tensor_network(...)
|
|
73
|
+
export_tensor_network_snapshot(...)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
If you want code for another backend rather than a figure, `translate_tensor_network(...)` can turn
|
|
77
|
+
supported TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced `einsum` inputs into executable
|
|
78
|
+
Python for `tensornetwork`, `quimb`, `einsum`, or `tensorkrowch`.
|
|
79
79
|
|
|
80
80
|
## Install
|
|
81
81
|
|
|
@@ -205,27 +205,27 @@ The repository examples are organized around the same launcher:
|
|
|
205
205
|
python examples/run_demo.py <group> <demo>
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
-
The gallery includes backend demos for TensorKrowch, TensorNetwork, Quimb, TeNPy, and `einsum`,
|
|
209
|
-
plus three focused groups:
|
|
208
|
+
The gallery includes backend demos for TensorKrowch, TensorNetwork, Quimb, TeNPy, and `einsum`,
|
|
209
|
+
plus three focused groups:
|
|
210
210
|
|
|
211
211
|
- `themes overview`: compares the `PlotConfig` visual presets for tensor-network figures.
|
|
212
212
|
- `themes tensor_elements`: compares the `TensorElementsConfig` presets for `show_tensor_elements(...)`
|
|
213
213
|
and the linked tensor inspector.
|
|
214
214
|
- `placements`: shows object, list, 2D grid, 3D grid, manual positions, manual schemes, and named
|
|
215
215
|
index inputs.
|
|
216
|
-
- `geometry`: renders larger irregular, incomplete, triangular, pyramidal, circular, and
|
|
217
|
-
disconnected networks.
|
|
218
|
-
|
|
219
|
-
There is also a dedicated translation demo:
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
python examples/translate_demo.py --source-engine tensornetwork --target-engine quimb --example mps
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
It generates Python code for the translated tensor network and can render the original and
|
|
226
|
-
translated versions side by side for comparison.
|
|
227
|
-
|
|
228
|
-
For batch checks, use:
|
|
216
|
+
- `geometry`: renders larger irregular, incomplete, triangular, pyramidal, circular, and
|
|
217
|
+
disconnected networks.
|
|
218
|
+
|
|
219
|
+
There is also a dedicated translation demo:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
python examples/translate_demo.py --source-engine tensornetwork --target-engine quimb --example mps
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
It generates Python code for the translated tensor network and can render the original and
|
|
226
|
+
translated versions side by side for comparison.
|
|
227
|
+
|
|
228
|
+
For batch checks, use:
|
|
229
229
|
|
|
230
230
|
```bash
|
|
231
231
|
python examples/run_all_examples.py --group engines --views 2d --list
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tensor-network-visualization"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.3"
|
|
8
8
|
description = "Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks."
|
|
9
9
|
authors = [{ name = "Alejandro Mata Ali" }]
|
|
10
10
|
readme = "README.md"
|
|
@@ -39,10 +39,14 @@ Issues = "https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/issues"
|
|
|
39
39
|
|
|
40
40
|
[project.optional-dependencies]
|
|
41
41
|
dev = [
|
|
42
|
+
"bandit",
|
|
42
43
|
"build",
|
|
43
44
|
"pytest",
|
|
44
45
|
"ruff",
|
|
46
|
+
"setuptools",
|
|
45
47
|
"pyright",
|
|
48
|
+
"pip-audit",
|
|
49
|
+
"twine",
|
|
46
50
|
"ipython",
|
|
47
51
|
"tensorkrowch",
|
|
48
52
|
"tensornetwork",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tensor-network-visualization
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
4
4
|
Summary: Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks.
|
|
5
5
|
Author: Alejandro Mata Ali
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,10 +27,14 @@ Requires-Dist: matplotlib>=3.7
|
|
|
27
27
|
Requires-Dist: networkx>=3.0
|
|
28
28
|
Requires-Dist: numpy>=2.0
|
|
29
29
|
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: bandit; extra == "dev"
|
|
30
31
|
Requires-Dist: build; extra == "dev"
|
|
31
32
|
Requires-Dist: pytest; extra == "dev"
|
|
32
33
|
Requires-Dist: ruff; extra == "dev"
|
|
34
|
+
Requires-Dist: setuptools; extra == "dev"
|
|
33
35
|
Requires-Dist: pyright; extra == "dev"
|
|
36
|
+
Requires-Dist: pip-audit; extra == "dev"
|
|
37
|
+
Requires-Dist: twine; extra == "dev"
|
|
34
38
|
Requires-Dist: ipython; extra == "dev"
|
|
35
39
|
Requires-Dist: tensorkrowch; extra == "dev"
|
|
36
40
|
Requires-Dist: tensornetwork; extra == "dev"
|
|
@@ -159,6 +159,7 @@ tests/test_plotting.py
|
|
|
159
159
|
tests/test_public_api.py
|
|
160
160
|
tests/test_quimb_backend.py
|
|
161
161
|
tests/test_render_performance_controls.py
|
|
162
|
+
tests/test_security_config.py
|
|
162
163
|
tests/test_show_tensor_network_throughput.py
|
|
163
164
|
tests/test_snapshot_api.py
|
|
164
165
|
tests/test_tenpy_backend.py
|
|
@@ -401,8 +401,8 @@ def _apply_saved_hover_state(
|
|
|
401
401
|
)
|
|
402
402
|
return
|
|
403
403
|
|
|
404
|
-
|
|
405
|
-
|
|
404
|
+
if state.positions is None or state.params is None:
|
|
405
|
+
raise RuntimeError("3D hover registration requires resolved positions and parameters.")
|
|
406
406
|
_register_3d_hover_labels(
|
|
407
407
|
state.ax,
|
|
408
408
|
state.figure,
|
|
@@ -515,7 +515,8 @@ def _plot_graph(
|
|
|
515
515
|
style,
|
|
516
516
|
visible_tensor_count=count_visible_tensors(draw_graph),
|
|
517
517
|
)
|
|
518
|
-
|
|
518
|
+
if resolved_style.show_tensor_labels is None:
|
|
519
|
+
raise RuntimeError("Auto display resolution did not resolve tensor-label visibility.")
|
|
519
520
|
draw_positions = {
|
|
520
521
|
node_id: geometry.positions[node_id]
|
|
521
522
|
for node_id in draw_graph.nodes
|
|
@@ -4,7 +4,7 @@ from collections.abc import Callable, Iterable
|
|
|
4
4
|
from dataclasses import replace
|
|
5
5
|
from functools import cache
|
|
6
6
|
from itertools import tee
|
|
7
|
-
from typing import Any
|
|
7
|
+
from typing import Any, NoReturn
|
|
8
8
|
|
|
9
9
|
from ._core.graph_utils import _is_unordered_collection
|
|
10
10
|
from ._engine_specs import EngineName
|
|
@@ -108,7 +108,7 @@ def _is_grid_container(value: Any) -> bool:
|
|
|
108
108
|
return isinstance(value, (list, tuple))
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
def _raise_grid_error(message: str) ->
|
|
111
|
+
def _raise_grid_error(message: str) -> NoReturn:
|
|
112
112
|
raise VisualizationInputError(message)
|
|
113
113
|
|
|
114
114
|
|
|
@@ -389,7 +389,8 @@ class _InteractiveTensorFigureController:
|
|
|
389
389
|
@property
|
|
390
390
|
def current_scene(self) -> _InteractiveSceneState:
|
|
391
391
|
scene = self._view_manager.current_scene(self.current_view)
|
|
392
|
-
|
|
392
|
+
if scene is None:
|
|
393
|
+
raise RuntimeError("Interactive scene is not available for the current view.")
|
|
393
394
|
return scene
|
|
394
395
|
|
|
395
396
|
@property
|
|
@@ -531,7 +532,8 @@ class _InteractiveTensorFigureController:
|
|
|
531
532
|
)
|
|
532
533
|
|
|
533
534
|
def _build_controls(self, scene: _InteractiveSceneState) -> None:
|
|
534
|
-
|
|
535
|
+
if self.figure is None:
|
|
536
|
+
raise RuntimeError("Interactive controls require an initialized figure.")
|
|
535
537
|
self._controls_panel = _InteractiveControlsPanel(
|
|
536
538
|
fig=self.figure,
|
|
537
539
|
layout=self._controls_layout(scene),
|
|
@@ -547,7 +549,8 @@ class _InteractiveTensorFigureController:
|
|
|
547
549
|
)
|
|
548
550
|
|
|
549
551
|
def _ensure_focus_status_text(self) -> Text:
|
|
550
|
-
|
|
552
|
+
if self.figure is None:
|
|
553
|
+
raise RuntimeError("Focus status text requires an initialized figure.")
|
|
551
554
|
if self._focus_status_text is None:
|
|
552
555
|
self._focus_status_text = self.figure.text(
|
|
553
556
|
0.5,
|
|
@@ -110,7 +110,8 @@ class _InteractiveViewManager:
|
|
|
110
110
|
|
|
111
111
|
def rerender_cached_view(self, view: ViewName) -> _InteractiveSceneState:
|
|
112
112
|
cache = self.view_caches[view]
|
|
113
|
-
|
|
113
|
+
if cache.ax is None:
|
|
114
|
+
raise RuntimeError("Cached view cannot be re-rendered before its axes are built.")
|
|
114
115
|
old_scene = cache.scene
|
|
115
116
|
if old_scene is not None and old_scene.contraction_controls is not None:
|
|
116
117
|
viewer = old_scene.contraction_controls._viewer
|
|
@@ -120,7 +121,8 @@ class _InteractiveViewManager:
|
|
|
120
121
|
viewer.hide_scheme_artists()
|
|
121
122
|
fig, rendered_ax = self._render_view(view, cache.ax)
|
|
122
123
|
scene = _scene_from_axes(rendered_ax)
|
|
123
|
-
|
|
124
|
+
if scene is None:
|
|
125
|
+
raise RuntimeError("Rendered axes did not expose an interactive scene.")
|
|
124
126
|
cache.ax = rendered_ax
|
|
125
127
|
cache.scene = scene
|
|
126
128
|
scene.contraction_controls = get_contraction_controls(rendered_ax)
|
|
@@ -186,7 +186,8 @@ def _balanced_axes_for_shape(shape: tuple[int, ...]) -> tuple[int, ...]:
|
|
|
186
186
|
best_axes = candidate
|
|
187
187
|
best_score = score
|
|
188
188
|
best_rank_gap = rank_gap
|
|
189
|
-
|
|
189
|
+
if best_axes is None:
|
|
190
|
+
raise RuntimeError("Could not resolve a balanced tensor-axis split.")
|
|
190
191
|
return best_axes
|
|
191
192
|
|
|
192
193
|
|
|
@@ -231,10 +232,12 @@ def _resolve_matrix_axes(
|
|
|
231
232
|
return resolved_rows, resolved_cols
|
|
232
233
|
|
|
233
234
|
if resolved_rows is None:
|
|
234
|
-
|
|
235
|
+
if resolved_cols is None:
|
|
236
|
+
raise RuntimeError("Column axes were not resolved.")
|
|
235
237
|
resolved_rows = tuple(index for index in range(ndim) if index not in resolved_cols)
|
|
236
238
|
if resolved_cols is None:
|
|
237
|
-
|
|
239
|
+
if resolved_rows is None:
|
|
240
|
+
raise RuntimeError("Row axes were not resolved.")
|
|
238
241
|
resolved_cols = tuple(index for index in range(ndim) if index not in resolved_rows)
|
|
239
242
|
|
|
240
243
|
if set(resolved_rows).intersection(resolved_cols):
|
|
@@ -405,7 +408,8 @@ def _resolve_tensor_analysis(
|
|
|
405
408
|
fallback_index=0,
|
|
406
409
|
fallback=fallback,
|
|
407
410
|
)
|
|
408
|
-
|
|
411
|
+
if slice_axis is None:
|
|
412
|
+
raise RuntimeError("Slice axis was not resolved for an active slice view.")
|
|
409
413
|
slice_axis_name = original_axis_names[slice_axis]
|
|
410
414
|
slice_axis_size = int(array.shape[slice_axis])
|
|
411
415
|
requested_slice_index = (
|
|
@@ -278,7 +278,8 @@ def _render_panel(
|
|
|
278
278
|
panel.main_ax.set_title(_panel_title(record, payload))
|
|
279
279
|
return
|
|
280
280
|
|
|
281
|
-
|
|
281
|
+
if not isinstance(payload, _HeatmapPayload):
|
|
282
|
+
raise TypeError(f"Unsupported tensor-elements payload: {type(payload).__name__!r}.")
|
|
282
283
|
matrix = np.asarray(payload.matrix)
|
|
283
284
|
metadata = payload.metadata
|
|
284
285
|
style_key = payload.style_key
|
|
@@ -787,7 +787,8 @@ class ContractionViewer2D(_ContractionViewerBase):
|
|
|
787
787
|
if fig is None:
|
|
788
788
|
fig, ax_new = plt.subplots()
|
|
789
789
|
ax = cast(Axes, ax_new)
|
|
790
|
-
|
|
790
|
+
if ax is None:
|
|
791
|
+
raise ValueError("ContractionViewer2D requires a 2D Axes when fig is provided.")
|
|
791
792
|
if getattr(ax, "name", None) == "3d":
|
|
792
793
|
raise TypeError("ContractionViewer2D requires a 2D Axes")
|
|
793
794
|
super().__init__(
|
|
@@ -816,7 +817,8 @@ class ContractionViewer2D(_ContractionViewerBase):
|
|
|
816
817
|
if fig is None:
|
|
817
818
|
fig, ax_new = plt.subplots()
|
|
818
819
|
ax = cast(Axes, ax_new)
|
|
819
|
-
|
|
820
|
+
if ax is None:
|
|
821
|
+
raise ValueError("ContractionViewer2D.from_rectangles requires a 2D Axes.")
|
|
820
822
|
artists: list[Rectangle] = []
|
|
821
823
|
for x, y, w, h in rectangles:
|
|
822
824
|
r = Rectangle(
|
|
@@ -850,7 +852,8 @@ class ContractionViewer3D(_ContractionViewerBase):
|
|
|
850
852
|
if fig is None:
|
|
851
853
|
fig = plt.figure()
|
|
852
854
|
ax = cast(Axes3D, fig.add_subplot(111, projection="3d"))
|
|
853
|
-
|
|
855
|
+
if ax is None:
|
|
856
|
+
raise ValueError("ContractionViewer3D requires Axes3D when fig is provided.")
|
|
854
857
|
if not hasattr(ax, "zaxis"):
|
|
855
858
|
raise TypeError("ContractionViewer3D requires Axes3D")
|
|
856
859
|
super().__init__(
|
|
@@ -879,7 +882,8 @@ class ContractionViewer3D(_ContractionViewerBase):
|
|
|
879
882
|
if fig is None:
|
|
880
883
|
fig = plt.figure()
|
|
881
884
|
ax = cast(Axes3D, fig.add_subplot(111, projection="3d"))
|
|
882
|
-
|
|
885
|
+
if ax is None:
|
|
886
|
+
raise ValueError("ContractionViewer3D.from_boxes requires Axes3D.")
|
|
883
887
|
artists: list[Poly3DCollection] = []
|
|
884
888
|
for mn, mx in boxes:
|
|
885
889
|
mn = np.asarray(mn, dtype=float).ravel()[:3]
|
{tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_ci_workflow.py
RENAMED
|
@@ -22,7 +22,7 @@ def _parse_block_list_item(raw_value: str) -> str:
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def _load_workflow_text(text: str) -> dict[str, Any]:
|
|
25
|
-
workflow: dict[str, Any] = {"jobs": {}}
|
|
25
|
+
workflow: dict[str, Any] = {"jobs": {}, "permissions": {}}
|
|
26
26
|
current_job_name: str | None = None
|
|
27
27
|
current_step: dict[str, Any] | None = None
|
|
28
28
|
current_matrix_key: str | None = None
|
|
@@ -48,6 +48,8 @@ def _load_workflow_text(text: str) -> dict[str, Any]:
|
|
|
48
48
|
continue
|
|
49
49
|
|
|
50
50
|
if current_job_name is None:
|
|
51
|
+
if indent == 2 and stripped.startswith("contents: "):
|
|
52
|
+
workflow["permissions"]["contents"] = stripped.split(": ", 1)[1].strip()
|
|
51
53
|
continue
|
|
52
54
|
|
|
53
55
|
if indent == 8 and stripped.startswith("os: "):
|
|
@@ -109,6 +111,10 @@ def _load_workflow() -> dict[str, Any]:
|
|
|
109
111
|
return _load_workflow_text(Path(".github/workflows/ci.yml").read_text(encoding="utf-8"))
|
|
110
112
|
|
|
111
113
|
|
|
114
|
+
def _workflow_text() -> str:
|
|
115
|
+
return Path(".github/workflows/ci.yml").read_text(encoding="utf-8")
|
|
116
|
+
|
|
117
|
+
|
|
112
118
|
def _job_step_names(workflow: dict[str, Any], job_name: str) -> list[str]:
|
|
113
119
|
return [step["name"] for step in workflow["jobs"][job_name]["steps"]]
|
|
114
120
|
|
|
@@ -153,8 +159,12 @@ jobs:
|
|
|
153
159
|
|
|
154
160
|
def test_ci_workflow_declares_expected_jobs_and_runner_matrices() -> None:
|
|
155
161
|
workflow = _load_workflow()
|
|
162
|
+
workflow_text = _workflow_text()
|
|
156
163
|
|
|
157
164
|
assert set(workflow["jobs"]) == {"smoke-minimal", "wheel-smoke", "lint-and-test"}
|
|
165
|
+
assert workflow["permissions"]["contents"] == "read"
|
|
166
|
+
assert workflow_text.count("uses: actions/checkout@v6") == 3
|
|
167
|
+
assert workflow_text.count("uses: actions/setup-python@v6") == 3
|
|
158
168
|
assert workflow["jobs"]["wheel-smoke"]["matrix"]["os"] == ["ubuntu-latest", "windows-latest"]
|
|
159
169
|
assert workflow["jobs"]["wheel-smoke"]["matrix"]["python-version"] == ["3.12", "3.13"]
|
|
160
170
|
assert workflow["jobs"]["lint-and-test"]["matrix"]["os"] == [
|
|
@@ -187,6 +197,9 @@ def test_ci_workflow_routes_core_checks_through_verify_script() -> None:
|
|
|
187
197
|
assert _job_step(workflow, "lint-and-test", "Pytest")["run"] == (
|
|
188
198
|
"python scripts/verify.py tests"
|
|
189
199
|
)
|
|
200
|
+
assert _job_step(workflow, "lint-and-test", "Security")["run"] == (
|
|
201
|
+
"python scripts/verify.py security"
|
|
202
|
+
)
|
|
190
203
|
|
|
191
204
|
|
|
192
205
|
def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
|
|
@@ -196,7 +209,13 @@ def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
|
|
|
196
209
|
]
|
|
197
210
|
|
|
198
211
|
assert "python -m pip install -e . --no-deps" in minimal_install
|
|
199
|
-
for requirement in (
|
|
212
|
+
for requirement in (
|
|
213
|
+
"matplotlib==3.10.9",
|
|
214
|
+
"networkx==3.6.1",
|
|
215
|
+
"numpy==2.4.5",
|
|
216
|
+
"pytest==9.0.3",
|
|
217
|
+
"quimb==1.14.0",
|
|
218
|
+
):
|
|
200
219
|
assert requirement in minimal_install
|
|
201
220
|
|
|
202
221
|
wheel_step_names = _job_step_names(workflow, "wheel-smoke")
|
|
@@ -204,13 +223,21 @@ def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
|
|
|
204
223
|
"Install build tool",
|
|
205
224
|
"Create wheel test venv",
|
|
206
225
|
"Create sdist test venv",
|
|
226
|
+
"Install wheel (Linux)",
|
|
207
227
|
"Install wheel (Windows)",
|
|
208
228
|
"Smoke import and render (Windows)",
|
|
229
|
+
"Install sdist (Linux)",
|
|
209
230
|
"Install sdist (Windows)",
|
|
210
231
|
"Smoke sdist import and render (Windows)",
|
|
211
232
|
):
|
|
212
233
|
assert step_name in wheel_step_names
|
|
213
234
|
|
|
235
|
+
wheel_linux_install = _job_step(workflow, "wheel-smoke", "Install wheel (Linux)")["run"]
|
|
236
|
+
assert ".tmp/package-dist/*.whl" in wheel_linux_install
|
|
237
|
+
|
|
238
|
+
wheel_windows_install = _job_step(workflow, "wheel-smoke", "Install wheel (Windows)")["run"]
|
|
239
|
+
assert "Get-ChildItem .tmp\\package-dist\\*.whl" in wheel_windows_install
|
|
240
|
+
|
|
214
241
|
wheel_windows_smoke = _job_step(workflow, "wheel-smoke", "Smoke import and render (Windows)")[
|
|
215
242
|
"run"
|
|
216
243
|
]
|
|
@@ -219,6 +246,12 @@ def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
|
|
|
219
246
|
assert "show_tensor_network(" in wheel_windows_smoke
|
|
220
247
|
assert "engine='einsum'" in wheel_windows_smoke
|
|
221
248
|
|
|
249
|
+
sdist_linux_install = _job_step(workflow, "wheel-smoke", "Install sdist (Linux)")["run"]
|
|
250
|
+
assert ".tmp/package-dist/*.tar.gz" in sdist_linux_install
|
|
251
|
+
|
|
252
|
+
sdist_windows_install = _job_step(workflow, "wheel-smoke", "Install sdist (Windows)")["run"]
|
|
253
|
+
assert "Get-ChildItem .tmp\\package-dist\\*.tar.gz" in sdist_windows_install
|
|
254
|
+
|
|
222
255
|
sdist_windows_smoke = _job_step(
|
|
223
256
|
workflow,
|
|
224
257
|
"wheel-smoke",
|
|
@@ -144,19 +144,22 @@ def test_dev_requirements_pin_verification_tools_and_use_editable_install() -> N
|
|
|
144
144
|
|
|
145
145
|
assert "-e ." in lines
|
|
146
146
|
assert {
|
|
147
|
-
"build==1.
|
|
148
|
-
"
|
|
149
|
-
"ipython==9.
|
|
150
|
-
"matplotlib==3.10.
|
|
147
|
+
"build==1.5.0",
|
|
148
|
+
"bandit==1.9.4",
|
|
149
|
+
"ipython==9.13.0",
|
|
150
|
+
"matplotlib==3.10.9",
|
|
151
151
|
"networkx==3.6.1",
|
|
152
|
-
"numpy==2.4.
|
|
152
|
+
"numpy==2.4.5",
|
|
153
|
+
"pip-audit==2.10.0",
|
|
153
154
|
"physics-tenpy==1.1.0",
|
|
154
|
-
"pyright==1.1.
|
|
155
|
-
"pytest==9.0.
|
|
156
|
-
"quimb==1.
|
|
157
|
-
"ruff==0.15.
|
|
155
|
+
"pyright==1.1.409",
|
|
156
|
+
"pytest==9.0.3",
|
|
157
|
+
"quimb==1.14.0",
|
|
158
|
+
"ruff==0.15.13",
|
|
159
|
+
"setuptools==81.0.0",
|
|
158
160
|
"tensorkrowch==1.1.6",
|
|
159
161
|
"tensornetwork==0.4.6",
|
|
162
|
+
"twine==6.2.0",
|
|
160
163
|
}.issubset(set(lines))
|
|
161
164
|
|
|
162
165
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _python_source_files(root: Path) -> list[Path]:
|
|
8
|
+
return sorted(root.rglob("*.py"))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_runtime_package_does_not_use_optimized_away_asserts() -> None:
|
|
12
|
+
assert_locations: list[str] = []
|
|
13
|
+
for path in _python_source_files(Path("src/tensor_network_viz")):
|
|
14
|
+
module = ast.parse(path.read_text(encoding="utf-8"))
|
|
15
|
+
for node in ast.walk(module):
|
|
16
|
+
if isinstance(node, ast.Assert):
|
|
17
|
+
assert_locations.append(f"{path}:{node.lineno}")
|
|
18
|
+
|
|
19
|
+
assert assert_locations == []
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_dependabot_updates_python_and_github_actions_manifests() -> None:
|
|
23
|
+
config_path = Path(".github/dependabot.yml")
|
|
24
|
+
|
|
25
|
+
text = config_path.read_text(encoding="utf-8")
|
|
26
|
+
|
|
27
|
+
assert 'package-ecosystem: "pip"' in text
|
|
28
|
+
assert 'package-ecosystem: "github-actions"' in text
|
|
29
|
+
assert 'directory: "/"' in text
|
|
30
|
+
assert 'interval: "weekly"' in text
|
|
31
|
+
assert 'timezone: "Europe/Madrid"' in text
|