From dd02e30a7dc8f0e7d27b74cd66813e304fe807b7 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Fri, 22 Aug 2025 16:49:06 +0200 Subject: [PATCH 1/3] Add dual flag to SumSpace --- src/vectorspaces/sumspace.jl | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/vectorspaces/sumspace.jl b/src/vectorspaces/sumspace.jl index 21bf105..0c02db9 100644 --- a/src/vectorspaces/sumspace.jl +++ b/src/vectorspaces/sumspace.jl @@ -5,10 +5,20 @@ A (lazy) direct sum of elementary vector spaces of type `S`. """ struct SumSpace{S <: ElementarySpace} <: ElementarySpace spaces::Vector{S} + dual::Bool + function SumSpace{S}(spaces::Vector{S}, dual::Bool) where {S} + allequal(==(dual) ∘ isdual, spaces) || throw(ArgumentError("Invalid mix of dual flags")) + return new{S}(spaces, dual) + end end -SumSpace(V::S, spaces::S...) where {S <: ElementarySpace} = SumSpace(collect((V, spaces...))) -SumSpace{S}() where {S} = SumSpace(S[]) +function SumSpace(V::S, spaces::S...; dual::Bool = isdual(V)) where {S <: ElementarySpace} + return SumSpace(collect((V, spaces...)); dual) +end +function SumSpace(spaces::Vector{S}; dual::Bool = isempty(spaces) ? false : isdual(first(spaces))) where {S} + return SumSpace{S}(spaces, dual) +end +SumSpace{S}(; dual::Bool = false) where {S} = SumSpace{S}(S[], dual) # Convenience aliases const ProductSumSpace{S, N} = ProductSpace{SumSpace{S}, N} @@ -68,10 +78,10 @@ TensorKit.dims(S::SumSpace) = map(dim, S.spaces) TensorKit.dim(S::SumSpace, n::Int) = dim(S.spaces[n]) TensorKit.dim(S::SumSpace) = sum(dims(S)) -TensorKit.isdual(S::SumSpace) = isdual(first(S.spaces)) -TensorKit.dual(S::SumSpace) = SumSpace(map(dual, S.spaces)) +TensorKit.isdual(S::SumSpace) = S.dual +TensorKit.dual(S::SumSpace) = SumSpace(map(dual, S.spaces); dual = !isdual(S)) Base.conj(S::SumSpace) = dual(S) -TensorKit.flip(S::SumSpace) = SumSpace(map(flip, S.spaces)) +TensorKit.flip(S::SumSpace) = SumSpace(map(flip, S.spaces); dual = isdual(S)) function TensorKit.hassector(S::SumSpace, s::Sector) return mapreduce(v -> hassector(v, s), |, S.spaces; init = false) From 000acc087792fd2ddcaed7fd67c2762dd529b2fb Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Fri, 22 Aug 2025 16:50:30 +0200 Subject: [PATCH 2/3] bump v0.2 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index d6b7535..05fcaeb 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.14" +version = "0.2.0" [deps] BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" From 39137a1cc108c9b756073d4616b4aa3a213152e6 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Thu, 28 Aug 2025 10:18:49 +0200 Subject: [PATCH 3/3] Fix dual flag for CartesianSpace --- src/vectorspaces/sumspace.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vectorspaces/sumspace.jl b/src/vectorspaces/sumspace.jl index 0c02db9..e805ede 100644 --- a/src/vectorspaces/sumspace.jl +++ b/src/vectorspaces/sumspace.jl @@ -79,8 +79,10 @@ TensorKit.dim(S::SumSpace, n::Int) = dim(S.spaces[n]) TensorKit.dim(S::SumSpace) = sum(dims(S)) TensorKit.isdual(S::SumSpace) = S.dual +TensorKit.dual(S::SumSpace{CartesianSpace}) = SumSpace(map(dual, S.spaces); dual = false) TensorKit.dual(S::SumSpace) = SumSpace(map(dual, S.spaces); dual = !isdual(S)) Base.conj(S::SumSpace) = dual(S) +TensorKit.flip(S::SumSpace{CartesianSpace}) = SumSpace(map(flip, S.spaces); dual = false) TensorKit.flip(S::SumSpace) = SumSpace(map(flip, S.spaces); dual = isdual(S)) function TensorKit.hassector(S::SumSpace, s::Sector)