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" 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: 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) diff --git a/src/tensors/tensoroperations.jl b/src/tensors/tensoroperations.jl index b2155d0..bf81570 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 = sectortype(A) + Tnew = 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) @@ -33,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 = 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) else @@ -52,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 = 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) else @@ -71,7 +79,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 = 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) else