Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SymmetrySectors] Non-abelian fusion #1363

Merged
merged 210 commits into from
Oct 25, 2024
Merged

Conversation

ogauthe
Copy link
Contributor

@ogauthe ogauthe commented Mar 25, 2024

This is a work in progress for a full implementation of non-abelian fusion rules in Sectors. It also contains several patches on other components of Sectors. A core aspect is that the dependency order between GradedAxes and Sectors has been reversed: Sectors now depends on GradedAxes.

To do:

  • Continue to refactor and simplify SectorProduct fusion, which is implemented in sectors_fusion_rule. The code logic handled by recover_style/recover_sector_product_type for handling different data formats (Tuple vs. NamedTuple, abelian vs. non-abelian) is still fairly complicated and hard to follow, we should try to simplify that.
  • Change output format of label_fusion_rule to Vector{<:Pair{<:AbstractSector,Int}}.
  • Define abelian_label_fusion_rule that can be used for abelian groups as a simpler interface for defining fusion rules just in terms of the labels and without the need for specifying degeneracies/block lengths. label_fusion_rule by default can call abelian_label_fusion_rule and specify that there is one block of length 1.
  • Rename sectors(...) to product_sectors(...) for accessing the storage of a SectorProduct. Additionally, rename functions that act on SectorProduct storage from sectors_*(...) to product_sectors_*(...) (for example, rename sectors_isless(...) to product_sectors_isless(...)).
  • Change SectorProduct equality so that SectorProduct(SU2(1), U1(0)) == SectorProduct(SU2(1)) so that it returns true (i.e. we should assume trailing trivial sectors, like the fusion code does), along with changing any other related corner cases of equality and inequality of category products.
  • Change the name of the module from Sectors to SymmetrySectors.
  • Rename AbstractCategory to AbstractSector and CategoryProduct to SectorProduct (also categories to sectors throughout the code).
  • Introduce struct TrivialSector <: AbstractSector end, remove as many special code definitions for SectorProduct{Tuple{}} and SectorProduct{NamedTuple{()}} as possible.
  • implement fusion rules for SectorProduct.
  • implement SymmetryStyle trait with values AbelianGroup, NonAbelianGroup and NonGroupSymmetry (this has been simplified to just AbelianStyle and NotAbelianStyle).
  • Simplify tensor_product(a1::AbstractBlockedUnitRange, a2::AbstractBlockedUnitRange), ideally by removing or redesigning flatten_maybe_nested, which may require redesigning fuse_blocklengths to have more consistent outputs for abelian and non-abelian spaces.
  • Redesign label_fusion_rule to always output the same data format, i.e. a list of degeneracies and sectors, for both abelian and non-abelian symmetries.

To be decided:

  • type return for c1 ⊗ c2: either always a GradedUnitRange or a GradedUnitRange or a Category depending on SymmetryStyle
  • whether to keep SU2 and SU{2}.

Future PRs:

Decisions:

  • c1 ⊗ c2: return type depends on SymmetryStyle
  • work on replacing SU2 with SU{2} and try to have a half-integer interface specific to SU{2}

Long term: how to handle braiding for fermions and anyons.

rebase on latest GradedAxes
set GradedAxes as a Sector dependency
define fusion rules for simple categories
pass test for simple categories
@codecov-commenter

This comment was marked as outdated.

@emstoudenmire

This comment was marked as resolved.

@mtfishman
Copy link
Member

Alright, this looks good to go from my end and addresses the latest round of comments. @emstoudenmire, any final comments before I merge?

@emstoudenmire
Copy link
Collaborator

Good to go from me. Looks very clean and I think it will be a powerful system!

@mtfishman
Copy link
Member

Thanks for sticking with the long review process @ogauthe!

@mtfishman mtfishman merged commit f37d4a5 into ITensor:main Oct 25, 2024
15 checks passed
@ogauthe ogauthe deleted the non-abelian_fusion branch October 25, 2024 13:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NDTensors Requires changes to the NDTensors.jl library. SymmetrySectors
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants