-
Notifications
You must be signed in to change notification settings - Fork 4
/
objects.jl
51 lines (43 loc) · 1.87 KB
/
objects.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
struct Object{F} <: Sector where {F<:FusionRing}
id::Int
function Object{F}(a::Int) where {F<:FusionRing}
0 < a <= rank(F) || throw(ArgumentError("Unknown $a ∈ 𝒪($F)."))
return new{F}(a)
end
end
function algebraic_structure(::Union{Type{Object{F}},Object{F}}) where {F}
return F
end
Base.isless(a::Object{F}, b::Object{F}) where {F} = isless(a.id, b.id)
Base.hash(a::Object{F}, h::UInt) where {F} = hash(a.id, h)
Base.convert(::Type{F}, d::Integer) where {F<:Object} = F(d)
Base.IteratorSize(::Type{SectorValues{<:Object}}) = HasLength()
Base.length(::SectorValues{<:Object{F}}) where {F} = rank(F)
function Base.iterate(::SectorValues{<:Object{F}}, i=1) where {F}
return i > rank(F) ? nothing : (Object{F}(i), i + 1)
end
function Base.getindex(S::SectorValues{<:Object{F}}, i) where {F}
return 0 < i <= rank(F) ? Object{F}(i) : throw(BoundsError(S, i))
end
TensorKit.findindex(::SectorValues{I}, c::I) where {I<:Object} = c.id
# some fallback styles - should probably be overwritten for specific categories
function TensorKit.FusionStyle(::Type{<:Object{F}}) where {F}
return multiplicity(F) == 1 ? SimpleFusion() : GenericFusion()
end
TensorKit.BraidingStyle(::Type{<:Object{<:BraidedCategory}}) = Anyonic()
TensorKit.BraidingStyle(::Type{<:Object{<:FusionRing}}) = NoBraiding()
function TensorKit.:⊗(a::I, b::I) where {I<:Object}
return Iterators.filter(c -> Nsymbol(a, b, c) > 0, values(I))
end
Base.one(::Type{<:Object{F}}) where {F} = Object{F}(1)
function Base.conj(a::Object{F}) where {F}
if selfduality(F) == 0
return a
else
return Object{F}(findfirst(x -> Nsymbol(a, x, one(a)) == 1,
collect(values(typeof(a)))))
end
end
# must be integer for fusiontensor
TensorKit.dim(a::Object{RepA4}) = a.id == 4 ? 3 : 1
TensorKit.BraidingStyle(::Type{Object{RepA4}}) = TensorKit.Bosonic()