Skip to content

Store the fusion trees of both sides instead of every fusion tree pair - #600

Draft
leburgel wants to merge 13 commits into
lb/fusiontreeblock_constructionfrom
lb/fusion_tree_pairs
Draft

leburgel wants to merge 13 commits into
lb/fusiontreeblock_constructionfrom
lb/fusion_tree_pairs

Conversation

@leburgel

Copy link
Copy Markdown
Member

Closes #596. Stacked on #581.

  • fusiontrees(W) is a FusionTreePairs, an AbstractIndices that stores the splitting and fusion trees of every coupled sector instead of every pair. The position of a pair follows from those of its trees, and is its (integer) token.
  • subblockstructure(W) is a FusionTreePairDict sharing those tokens.
  • fusionblocks groups the trees of each side by their uncoupled sectors, combines the groups in the order in which they first occur (the order of Construct fusion tree blocks from the shorter side, and group the cached trees in fusionblocks #581), and fills every block once at its final size.
  • degeneracystructure loops over the trees of both sides.

The transformers are identical to those of #581, block order included, on all transformers of one CTMRG iteration (554 for fℤ₂ × U(1) × SU(3), 550 for fℤ₂ × U(1) × SU(2) × U(1)).

Building those transformers, on top of main + #580 + #581 + #592 (D = 7, shared machine at load 16–29, ranges over 3 interleaved rounds):

before after
fℤ₂ × U(1) × SU(2) × U(1), serial preparation 15.6–17.3 s 9.9–11.1 s
fℤ₂ × U(1) × SU(2) × U(1), 1 thread 27.0–29.5 s 20.5–22.9 s
fℤ₂ × U(1) × SU(2) × U(1), 8 threads 18.9–20.0 s 14.1–17.9 s
fℤ₂ × U(1) × SU(3), serial preparation 4.4–4.7 s 3.4–3.7 s
fℤ₂ × U(1) × SU(3), 1 thread 10.6–10.7 s 9.5–10.3 s
fℤ₂ × U(1) × SU(3), 8 threads 4.9–5.5 s 4.2–4.6 s

Keying the groups by the integer positions of the uncoupled sectors instead makes fusionblocks about 1 s faster for SU(2), but the totals are within the noise, so this keeps the simpler version.

🤖 Generated with Claude Code

leburgel and others added 13 commits October 14, 2026 12:59
For sectors with a simple unit, a superset of the coupled sectors suffices, as the fusion tree iterators yield nothing for the others: the unit if one side is empty, and otherwise the fusion product of the shorter side only, instead of the intersection of the fusion products of both sides. The trees and their order are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Instead of constructing a block for every combination of codomain and domain sectors, `fusionblocks` groups the cached `fusiontrees(W)` by their uncoupled sectors, in the same order as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`sort!(...; by = rank)` evaluated `rank`, and with it the `Dict` lookups of (product) sectors, at every comparison.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… only the longer side for trees

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…no legs on one side

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For several units, a coupled sector of a block must be compatible with the units at both ends of either side; otherwise the fusion tree iterator throws instead of being empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ccur

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`fusiontrees(W)` is a `FusionTreePairs`, an `AbstractIndices` holding the
splitting and fusion trees of every coupled sector; the position of a pair
follows from those of its trees, and is its token. `subblockstructure(W)`
shares these tokens. `fusionblocks` groups the trees of each side by their
uncoupled sectors, combines the groups in the order in which they first occur,
and fills every block once at its final size; `degeneracystructure` loops over
the trees of both sides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ePairs

The units of a product sector, the block sectors of a space without indices, come with a shape,
and showing a FusionTreePairs iterates it in reverse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lkdvos
lkdvos force-pushed the lb/fusiontreeblock_construction branch from 8e373fa to 3f74b72 Compare October 28, 2026 19:19

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant