Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/TensorKitSectors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export otimes, deligneproduct, times
export FusionStyle, UniqueFusion, MultipleFusion, SimpleFusion, GenericFusion,
MultiplicityFreeFusion
export UnitStyle, SimpleUnit, GenericUnit
export FusionDataStyle, TrivialFusionData, NonTrivialFusionData
export BraidingStyle, NoBraiding, HasBraiding, SymmetricBraiding, Bosonic, Fermionic, Anyonic
export SectorSet, SectorValues, findindex
export unit, rightunit, leftunit, allunits, isunit
Expand Down
3 changes: 3 additions & 0 deletions src/anyons.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ unit(::Type{PlanarTrivial}) = PlanarTrivial()
dual(::PlanarTrivial) = PlanarTrivial()

FusionStyle(::Type{PlanarTrivial}) = UniqueFusion()
FusionDataStyle(::Type{PlanarTrivial}) = TrivialFusionData()
BraidingStyle(::Type{PlanarTrivial}) = NoBraiding()
Base.isreal(::Type{PlanarTrivial}) = true

Expand Down Expand Up @@ -82,6 +83,7 @@ const _goldenratio = Float64(MathConstants.golden)
dim(a::FibonacciAnyon) = isunit(a) ? one(_goldenratio) : _goldenratio

FusionStyle(::Type{FibonacciAnyon}) = SimpleFusion()
FusionDataStyle(::Type{FibonacciAnyon}) = NonTrivialFusionData()
BraidingStyle(::Type{FibonacciAnyon}) = Anyonic()
Base.isreal(::Type{FibonacciAnyon}) = false

Expand Down Expand Up @@ -198,6 +200,7 @@ dual(s::IsingAnyon) = s
dim(a::IsingAnyon) = a.s == :σ ? sqrt(2) : 1.0

FusionStyle(::Type{IsingAnyon}) = SimpleFusion()
FusionDataStyle(::Type{IsingAnyon}) = NonTrivialFusionData()
BraidingStyle(::Type{IsingAnyon}) = Anyonic()
Base.isreal(::Type{IsingAnyon}) = false

Expand Down
1 change: 1 addition & 0 deletions src/fermions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dual(f::FermionParity) = f
dim(f::FermionParity) = 1

FusionStyle(::Type{FermionParity}) = UniqueFusion()
FusionDataStyle(::Type{FermionParity}) = TrivialFusionData()
BraidingStyle(::Type{FermionParity}) = Fermionic()
Base.isreal(::Type{FermionParity}) = true

