From 07aafb8259e91b219da09202af44e1371f9ea522 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Mon, 14 Jul 2025 17:02:37 +0200 Subject: [PATCH 1/8] scalartype promotion for complexes --- src/BlockTensorKit.jl | 2 ++ src/tensors/tensoroperations.jl | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/BlockTensorKit.jl b/src/BlockTensorKit.jl index 15c3846..fa22328 100644 --- a/src/BlockTensorKit.jl +++ b/src/BlockTensorKit.jl @@ -14,6 +14,7 @@ export sparse export dropzeros!, droptol! export undef_blocks +using TensorKitSectors using TensorKit using TensorKit: OneOrNoneIterator, @@ -45,6 +46,7 @@ using Compat import VectorInterface as VI import TensorKit as TK +import TensorKitSectors as TKS import TensorOperations as TO import TupleTools as TT diff --git a/src/tensors/tensoroperations.jl b/src/tensors/tensoroperations.jl index b2155d0..51db2d2 100644 --- a/src/tensors/tensoroperations.jl +++ b/src/tensors/tensoroperations.jl @@ -4,10 +4,12 @@ function TO.tensoradd_type( TC, A::AbstractBlockTensorMap, ::Index2Tuple{N₁,N₂}, ::Bool ) where {N₁,N₂} TA = eltype(A) + I = TK.sectortype(A) + Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) if TA isa Union - M = Union{TK.similarstoragetype(TA.a, TC),TK.similarstoragetype(TA.b, TC)} + M = Union{TK.similarstoragetype(TA.a, Tnew),TK.similarstoragetype(TA.b, Tnew)} else - M = TK.similarstoragetype(TA, TC) + M = TK.similarstoragetype(TA, Tnew) end return if issparse(A) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) @@ -71,7 +73,10 @@ function TO.tensorcontract_type( ) where {N₁,N₂} spacetype(A) == spacetype(B) || throw(SpaceMismatch("incompatible space types: $(spacetype(A)) ≠ $(spacetype(B))")) - M = promote_storagetype(TC, eltype(A), typeof(B)) + + I = TK.sectortype(A) + Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + M = promote_storagetype(Tnew, eltype(A), typeof(B)) return if issparse(A) && issparse(B) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) else From fac9000bcb264d62318867c8ac1102a6c0aeff5d Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Mon, 14 Jul 2025 17:09:52 +0200 Subject: [PATCH 2/8] add TensorKitSectors to `Project.toml` --- Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Project.toml b/Project.toml index 3952a03..128f63a 100644 --- a/Project.toml +++ b/Project.toml @@ -10,6 +10,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Strided = "5e0ebb24-38b0-5f93-81fe-25c709ecae67" TensorKit = "07d1fe3e-3e46-537d-9eac-e9e13d0d4cec" +TensorKitSectors = "13a9c161-d5da-41f0-bcbd-e1a08ae0647f" TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" TupleTools = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" VectorInterface = "409d34a3-91d5-4945-b6ec-7529ddf182d8" From 0ac3dad3d401bb7aef258da57cafbe4c07c76081 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Mon, 14 Jul 2025 17:38:48 +0200 Subject: [PATCH 3/8] apply changes to all methods --- src/tensors/tensoroperations.jl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/tensors/tensoroperations.jl b/src/tensors/tensoroperations.jl index 51db2d2..e124f17 100644 --- a/src/tensors/tensoroperations.jl +++ b/src/tensors/tensoroperations.jl @@ -35,7 +35,10 @@ function TO.tensorcontract_type( ) where {N₁,N₂} spacetype(A) == spacetype(B) || throw(SpaceMismatch("incompatible space types: $(spacetype(A)) ≠ $(spacetype(B))")) - M = promote_storagetype(TC, eltype(A), eltype(B)) + + I = TK.sectortype(A) + Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + M = promote_storagetype(Tnew, eltype(A), eltype(B)) return if issparse(A) && issparse(B) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) else @@ -54,7 +57,10 @@ function TO.tensorcontract_type( ) where {N₁,N₂} spacetype(A) == spacetype(B) || throw(SpaceMismatch("incompatible space types: $(spacetype(A)) ≠ $(spacetype(B))")) - M = promote_storagetype(TC, typeof(A), eltype(B)) + + I = TK.sectortype(A) + Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + M = promote_storagetype(Tnew, typeof(A), eltype(B)) return if issparse(A) && issparse(B) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) else From bfe6333b9620393345e3d7ec80043cabb7318796 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Mon, 14 Jul 2025 17:55:19 +0200 Subject: [PATCH 4/8] add TensorKitSectors compat --- Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Project.toml b/Project.toml index 128f63a..913f523 100644 --- a/Project.toml +++ b/Project.toml @@ -25,6 +25,7 @@ Random = "1" SafeTestsets = "0.1" Strided = "2" TensorKit = "0.14" +TensorKitSectors = "0.1.6" TensorOperations = "5" Test = "1" TestExtras = "0.2, 0.3" From 8d5b989353fdf9cd21d1b36b9a01e57fb65d15b2 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Wed, 16 Jul 2025 09:49:26 -0400 Subject: [PATCH 5/8] Update `blocks` to return `Pair` instead of `Tuple` --- src/tensors/abstractblocktensor/abstracttensormap.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tensors/abstractblocktensor/abstracttensormap.jl b/src/tensors/abstractblocktensor/abstracttensormap.jl index ef8f46e..4f94959 100644 --- a/src/tensors/abstractblocktensor/abstracttensormap.jl +++ b/src/tensors/abstractblocktensor/abstracttensormap.jl @@ -63,7 +63,7 @@ function TensorKit.block(t::AbstractBlockTensorMap, c::Sector) end # TODO: this might get fixed once new tensormap is implemented -TensorKit.blocks(t::AbstractBlockTensorMap) = ((c, block(t, c)) for c in blocksectors(t)) +TensorKit.blocks(t::AbstractBlockTensorMap) = ((c => block(t, c)) for c in blocksectors(t)) TensorKit.blocksectors(t::AbstractBlockTensorMap) = blocksectors(space(t)) TensorKit.hasblock(t::AbstractBlockTensorMap, c::Sector) = c in blocksectors(t) From 13f7c5da40888707afc8bcbc32bf3200ea0c16e7 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Fri, 18 Jul 2025 07:49:36 +0200 Subject: [PATCH 6/8] remove TensorKitSectors dependency + unspecify `TK.sectortype` --- Project.toml | 2 -- src/BlockTensorKit.jl | 2 -- src/tensors/tensoroperations.jl | 22 +++++++++++----------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/Project.toml b/Project.toml index 913f523..3952a03 100644 --- a/Project.toml +++ b/Project.toml @@ -10,7 +10,6 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Strided = "5e0ebb24-38b0-5f93-81fe-25c709ecae67" TensorKit = "07d1fe3e-3e46-537d-9eac-e9e13d0d4cec" -TensorKitSectors = "13a9c161-d5da-41f0-bcbd-e1a08ae0647f" TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" TupleTools = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" VectorInterface = "409d34a3-91d5-4945-b6ec-7529ddf182d8" @@ -25,7 +24,6 @@ Random = "1" SafeTestsets = "0.1" Strided = "2" TensorKit = "0.14" -TensorKitSectors = "0.1.6" TensorOperations = "5" Test = "1" TestExtras = "0.2, 0.3" diff --git a/src/BlockTensorKit.jl b/src/BlockTensorKit.jl index fa22328..15c3846 100644 --- a/src/BlockTensorKit.jl +++ b/src/BlockTensorKit.jl @@ -14,7 +14,6 @@ export sparse export dropzeros!, droptol! export undef_blocks -using TensorKitSectors using TensorKit using TensorKit: OneOrNoneIterator, @@ -46,7 +45,6 @@ using Compat import VectorInterface as VI import TensorKit as TK -import TensorKitSectors as TKS import TensorOperations as TO import TupleTools as TT diff --git a/src/tensors/tensoroperations.jl b/src/tensors/tensoroperations.jl index e124f17..bf81570 100644 --- a/src/tensors/tensoroperations.jl +++ b/src/tensors/tensoroperations.jl @@ -4,8 +4,8 @@ function TO.tensoradd_type( TC, A::AbstractBlockTensorMap, ::Index2Tuple{N₁,N₂}, ::Bool ) where {N₁,N₂} TA = eltype(A) - I = TK.sectortype(A) - Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + I = sectortype(A) + Tnew = sectorscalartype(I) <: Real ? TC : complex(TC) if TA isa Union M = Union{TK.similarstoragetype(TA.a, Tnew),TK.similarstoragetype(TA.b, Tnew)} else @@ -35,9 +35,9 @@ function TO.tensorcontract_type( ) where {N₁,N₂} spacetype(A) == spacetype(B) || throw(SpaceMismatch("incompatible space types: $(spacetype(A)) ≠ $(spacetype(B))")) - - I = TK.sectortype(A) - Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + + I = sectortype(A) + Tnew = sectorscalartype(I) <: Real ? TC : complex(TC) M = promote_storagetype(Tnew, eltype(A), eltype(B)) return if issparse(A) && issparse(B) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) @@ -57,9 +57,9 @@ function TO.tensorcontract_type( ) where {N₁,N₂} spacetype(A) == spacetype(B) || throw(SpaceMismatch("incompatible space types: $(spacetype(A)) ≠ $(spacetype(B))")) - - I = TK.sectortype(A) - Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + + I = sectortype(A) + Tnew = sectorscalartype(I) <: Real ? TC : complex(TC) M = promote_storagetype(Tnew, typeof(A), eltype(B)) return if issparse(A) && issparse(B) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) @@ -79,9 +79,9 @@ function TO.tensorcontract_type( ) where {N₁,N₂} spacetype(A) == spacetype(B) || throw(SpaceMismatch("incompatible space types: $(spacetype(A)) ≠ $(spacetype(B))")) - - I = TK.sectortype(A) - Tnew = TKS.sectorscalartype(I) <: Real ? TC : complex(TC) + + I = sectortype(A) + Tnew = sectorscalartype(I) <: Real ? TC : complex(TC) M = promote_storagetype(Tnew, eltype(A), typeof(B)) return if issparse(A) && issparse(B) sparseblocktensormaptype(spacetype(A), N₁, N₂, M) From 059620eaf75c738587d39fde9d7ca56d0c3583c9 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Fri, 18 Jul 2025 07:53:36 +0200 Subject: [PATCH 7/8] bump version 0.1.10 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 3952a03..64be300 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "BlockTensorKit" uuid = "5f87ffc2-9cf1-4a46-8172-465d160bd8cd" authors = ["Lukas Devos and contributors"] -version = "0.1.9" +version = "0.1.10" [deps] BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" From c500f5786e2a6e47e127aa276f5c38fd138156d8 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Fri, 18 Jul 2025 14:13:17 +0200 Subject: [PATCH 8/8] import `sectorscalartype` --- src/BlockTensorKit.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BlockTensorKit.jl b/src/BlockTensorKit.jl index 15c3846..bdc4042 100644 --- a/src/BlockTensorKit.jl +++ b/src/BlockTensorKit.jl @@ -22,7 +22,8 @@ using TensorKit: SectorDict, AdjointTensorMap, adjointtensorindices, - compose + compose, + sectorscalartype using VectorInterface using TensorOperations using TensorOperations: