SU2 Singlets
Utilities to construct, group, and inspect SU(2)-singlet spin combinations and their canonical basis vectors.
SU(2) singlet construction utilities and helper data structures.
This module is the user-facing surface for building local SU(2)
gauge-invariant (singlet) states. The flow when a caller asks for the
singlets of a chain of spin irreps [j_1, j_2, ..., j_N] is:
get_SU2_singlets()converts the spin list to doubled integers and dispatches to the numba enumerator_su2_singlet_enum._enumerate_singlet_paths_doubled(), which returns every chain-of-couplings path that lands on a singlet (J_N = 0), as flat(m_paths, J_paths, cg_products)arrays.The output is sorted by the intermediate-J chain
(J_2, J_3, ..., J_{N-1}); rows sharing the same chain form one multiplet. Each multiplet is wrapped into anSU2_singletobject: sympy-typedJ_config/M_configsfor downstream compatibility,CG_valueskept as floats.SU2_singlet_canonical_vector()turns oneSU2_singletinto a normalized vector in the local Hilbert basis. The per-leg(j, m) → indexlookups built fromget_spin_Hilbert_spaces()are memoized by_cached_leg_lookup(), so repeated calls with the same leg layout (as in the outer loop ofSU2_gauge_invariant_states()) skip the layout reconstruction.
Matter sector
Each matter site carries one fermionic doublet (red + green) per flavor.
A single matter leg has four states |n_r, n_g⟩:
The vacuum and the pair share the same SU(2) labels, so we tag each
matter slot with its fermion occupation n ∈ {0, 1, 2}. The
SU2_singlet records this in its occupations field (one
entry per flavor); the per-leg lookup in _cached_leg_lookup()
uses (J, m, n) keys on matter legs (and plain (J, m) on gauge
and background legs).
For N_f > 1 flavors, each flavor contributes one independent matter
leg to the chain. Flavors transform under the same local SU(2), so the
singlet-formation step automatically explores chains that combine
different flavors into local color singlets — the enumerator is
flavor-blind.
The Clebsch-Gordan kernel lives in _clebsch_gordan and the path
enumerator in _su2_singlet_enum; both work in pure integer
arithmetic on doubled spins / doubled magnetic numbers.
- class edlgt.operators.SU2_singlets.SU2_singlet(J_config, M_configs, CG_values, pure_theory=True, occupations=None, background=0)[source]
Bases:
objectRepresentation of one SU(2)-singlet multiplet in coupled-spin form.
Initialize an SU(2)-singlet descriptor.
- Parameters:
J_config (
list) – Total-spin labels for the constituent degrees of freedom. Matter slots carry the physical total spin (S(0)for vacuum / pair,S(1)/2for half-occupied).M_configs (
list) – Allowed sets of magnetic quantum numbers producing the singlet.CG_values (
list) – Lists of intermediate Clebsch-Gordan coefficients associated with eachMconfiguration.pure_theory (
bool, optional) – IfFalse, matter degrees of freedom are included in the leading entries of the configuration.occupations (
tupleofint, optional) – Per-flavor fermion occupationn_f ∈ {0, 1, 2}(vacuum / half / pair). Required whenpure_theory=Falseand the length determines the number of matter flavors.background (
int, optional) – Background-charge sector information used for labeling.
- Raises:
TypeError – If inputs are not in the expected formats.
ValueError – If configuration lengths are inconsistent or
occupationsis missing / out of range for a matter theory.
- edlgt.operators.SU2_singlets.get_SU2_singlets(spin_list, pure_theory=True, occupations=None, background=0)[source]
Enumerate all SU(2) singlets compatible with a list of spin irreps.
- Parameters:
spin_list (
list) – Spin irreps to be coupled. Matter slots (if any) come first and must carry the physical spin associated with each flavor’s occupation (S(0)for vacuum / pair,S(1)/2for half).pure_theory (
bool, optional) – IfTrue,spin_listis treated as gauge-only andoccupationsmust be empty /None.occupations (
tupleofint, optional) – Per-flavor fermion occupationsn_f ∈ {0, 1, 2}. Required whenpure_theory=False.background (
int, optional) – Background-charge sector information.
- Returns:
List of
SU2_singletobjects, orNoneif no singlet exists.- Return type:
- edlgt.operators.SU2_singlets.SU2_singlet_canonical_vector(spin_list, singlet, background=False)[source]
Construct the canonical basis vector of a specific SU(2) singlet.
- Parameters:
spin_list (
list) – Maximum spin irreps for each (gauge) degree of freedom.singlet (
SU2_singlet) – Singlet descriptor returned byget_SU2_singlets().background (
boolorint, optional) – Background-charge flag/sector forwarded toget_spin_Hilbert_spaces().
- Returns:
Normalized canonical state vector for the requested singlet.
- Return type:
- edlgt.operators.SU2_singlets.get_spin_Hilbert_spaces(max_spin_irrep_list, pure_theory, background=0, n_flavors=None)[source]
Build local spin Hilbert spaces used in singlet construction.
- Parameters:
max_spin_irrep_list (
list) – Maximum spin irrep kept for each gauge degree of freedom.pure_theory (
bool) – IfFalse, prepend the matter Hilbert space(s) used by the SU(2) dressed-site construction.background (
int, optional) – If nonzero, prepend the background-charge Hilbert space.n_flavors (
int, optional) – Number of matter flavors. Each flavor contributes one independent matter leg (4 fermion-occupation states). Defaults to1whenpure_theory=Falseand0otherwise.
- Returns:
(j_list, m_list)with per-degree-of-freedom lists of spin irreps and magnetic quantum numbers. Matter legs carry the physicalJ ∈ {0, 1/2, 1/2, 0}andm ∈ {0, +1/2, -1/2, 0}; the vacuum and pair states are distinguished by an occupation tag carried separately onSU2_singlet.- Return type: