@@ -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,10 @@ 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 ) = SumSpace (map (dual, S. spaces); dual = ! isdual (S) )
7383Base. conj (S:: SumSpace ) = dual (S)
74- TensorKit. flip (S:: SumSpace ) = SumSpace (map (flip, S. spaces))
84+ TensorKit. flip (S:: SumSpace ) = SumSpace (map (flip, S. spaces); dual = isdual (S) )
7585
7686function TensorKit. hassector (S:: SumSpace , s:: Sector )
7787 return mapreduce (v -> hassector (v, s), | , S. spaces; init = false )
0 commit comments