Expand Down
2 changes: 2 additions & 0 deletions src/groupelements.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ the cocycle will be assumed to be trivial, i.e. equal to `1`.
"""
abstract type AbstractGroupElement{G <: Group} <: Sector end
FusionStyle(::Type{<:AbstractGroupElement}) = UniqueFusion()
FusionDataStyle(::Type{<:AbstractGroupElement}) = NonTrivialFusionData()
BraidingStyle(::Type{<:AbstractGroupElement}) = NoBraiding()

cocycle(a::I, b::I, c::I) where {I <: AbstractGroupElement} = 1
Expand Down Expand Up @@ -149,6 +150,7 @@ Base.hash(c::ZNElement, h::UInt) = hash(c.n, h)
Base.isless(c1::ZNElement{N, p}, c2::ZNElement{N, p}) where {N, p} = isless(c1.n, c2.n)

# Experimental
FusionDataStyle(::Type{ZNElement{N, p}}) where {N, p} = p == 0 ? TrivialFusionData() : NonTrivialFusionData()
BraidingStyle(::Type{ZNElement{N, 0}}) where {N} = Bosonic()
Rsymbol(a::ZNElement{N, 0}, b::ZNElement{N, 0}, c::ZNElement{N, 0}) where {N} = ifelse(a * b == c, 1, zero(1))

Expand Down
1 change: 1 addition & 0 deletions src/irreps/a4irrep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct A4Irrep <: AbstractIrrep{A₄}
end

FusionStyle(::Type{A4Irrep}) = GenericFusion()
FusionDataStyle(::Type{A4Irrep}) = NonTrivialFusionData()
sectorscalartype(::Type{A4Irrep}) = Float64

unit(::Type{A4Irrep}) = A4Irrep(0)
Expand Down
1 change: 1 addition & 0 deletions src/irreps/cu1irrep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ end
dim(c::CU1Irrep) = ifelse(c.j == zero(HalfInt), 1, 2)

FusionStyle(::Type{CU1Irrep}) = SimpleFusion()
FusionDataStyle(::Type{CU1Irrep}) = NonTrivialFusionData()
sectorscalartype(::Type{CU1Irrep}) = Float64
Base.isreal(::Type{CU1Irrep}) = true

Expand Down
1 change: 1 addition & 0 deletions src/irreps/dnirrep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ function Base.getproperty(a::DNIrrep{N}, sym::Symbol) where {N}
end

FusionStyle(::Type{DNIrrep{N}}) where {N} = N < 3 ? UniqueFusion() : SimpleFusion()
FusionDataStyle(::Type{DNIrrep{N}}) where {N} = N < 3 ? TrivialFusionData() : NonTrivialFusionData()
sectorscalartype(::Type{DNIrrep{N}}) where {N} = Float64
Base.isreal(::Type{DNIrrep{N}}) where {N} = true

Expand Down
1 change: 1 addition & 0 deletions src/irreps/irreps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ end

const AbelianIrrep{G} = AbstractIrrep{G} where {G <: AbelianGroup}
FusionStyle(::Type{<:AbelianIrrep}) = UniqueFusion()
FusionDataStyle(::Type{<:AbelianIrrep}) = TrivialFusionData()
Base.isreal(::Type{<:AbelianIrrep}) = true

Nsymbol(a::I, b::I, c::I) where {I <: AbelianIrrep} = c == first(a ⊗ b)
Expand Down
1 change: 1 addition & 0 deletions src/irreps/su2irrep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ findindex(::SectorValues{SU2Irrep}, s::SU2Irrep) = twice(s.j) + 1
dim(s::SU2Irrep) = twice(s.j) + 1

FusionStyle(::Type{SU2Irrep}) = SimpleFusion()
FusionDataStyle(::Type{SU2Irrep}) = NonTrivialFusionData()
sectorscalartype(::Type{SU2Irrep}) = Float64
Base.isreal(::Type{SU2Irrep}) = true

Expand Down
1 change: 1 addition & 0 deletions src/multifusion.jl
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ function Base.convert(::Type{IsingAnyon}, a::IsingBimodule) # identify RepZ2 ⊕
end

FusionStyle(::Type{IsingBimodule}) = SimpleFusion() # no multiplicities
FusionDataStyle(::Type{IsingBimodule}) = NonTrivialFusionData()
BraidingStyle(::Type{IsingBimodule}) = NoBraiding() # because of module categories

function Nsymbol(a::IsingBimodule, b::IsingBimodule, c::IsingBimodule)
Expand Down
3 changes: 3 additions & 0 deletions src/product.jl
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,9 @@ end
function FusionStyle(::Type{<:ProductSector{T}}) where {T <: SectorTuple}
return mapreduce(FusionStyle, &, _sectors(T))
end
function FusionDataStyle(::Type{<:ProductSector{T}}) where {T <: SectorTuple}
return mapreduce(FusionDataStyle, &, _sectors(T))
end
function UnitStyle(::Type{<:ProductSector{T}}) where {T <: SectorTuple}
return mapreduce(UnitStyle, &, _sectors(T))
end
Expand Down
29 changes: 29 additions & 0 deletions src/sectors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,35 @@ Base.:&(::SimpleFusion, ::UniqueFusion) = SimpleFusion()
Base.:&(::GenericFusion, ::UniqueFusion) = GenericFusion()
Base.:&(::GenericFusion, ::SimpleFusion) = GenericFusion()

# trait to differentiate between trivial and non-trivial F-symbols
"""
abstract type FusionDataStyle
FusionDataStyle(::Sector)
FusionDataStyle(I::Type{<:Sector})

Trait to describe the fusion behavior of sectors of type `I`, which can be either
* `TrivialFusionData()`: All F-symbols are trivial (equal to `0` or `1`);
* `NonTrivialFusionData()`: Some F-symbols are non-trivial;


