From 2cf73c47810bea2957155e5f4ea6697630bffe78 Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Mon, 3 Feb 2025 16:15:39 +0800 Subject: [PATCH 01/11] Update README upgrade guide; add TensorMap to DiagonalTensorMap conversion --- README.md | 35 ++++++++++++++++------------------- src/tensors/diagonal.jl | 9 +++++++++ src/tensors/tensor.jl | 12 +++--------- test/diagonal.jl | 5 +++++ 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index baf9a8e1f..936b45ed4 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@ A Julia package for large-scale tensor computations, with a hint of category theory. -| **Documentation** | **Digital Object Identifier** | **Downloads** | -|:-----------------:|:-----------------------------:|:-------------:| -| [![][docs-stable-img]][docs-stable-url] [![][docs-dev-img]][docs-dev-url] | [![DOI][doi-img]][doi-url] | [![TensorOperations Downloads][downloads-img]][downloads-url] | - +| **Documentation** | **Digital Object Identifier** | **Downloads** | +| :-----------------------------------------------------------------------: | :-----------------------------------------------------------------------: | :-----------------------------------------------------------: | +| [![][docs-stable-img]][docs-stable-url] [![][docs-dev-img]][docs-dev-url] | [![DOI][doi-img]][doi-url] | [![TensorOperations Downloads][downloads-img]][downloads-url] | +| | -| **Build Status** | **Coverage** | **Quality assurance** | -|:----------------:|:------------:|:---------------------:| +| **Build Status** | **Coverage** | **Quality assurance** | +| :---------------------: | :------------------------------------: | :------------------------------: | | [![CI][ci-img]][ci-url] | [![Codecov][codecov-img]][codecov-url] | [![Aqua QA][aqua-img]][aqua-url] | @@ -89,16 +89,18 @@ Major non-breaking changes include: ### Transferring `TensorMap` data from older versions to v0.13: -To export `TensorMap` data from TensorKit.jl v0.12.7 or earlier, you should first export the -data there in a format that is explicit about how tensor data is associated with the -structural part of the tensor, i.e. the splitting and fusion tree pairs. Therefore, on the -older version of TensorKit.jl, use the following code to save the data +To export `TensorMap` data from TensorKit.jl v0.12.7 or earlier, please use a format that is explicit about all "blocks" of the tensor, i.e. all coupled sectors and their corresponding matrix blocks. Therefore, on the +older version of TensorKit.jl, use the following code to save the data: ```julia using JLD2 filename = "choose_some_filename.jld2" -t_dict = Dict(:space => space(t), :data => Dict((f₁, f₂) => t[f₁, f₂] for (f₁, f₂) in fusiontrees(t))) -jldsave(filename; t_dict) +t_dict = Dict( + :codomain => repr(codomain(t)), + :domain => repr(domain(t)), + :data => Dict(repr(c) => Array(b) for (c, b) in blocks(t)) +) +save_object(filename, t_dict) ``` If you have already upgraded to TensorKit.jl v0.13, you can still install the old version in @@ -123,12 +125,7 @@ data and reconstruct the tensor as follows: ```julia using JLD2 filename = "choose_some_filename.jld2" -t_dict = jldload(filename) -T = eltype(valtype(t_dict[:data])) -t = TensorMap{T}(undef, t_dict[:space]) -for ((f₁, f₂), val) in t_dict[:data] - t[f₁, f₂] .= val -end +t = convert(TensorMap, load_object(filename)) ``` ## Overview @@ -136,7 +133,7 @@ end TensorKit.jl is a package that provides types and methods to represent and manipulate tensors with symmetries. The emphasis is on the structure and functionality needed to build tensor network algorithms for the simulation of quantum many-body systems. Such tensors are -typically invariant under a symmetry group which acts via specific representions on each of +typically invariant under a symmetry group which acts via specific representations on each of the indices of the tensor. TensorKit.jl provides the functionality for constructing such tensors and performing typical operations such as tensor contractions and decompositions, thereby preserving the symmetries and exploiting them for optimal performance. diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index cce5624ea..3a47318c3 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -52,6 +52,15 @@ function DiagonalTensorMap(data::DenseVector{T}, V::IndexSpace) where {T} return DiagonalTensorMap{T}(data, V) end +function DiagonalTensorMap(t::AbstractTensorMap) + isa(t, DiagonalTensorMap) && return t + @assert domain(t) == codomain(t) "Domain and codomain of the input tensor are different." + @assert numin(t) == numout(t) == 1 "Domain and codomain of the input tensor are not an IndexSpace." + @assert all(Diagonal(b) == b for (k, b) in blocks(t)) "Input tensor is not diagonal." + data = vcat((LinearAlgebra.diag(b) for (k, b) in blocks(t))...) + return DiagonalTensorMap(data, space(t, 1)) +end + # TODO: more constructors needed? # Special case adjoint: diff --git a/src/tensors/tensor.jl b/src/tensors/tensor.jl index abdb6d8c7..de2e6e823 100644 --- a/src/tensors/tensor.jl +++ b/src/tensors/tensor.jl @@ -395,15 +395,9 @@ Base.copy(t::TensorMap) = typeof(t)(copy(t.data), t.space) # Conversion between TensorMap and Dict, for read and write purpose #------------------------------------------------------------------ function Base.convert(::Type{Dict}, t::AbstractTensorMap) - d = Dict{Symbol,Any}() - d[:codomain] = repr(codomain(t)) - d[:domain] = repr(domain(t)) - data = Dict{String,Any}() - for (c, b) in blocks(t) - data[repr(c)] = Array(b) - end - d[:data] = data - return d + return Dict(:codomain => repr(codomain(t)), + :domain => repr(domain(t)), + :data => Dict(repr(c) => Array(b) for (c, b) in blocks(t))) end function Base.convert(::Type{TensorMap}, d::Dict{Symbol,Any}) try diff --git a/test/diagonal.jl b/test/diagonal.jl index 83cdee10e..e4b3f6225 100644 --- a/test/diagonal.jl +++ b/test/diagonal.jl @@ -89,9 +89,14 @@ diagspacelist = ((ℂ^4)', ℂ[Z2Irrep](0 => 2, 1 => 3), @timedtestset "Tensor conversion" begin t = @constinferred DiagonalTensorMap(undef, V) rand!(t.data) + # element type conversion tc = complex(t) @test convert(typeof(tc), t) == tc @test typeof(convert(typeof(tc), t)) == typeof(tc) + # to and from generic TensorMap + td = DiagonalTensorMap(TensorMap(t)) + @test t == td + @test typeof(td) == typeof(t) end I = sectortype(V) if BraidingStyle(I) isa SymmetricBraiding From 05c64b56687753e43c0f088011ba01a3f0d24ce8 Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Mon, 3 Feb 2025 16:30:36 +0800 Subject: [PATCH 02/11] Minor update to TensorMap to DiagonalTensorMap conversion --- README.md | 12 ++++++------ src/tensors/diagonal.jl | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 936b45ed4..6cff3bd25 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@ A Julia package for large-scale tensor computations, with a hint of category theory. -| **Documentation** | **Digital Object Identifier** | **Downloads** | -| :-----------------------------------------------------------------------: | :-----------------------------------------------------------------------: | :-----------------------------------------------------------: | -| [![][docs-stable-img]][docs-stable-url] [![][docs-dev-img]][docs-dev-url] | [![DOI][doi-img]][doi-url] | [![TensorOperations Downloads][downloads-img]][downloads-url] | -| | +| **Documentation** | **Digital Object Identifier** | **Downloads** | +|:-----------------:|:-----------------------------:|:-------------:| +| [![][docs-stable-img]][docs-stable-url] [![][docs-dev-img]][docs-dev-url] | [![DOI][doi-img]][doi-url] | [![TensorOperations Downloads][downloads-img]][downloads-url] | + -| **Build Status** | **Coverage** | **Quality assurance** | -| :---------------------: | :------------------------------------: | :------------------------------: | +| **Build Status** | **Coverage** | **Quality assurance** | +|:----------------:|:------------:|:---------------------:| | [![CI][ci-img]][ci-url] | [![Codecov][codecov-img]][codecov-url] | [![Aqua QA][aqua-img]][aqua-url] | diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index 3a47318c3..0b18fcb2a 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -52,10 +52,9 @@ function DiagonalTensorMap(data::DenseVector{T}, V::IndexSpace) where {T} return DiagonalTensorMap{T}(data, V) end -function DiagonalTensorMap(t::AbstractTensorMap) +function DiagonalTensorMap(t::AbstractTensorMap{T,S,1,1}) where {T,S} isa(t, DiagonalTensorMap) && return t @assert domain(t) == codomain(t) "Domain and codomain of the input tensor are different." - @assert numin(t) == numout(t) == 1 "Domain and codomain of the input tensor are not an IndexSpace." @assert all(Diagonal(b) == b for (k, b) in blocks(t)) "Input tensor is not diagonal." data = vcat((LinearAlgebra.diag(b) for (k, b) in blocks(t))...) return DiagonalTensorMap(data, space(t, 1)) @@ -81,6 +80,7 @@ function Base.copy!(t::AbstractTensorMap, d::DiagonalTensorMap) end TensorMap(d::DiagonalTensorMap) = copy!(similar(d), d) Base.convert(::Type{TensorMap}, d::DiagonalTensorMap) = TensorMap(d) +Base.convert(::Type{DiagonalTensorMap}, t::AbstractTensorMap) = DiagonalTensorMap(t) function Base.convert(::Type{DiagonalTensorMap{T,S,A}}, d::DiagonalTensorMap{T,S,A}) where {T,S,A} From 3650359f8a0bb95f8fb6237b45d30a1ad26c8752 Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Mon, 3 Feb 2025 21:41:42 +0800 Subject: [PATCH 03/11] Add suggested changes --- src/tensors/diagonal.jl | 6 ++++-- src/tensors/tensor.jl | 10 +++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index 0b18fcb2a..a629e56b8 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -54,8 +54,10 @@ end function DiagonalTensorMap(t::AbstractTensorMap{T,S,1,1}) where {T,S} isa(t, DiagonalTensorMap) && return t - @assert domain(t) == codomain(t) "Domain and codomain of the input tensor are different." - @assert all(Diagonal(b) == b for (k, b) in blocks(t)) "Input tensor is not diagonal." + domain(t) == codomain(t) || + throw(SpaceMismatch("DiagonalTensorMap requires equal domain and codomain")) + all(LinearAlgebra.isdiag ∘ last, blocks(t)) || + throw(ArgumentError("DiagonalTensorMap requires input tensor that is diagonal")) data = vcat((LinearAlgebra.diag(b) for (k, b) in blocks(t))...) return DiagonalTensorMap(data, space(t, 1)) end diff --git a/src/tensors/tensor.jl b/src/tensors/tensor.jl index de2e6e823..bd9fb38af 100644 --- a/src/tensors/tensor.jl +++ b/src/tensors/tensor.jl @@ -395,9 +395,10 @@ Base.copy(t::TensorMap) = typeof(t)(copy(t.data), t.space) # Conversion between TensorMap and Dict, for read and write purpose #------------------------------------------------------------------ function Base.convert(::Type{Dict}, t::AbstractTensorMap) - return Dict(:codomain => repr(codomain(t)), - :domain => repr(domain(t)), - :data => Dict(repr(c) => Array(b) for (c, b) in blocks(t))) + return Dict{Symbol,Any}(:codomain => repr(codomain(t)), + :domain => repr(domain(t)), + :data => Dict{String,Any}(repr(c) => Array(b) + for (c, b) in blocks(t))) end function Base.convert(::Type{TensorMap}, d::Dict{Symbol,Any}) try @@ -412,6 +413,9 @@ function Base.convert(::Type{TensorMap}, d::Dict{Symbol,Any}) return TensorMap(data, codomain, domain) end end +function Base.convert(::Type{DiagonalTensorMap}, d::Dict{Symbol,Any}) + return convert(DiagonalTensorMap, convert(TensorMap, d)) +end # Getting and setting the data at the block level #------------------------------------------------- From 2c774f54c1aaaba472e03dc8a052dd5857f9efda Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Mon, 3 Feb 2025 21:47:19 +0800 Subject: [PATCH 04/11] Refactoring --- src/tensors/diagonal.jl | 3 +++ src/tensors/tensor.jl | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index a629e56b8..1b8a6d930 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -91,6 +91,9 @@ end function Base.convert(D::Type{<:DiagonalTensorMap}, d::DiagonalTensorMap) return DiagonalTensorMap(convert(storagetype(D), d.data), d.domain) end +function Base.convert(::Type{DiagonalTensorMap}, d::Dict{Symbol,Any}) + return convert(DiagonalTensorMap, convert(TensorMap, d)) +end # Complex, real and imaginary parts #----------------------------------- diff --git a/src/tensors/tensor.jl b/src/tensors/tensor.jl index bd9fb38af..7db822611 100644 --- a/src/tensors/tensor.jl +++ b/src/tensors/tensor.jl @@ -413,9 +413,6 @@ function Base.convert(::Type{TensorMap}, d::Dict{Symbol,Any}) return TensorMap(data, codomain, domain) end end -function Base.convert(::Type{DiagonalTensorMap}, d::Dict{Symbol,Any}) - return convert(DiagonalTensorMap, convert(TensorMap, d)) -end # Getting and setting the data at the block level #------------------------------------------------- From c9af340e354b14661cea4f9358e5e79ed9ead08c Mon Sep 17 00:00:00 2001 From: Jutho Date: Mon, 3 Feb 2025 21:04:24 +0100 Subject: [PATCH 05/11] implement changes as discussed --- src/tensors/diagonal.jl | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index 1b8a6d930..bf1c985a0 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -56,10 +56,14 @@ function DiagonalTensorMap(t::AbstractTensorMap{T,S,1,1}) where {T,S} isa(t, DiagonalTensorMap) && return t domain(t) == codomain(t) || throw(SpaceMismatch("DiagonalTensorMap requires equal domain and codomain")) - all(LinearAlgebra.isdiag ∘ last, blocks(t)) || - throw(ArgumentError("DiagonalTensorMap requires input tensor that is diagonal")) - data = vcat((LinearAlgebra.diag(b) for (k, b) in blocks(t))...) - return DiagonalTensorMap(data, space(t, 1)) + A = storagetype(t) + d = DiagonalTensorMap{T,S,A}(undef, space(t, 1)) + for (c, b) in blocks(d) + bt = block(t, c) + # TODO: rewrite in terms of `diagview` from MatrixAlgebraKit.jl + copy!(b.diag, view(bt, LinearAlgebra.diagind(bt))) + end + return t end # TODO: more constructors needed? @@ -82,7 +86,6 @@ function Base.copy!(t::AbstractTensorMap, d::DiagonalTensorMap) end TensorMap(d::DiagonalTensorMap) = copy!(similar(d), d) Base.convert(::Type{TensorMap}, d::DiagonalTensorMap) = TensorMap(d) -Base.convert(::Type{DiagonalTensorMap}, t::AbstractTensorMap) = DiagonalTensorMap(t) function Base.convert(::Type{DiagonalTensorMap{T,S,A}}, d::DiagonalTensorMap{T,S,A}) where {T,S,A} @@ -91,6 +94,11 @@ end function Base.convert(D::Type{<:DiagonalTensorMap}, d::DiagonalTensorMap) return DiagonalTensorMap(convert(storagetype(D), d.data), d.domain) end +function Base.convert(::Type{DiagonalTensorMap}, t::AbstractTensorMap) + all(LinearAlgebra.isdiag ∘ last, blocks(t)) || + throw(ArgumentError("DiagonalTensorMap requires input tensor that is diagonal")) + return DiagonalTensorMap(t) +end function Base.convert(::Type{DiagonalTensorMap}, d::Dict{Symbol,Any}) return convert(DiagonalTensorMap, convert(TensorMap, d)) end From 03537cf6a3f2548f181f7cedd0394656fccc01d9 Mon Sep 17 00:00:00 2001 From: Jutho Date: Mon, 3 Feb 2025 21:08:15 +0100 Subject: [PATCH 06/11] restore tensor.jl --- src/tensors/tensor.jl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/tensors/tensor.jl b/src/tensors/tensor.jl index 7db822611..abdb6d8c7 100644 --- a/src/tensors/tensor.jl +++ b/src/tensors/tensor.jl @@ -395,10 +395,15 @@ Base.copy(t::TensorMap) = typeof(t)(copy(t.data), t.space) # Conversion between TensorMap and Dict, for read and write purpose #------------------------------------------------------------------ function Base.convert(::Type{Dict}, t::AbstractTensorMap) - return Dict{Symbol,Any}(:codomain => repr(codomain(t)), - :domain => repr(domain(t)), - :data => Dict{String,Any}(repr(c) => Array(b) - for (c, b) in blocks(t))) + d = Dict{Symbol,Any}() + d[:codomain] = repr(codomain(t)) + d[:domain] = repr(domain(t)) + data = Dict{String,Any}() + for (c, b) in blocks(t) + data[repr(c)] = Array(b) + end + d[:data] = data + return d end function Base.convert(::Type{TensorMap}, d::Dict{Symbol,Any}) try From c74a1f7ede11f62baad2f622be11ffbd011d8c63 Mon Sep 17 00:00:00 2001 From: Jutho Date: Mon, 3 Feb 2025 21:12:13 +0100 Subject: [PATCH 07/11] Restore README.md --- README.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 6cff3bd25..a1d05c0c5 100644 --- a/README.md +++ b/README.md @@ -89,19 +89,17 @@ Major non-breaking changes include: ### Transferring `TensorMap` data from older versions to v0.13: -To export `TensorMap` data from TensorKit.jl v0.12.7 or earlier, please use a format that is explicit about all "blocks" of the tensor, i.e. all coupled sectors and their corresponding matrix blocks. Therefore, on the -older version of TensorKit.jl, use the following code to save the data: - -```julia -using JLD2 -filename = "choose_some_filename.jld2" -t_dict = Dict( - :codomain => repr(codomain(t)), - :domain => repr(domain(t)), - :data => Dict(repr(c) => Array(b) for (c, b) in blocks(t)) -) -save_object(filename, t_dict) -``` +To export `TensorMap` data from TensorKit.jl v0.12.7 or earlier, you should first export the +data there in a format that is explicit about how tensor data is associated with the +structural part of the tensor, i.e. the splitting and fusion tree pairs. Therefore, on the +older version of TensorKit.jl, use the following code to save the data + + ```julia + using JLD2 + filename = "choose_some_filename.jld2" + t_dict = Dict(:space => space(t), :data => Dict((f₁, f₂) => t[f₁, f₂] for (f₁, f₂) in fusiontrees(t))) + jldsave(filename; t_dict) + ``` If you have already upgraded to TensorKit.jl v0.13, you can still install the old version in a separate environment, for example a temporary environment. To do this, run From b7e44c73e72a096e06e53bdffbff21782c6fee69 Mon Sep 17 00:00:00 2001 From: Jutho Date: Mon, 3 Feb 2025 21:13:50 +0100 Subject: [PATCH 08/11] Restore README.md 2 --- README.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a1d05c0c5..835982c6a 100644 --- a/README.md +++ b/README.md @@ -94,12 +94,12 @@ data there in a format that is explicit about how tensor data is associated with structural part of the tensor, i.e. the splitting and fusion tree pairs. Therefore, on the older version of TensorKit.jl, use the following code to save the data - ```julia - using JLD2 - filename = "choose_some_filename.jld2" - t_dict = Dict(:space => space(t), :data => Dict((f₁, f₂) => t[f₁, f₂] for (f₁, f₂) in fusiontrees(t))) - jldsave(filename; t_dict) - ``` +```julia +using JLD2 +filename = "choose_some_filename.jld2" +t_dict = Dict(:space => space(t), :data => Dict((f₁, f₂) => t[f₁, f₂] for (f₁, f₂) in fusiontrees(t))) +jldsave(filename; t_dict) +``` If you have already upgraded to TensorKit.jl v0.13, you can still install the old version in a separate environment, for example a temporary environment. To do this, run @@ -123,7 +123,12 @@ data and reconstruct the tensor as follows: ```julia using JLD2 filename = "choose_some_filename.jld2" -t = convert(TensorMap, load_object(filename)) +t_dict = jldload(filename) +T = eltype(valtype(t_dict[:data])) +t = TensorMap{T}(undef, t_dict[:space]) +for ((f₁, f₂), val) in t_dict[:data] + t[f₁, f₂] .= val +end ``` ## Overview From 563f4e7066d0ff8df2f00c77dd03d7e563501fa8 Mon Sep 17 00:00:00 2001 From: Jutho Date: Mon, 3 Feb 2025 22:06:55 +0100 Subject: [PATCH 09/11] use `isdiag(::AbstractTensorMap)` Co-authored-by: Lukas Devos --- src/tensors/diagonal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index bf1c985a0..6485a1ea8 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -95,7 +95,7 @@ function Base.convert(D::Type{<:DiagonalTensorMap}, d::DiagonalTensorMap) return DiagonalTensorMap(convert(storagetype(D), d.data), d.domain) end function Base.convert(::Type{DiagonalTensorMap}, t::AbstractTensorMap) - all(LinearAlgebra.isdiag ∘ last, blocks(t)) || + LinearAlgebra.isdiag(t) || throw(ArgumentError("DiagonalTensorMap requires input tensor that is diagonal")) return DiagonalTensorMap(t) end From 709b3a69788f74a9103f0ec9f192641717557810 Mon Sep 17 00:00:00 2001 From: Jutho Date: Mon, 3 Feb 2025 22:08:28 +0100 Subject: [PATCH 10/11] Fix diagonal.jl --- src/tensors/diagonal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index 6485a1ea8..a15eb4261 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -63,7 +63,7 @@ function DiagonalTensorMap(t::AbstractTensorMap{T,S,1,1}) where {T,S} # TODO: rewrite in terms of `diagview` from MatrixAlgebraKit.jl copy!(b.diag, view(bt, LinearAlgebra.diagind(bt))) end - return t + return d end # TODO: more constructors needed? From bcca586dc27c589896aba59c57c7825a74dd1a43 Mon Sep 17 00:00:00 2001 From: Jutho Date: Tue, 4 Feb 2025 10:47:54 +0100 Subject: [PATCH 11/11] remove ambiguity in convert methods --- src/tensors/diagonal.jl | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index a15eb4261..a13918d03 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -87,13 +87,10 @@ end TensorMap(d::DiagonalTensorMap) = copy!(similar(d), d) Base.convert(::Type{TensorMap}, d::DiagonalTensorMap) = TensorMap(d) -function Base.convert(::Type{DiagonalTensorMap{T,S,A}}, - d::DiagonalTensorMap{T,S,A}) where {T,S,A} - return d -end function Base.convert(D::Type{<:DiagonalTensorMap}, d::DiagonalTensorMap) - return DiagonalTensorMap(convert(storagetype(D), d.data), d.domain) + return (d isa D) ? d : DiagonalTensorMap(convert(storagetype(D), d.data), d.domain) end +Base.convert(::Type{DiagonalTensorMap}, t::DiagonalTensorMap) = t function Base.convert(::Type{DiagonalTensorMap}, t::AbstractTensorMap) LinearAlgebra.isdiag(t) || throw(ArgumentError("DiagonalTensorMap requires input tensor that is diagonal"))