Skip to content

Commit c37cf86

Browse files
authored
Default spacetype and sectortype implementations in type domain (#248)
* generic spacetype and sectortype * generalize doc * unify type handling
1 parent 0c73bd2 commit c37cf86

File tree

4 files changed

+22
-44
lines changed

4 files changed

+22
-44
lines changed

src/fusiontrees/fusiontrees.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ FusionStyle(::Type{<:FusionTree{I}}) where {I<:Sector} = FusionStyle(I)
9898
BraidingStyle(::Type{<:FusionTree{I}}) where {I<:Sector} = BraidingStyle(I)
9999
Base.length(::Type{<:FusionTree{<:Sector,N}}) where {N} = N
100100

101-
sectortype(f::FusionTree) = sectortype(typeof(f))
102101
FusionStyle(f::FusionTree) = FusionStyle(typeof(f))
103102
BraidingStyle(f::FusionTree) = BraidingStyle(typeof(f))
104103
Base.length(f::FusionTree) = length(typeof(f))

src/spaces/homspace.jl

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,7 @@ function Base.:(==)(W₁::HomSpace, W₂::HomSpace)
2727
return (W₁.codomain == W₂.codomain) && (W₁.domain == W₂.domain)
2828
end
2929

30-
spacetype(W::HomSpace) = spacetype(typeof(W))
31-
sectortype(W::HomSpace) = sectortype(typeof(W))
32-
field(W::HomSpace) = field(typeof(W))
33-
3430
spacetype(::Type{<:HomSpace{S}}) where {S} = S
35-
field(L::Type{<:HomSpace}) = field(spacetype(L))
36-
sectortype(L::Type{<:HomSpace}) = sectortype(spacetype(L))
3731

3832
numout(W::HomSpace) = length(codomain(W))
3933
numin(W::HomSpace) = length(domain(W))

src/spaces/vectorspaces.jl

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ represent objects in 𝕜-linear monoidal categories.
4242
abstract type VectorSpace end
4343

4444
"""
45-
field(V::VectorSpace) -> Field
45+
field(a) -> Type{𝔽<:Field}
46+
field(::Type{T}) -> Type{𝔽<:Field}
4647
47-
Return the field type over which a vector space is defined.
48+
Return the type of field over which object `a` (e.g. a vector space or a tensor) is defined.
49+
Also works in type domain.
4850
"""
49-
function field end
50-
field(V::VectorSpace) = field(typeof(V))
51+
field(x) = field(typeof(x))
52+
field(::Type{T}) where {T} = field(spacetype(T))
5153

5254
# Basic vector space methods
5355
#----------------------------
@@ -102,7 +104,6 @@ of a homogeneous tensor product of these spaces.
102104
abstract type ElementarySpace <: VectorSpace end
103105
const IndexSpace = ElementarySpace
104106

105-
field(V::ElementarySpace) = field(typeof(V))
106107
# field(::Type{<:ElementarySpace{𝕜}}) where {𝕜} = 𝕜
107108

108109
@doc """
@@ -241,11 +242,14 @@ dual(::EuclideanInnerProduct, V::VectorSpace) = conj(V)
241242

242243
"""
243244
sectortype(a) -> Type{<:Sector}
245+
sectortype(::Type) -> Type{<:Sector}
244246
245247
Return the type of sector over which object `a` (e.g. a representation space or a tensor) is
246248
defined. Also works in type domain.
247249
"""
248-
sectortype(V::VectorSpace) = sectortype(typeof(V))
250+
sectortype(x) = sectortype(typeof(x))
251+
sectortype(::Type{T}) where {T} = sectortype(spacetype(T))
252+
sectortype(::Type{S}) where {S<:Sector} = S
249253

250254
"""
251255
hassector(V::VectorSpace, a::Sector) -> Bool
@@ -274,13 +278,19 @@ abstract type CompositeSpace{S<:ElementarySpace} <: VectorSpace end
274278

275279
InnerProductStyle(::Type{<:CompositeSpace{S}}) where {S} = InnerProductStyle(S)
276280

277-
spacetype(S::Type{<:ElementarySpace}) = S
278-
spacetype(V::ElementarySpace) = typeof(V) # = spacetype(typeof(V))
279-
spacetype(::Type{<:CompositeSpace{S}}) where {S} = S
280-
spacetype(V::CompositeSpace) = spacetype(typeof(V)) # = spacetype(typeof(V))
281+
"""
282+
spacetype(a) -> Type{S<:IndexSpace}
283+
spacetype(::Type) -> Type{S<:IndexSpace}
281284
282-
field(P::Type{<:CompositeSpace}) = field(spacetype(P))
283-
sectortype(P::Type{<:CompositeSpace}) = sectortype(spacetype(P))
285+
Return the type of the elementary space `S` of object `a` (e.g. a tensor). Also works in
286+
type domain.
287+
"""
288+
spacetype(x) = spacetype(typeof(x))
289+
function spacetype(::Type{T}) where {T}
290+
throw(MethodError(spacetype, (T,)))
291+
end
292+
spacetype(::Type{E}) where {E<:ElementarySpace} = E
293+
spacetype(::Type{S}) where {E,S<:CompositeSpace{E}} = E
284294

285295
# make ElementarySpace instances behave similar to ProductSpace instances
286296
blocksectors(V::ElementarySpace) = collect(sectors(V))

src/tensors/abstracttensor.jl

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,34 +32,12 @@ Return the scalar or element type `T` of a tensor.
3232
"""
3333
Base.eltype(::Type{<:AbstractTensorMap{T}}) where {T} = T
3434

35-
"""
36-
spacetype(::AbstractTensorMap) -> Type{S<:IndexSpace}
37-
spacetype(::Type{<:AbstractTensorMap}) -> Type{S<:IndexSpace}
38-
39-
Return the type of the elementary space `S` of a tensor.
40-
"""
4135
spacetype(::Type{<:AbstractTensorMap{<:Any,S}}) where {S} = S
4236

43-
"""
44-
sectortype(::AbstractTensorMap) -> Type{I<:Sector}
45-
sectortype(::Type{<:AbstractTensorMap}) -> Type{I<:Sector}
46-
47-
Return the type of sector `I` of a tensor.
48-
"""
49-
sectortype(::Type{TT}) where {TT<:AbstractTensorMap} = sectortype(spacetype(TT))
50-
5137
function InnerProductStyle(::Type{TT}) where {TT<:AbstractTensorMap}
5238
return InnerProductStyle(spacetype(TT))
5339
end
5440

55-
"""
56-
field(::AbstractTensorMap) -> Type{𝔽<:Field}
57-
field(::Type{<:AbstractTensorMap}) -> Type{𝔽<:Field}
58-
59-
Return the type of field `𝔽` of a tensor.
60-
"""
61-
field(::Type{TT}) where {TT<:AbstractTensorMap} = field(spacetype(TT))
62-
6341
@doc """
6442
storagetype(t::AbstractTensorMap) -> Type{A<:AbstractVector}
6543
storagetype(T::Type{<:AbstractTensorMap}) -> Type{A<:AbstractVector}
@@ -190,10 +168,7 @@ end
190168

191169
# tensor characteristics: work on instances and pass to type
192170
#------------------------------------------------------------
193-
spacetype(t::AbstractTensorMap) = spacetype(typeof(t))
194-
sectortype(t::AbstractTensorMap) = sectortype(typeof(t))
195171
InnerProductStyle(t::AbstractTensorMap) = InnerProductStyle(typeof(t))
196-
field(t::AbstractTensorMap) = field(typeof(t))
197172
storagetype(t::AbstractTensorMap) = storagetype(typeof(t))
198173
blocktype(t::AbstractTensorMap) = blocktype(typeof(t))
199174
similarstoragetype(t::AbstractTensorMap, T=scalartype(t)) = similarstoragetype(typeof(t), T)

0 commit comments

Comments
 (0)