gutzwiller

Tools for Gutzwiller projecting MPS to a smaller on-site Hilbert space.

Gutzwiller projections

abrikosov

Projection from Abrikosov fermions to a spin-1/2 Hilbert space.

abrikosov_ph

Projection from particle-hole rotated Abrikosov fermions to a spin-1/2 Hilbert space.

Helper functions

parity_mask

Generates a mask selecting the physical parity blocks for a given fermionic leg.

number_mask

Generates a mask selecting the physical charge block for a fermionic leg.

Gutzwiller projections of Abrikosov fermions

temfpy.gutzwiller.abrikosov(mps, *, inplace=False, return_canonical=True, cutoff=1e-12, q_left=None, unit_cell_width=None)[source]

Projection from Abrikosov fermions to a spin-1/2 Hilbert space.

The input MPS must contain an even number of sites, sites \(2i\) and \(2i+1\) representing modes \(f_{i\uparrow}\) and \(f_{i\downarrow}\), respectively. These pairs are projected to a spin-1/2 Hilbert space using the following rules:

  • Single occupation of \(f_{i\uparrow}\) orbital → spin-up state

  • Single occupation of \(f_{i\downarrow}\) orbital → spin-down state

  • Zero and double occupation → unphysical states, dropped

Since the only conserved quantity in the input MPS is expected to be (the parity of) the particle number, no spin quantum numbers are kept in the output.

Parameters:
  • mps (MPS) –

    MPS representing the wave function to be projected.

    Must be of even length and every site must be an instance of FermionSite.

  • inplace (bool) – Whether to transform the original MPS in place.

  • return_canonical (bool) – Whether to transform the output MPS to right canonical form.

  • cutoff (float) – Cutoff for Schmidt values to keep in the canonical form.

  • q_left (None | int) –

    For infinite MPS only, determines which fermion number/parity sector of the leftmost virtual leg to keep.

    Has to be a charge sector contained within charges of the leftmost virtual leg of the iMPS unit cell.

  • unit_cell_width (int | None) –

    Physical length of the system represented by the MPS.

    If None (default), keep the existing unit_cell_width if it divides the new, halved, system size. Otherwise, replace with the new MPS length (i.e., treat it as a chain).

Return type:

None | MPS

Returns:

The Gutzwiller projected mps, if inplace is False.

Note

Currently,

  • no symmetry quantum numbers other than fermion number or parity can be handled.

  • only 'finite' and 'infinite' boundary conditions are supported.

temfpy.gutzwiller.abrikosov_ph(mps, *, inplace=False, return_canonical=True, cutoff=1e-12, offset=0, parity=0, unit_cell_width=None)[source]

Projection from particle-hole rotated Abrikosov fermions to a spin-1/2 Hilbert space.

The input MPS must contain an even number of sites, sites \(2i\) and \(2i+1\) representing modes \(f_{i\uparrow}\) and \(f_{i\downarrow}^\dagger\), respectively. These pairs are projected to a spin-1/2 Hilbert space using the following rules:

  • Zero occupation → spin-down state

  • Double occupation of → spin-up state

  • Single occupation → unphysical states, dropped

Depending on the conserved charge of the input MPS, the following spin quantum numbers are kept in the output:

  • 'N' (particle number) → even 'N' blocks → 'S_z' conserved

  • 'parity' → even 'parity' blocks → no conserved charge

For this conversion to work, the total parity of the input MPS has to be even.

Parameters:
  • mps (MPS) –

    MPS representing the wave function to be projected.

    Must be of even length and every site must be an instance of FermionSite.

  • inplace (bool) – Whether to transform the original MPS in place.

  • return_canonical (bool) – Whether to transform the output MPS to right canonical form.

  • cutoff (float) – Cutoff for Schmidt values to keep in the canonical form.

  • parity (Literal[0, 1]) – For infinite MPS only, determines which fermion parity sector of the virtual legs to keep in the projected iMPS.

  • offset (int) –

    For infinite, number-preserving MPS only, adjusts the mapping of fermion number to spin on virtual legs:

    2S^z = number - offset - bond_index

  • unit_cell_width (int | None) –

    Physical length of the system represented by the MPS.

    If None (default), keep the existing unit_cell_width if it divides the new, halved, system size. Otherwise, replace with the new MPS length (i.e., treat it as a chain).

Return type:

None | MPS

Returns:

The Gutzwiller projected mps, if inplace is False.

Note

Currently,

  • no symmetry quantum numbers other than fermion number or parity can be handled.

  • only 'finite' and 'infinite' boundary conditions are supported.

Helper functions

temfpy.gutzwiller.parity_mask(leg, parity=0)[source]

Generates a mask selecting the physical parity blocks for a given fermionic leg.

The physical parity blocks depend on the conserved charge of the given leg:

  • 'N' → even/odd particle charge blocks

  • 'parity' → even/odd parity charge block

Parameters:
  • leg (LegCharge) – The fermionic leg for which the mask is generated.

  • parity (int) – Particle number parity in the physical sector (default: even)

Return type:

ndarray

Returns:

A boolean mask selecting the physical charge blocks that can be used by iproject().

temfpy.gutzwiller.number_mask(leg, n)[source]

Generates a mask selecting the physical charge block for a fermionic leg.

Only really makes sense for a U(1) conserving leg.

Parameters:
  • leg (LegCharge) – The fermionic leg for which the mask is generated.

  • n (int) – Particle number in the physical sector

Return type:

ndarray

Returns:

A boolean mask selecting the physical charge block that can be used by iproject().