Skip to content

Commit 271f544

Browse files
committed
remove fermions (broken work in progress)
1 parent 5ed7e56 commit 271f544

File tree

2 files changed

+67
-153
lines changed

2 files changed

+67
-153
lines changed

docs/src/man/sectors.md

Lines changed: 66 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,71 +5,77 @@ using TensorKit
55
```
66

77
Symmetries in a physical system often result in tensors which are invariant under the action
8-
of the symmetry group, where this group acts as a tensor product of group actions on every tensor
9-
index separately. The group action on a single index, or thus, on the corresponding vector space,
10-
can be decomposed into irreducible representations (irreps). Here, we restrict to unitary
11-
representations, such that the corresponding vector spaces also have a natural Euclidean inner
12-
product. In particular, the Euclidean inner product between two vectors is invariant under the
13-
group action, i.e. the scalar field corresponds to the trivial representation of the group.
14-
15-
The corresponding vector spaces will be canonically represented as ``V = ⨁_a ℂ^{n_a} ⊗ R_{a}``,
16-
where ``a`` labels the different irreps, ``n_a`` is the number of times irrep ``a`` appears and
17-
``R_a`` is the vector space associated with irrep ``a``. Irreps are also known as spin sectors
18-
(in the case of ``\mathsf{SU}_2``) or charge sectors (in the case of `\mathsf{U}_1`), and we
19-
henceforth refer to `a` as a sector. As is briefly discussed below, the approach we follow does
20-
in fact go beyond the case of irreps of groups, and sectors would more generally correspond to
21-
simple objects in a (ribbon) fusion category. Nonetheless, every step can be appreciated by using
22-
the representation theory of ``\mathsf{SU}_2`` or ``\mathsf{SU}_3`` as example. The vector space
23-
``V`` is completely specified by the values of `n_a`.
8+
of the symmetry group, where this group acts as a tensor product of group actions on every
9+
tensor index separately. The group action on a single index, or thus, on the corresponding
10+
vector space, can be decomposed into irreducible representations (irreps). Here, we
11+
restrict to unitary representations, such that the corresponding vector spaces also have a
12+
natural Euclidean inner product. In particular, the Euclidean inner product between two
13+
vectors is invariant under the group action, i.e. the scalar field corresponds to the
14+
trivial representation of the group.
15+
16+
The corresponding vector spaces will be canonically represented as
17+
``V = ⨁_a ℂ^{n_a} ⊗ R_{a}``, where ``a`` labels the different irreps, ``n_a`` is the number
18+
of times irrep ``a`` appears and ``R_a`` is the vector space associated with irrep ``a``.
19+
Irreps are also known as spin sectors (in the case of ``\mathsf{SU}_2``) or charge sectors
20+
(in the case of `\mathsf{U}_1`), and we henceforth refer to `a` as a sector. As is briefly
21+
discussed below, the approach we follow doesin fact go beyond the case of irreps of groups,
22+
and sectors would more generally correspond to simple objects in a (ribbon) fusion
23+
category. Nonetheless, every step can be appreciated by using the representation theory of
24+
``\mathsf{SU}_2`` or ``\mathsf{SU}_3`` as example. The vector space ``V`` is completely
25+
specified by the values of ``n_a``.
2426

2527
The gain in efficiency (both in memory occupation and computation time) obtained from using
2628
symmetric tensor maps is that, by Schur's lemma, they are block diagonal in the basis of
2729
coupled sectors. To exploit this block diagonal form, it is however essential that we know
2830
the basis transform from the individual (uncoupled) sectors appearing in the tensor product
29-
form of the domain and codomain, to the totally coupled sectors that label the different blocks.
30-
We refer to the latter as block sectors. The transformation from the uncoupled sectors in the
31-
domain (or codomain) of the tensor map to the block sector is encoded in a fusion tree (or splitting
32-
tree). Essentially, it is a sequential application of pairwise fusion as described by the group's
31+
form of the domain and codomain, to the totally coupled sectors that label the different
32+
blocks. We refer to the latter as block sectors. The transformation from the uncoupled
33+
sectors in the domain (or codomain) of the tensor map to the block sector is encoded in a
34+
fusion tree (or splitting tree). Essentially, it is a sequential application of pairwise
35+
fusion as described by the group's
3336
[Clebsch-Gordan (CG) coefficients](https://en.wikipedia.org/wiki/Clebsch–Gordan_coefficients).
34-
However, it turns out that we do not need the actual CG coefficients, but only how they transform
35-
under transformations such as interchanging the order of the incoming irreps or interchanging
36-
incoming and outgoing irreps. This information is known as the topological data of the group, i.e.
37-
mainly the F-symbols, which are also known as recoupling coefficients or [6j-symbols](https://en.wikipedia.org/wiki/6-j_symbol)
38-
(more accurately, it's actually [Racah's W-coefficients](https://en.wikipedia.org/wiki/Racah_W-coefficient))
37+
However, it turns out that we do not need the actual CG coefficients, but only how they
38+
transform under transformations such as interchanging the order of the incoming irreps or
39+
interchanging incoming and outgoing irreps. This information is known as the topological
40+
data of the group, i.e. mainly the F-symbols, which are also known as recoupling
41+
coefficients or [6j-symbols](https://en.wikipedia.org/wiki/6-j_symbol) (more accurately,
42+
it's actually [Racah's W-coefficients](https://en.wikipedia.org/wiki/Racah_W-coefficient))
3943
in the case of ``\mathsf{SU}_2``.
4044

4145
Below, we describe how to specify a certain type of sector what information about them
4246
needs to be implemented. Then, we describe how to build a space `V` composed of a direct sum
43-
of different sectors. In the last section, we explain the details of fusion trees, i.e. their
44-
construction and manipulation. But first, we provide a quick theoretical overview of the required
45-
data of the representation theory of a group.
47+
of different sectors. In the last section, we explain the details of fusion trees, i.e.
48+
their construction and manipulation. But first, we provide a quick theoretical overview of
49+
the required data of the representation theory of a group.
4650

4751
## Representation theory and unitary fusion categories
4852

4953
Let the different irreps or sectors be labeled as ``a``, ``b``, ``c``, … First and foremost,
50-
we need to specify the *fusion rules* ``a ⊗ b = ⨁ N_{a,b}^{c} c`` with `N_{a,b}^c` some non-negative
51-
integers. There should always exists a unique trivial sector ``u`` such that ``a ⊗ u = a = u ⊗ a``.
52-
Furthermore, there should exist a unique sector ``\overline{a}`` such that ``N_{a,\overline{a}}^{u} = 1``,
53-
whereas for all ``b ≂̸ \overline{a}``, ``N_{a,b}^{u} = 0``. For example, for the representations
54-
of ``\mathsf{SU}_2``, all irreps are self-dual (i.e. ``a = \overline{a}``) and the trivial
55-
sector corresponds to spin zero.
56-
57-
The meaning of the fusion rules is that the space of transformations ``R_a ⊗ R_b → R_c`` (or vice
58-
versa) has dimension ``N_{a,b}^c``. In particular, we assume the existence of a basis consisting of
59-
unitary tensor maps ``X_{a,b}^{c,μ} : R_c → R_a ⊗ R_b`` with `μ = 1, \ldots, N_{a,b}^c` such that
54+
we need to specify the *fusion rules* ``a ⊗ b = ⨁ N_{a,b}^{c} c`` with `N_{a,b}^c` some
55+
non-negative integers. There should always exists a unique trivial sector ``u`` such that
56+
``a ⊗ u = a = u ⊗ a``. Furthermore, there should exist a unique sector ``\overline{a}``
57+
such that ``N_{a,\overline{a}}^{u} = 1``, whereas for all ``b ≂̸ \overline{a}``,
58+
``N_{a,b}^{u} = 0``. For example, for the representations of ``\mathsf{SU}_2``, all irreps
59+
are self-dual (i.e. ``a = \overline{a}``) and the trivial sector corresponds to spin zero.
60+
61+
The meaning of the fusion rules is that the space of transformations ``R_a ⊗ R_b → R_c``
62+
(or vice versa) has dimension ``N_{a,b}^c``. In particular, we assume the existence of a
63+
basis consisting of unitary tensor maps ``X_{a,b}^{c,μ} : R_c → R_a ⊗ R_b`` with
64+
``μ = 1, \ldots, N_{a,b}^c`` such that
6065

6166
``(X_{a,b}^{c,μ})^† X_{a,b}^{c,μ} = \mathrm{id}_{R_c}``
6267

6368
and
6469

6570
``\sum_{c} \sum_{μ = 1}^{N_{a,b}^c} X_{a,b}^{c,μ} (X_{a,b}^{c,μ})^\dagger = \mathrm{id}_{R_a ⊗ R_b}``
6671

67-
The tensors ``X_{a,b}^{c,μ}`` are the splitting tensors, their hermitian conjugate are the fusion
68-
tensors. They are only determined up to a unitary basis transform within the space, i.e. acting
69-
on the multiplicity label ``μ``. For ``\mathsf{SU}_2``, where ``N_{a,b}^c`` is zero or one and the
70-
multiplicity labels are absent, the entries of ``X_{a,b}^{c}`` are precisely given by the CG
71-
coefficients. The point is that we do not need to know the tensors ``X_{a,b}^{c,μ}``, the topological
72-
data of (the representation category of) the group describes the following transformation:
72+
The tensors ``X_{a,b}^{c,μ}`` are the splitting tensors, their hermitian conjugate are the
73+
fusion tensors. They are only determined up to a unitary basis transform within the space,
74+
i.e. acting on the multiplicity label ``μ``. For ``\mathsf{SU}_2``, where ``N_{a,b}^c`` is
75+
zero or one and the multiplicity labels are absent, the entries of ``X_{a,b}^{c}`` are
76+
precisely given by the CG coefficients. The point is that we do not need to know the
77+
tensors ``X_{a,b}^{c,μ}``, the topological data of (the representation category of) the
78+
group describes the following transformation:
7379

7480
* F-move or recoupling: the transformation between ``(a ⊗ b) ⊗ c`` to ``a ⊗ (b ⊗ c)``:
7581

@@ -79,25 +85,27 @@ data of (the representation category of) the group describes the following trans
7985

8086
``σ_{R_a,R_b} ∘ X_{a,b}^{c,μ} = ∑_{ν} [R_{a,b}^c]^μ_ν X_{b,a}^{c,ν}
8187

82-
The dimensions of the spaces ``R_a`` on which representation ``a`` acts are denoted as ``d_a``
83-
and referred to as quantum dimensions. In particular ``d_u = 1`` and ``d_a = d_{\overline{a}}``.
84-
This information is also encoded in the F-symbol as ``d_a = | [F^{a \overline{a} a}_a]^u_u |^{-1}``.
85-
Note that there are no multiplicity labels in that particular F-symbol as `N_{a,\overline{a}}^u = 1`.
88+
The dimensions of the spaces ``R_a`` on which representation ``a`` acts are denoted as
89+
``d_a`` and referred to as quantum dimensions. In particular ``d_u = 1`` and
90+
``d_a = d_{\overline{a}}``. This information is also encoded in the F-symbol as
91+
``d_a = | [F^{a \overline{a} a}_a]^u_u |^{-1}``. Note that there are no multiplicity labels
92+
in that particular F-symbol as `N_{a,\overline{a}}^u = 1`.
8693

87-
If, for every ``a`` and ``b``, there is a unique ``c`` such that ``a ⊗ b = c``
88-
(i.e. ``N_{a,b}^{c} = 1`` and ``N_{a,b}^{c′} = 0`` for all other ``c′``), the category is abelian.
89-
Indeed, the representations of a group have this property if and only if the group multiplication
90-
law is commutative. In that case, all spaces ``R_{a}`` associated with the representation are
91-
one-dimensional and thus trivial. In all other cases, the category is nonabelian. We find it
92-
useful to further finegrain between categories which have all ``N_{a,b}^c`` equal to zero or
93-
one (such that no multiplicity labels are needed), e.g. the representations of ``\mathsf{SU}_2``,
94-
and those where some ``N_{a,b}^c`` are larger than one, e.g. the representations of ``\mathsf{SU}_3``.
94+
If, for every ``a`` and ``b``, there is a unique ``c`` such that ``a ⊗ b = c`` (i.e.
95+
``N_{a,b}^{c} = 1`` and ``N_{a,b}^{c′} = 0`` for all other ``c′``), the category is abelian.
96+
Indeed, the representations of a group have this property if and only if the group
97+
multiplication law is commutative. In that case, all spaces ``R_{a}`` associated with the
98+
representation are one-dimensional and thus trivial. In all other cases, the category is
99+
nonabelian. We find it useful to further finegrain between categories which have all
100+
``N_{a,b}^c`` equal to zero or one (such that no multiplicity labels are needed), e.g. the
101+
representations of ``\mathsf{SU}_2``, and those where some ``N_{a,b}^c`` are larger than
102+
one, e.g. the representations of ``\mathsf{SU}_3``.
95103

96104

97105

98106

99107

100-
Using ``R_u ≂ ℂ``, ``λ_{R_} ``η_{R_{\overline{a}}}``
108+
Using ``R_u ≂ ℂ``, ``λ_{R_}`` ``η_{R_{\overline{a}}}``
101109

102110

103111

@@ -106,9 +114,7 @@ Using ``R_u ≂ ℂ``, ``λ_{R_} ``η_{R_{\overline{a}}}``
106114

107115

108116
If, for every ``a`` and ``b``, there is a unique ``c`` such that ``a ⊗ b = c``
109-
(i.e. ``N_{a,b}^{c} = 1`` and ``N_{a,b}^{c′} = 0`` for all other ``c′``), the category is Abelian.
110-
Indeed, the representations of a group have this property if and only if the group multiplication
111-
law is commutative. In that case, all spaces ``R_{a}`` associated with the representation are
117+
(i.e. ``N_{a,b}^{c} = 1`` and ``N_{a,b}^{c′} = 0`` for all other ``c′``), the category is Abelian. Indeed, the representations of a group have this property if and only if the group multiplication law is commutative. In that case, all spaces ``R_{a}`` associated with the representation are
112118
one-dimensional and thus trivial.
113119

114120

src/sectors/fermions.jl

Lines changed: 1 addition & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1 @@
1-
# Sectors giving rise to super vector spaces, which have at least a Z2 grading
2-
#==============================================================================#
3-
abstract type AbstractFermion end
4-
5-
6-
7-
struct Fermion{G<:Sector,F} <: Sector end
8-
sector::G
9-
parity::F
10-
end
11-
12-
z2fermionparity(c::ℤ₂) = isodd(c.n)
13-
u1fermionparity(c::U₁) = isodd(c.charge)
14-
const FermionParity = Fermion{ℤ₂,typeof(z2fermionparity)}
15-
16-
17-
Base.@pure BraidingStyle(::Type{<:Fermion}) = Fermionic()
18-
19-
# FermionParity: only total fermion parity is conserved
20-
struct FermionParity <: Fermion
21-
parity::Bool
22-
end
23-
FermionParity(p::Int) = FermionParity(isodd(p))
24-
Base.one(::Type{FermionParity}) = FermionParity(false)
25-
Base.conj(p::FermionParity) = p
26-
(p1::FermionParity, p2::FermionParity) = (FermionParity(p1.parity != p2.parity),)
27-
28-
Base.@pure FusionStyle(::Type{FermionParity}) = Abelian()
29-
30-
const fℤ₂ = FermionParity
31-
32-
Base.show(io::IO, ::Type{FermionParity}) = print(io, "fℤ₂")
33-
Base.show(io::IO, p::FermionParity) = get(io, :compact, false) ? print(io, Int(p.parity)) : print(io, "fℤ₂(", Int(p.parity), ")")
34-
35-
# FermionNumber: total number of fermions is conserved -> U1 symmetry
36-
struct FermionNumber <: Fermion
37-
num::Int
38-
end
39-
Base.one(::Type{FermionNumber}) = FermionNumber(0)
40-
Base.conj(n::FermionNumber) = FermionNumber(n.num)
41-
(n1::FermionNumber, n2::FermionNumber) = (FermionNumber(n1.num+n2.num),)
42-
43-
Base.@pure FusionStyle(::Type{FermionNumber}) = Abelian()
44-
45-
const fU₁ = FermionNumber
46-
47-
Base.show(io::IO, ::Type{FermionNumber}) = print(io, "fU₁")
48-
Base.show(io::IO, n::FermionNumber) = get(io, :compact, false) ? print(io, n.num) : print(io, "fU₁(", n.num, ")")
49-
50-
const AbelianFermion = Union{FermionParity,FermionNumber}
51-
Nsymbol(a::G, b::G, c::G) where {G<:AbelianFermion} = c == first(a b)
52-
Fsymbol(a::G, b::G, c::G, d::G, e::G, f::G) where {G<:AbelianFermion} =
53-
Int(Nsymbol(a,b,e)*Nsymbol(e,c,d)*Nsymbol(b,c,f)*Nsymbol(a,f,d))
54-
Rsymbol(a::G, b::G, c::G) where {G<:AbelianFermion} = fermionparity(a) && fermionparity(b) ? -Int(Nsymbol(a, b, c)) : Int(Nsymbol(a, b, c))
55-
56-
"""
57-
function fermionparity(s::Fermion) -> Bool
58-
59-
Returns the fermion parity of a sector `s` that is a subtype of `Fermion`, as a
60-
`Bool` being true if odd and false if even.
61-
"""
62-
fermionparity(p::FermionParity) = p.parity
63-
fermionparity(n::FermionNumber) = isodd(n.num)
64-
65-
struct FermionSpin <: Fermion
66-
dim::Int
67-
FermionSpin(j::Int) = j >= 0 ? new(2*j+1) : throw(SU2IrrepException)
68-
function FermionSpin(j::Rational{Int})
69-
if j.den == 2
70-
new(j.num+1)
71-
elseif j.den == 1
72-
new(2*j.num+1)
73-
else
74-
throw(SU2IrrepException)
75-
end
76-
end
77-
end
78-
_getj(s::FermionSpin) = (s.dim-1)//2
79-
Base.one(::Type{FermionSpin}) = FermionSpin(0)
80-
Base.conj(s::FermionSpin) = s
81-
(s1::FermionSpin, s2::FermionSpin) = SectorSet{FermionSpin}( abs(_getj(s1)-_getj(s2)):(_getj(s1)+_getj(s2)) )
82-
83-
Base.@pure FusionStyle(::Type{FermionSpin}) = SimpleNonAbelian()
84-
85-
Nsymbol(s1::FermionSpin, s2::FermionSpin, s::FermionSpin) = (abs(s1.dim-s2.dim)+1) <= s.dim <= (s1.dim+s2.dim-1) && isodd(s1.dim+s2.dim - s.dim)
86-
87-
# TODO: Fsymbol -> 6j-symbols of SU(2), compute, cache, ... -> Recycle those of SU2Irrep
88-
89-
const fSU₂ = FermionSpin
90-
Base.show(io::IO, ::Type{FermionSpin}) = print(io, "fSU₂")
91-
Base.show(io::IO, s::FermionSpin) = get(io, :compact, false) ? print(io, _getj(s)) : print(io, "fSU₂(", _getj(s), ")")
92-
93-
fermionparity(s::FermionSpin) = iseven(s.dim)
1+
# TODO

0 commit comments

Comments
 (0)