Skeletal fusion categories and symbol conventions
Let $\mathcal C$ be a split fusion category over a field $k$, and choose representatives $S_1,\ldots,S_r$ of its simple objects. Decompositions into these simples give a skeletal linear model: objects become multiplicity vectors, morphisms become blocks of matrices over $k$, and the tensor structure is described by fusion rules and associator matrices in chosen bases. TensorCategories.jl implements this model as SixJCategory. We use the definitions of semisimple and fusion categories in Etingof et al. (2015), Chapters 1, 2, and 4. The reconstruction in terms of multiplicity vectors, matrix blocks, and fusion rules is described in Mäurer (2026), §1.7.
The name SixJCategory refers to this general skeletal data model. It allows arbitrary fusion multiplicities, and its associator entries need not be literal Wigner $6j$-symbols.
Objects and morphisms
An object
\[\label{eq:skeletal-object-decomposition} X=\bigoplus_{i=1}^r S_i^{\oplus m_i}\]
is represented by the vector $(m_1,\ldots,m_r)$ of nonnegative integers. In the implementation this vector is X.components, and C[i] denotes the chosen representative $S_i$. The zero object has all multiplicities zero, and direct sums add multiplicity vectors.
To keep formulas and code legible, the manual also uses a simple label such as $a$ for its position in simples(C) when it occurs inside an array access. Thus C.ass[a,b,c,d] means the block indexed by the positions of the four simples $a,b,c,d$; Julia code must of course supply the corresponding integers.
A SixJCategory is mutable, and its objects retain that particular category as their parent. Two independently constructed categories can carry identical arrays without being the same parent; transport objects explicitly between them.
If
\[\label{eq:skeletal-target-decomposition} Y=\bigoplus_{i=1}^r S_i^{\oplus n_i},\]
then
\[\label{eq:skeletal-homspace} \operatorname{Hom}_{\mathcal C}(X,Y) \cong\bigoplus_{i=1}^r\operatorname{Mat}_{m_i\times n_i}(k).\]
A morphism $f:X\to Y$ is therefore stored as one $m_i\times n_i$ matrix for each simple $S_i$. These matrices act on row coordinates, so the block representing $g\circ f$ is the block for $f$ multiplied by the block for $g$.
This description uses $\operatorname{End}_{\mathcal C}(S_i)=k$. In a non-split semisimple category, the blocks have coefficients in the division algebras $\operatorname{End}_{\mathcal C}(S_i)$ instead. SixJCategory implements the split case; see Fusion and splitting for the non-split setting.
The matrix blocks describe maps between multiplicity spaces. Their existence does not require a monoidal fiber functor $\mathcal C\to\operatorname{Vec}_k$; see Fiber functors and semisimple coordinates.
Fusion rules
The fusion multiplicities are the structure constants of the Grothendieck ring in its simple-object basis:
\[\label{eq:skeletal-fusion-rule} S_i\otimes S_j\cong \bigoplus_l S_l^{\oplus N_{ij}^{\,l}}, \qquad N_{ij}^{\,l} =\dim_k\operatorname{Hom}_{\mathcal C}(S_i\otimes S_j,S_l).\]
The integer array C.tensor_product[i,j,l] stores $N_{ij}^{\,l}$. By bilinearity,
\[\label{eq:skeletal-tensor-multiplicity} [X\otimes Y:S_l]=\sum_{i,j}m_i n_jN_{ij}^{\,l}.\]
The simple unit has a distinguished index $u$ and satisfies
\[\label{eq:skeletal-unit-fusion} N_{ui}^{\,j}=N_{iu}^{\,j}=\delta_{ij}.\]
The program stores this index separately through set_one!.
For morphisms, tensor products use Kronecker products of matrix blocks, with one copy for each binary fusion channel. Coordinates in these copies require a choice of basis in every space $\operatorname{Hom}_{\mathcal C}(S_i\otimes S_j,S_l)$.
Associativity of the fusion rules requires
\[\label{eq:skeletal-associativity-dimensions} \sum_eN_{ab}^{\,e}N_{ec}^{\,d} = \sum_fN_{bc}^{\,f}N_{af}^{\,d}.\]
The equality of these dimensions is not yet an associator. To write its matrix, one must first choose and order bases in the binary fusion spaces.
Fusion bases and structural matrices
Scalar structural data arise only after bases have been chosen in the binary fusion spaces. We now fix those bases, use them to define the matrices of the associator, braiding, and pivotal structure, and only then name their scalar entries.
Binary fusion bases
The implementation uses the fixed order $(S_1,\ldots,S_r)$ returned by simples(C). For simple objects $a,b,e$, put
\[\label{eq:binary-fusion-space} V_{ab}^{e}=\operatorname{Hom}_{\mathcal C}(a\otimes b,e), \qquad N_{ab}^{e}=\dim_k V_{ab}^{e},\]
and choose an ordered projection basis
\[\label{eq:binary-projection-basis} p^{ab}_{e,\mu}:a\otimes b\longrightarrow e, \qquad 1\leq \mu\leq N_{ab}^{e}.\]
Let
\[\label{eq:binary-splitting-basis} s_{ab}^{e,\mu}:e\longrightarrow a\otimes b\]
be the composition-dual splitting basis. Thus
\[\label{eq:composition-dual-bases} p^{ab}_{e,\mu}\circ s_{ab}^{e,\nu} =\delta_{\mu,\nu}\operatorname{id}_e, \qquad \sum_{e,\mu}s_{ab}^{e,\mu}\circ p^{ab}_{e,\mu} =\operatorname{id}_{a\otimes b}.\]
These binary bases determine bases for the two projection spaces of a triple tensor product. For a fixed output simple $d$, define
\[\label{eq:left-triple-projection} L_{e,\mu,\nu} =p^{ec}_{d,\nu}\circ \bigl(p^{ab}_{e,\mu}\otimes\operatorname{id}_c\bigr) :(a\otimes b)\otimes c\longrightarrow d\]
and
\[\label{eq:right-triple-projection} R_{f,\rho,\sigma} =p^{af}_{d,\sigma}\circ \bigl(\operatorname{id}_a\otimes p^{bc}_{f,\rho}\bigr) :a\otimes(b\otimes c)\longrightarrow d.\]
The left paths are ordered lexicographically as $(e,\mu,\nu)$, with $\nu$ varying fastest. The right paths are ordered as $(f,\rho,\sigma)$, with $\sigma$ varying fastest. Intermediate simples follow the order of simples(C).
The associator matrix
Let
\[\label{eq:associator-map} \alpha_{a,b,c}:(a\otimes b)\otimes c \longrightarrow a\otimes(b\otimes c)\]
be the associator. Its block with output $d$ is the matrix $A=A^{abc}_d$ defined by
\[\label{eq:associator-projection-bases} R_{f,\rho,\sigma}\circ\alpha_{a,b,c} =\sum_{e,\mu,\nu} A^{abc}_d[(e,\mu,\nu),(f,\rho,\sigma)] L_{e,\mu,\nu}.\]
Thus rows are left paths and columns are right paths. In the documentation's index notation, the stored block is C.ass[a,b,c,d]. Its size is
\[\label{eq:associator-block-size} \left(\sum_e N_{ab}^{e}N_{ec}^{d}\right) \times \left(\sum_f N_{bc}^{f}N_{af}^{d}\right).\]
Associativity of the fusion rules makes the two numbers equal.
Let $L^{e,\mu,\nu}$ and $R^{f,\rho,\sigma}$ be the triple-product splittings induced by the composition-dual binary bases. Equation $\eqref{eq:associator-projection-bases}$ is equivalent to
\[\label{eq:associator-splitting-bases} \alpha_{a,b,c}\circ L^{e,\mu,\nu} =\sum_{f,\rho,\sigma} A^{abc}_d[(e,\mu,\nu),(f,\rho,\sigma)] R^{f,\rho,\sigma}.\]
The entries of $A^{abc}_d$ are the $F$-symbols in this manual. Explicitly,
\[\label{eq:F-symbol-definition} \left[F^{abc}_d\right]_{(e,\mu,\nu),(f,\rho,\sigma)} :=A^{abc}_d[(e,\mu,\nu),(f,\rho,\sigma)].\]
Equation $\eqref{eq:associator-splitting-bases}$ replaces a left-associated splitting tree by a linear combination of right-associated splitting trees; this change of basis is the $F$-move. The first multi-index in $\eqref{eq:F-symbol-definition}$ labels the input tree and the second labels the output tree. This is the convention used in Bonderson et al. (2008), Eq. (2.14) and Barkeshli et al. (2019), Eq. (10). Both references work with unitary anyon models and orthonormal splitting bases. The same coefficient convention makes sense for the composition-dual bases used here over an arbitrary splitting field.
The function F_symbols(C; convention=...) returns all admissible coefficients, including zeros, as a Julia dictionary. The two accepted dictionary conventions are:
convention | Keys |
|---|---|
:column_major_packing | [a,b,c,d,f,e] without multiplicities and [a,b,c,d,f,sigma,rho,e,mu,nu] in general |
:bonderson | [a,b,c,d,e,f] without multiplicities and [a,b,c,d,e,mu,nu,f,rho,sigma] in general |
With convention=:bonderson, the value is precisely the entry in $\eqref{eq:F-symbol-definition}$ named by the two fusion paths in the key. The default is convention=:column_major_packing, the layout used by TensorCategories data files. In that layout the suffix records the order used to pack the entries of $A$ in Julia column-major order: for fixed $a,b,c,d$, the keys are traversed in the nested order $(e,f,\nu,\mu,\rho,\sigma)$ and matched with successive entries of vec(A). The key suffix is therefore not a pair of direct fusion-path indices. The data exchange page gives the equivalent entry-by-entry reconstruction rule. Changing convention changes the dictionary keys and their interpretation, not the matrix $A$, the chosen bases, or the gauge. numeric_F_symbols uses the same keyword.
The package stores matrices for row coordinates: whenever the represented composition is defined,
matrix(g ∘ f) == matrix(f) * matrix(g)A reader who instead represents splitting-space vectors by columns therefore uses $A^{\mathsf T}$ as the matrix of the associator. This transpose is only a coordinate convention. It is neither an inverse nor a complex conjugate, and composition-dual bases need not be Hermitian-adjoint bases.
The braiding matrix
For simple objects $a,b,d$, let $B=B^{ab}_d$ be defined by
\[\label{eq:braiding-projection-bases} p^{ba}_{d,\nu}\circ c_{a,b} =\sum_{\mu} B^{ab}_d[\mu,\nu]p^{ab}_{d,\mu}.\]
In composition-dual splitting bases this is
\[\label{eq:braiding-splitting-bases} c_{a,b}\circ s_{ab}^{d,\mu} =\sum_{\nu}B^{ab}_d[\mu,\nu]s_{ba}^{d,\nu}.\]
The entries of $B^{ab}_d$ are the $R$-symbols:
\[\label{eq:R-symbol-definition} \left[R^{ab}_d\right]_{\mu,\nu}:=B^{ab}_d[\mu,\nu].\]
Equation $\eqref{eq:braiding-splitting-bases}$ is the $R$-move induced by the braiding. The row index $\mu$ labels the input basis of $\operatorname{Hom}(a\otimes b,d)$, and the column index $\nu$ labels the output basis of $\operatorname{Hom}(b\otimes a,d)$. This is the convention used in Bonderson et al. (2008), Eqs. (2.31)–(2.32); see also Barkeshli et al. (2019), Eqs. (27)–(28). With the same index notation, the structural matrix is C.braiding[a,b,d].
The function R_symbols(C; convention=...) returns all admissible coefficients, including zeros. The two accepted dictionary conventions are:
convention | Key with multiplicities | Value stored at that key |
|---|---|---|
:column_major_packing | [a,b,d,mu,nu] | $B^{ab}_d[\nu,\mu]$ |
:bonderson | [a,b,d,mu,nu] | $B^{ab}_d[\mu,\nu]$ |
Without multiplicities, both conventions use the key [a,b,d] and return the single entry of $B^{ab}_d$. Thus the two multiplicity indices are transposed in the default dictionary layout. This is a packing rule, not an inverse braiding or a change of gauge. numeric_R_symbols uses the same keyword.
Both functions return an ordinary Dict, which does not retain the selected convention. Code that stores or passes the dictionary separately from the category must therefore retain the convention as accompanying metadata.
The order of $a$ and $b$ matters. The inverse of $B^{ab}_d$ represents the inverse map from $b\otimes a$ to $a\otimes b$; it is not generally $B^{ba}_d$.
Pivotal coefficients
A pivotal structure is a monoidal natural isomorphism
\[\label{eq:pivotal-structure-map} j:\operatorname{id}_{\mathcal C}\Longrightarrow(-)^{**}\]
(Etingof et al., 2015; Definition 4.7.7). In the skeletal model the chosen duality has $S_i^{**}=S_i$. Since $S_i$ is split simple, the component of $j$ is a scalar:
\[\label{eq:P-symbol-definition} j_{S_i}=P_i\operatorname{id}_{S_i},\qquad P_i\in k^\times.\]
TensorCategories.jl calls the scalars $P_i$ the $P$-symbols. They are stored as C.pivotal[i], and P_symbols(C) returns the dictionary Dict([i] => P_i). This function name refers specifically to the components in $\eqref{eq:P-symbol-definition}$; the term “pivotal symbols” is also used elsewhere for different data attached to trivalent fusion spaces.
The coefficients $P_i$ are additional structure: they are not determined by the $F$- or $R$-symbols. They must make $j$ monoidal. If
\[\label{eq:double-dual-tensorator} \phi_{X,Y}:(X\otimes Y)^{**}\longrightarrow X^{**}\otimes Y^{**}\]
is the package's monoidal structure of the double-dual functor, the required identity is
\[\label{eq:pivotal-monoidality} j_X\otimes j_Y=\phi_{X,Y}\circ j_{X\otimes Y}.\]
The initializer six_j_category sets $P_i=1$ for every simple object, and set_pivotal! replaces these components. Validation is explicit: use is_pivotal(C; check=true) to check $\eqref{eq:pivotal-monoidality}$. Sphericality is the additional equality of the left and right pivotal traces and can be checked with is_spherical(C; check=true). Since a $P$-symbol dictionary has one scalar per simple object rather than matrix entries indexed by fusion paths, P_symbols has no convention keyword.
Unit normalization
SixJCategory uses strict unit constraints in its skeletal coordinates. The normalized convention requires every associator block with a unit input to be an identity matrix, and the public associator function treats such inputs as strict. The low-level setters accept check=false for prevalidated input. With check=true, set_one! and set_associator! check unit normalization. The full pentagon is checked separately by pentagon_axiom(C).
Pentagon and hexagon equations
In a multiplicity-free category, write $\mathcal F^{abc}_d[e,f]$ for the coefficient in $\eqref{eq:associator-splitting-bases}$, and write $\mathcal R^{ab}_d$ for the coefficient in $\eqref{eq:braiding-splitting-bases}$. With inadmissible fusion paths interpreted as zero, the pentagon equation is
\[\label{eq:pentagon-multiplicity-free} \mathcal F^{fcd}_e[g,l]\,\mathcal F^{abl}_e[f,k] =\sum_h \mathcal F^{abc}_g[f,h]\, \mathcal F^{ahd}_e[g,k]\, \mathcal F^{bcd}_k[h,l].\]
This is the multiplicity-free specialization of the standard indexed pentagon equation in Barkeshli et al. (2019), Eq. (12). The two hexagon equations, in the same convention, are
\[\label{eq:hexagon-positive-multiplicity-free} \mathcal R^{ca}_e\, \mathcal F^{acb}_d[e,g]\, \mathcal R^{cb}_g =\sum_f \mathcal F^{cab}_d[e,f]\, \mathcal R^{cf}_d\, \mathcal F^{abc}_d[f,g]\]
and
\[\label{eq:hexagon-negative-multiplicity-free} (\mathcal R^{ac}_e)^{-1}\, \mathcal F^{acb}_d[e,g]\, (\mathcal R^{bc}_g)^{-1} =\sum_f \mathcal F^{cab}_d[e,f]\, (\mathcal R^{fc}_d)^{-1}\, \mathcal F^{abc}_d[f,g].\]
These agree with Bonderson (2007), Eqs. (2.57)–(2.58), with the label order and $R$-symbol superscripts used here.
Equations $\eqref{eq:hexagon-positive-multiplicity-free}$ and $\eqref{eq:hexagon-negative-multiplicity-free}$ result by suppressing the multiplicity indices in those full equations. The compact formulas printed as Bonderson (2007), Eqs. (2.78)–(2.79) reverse the ordered superscripts of the $R$-symbols relative to the defining $R$-move in Eq. (2.54) and the full hexagon equations. The convention here follows Eq. (2.54), Eqs. (2.57)–(2.58), and the categorical hexagon.
Equations $\eqref{eq:pentagon-multiplicity-free}$–$\eqref{eq:hexagon-negative-multiplicity-free}$ display the multiplicity-free scalar form. With fusion multiplicities, the coherence conditions are the same pentagon and hexagon identities between structural morphisms, using the full matrices and all four binary-basis indices. The methods pentagon_axiom(C) and hexagon_axiom(C) evaluate those morphism equations without a multiplicity-free assumption.
Changes of fusion bases
A gauge transformation changes the basis of every binary fusion space $V_{ab}^{e}$. It consequently changes both triple-product bases. If
\[\label{eq:gauge-basis-change} L'_u=\sum_s L_sU_{s,u}, \qquad R'_v=\sum_t R_tV_{t,v},\]
then the associator block in the new bases is
\[\label{eq:associator-gauge-change} A'=U^{-1}AV.\]
The matrices $U$ and $V$ are assembled from the binary basis changes, block by block over the intermediate channels. The same binary basis choices determine the transformation of $B$. Consequently, raw $F$- and $R$-symbol entries are not gauge invariants. The corresponding entrywise formulas for changes of binary splitting bases are Bonderson (2007), Eqs. (2.75)–(2.76).
Relation to other published conventions
The definitions in $\eqref{eq:F-symbol-definition}$ and $\eqref{eq:R-symbol-definition}$ are the published anyon conventions cited above. Other sources may instead use projection trees, reverse the associator, or place the output coordinate first. Those choices change the displayed matrix without changing the underlying structural morphism.
The fusion spaces in Osborne et al. (2019), §2, p. 2, and §4, pp. 3–4 are $\operatorname{Hom}(d,a\otimes b)$. Its associator map is written in column coordinates with the output channel as the first matrix index. With composition-dual bases and matching labels, that matrix is $A^{\mathsf T}$. This explains the transpose between the package's structural matrices and the convention used for the $H_3$ formulas in that reference.
In Mäurer (2026), Eqs. (1.58)–(1.59), (1.65), and Algorithm 6, the $F$- and $R$-matrices are defined on projection trees by
\[\label{eq:thesis-F-projection-matrix} L_u\circ\alpha^{-1}=\sum_vM^{F}_{u,v}R_v.\]
\[\label{eq:thesis-R-projection-matrix} p^{ab}_{d,\mu}\circ c_{a,b}^{-1} =\sum_\nu M^{R}_{\mu,\nu}p^{ba}_{d,\nu}.\]
There is also an index-order translation in the multiplicity case. The thesis prints the left projection tree with multi-index $(m,\beta,\alpha)$, whereas the corresponding path in this manual is ordered as $(e,\mu,\nu)=(m,\alpha,\beta)$. The thesis's right multi-index $(n,\gamma,\delta)$ has the same order as $(f,\rho,\sigma)$. After applying this relabeling, so that both matrices are indexed by the same ordered projection trees, the projection-inverse matrices are related to the structural matrices in $\eqref{eq:associator-projection-bases}$ and $\eqref{eq:braiding-projection-bases}$ by
\[\label{eq:projection-inverse-conversion} M^{F}=(A^{-1})^{\mathsf T}, \qquad M^{R}=(B^{-1})^{\mathsf T}.\]
Thus, in the package's row-coordinate realization, the associator block corresponding to the thesis matrix $M^F$ is $A=(M^F)^{-\mathsf T}$, and similarly $B=(M^R)^{-\mathsf T}$ for the braiding.
The $F$-symbol convention in Ardonne and Slingerland (2010), Eq. (2) has the same projection direction as $M^F$. The dictionary conventions described above change the association of keys with entries of $A$ and $B$; they do not apply the inverse-transpose operation in $\eqref{eq:projection-inverse-conversion}$.
These comparisons concern mathematical matrix conventions. The dictionary packing used by the database is a separate software format, described on the data exchange page.
Constructing and checking skeletal data
Conversely, arrays of plausible dimensions do not yet define a fusion category. The fusion multiplicities must give an associative unital fusion ring with duals. Every associator block must be an invertible matrix of the prescribed size, the unit blocks must have the normalization fixed above, and all pentagon equations must hold. Braiding requires invertible blocks of the prescribed sizes satisfying both hexagon equations. Pivotal and spherical structures require their own coherence conditions.
The call six_j_category(K,N,names) creates a mutable container with fusion array $N$, identity associator blocks of the required sizes, and all-one pivotal components. The names argument may be omitted, in which case the labels are X1, X2, and so on. The shorter call six_j_category(K,names) sets only the coefficient ring, rank, labels, and all-one pivotal components; a subsequent set_tensor_product! call installs the fusion array and initializes the identity associator blocks. Neither form sets the tensor unit or certifies any coherence axiom. After entering data, use pentagon_axiom(C), hexagon_axiom(C), and the relevant checked structural predicates.
These initializer methods accept a Julia Ring, but the split fusion-category interpretation on this page and algorithms that use dimensions of Hom spaces require $K$ to be a field. The initializer does not check that $N$ is a nonnegative, associative, unital fusion table or that the number of supplied names matches its rank.
The worked examples now apply these definitions to explicit categories. The data exchange section specifies the exact key packing and serialization metadata.