Skip to content

Conversation

@Jutho
Copy link
Member

@Jutho Jutho commented Jan 6, 2026

This includes a major restructuring (breaking down long pages into separate pages) and a complete rewrite of the Sector documentation. This could become the manual page for TensorKitSectors.jl in time, but for now I would still include it here.

By lack of a good Markdown formatter, I switched to breaking lines at natural places (end of sentence, subsentences, …), like one might do with LaTeX documents. Maybe that strategy can lead to clean git diffs in future (potentially smaller) doc changes, but I am open to other suggestions.

This would very much benefit from some proofreading by e.g. @borisdevos , @leburgel , @lkdvos .

@codecov
Copy link

codecov bot commented Jan 6, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
see 23 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions
Copy link
Contributor

github-actions bot commented Jan 6, 2026

After the build completes, the updated documentation will be available here

object ``V``, referred to as `dim(V)` in TensorKit.jl.

For further information and a more detailed treatment of rigid and pivotal categories, we
refer to [^turaev] and [^selinger]. We conclude this section by studying the example of
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just an idea, but the way the citations are printed in the docs is precisely how you define it here, so e.g. [turaev] and [selinger]. Do we want to capitalise the names?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes that is perhaps a good idea.

Before continuing, let us use some examples to sketch the relevance of the concept of fusion
categories. As mentioned, the categories ``\mathbf{Vect}_𝕜`` and ``\mathbf{SVect}_𝕜`` have
``I ≂ 𝕜`` as simple object. For ``\mathbf{Vect}``, this is the only simple object, i.e. any
other vector space ``V`` over ``𝕜``, can be thought of as a direct sum over
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
other vector space ``V`` over ``𝕜``, can be thought of as a direct sum over
other vector space ``V`` over ``𝕜`` can be thought of as a direct sum over

manipulations thereof (in particular orthonormal factorizations such as the singular
value decomposition), we find it more convenient to work with the original normalization
convention.
!!! note In the context of fusion categories, one often resorts to the so-called *isotopic*
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This note block isn't working. The main text needs to start on a new line with four spaces (https://documenter.juliadocs.org/stable/showcase/#Admonitions)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually this might just be an artefact of the preview, since it's fine in the current stable version.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now I think the note blocks got destroyed by the automatic Markdown formatting that did happen in the final commit because of how my VSCode at the office desktop was set up.

I will have to disable that formatter and revert to manual formatting as I originally intended.


The following types are used to characterise different properties of the different types
of sectors:
The following types are used to characterise different properties of the different types of
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The following types are used to characterise different properties of the different types of
The following types are used to characterize different properties of the different types of

Since American English is preferred in the docs

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Somehow I cannot commit this suggestion directly so I'll have to change it manually.

Because we sometimes want to customize the string representation of our sector types,
we also have the following method:
Mapping between sectors and linear indices is only used for sectors `I` for which
`Base.IteratorSize(values(I)) == HasLength()`. In that case, we map an index `i` to a sector
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this true? I can call e.g. values(SU2Irrep)[3] and it gives SU2Irrep(1)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original reason for that method is that in the spaces, instead of a Dict{Sector,Int} for the degeneracies we are storing a NTuple{N, Int} and using direct indexing. This requires a finite and compile-time known number of different sectors.
I would have to double check, but I don't think we are really using that function for anything else right now.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But yes, it is true. There is a default getindex(::SectorValues{I}, i) that really just runs the values(I) iterator until it reaches the ith element. The same with findindex(::SectorValues{I}, c::I) that runs the iterator and counts how long it takes before the requested sector c is reached.

There are also specific methods for `HomSpace` instances, that are used in determining
the resuling `HomSpace` after applying certain tensor operations.
There are also specific methods for `HomSpace` instances, that are used in determining the
resuling `HomSpace` after applying certain tensor operations.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
resuling `HomSpace` after applying certain tensor operations.
resulting `HomSpace` after applying certain tensor operations.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This suggestion I can also not commit directly. Very strange.