This is most important for sectors with `FusionStyle(I) == UniqueFusion()`, where
`NonTrivialFusionData()` requires a proper evaluation of the F-symbols when manipulating
fusion trees, while `TrivialFusionData()` allows to skip all F-symbol evaluations.
"""
abstract type FusionDataStyle end
FusionDataStyle(a::Sector) = FusionDataStyle(typeof(a))

struct TrivialFusionData <: FusionDataStyle end
struct NonTrivialFusionData <: FusionDataStyle end

# combine fusion data properties of tensor products of sectors
Base.:&(f::F, ::F) where {F <: FusionDataStyle} = f
Base.:&(f₁::FusionDataStyle, f₂::FusionDataStyle) = f₂ & f₁

Base.:&(::TrivialFusionData, ::TrivialFusionData) = TrivialFusionData()
Base.:&(::TrivialFusionData, ::NonTrivialFusionData) = NonTrivialFusionData()
Base.:&(::NonTrivialFusionData, ::NonTrivialFusionData) = NonTrivialFusionData()

# similar, but for multifusion categories
"""
abstract type UnitStyle
Expand Down
1 change: 1 addition & 0 deletions src/timereversed.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct TimeReversed{I <: Sector} <: Sector
end
end
FusionStyle(::Type{TimeReversed{I}}) where {I <: Sector} = FusionStyle(I)
FusionDataStyle(::Type{TimeReversed{I}}) where {I <: Sector} = FusionDataStyle(I)
BraidingStyle(::Type{TimeReversed{I}}) where {I <: Sector} = BraidingStyle(I)
function Nsymbol(
a::TimeReversed{I}, b::TimeReversed{I}, c::TimeReversed{I}
Expand Down
1 change: 1 addition & 0 deletions src/trivial.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Base.isless(::Trivial, ::Trivial) = false
⊗(::Trivial, ::Trivial) = (Trivial(),)
Nsymbol(::Trivial, ::Trivial, ::Trivial) = true
FusionStyle(::Type{Trivial}) = UniqueFusion()
FusionDataStyle(::Type{Trivial}) = TrivialFusionData()
Fsymbol(::Trivial, ::Trivial, ::Trivial, ::Trivial, ::Trivial, ::Trivial) = 1
fusiontensor(::Trivial, ::Trivial, ::Trivial) = fill(1, (1, 1, 1, 1))

Expand Down
1 change: 1 addition & 0 deletions test/multifusion.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Istr = TensorKitSectors.type_repr(I)
prodsec = I ⊠ Z2Irrep
@test UnitStyle(prodsec) isa GenericUnit
@test FusionStyle(prodsec) isa SimpleFusion
@test FusionDataStyle(prodsec) isa NonTrivialFusionData
@test_throws DomainError unit(prodsec)
@test length(allunits(prodsec)) == 2
end
Expand Down
3 changes: 2 additions & 1 deletion test/newsectors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ using HalfIntegers
using WignerSymbols
using TensorKitSectors

import TensorKitSectors: FusionStyle, BraidingStyle, Nsymbol, Fsymbol, Rsymbol, dim,
import TensorKitSectors: FusionStyle, BraidingStyle, FusionDataStyle, Nsymbol, Fsymbol, Rsymbol, dim,
fusiontensor, ⊗, unit, dual

struct NewSU2Irrep <: Sector
Expand All @@ -35,6 +35,7 @@ Base.IteratorSize(::Type{SectorValues{NewSU2Irrep}}) = Base.IsInfinite()
Base.iterate(::SectorValues{NewSU2Irrep}, i = 0) = (NewSU2Irrep(half(i)), i + 1)

FusionStyle(::Type{NewSU2Irrep}) = GenericFusion()
FusionDataStyle(::Type{NewSU2Irrep}) = NonTrivialFusionData()
BraidingStyle(::Type{NewSU2Irrep}) = Bosonic()
Base.isreal(::Type{NewSU2Irrep}) = true

Expand Down
3 changes: 3 additions & 0 deletions test/sectors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ using LinearAlgebra
@test eltype(F) <: @testinferred sectorscalartype(I)
end
end
if FusionStyle(I) != UniqueFusion()
@test FusionDataStyle(I) === NonTrivialFusionData()
end
@testinferred(s[1] ⊗ s[2])
@testinferred(⊗(s..., s...))
end
Expand Down
Loading