@@ -5,10 +5,20 @@ A (lazy) direct sum of elementary vector spaces of type `S`.
55"""
66struct SumSpace{S <: ElementarySpace } <: ElementarySpace
77 spaces:: Vector{S}
8+ dual:: Bool
9+ function SumSpace{S}(spaces:: Vector{S} , dual:: Bool ) where {S}
10+ allequal(== (dual) ∘ isdual, spaces) || throw(ArgumentError(" Invalid mix of dual flags" ))
11+ return new{S}(spaces, dual)
12+ end
813end
914
10- SumSpace(V:: S , spaces:: S... ) where {S <: ElementarySpace } = SumSpace(collect((V, spaces... )))
11- SumSpace{S}() where {S} = SumSpace(S[])
15+ function SumSpace(V:: S , spaces:: S... ; dual:: Bool = isdual(V)) where {S <: ElementarySpace }
16+ return SumSpace(collect((V, spaces... )); dual)
17+ end
18+ function SumSpace(spaces:: Vector{S} ; dual:: Bool = isempty(spaces) ? false : isdual(first(spaces))) where {S}
19+ return SumSpace{S}(spaces, dual)
20+ end
21+ SumSpace{S}(; dual:: Bool = false ) where {S} = SumSpace{S}(S[], dual)
1222
1323# Convenience aliases
1424const ProductSumSpace{S, N} = ProductSpace{SumSpace{S}, N}
@@ -68,10 +78,12 @@ TensorKit.dims(S::SumSpace) = map(dim, S.spaces)
6878TensorKit. dim(S:: SumSpace , n:: Int ) = dim(S. spaces[n])
6979TensorKit. dim(S:: SumSpace ) = sum(dims(S))
7080
71- TensorKit. isdual(S:: SumSpace ) = isdual(first(S. spaces))
72- TensorKit. dual(S:: SumSpace ) = SumSpace(map(dual, S. spaces))
81+ TensorKit. isdual(S:: SumSpace ) = S. dual
82+ TensorKit. dual(S:: SumSpace{CartesianSpace} ) = SumSpace(map(dual, S. spaces); dual = false )
83+ TensorKit. dual(S:: SumSpace ) = SumSpace(map(dual, S. spaces); dual = ! isdual(S))
7384Base. conj(S:: SumSpace ) = dual(S)
74- TensorKit. flip(S:: SumSpace ) = SumSpace(map(flip, S. spaces))
85+ TensorKit. flip(S:: SumSpace{CartesianSpace} ) = SumSpace(map(flip, S. spaces); dual = false )
86+ TensorKit. flip(S:: SumSpace ) = SumSpace(map(flip, S. spaces); dual = isdual(S))
7587
7688function TensorKit. hassector(S:: SumSpace , s:: Sector )
7789 return mapreduce(v -> hassector(v, s), | , S. spaces; init = false )
0 commit comments