```

For a tensor `t` with `FusionType(sectortype(t)) isa UniqueFusion`, fusion trees are
For a tensor `t` with `FusionType(sectortype(t)) isa UniqueFusion`, fusion trees are
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
For a tensor `t` with `FusionType(sectortype(t)) isa UniqueFusion`, fusion trees are
For a tensor `t` with `FusionStyle(sectortype(t)) isa UniqueFusion`, fusion trees are

Comment on lines +160 to +161
* *vector operations*: these do not change the `space` or index strucure of a tensor and can
be straightforwardly implemented on on the full data. All the methods described in
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* *vector operations*: these do not change the `space` or index strucure of a tensor and can
be straightforwardly implemented on on the full data. All the methods described in
* *vector operations*: these do not change the `space` or index structure of a tensor and can
be straightforwardly implemented on the full data. All the methods described in

dedicated implementation.
Tensor contractions correspond to a combination of some index manipulations followed by a
composition or multiplication of the tensors in their role as linear maps. Tensor
contractions are however of such important and frequency that they require a dedicated
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
contractions are however of such important and frequency that they require a dedicated
contractions are however of such importance and frequency that they require a dedicated

Comment on lines +177 to +178
between tensor spaces. The factorisations are applied as ordinary matrix factorisations to
the matrix blocks associated with the coupled charges.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
between tensor spaces. The factorisations are applied as ordinary matrix factorisations to
the matrix blocks associated with the coupled charges.
between tensor spaces. The factorizations are applied as ordinary matrix factorizations to
the matrix blocks associated with the coupled charges.

There's another "factorisation" in the line above

entire range of MatrixAlgebraKit functions can be called.
Factorizing a tensor according to a different partition of the indices is possible
by prepending the factorization step with an explicit call to [`permute`](@ref) or [`transpose`](@ref).
The factorisation methods are powered by
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The factorisation methods are powered by
The factorization methods are powered by

to the dual space of ``W``. This simple example introduces two new concepts.

1. Typical vector spaces can appear in the domain and codomain in different related forms,
e.g. as normal space or dual space. In fact, the most generic case is that every vector
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
e.g. as normal space or dual space. In fact, the most generic case is that every vector
e.g. as normal spaces or dual spaces. In fact, the most generic case is that every vector

which we can obtain by typing `` (i.e. `\otimes+TAB`), although for simplicity also the
usual multiplication sign `*` does the job. Note also that `A` is printed as an instance of
a parametric type `TensorMap`, which we will discuss below and contains `Tensor`.
Note that we entered the tensor size not as plain dimensions, by specifying the vector space
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Note that we entered the tensor size not as plain dimensions, by specifying the vector space
Note that we entered the tensor size not as plain dimensions, but by specifying the vector space

i.e. `ℝ^n` can also be created without Unicode using the longer syntax `CartesianSpace(n)`.
It is subtype of `ElementarySpace`, with a standard (Euclidean) inner product
over the real numbers. Furthermore,
It is subtype of `ElementarySpace`, with a standard (Euclidean) inner product over the real
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
It is subtype of `ElementarySpace`, with a standard (Euclidean) inner product over the real
It is a subtype of `ElementarySpace` with a standard (Euclidean) inner product over the real

numbers. Furthermore,

```@repl tutorial
W = ℝ^3 ⊗ ℝ^2 ⊗ ℝ^4
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line 60 has a typo: Given that they are behave as vectors, they also...

TensorKit.jl reexports the `@tensor` macro

```@repl tutorial
@tensor D[a,b,c,d] := A[a,b,e] * B[d,c,e]
Copy link
Member

@borisdevos borisdevos Jan 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line 105 and onwards uses the outdated tsvd function to illustrate a factorization, so the REPL tutorial is just showing errors. This continues to line 141 and 177-183.

meaning to a direct sum of tensor product spaces.

Time for some more examples:
```@repl tensors
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This REPL is failing because TensorKit isn't exported, and t and V1 aren't defined

in a new destination tensor, but just modifies the tensor `t` in place. Twisting several
indices simultaneously can be obtained by using the defining property

``θ_{V⊗W} = τ_{W,V} ∘ (θ_W ⊗ θ_V) ∘ τ_{V,W} = (θ_V ⊗ θ_W) ∘ τ_{W,V} ∘ τ_{V,W}.``
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
``θ_{V⊗W} = τ_{W,V} ∘ (θ_W ⊗ θ_V) ∘ τ_{V,W} = (θ_V ⊗ θ_W) ∘ τ_{W,V} ∘ τ_{V,W}.``
``θ_{V⊗W} = τ_{W,V} ∘ (θ_W ⊗ θ_V) ∘ τ_{V,W} = (θ_V ⊗ θ_W) ∘ τ_{W,V} ∘ τ_{V,W},``

