Skip to content

Commit dd3a832

Browse files
authored
Add dual flag to SumSpace (#32)
* Add dual flag to SumSpace * bump v0.2 * Fix dual flag for CartesianSpace
1 parent 523abc8 commit dd3a832

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "BlockTensorKit"
22
uuid = "5f87ffc2-9cf1-4a46-8172-465d160bd8cd"
33
authors = ["Lukas Devos <ldevos98@gmail.com> and contributors"]
4-
version = "0.1.14"
4+
version = "0.2.0"
55

66
[deps]
77
BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"

src/vectorspaces/sumspace.jl

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,20 @@ A (lazy) direct sum of elementary vector spaces of type `S`.
55
"""
66
struct 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
813
end
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
1424
const ProductSumSpace{S, N} = ProductSpace{SumSpace{S}, N}
@@ -68,10 +78,12 @@ TensorKit.dims(S::SumSpace) = map(dim, S.spaces)
6878
TensorKit.dim(S::SumSpace, n::Int) = dim(S.spaces[n])
6979
TensorKit.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))
7384
Base.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

7688
function TensorKit.hassector(S::SumSpace, s::Sector)
7789
return mapreduce(v -> hassector(v, s), |, S.spaces; init = false)

0 commit comments

Comments
 (0)