From 269a7f2a05fe6eaeb361c58299a2efe56cdf98d3 Mon Sep 17 00:00:00 2001 From: Matthew Fishman Date: Tue, 12 May 2026 16:50:00 -0400 Subject: [PATCH] [Backport] Move visualize overloads to package extension; bump to v0.21.2 Backport of #367 onto the release-0.21 branch. Replace the in-source `visualize(::AbstractITensorNetwork, ...)` method (in `src/abstractitensornetwork.jl`) and the two type-piracy methods on `AbstractNamedGraph` / `AbstractDataGraph` (in `src/visualize.jl`) with a single `ITensorNetworksITensorVisualizationBaseExt` package extension that overloads `visualize(::AbstractITensorNetwork, ...)` only. The type-piracy methods migrate upstream: - `NamedGraphs.jl` v0.11.1 (PR ITensor/NamedGraphs.jl#166) adds the `AbstractNamedGraph` overload via its own `NamedGraphsITensorVisualizationBaseExt`. - `DataGraphs.jl` v0.4.1 (PR ITensor/DataGraphs.jl#119) adds the `AbstractDataGraph` overload via `DataGraphsITensorVisualizationBaseExt`. Motivation for backporting: once NamedGraphs v0.11.1 and DataGraphs v0.4.1 register, any user on legacy ITensorNetworks v0.21.x alongside the new NamedGraphs/DataGraphs would hit method-overwrite warnings on the two type-pirated `visualize` methods. v0.22 may take a while to ship (its prerelease accumulator is still receiving changes), so we publish a v0.21.2 patch carrying the equivalent fix. Bumps `[compat]` floors to `NamedGraphs = "0.11.1"` and `DataGraphs = "0.4.1"`, and bumps package version from 0.21.1 to 0.21.2. Co-Authored-By: Claude Opus 4.7 (1M context) --- Project.toml | 9 ++++-- ...nsorNetworksITensorVisualizationBaseExt.jl | 22 +++++++++++++++ src/ITensorNetworks.jl | 1 - src/abstractitensornetwork.jl | 18 ------------ src/visualize.jl | 28 ------------------- test/Project.toml | 6 ++-- test/test_itensorvisualizationbase_ext.jl | 12 ++++++++ 7 files changed, 44 insertions(+), 52 deletions(-) create mode 100644 ext/ITensorNetworksITensorVisualizationBaseExt/ITensorNetworksITensorVisualizationBaseExt.jl delete mode 100644 src/visualize.jl create mode 100644 test/test_itensorvisualizationbase_ext.jl diff --git a/Project.toml b/Project.toml index 6f8f559c..cb058afd 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ITensorNetworks" uuid = "2919e153-833c-4bdc-8836-1ea460a35fc7" -version = "0.21.1" +version = "0.21.2" authors = ["Matthew Fishman , Joseph Tindall and contributors"] [workspace] @@ -38,10 +38,12 @@ TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" TupleTools = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" [weakdeps] +ITensorVisualizationBase = "cd2553d2-8bef-4d93-8a38-c62f17d5ad23" OMEinsumContractionOrders = "6f22d1fd-8eed-4bb7-9776-e7d684900715" TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" [extensions] +ITensorNetworksITensorVisualizationBaseExt = "ITensorVisualizationBase" ITensorNetworksOMEinsumContractionOrdersExt = "OMEinsumContractionOrders" ITensorNetworksTensorOperationsExt = "TensorOperations" @@ -52,18 +54,19 @@ Adapt = "4" Combinatorics = "1" Compat = "3, 4" ConstructionBase = "1.6" -DataGraphs = "0.4" +DataGraphs = "0.4.1" Dictionaries = "0.4" Distributions = "0.25.86" DocStringExtensions = "0.9" Graphs = "1.8" +ITensorVisualizationBase = "0.1" ITensors = "0.7, 0.8, 0.9" IsApprox = "0.1, 1, 2" IterTools = "1.4" KrylovKit = "0.6, 0.7, 0.8, 0.9, 0.10" MacroTools = "0.5" NDTensors = "0.3, 0.4" -NamedGraphs = "0.11" +NamedGraphs = "0.11.1" OMEinsumContractionOrders = "0.8.3, 0.9, 1" SerializedElementArrays = "0.1" SimpleTraits = "0.9" diff --git a/ext/ITensorNetworksITensorVisualizationBaseExt/ITensorNetworksITensorVisualizationBaseExt.jl b/ext/ITensorNetworksITensorVisualizationBaseExt/ITensorNetworksITensorVisualizationBaseExt.jl new file mode 100644 index 00000000..734b2eeb --- /dev/null +++ b/ext/ITensorNetworksITensorVisualizationBaseExt/ITensorNetworksITensorVisualizationBaseExt.jl @@ -0,0 +1,22 @@ +module ITensorNetworksITensorVisualizationBaseExt + +using Graphs: vertices +using ITensorNetworks: AbstractITensorNetwork +using ITensorVisualizationBase: ITensorVisualizationBase + +function ITensorVisualizationBase.visualize( + tn::AbstractITensorNetwork, + args...; + vertex_labels_prefix = nothing, + vertex_labels = nothing, + kwargs... + ) + if !isnothing(vertex_labels_prefix) + vertex_labels = [vertex_labels_prefix * string(v) for v in vertices(tn)] + end + return ITensorVisualizationBase.visualize( + [tn[v] for v in vertices(tn)], args...; vertex_labels, kwargs... + ) +end + +end diff --git a/src/ITensorNetworks.jl b/src/ITensorNetworks.jl index 8c7d61ed..31d8e1ba 100644 --- a/src/ITensorNetworks.jl +++ b/src/ITensorNetworks.jl @@ -2,7 +2,6 @@ module ITensorNetworks include("lib/BaseExtensions/src/BaseExtensions.jl") include("lib/ITensorsExtensions/src/ITensorsExtensions.jl") -include("visualize.jl") include("abstractindsnetwork.jl") include("indextags.jl") include("indsnetwork.jl") diff --git a/src/abstractitensornetwork.jl b/src/abstractitensornetwork.jl index 11f91c96..28f9d846 100644 --- a/src/abstractitensornetwork.jl +++ b/src/abstractitensornetwork.jl @@ -791,24 +791,6 @@ end Base.show(io::IO, graph::AbstractITensorNetwork) = show(io, MIME"text/plain"(), graph) -# TODO: Move to an `ITensorNetworksVisualizationInterfaceExt` -# package extension (and define a `VisualizationInterface` package -# based on `ITensorVisualizationCore`.). -using ITensors.ITensorVisualizationCore: ITensorVisualizationCore, visualize -function ITensorVisualizationCore.visualize( - tn::AbstractITensorNetwork, - args...; - vertex_labels_prefix = nothing, - vertex_labels = nothing, - kwargs... - ) - if !isnothing(vertex_labels_prefix) - vertex_labels = [vertex_labels_prefix * string(v) for v in vertices(tn)] - end - # TODO: Use `tokenize_vertex`. - return visualize([tn[v] for v in vertices(tn)], args...; vertex_labels, kwargs...) -end - # # Link dimensions # diff --git a/src/visualize.jl b/src/visualize.jl deleted file mode 100644 index 950e48de..00000000 --- a/src/visualize.jl +++ /dev/null @@ -1,28 +0,0 @@ -# TODO: Move to `NamedGraphsITensorVisualizationCoreExt`. -using Graphs: vertices -using ITensors.ITensorVisualizationCore: ITensorVisualizationCore -using NamedGraphs: NamedGraphs, AbstractNamedGraph -function ITensorVisualizationCore.visualize( - graph::AbstractNamedGraph, - args...; - vertex_labels_prefix = nothing, - vertex_labels = nothing, - kwargs... - ) - if !isnothing(vertex_labels_prefix) - vertex_labels = [vertex_labels_prefix * string(v) for v in vertices(graph)] - end - #edge_labels = [string(e) for e in edges(graph)] - return ITensorVisualizationCore.visualize( - NamedGraphs.position_graph(graph), args...; vertex_labels, kwargs... - ) -end - -# TODO: Move to `DataGraphsITensorVisualizationCoreExt`. -using DataGraphs: DataGraphs, AbstractDataGraph -using ITensors.ITensorVisualizationCore: ITensorVisualizationCore -function ITensorVisualizationCore.visualize(graph::AbstractDataGraph, args...; kwargs...) - return ITensorVisualizationCore.visualize( - DataGraphs.underlying_graph(graph), args...; kwargs... - ) -end diff --git a/test/Project.toml b/test/Project.toml index 708ec90f..76019762 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -12,6 +12,7 @@ GraphsFlows = "06909019-6f44-4949-96fc-b9d9aaa02889" ITensorMPS = "0d1a4710-d33b-49a5-8f18-73bdf49b47e2" ITensorNetworks = "2919e153-833c-4bdc-8836-1ea460a35fc7" ITensorPkgSkeleton = "3d388ab1-018a-49f4-ae50-18094d5f71ea" +ITensorVisualizationBase = "cd2553d2-8bef-4d93-8a38-c62f17d5ad23" ITensors = "9136182c-28ba-11e9-034c-db9fb085ebd5" KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -38,7 +39,7 @@ AbstractTrees = "0.4.5" Adapt = "4.3" Aqua = "0.8.11" Compat = "4.16" -DataGraphs = "0.4" +DataGraphs = "0.4.1" Dictionaries = "0.4.4" Distributions = "0.25.118" Glob = "1.3.1" @@ -47,12 +48,13 @@ GraphsFlows = "0.1.1" ITensorMPS = "0.3.6, 0.4" ITensorNetworks = "0.21" ITensorPkgSkeleton = "0.3.42" +ITensorVisualizationBase = "0.1" ITensors = "0.7, 0.8, 0.9" KrylovKit = "0.8, 0.9, 0.10" LinearAlgebra = "1.10" Metis = "1.5" NDTensors = "0.3, 0.4" -NamedGraphs = "0.11" +NamedGraphs = "0.11.1" OMEinsumContractionOrders = "0.9.5, 1" Pkg = "1.10" Random = "1.10" diff --git a/test/test_itensorvisualizationbase_ext.jl b/test/test_itensorvisualizationbase_ext.jl new file mode 100644 index 00000000..ae4d9770 --- /dev/null +++ b/test/test_itensorvisualizationbase_ext.jl @@ -0,0 +1,12 @@ +using ITensorNetworks: AbstractITensorNetwork, ITensorNetwork +using ITensorVisualizationBase: ITensorVisualizationBase +using ITensors: ITensor, Index +using Test: @test, @testset + +@testset "ITensorNetworksITensorVisualizationBaseExt" begin + i, j, k = Index(2, "i"), Index(2, "j"), Index(2, "k") + tn = ITensorNetwork([ITensor(i, j), ITensor(j, k)]) + @test hasmethod(ITensorVisualizationBase.visualize, Tuple{AbstractITensorNetwork}) + @test isnothing(ITensorVisualizationBase.visualize(tn)) + @test isnothing(ITensorVisualizationBase.visualize(tn; vertex_labels_prefix = "v")) +end