have no effect. Let us start with some examples, in which we illustrate that, albeit
`permute` might act highly non-trivial on the fusion trees and on the corresponding data,
after conversion to a regular `Array` (when possible), it just acts like `permutedims`
```@repl tensors
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above

BraidingStyle(sectortype(t))
```
Note that `transpose` acts like one would expect on a `TensorMap{T,S,1,1}`. On a
`TensorMap{TS,N₁,N₂}`, because `transpose` replaces the codomain with the dual of the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`TensorMap{TS,N₁,N₂}`, because `transpose` replaces the codomain with the dual of the
`TensorMap{T,S,N₁,N₂}`, because `transpose` replaces the codomain with the dual of the

Note that `transpose` acts like one would expect on a `TensorMap{T,S,1,1}`. On a
`TensorMap{TS,N₁,N₂}`, because `transpose` replaces the codomain with the dual of the
domain, which has its tensor product operation reversed, this in the end amounts in a
complete reversal of all tensor indices when representing it as a plain mutli-dimensional
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
complete reversal of all tensor indices when representing it as a plain mutli-dimensional
complete reversal of all tensor indices when representing it as a plain multi-dimensional

ss_tensor_contraction).

To show the effect of `twist`, we now consider a type of sector `I` for which
`BraidingStyle{I} != Bosonic()`. In particular, we use `FibonacciAnyon`. We cannot convert
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`BraidingStyle{I} != Bosonic()`. In particular, we use `FibonacciAnyon`. We cannot convert
`BraidingStyle(I) != Bosonic()`. In particular, we use `FibonacciAnyon`. We cannot convert

the resulting `TensorMap` to an `Array`, so we have to rely on indirect tests to verify our
results.

