From 243275797b6931e861a229a4774c3168c9f26390 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Mon, 15 Dec 2025 10:26:25 -0500 Subject: [PATCH 1/3] optimize converter to `TensorMap` --- src/tensors/abstractblocktensor/conversion.jl | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/tensors/abstractblocktensor/conversion.jl b/src/tensors/abstractblocktensor/conversion.jl index bbc8e8a..de760bb 100644 --- a/src/tensors/abstractblocktensor/conversion.jl +++ b/src/tensors/abstractblocktensor/conversion.jl @@ -1,29 +1,35 @@ # Conversion # ---------- -function Base.convert(::Type{T}, t::AbstractBlockTensorMap) where {T <: TensorMap} - cod = ProductSpace{spacetype(t), numout(t)}(oplus.(codomain(t).spaces)) - dom = ProductSpace{spacetype(t), numin(t)}(oplus.(domain(t).spaces)) - +function Base.convert(::Type{TensorMap}, t::AbstractBlockTensorMap) + S = spacetype(t) + N₁, N₂ = numout(t), numin(t) + cod = ProductSpace{S, N₁}(oplus.(codomain(t).spaces)) + dom = ProductSpace{S, N₂}(oplus.(domain(t).spaces)) tdst = similar(t, cod ← dom) - for (f₁, f₂) in fusiontrees(tdst) - tdst[f₁, f₂] .= t[f₁, f₂] - end - return convert(T, tdst) -end -# disambiguate -function Base.convert(::Type{TensorMap}, t::AbstractBlockTensorMap) - cod = ProductSpace{spacetype(t), numout(t)}(oplus.(codomain(t).spaces)) - dom = ProductSpace{spacetype(t), numin(t)}(oplus.(domain(t).spaces)) + for ((f₁, f₂), arr) in subblocks(tdst) + blockax = ntuple(N₁ + N₂) do i + return if i <= N₁ + blockedrange(map(Base.Fix2(dim, f₁.uncoupled[i]), space(t, i))) + else + blockedrange(map(Base.Fix2(dim, f₂.uncoupled[i - N₁]), space(t, i)')) + end + end - tdst = similar(t, cod ← dom) - for (f₁, f₂) in fusiontrees(tdst) - copyto!(tdst[f₁, f₂], t[f₁, f₂]) + for (k, v) in nonzero_pairs(t) + indices = getindex.(blockax, Block.(Tuple(k))) + copy!(arr[indices...], v[f₁, f₂]) + end end return tdst end +function Base.convert(::Type{T}, t::AbstractBlockTensorMap) where {T <: TensorMap} + tdst = convert(TensorMap, t) + return convert(T, tdst) +end + function Base.convert(::Type{TT}, t::AbstractTensorMap) where {TT <: AbstractBlockTensorMap} t isa TT && return t if t isa AbstractBlockTensorMap From e3f8cf7056b0e282ababcbb7b57155289ee74d92 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Mon, 15 Dec 2025 13:56:08 -0500 Subject: [PATCH 2/3] fix for sparse --- src/tensors/abstractblocktensor/conversion.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tensors/abstractblocktensor/conversion.jl b/src/tensors/abstractblocktensor/conversion.jl index de760bb..bf43416 100644 --- a/src/tensors/abstractblocktensor/conversion.jl +++ b/src/tensors/abstractblocktensor/conversion.jl @@ -7,6 +7,8 @@ function Base.convert(::Type{TensorMap}, t::AbstractBlockTensorMap) dom = ProductSpace{S, N₂}(oplus.(domain(t).spaces)) tdst = similar(t, cod ← dom) + issparse(t) && zerovector!(tdst) + for ((f₁, f₂), arr) in subblocks(tdst) blockax = ntuple(N₁ + N₂) do i return if i <= N₁ From a623a194af3ea67e316066ac453684b0e704458b Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Mon, 15 Dec 2025 14:42:11 -0500 Subject: [PATCH 3/3] bump v0.3.3 [skip ci] --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index c93b6e5..b634ece 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "BlockTensorKit" uuid = "5f87ffc2-9cf1-4a46-8172-465d160bd8cd" -version = "0.3.2" +version = "0.3.3" authors = ["Lukas Devos and contributors"] [deps]