```@repl tensors
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here

Other factorizations that are provided by TensorKit.jl are orthogonal or unitary in nature,
and thus always require a Euclidean inner product. However, they don't require equal domain
and codomain. Let us first discuss the *singular value decomposition*, for which we define
and export the methods [`tsvd`](@ref) and `tsvd!` (where as always, the latter destroys the
Copy link
Member

@borisdevos borisdevos Jan 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tsvd mentioned. In general this section is outdated and doesn't mention MAK

(only if ``a == \overline{a}``) are encoded in the F-symbol. They are obtained as
[`dim(a)`](@ref), [`frobenius_schur_phase(a)`](@ref) and
[`frobenius_schur_indicator(a)`](@ref). These functions have default definitions which
compute the requested data from `Fsymbol(a, conj(a), a, a, one(a), one(a))`, but they can be
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
compute the requested data from `Fsymbol(a, conj(a), a, a, one(a), one(a))`, but they can be
compute the requested data from `Fsymbol(a, dual(a), a, a, unit(a), unit(a))`, but they can be

I think it's fine to not make the discrepancy between unit and left/rightunit

overloaded in case the value can be computed more efficiently. The same holds for related
fusion manipulations such as the B-symbol, which is obtained as [`Bsymbol(a, b, c)`](@ref).
Finally, the twist associated with a sector `a` is obtained as [`twist(a)`](@ref), which
also has a default implementation in terms of the R-symbol. In addition, tThe function
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
also has a default implementation in terms of the R-symbol. In addition, tThe function
also has a default implementation in terms of the R-symbol. In addition, the function

Groups themselves are abstract types without any functionality (at least for now). We also
provide a number of convenient Unicode aliases. These group names are probably self-
explanatory, except for `CU₁` which is explained below.
Groups themselves are abstract types without any functionality (at least for now). However,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mention GroupElement sector here perhaps?

automatic conversion and pretty printing are provided, as illustrated by the following
example
you should not worry about the details of `HalfInt` and additional methods for automatic
conversion and pretty printing are provided, as illustrated by the following example
```@repl sectors
Irrep[U₁](0.5)
U1Irrep(0.4)
U1Irrep(1) ⊗ Irrep[U₁](1//2)
u = first(U1Irrep(1) ⊗ Irrep[U₁](1//2))
Nsymbol(u, conj(u), one(u))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Nsymbol(u, conj(u), one(u))
Nsymbol(u, dual(u), unit(u))

WignerSymbols.jl is able to generate the required data in arbitrary precision, we have
explicitly restricted the scalar type of `SU2Irrep` to `Float64` for efficiency.

The following example illustrates the usage of `SU2Irrep`
```@repl sectors
s = SU2Irrep(3//2)
conj(s)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
conj(s)
dual(s)

However, because we also allow for half integer representations, we refer to it as
`Irrep[CU₁]` or `CU1Irrep` in full.
Other non-abelian groups for which the irreps are implemented are the dihedral groups
``\mathsf{D}_N``, and the semidirect product ``\mathsf{U}₁ ⋉ ℤ_2``. In the context of
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
``\mathsf{D}_N``, and the semidirect product ``\mathsf{U}₁ ⋉ ℤ_2``. In the context of
``\mathsf{D}_N``, the alternating group of order 4 ``\mathsf{A}_4``, and the semidirect product ``\mathsf{U}₁ ⋉ ℤ_2``. In the context of

``\mathsf{D}_N``, and the semidirect product ``\mathsf{U}₁ ⋉ ℤ_2``. In the context of
quantum systems, the latter occurs in the case of systems with particle hole symmetry and
the non-trivial element of ``ℤ_2`` acts as charge conjugation ``C``. It has the effect of
interchaning ``\mathsf{U}_1`` irreps ``n`` and ``-n``, and turns them together in a joint
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
interchaning ``\mathsf{U}_1`` irreps ``n`` and ``-n``, and turns them together in a joint
interchanging ``\mathsf{U}_1`` irreps ``n`` and ``-n``, and turns them together in a joint

interchaning ``\mathsf{U}_1`` irreps ``n`` and ``-n``, and turns them together in a joint
2-dimensional index, except for the case ``n=0``. Irreps are therefore labeled by integers
``n ≧ 0``, however for ``n=0`` the ``ℤ₂`` symmetry can be realized trivially or
non-trivially, resulting in an even and odd one-dimensional irrep with ``\mathsf{U})_1``
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
non-trivially, resulting in an even and odd one-dimensional irrep with ``\mathsf{U})_1``
non-trivially, resulting in an even and odd one-dimensional irrep with ``\mathsf{U}_1``

Comment on lines +559 to +562
By default, none of the groups mentioned above have a reprenenstation theory for which
`FusionStyle(I) == GenericFusion()`, i.e. where fusion mulitplicities are required. An
example where this does appear is for the irreps of `SU{N}` for `N>2`. Such sectors are
supported through
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
By default, none of the groups mentioned above have a reprenenstation theory for which
`FusionStyle(I) == GenericFusion()`, i.e. where fusion mulitplicities are required. An
example where this does appear is for the irreps of `SU{N}` for `N>2`. Such sectors are
supported through
Of the abovementioned groups, only ``mathsf{A}_4`` has a representation theory for which
`FusionStyle(I) == GenericFusion()`, i.e. where fusion multiplicities are required. Another
example where this does appear is for the irreps of `SU{N}` for `N>2`. Such sectors are
supported through

sectors are obtained using the binary operator `⊠`, which can be entered as `\boxtimes`+TAB.
The resulting type is called [`ProductSector`](@ref), which simply wraps the individual
sectors, but knows how to combine their fusion and braiding data correctly. First some
examples
```@repl sectors
a = Z3Irrep(1) ⊠ Irrep[U₁](1)
typeof(a)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A couple of conjs and ones here below should be replaced by dual and unit, respectively.

constructed by giving a number of arguments, where the first argument is used to construct
the first sector, and so forth. Furthermore, for representations of groups, we also enabled
the notation `Irrep[ℤ₃ × CU₁]`, with `×` obtained using `\times+TAB`. However, this is
merely for convience, as `Irrep[ℤ₃] ⊠ Irrep[CU₁]` is not a subtype of the abstract type
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
merely for convience, as `Irrep[ℤ₃] ⊠ Irrep[CU₁]` is not a subtype of the abstract type
merely for convenience, as `Irrep[ℤ₃] ⊠ Irrep[CU₁]` is not a subtype of the abstract type

multi-fusion categories, where the sectors (simple objects) are organized in a matrix-like
structure and thus have an additional row and column index. Fusion between sectors is only
possible when the row and column indices match appropriately; otherwise the fusion product
is empty. In this structure, the different groups of "diagonal" sectors define separate
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better word than "group" that can be used in this and the following sentence?

@Jutho
Copy link
Member Author

Jutho commented Jan 7, 2026

Thanks for the heroic effort @borisdevos , I will try to process all these comments tomorrow.

@Jutho
Copy link
Member Author

Jutho commented Jan 7, 2026

Also, any general comments? What do you think of the new structure of the manual? Is it an improvement?

@borisdevos
Copy link
Member

It's a global improvement in my opinion. If I had to complain about some stylistic choice, there are certain paragraphs in the docs where a bunch of methods/properties are explained back-to-back, which can be bothersome to read through (although I don't know how often people really read paragraphs from start to finish and just ctrl+f words). In my opinion, one of the best-written parts is the fusion tree manipulations subsection, but maybe I'm just a big fan of lists.

Another small remark: some paragraphs in the category theory introduction are also tough to read because there's some inconsistency with the maths written within the paragraph; some of it is not in some latex equation environment. Not a huge gripe, since this part is optional to read.

But again, the pros outweigh these minor cons heavily, and the content remains rich and descriptive. I actually learnt/relearnt a lot going through the docs again 😄.

value of `isdual`) as [`V1 ⊕ V2`](@ref), where `` is obtained by typing `\oplus`+TAB.
[`zerospace(V)`](@ref) corresponds to the identity or zero element with respect to this
direct sum operation, i.e. it corresponds to a zero-dimensional space. Furthermore,
[`unitspace(V)`] (@ref) applied to an elementary space returns a one-dimensional space, that
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
[`unitspace(V)`] (@ref) applied to an elementary space returns a one-dimensional space, that
[`unitspace(V)`](@ref) applied to an elementary space returns a one-dimensional space, that

direct sum operation, i.e. it corresponds to a zero-dimensional space. Furthermore,
[`unitspace(V)`] (@ref) applied to an elementary space returns a one-dimensional space, that
is isomorphic to the scalar field underlying the space itself. Finally, we have also
introduced the non-standard convention `V1 ⊖ V2` (obtained by typing `\ominus`+TAB.) in
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
introduced the non-standard convention `V1 ⊖ V2` (obtained by typing `\ominus`+TAB.) in
introduced the non-standard convention [`V1 ⊖ V2`](@ref) (obtained by typing `\ominus`+TAB.) in

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think throughout this file the header level of the sections is 3 instead of 2, which makes them not appear in the page list in the sidebar.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think throughout this file the header level of the sections is 3 instead of 2, which makes them not appear in the page list in the sidebar.

@lkdvos
Copy link
Member

lkdvos commented Jan 8, 2026

I tried briefly skimming through the updates to just give some global comments, since it is a bit hard to interleave these/not duplicate the things @borisdevos has already marked (Thanks for the huge amount of work @borisdevos !!!)
I can then read a bit more in detail once these comments have been incorporated.

Considering the markdown formatting, I have also been advocating to indeed use a more "LaTeX" style for line breaks as well.
The lack of good markdown formatter is one good argument, but I think it is incredibly hard to figure out what the actual git diff is if entire paragraphs have to be changed/reflowed due to the introduction of a single longer word.
Additionally, github suggestions in text like this also does not work very well with linebreak limits, so in the long run I would simply use the rule that for text, every sentence is on its own line.
I'm okay with splitting up longer sentences on multiple different lines, but in general it tends to be language-wise better to then simply split up the sentence itself to begin with...
Ideally, we should just at some point decide to do this and have a single PR that implements it everywhere, so we can then spot the git diffs more easily.


I definitely like the division in more subpages, large pages make it quite hard to quickly jump to the wanted sections and to lose track of what is going on!

One suggestion I have is about the order of these pages in the manual section.
I think the main thing that feels slightly off to me is having Vector Spaces before the symmetries and sectors, and only then proceeding to Graded Spaces.
I can see the appeal of introducing a number of methods and concepts without the burden of the symmetries, and I like that idea.
Currently however, I feel like the Vector Spaces section isn't really a simplification of the concepts, and is still rather mathematically inclined both in language and concepts.
It seems also like some of the methods that are mentioned there are somewhat hard to illustrate, mostly because ComplexSpace does not have enough structure to show what is going on or why we need these methods to begin with.
I think that since most of our language is still quite mathematical in that section, it might turn out to be easier in the long run to simply bite through the sour apple (😀) and merge graded spaces and vector spaces together, after introducing sectors and symmetries, and then going to fusion trees, and finally tensors and tensor manipulations.

Jutho and others added 2 commits January 9, 2026 10:14
Co-authored-by: Boris De Vos <143942306+borisdevos@users.noreply.github.com>
Co-authored-by: Boris De Vos <143942306+borisdevos@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants