A high-performance DMRG (density matrix renormalization group) solver for 1D anyon chains — quantum many-body systems whose Hilbert spaces are not tensor-factorized over sites, and therefore cannot be handled by standard spin-chain codes out of the box.
Written in C++ on top of ITensor, with a later Julia port for prototyping new fusion categories.
Research output: Numerical Evidence for a Haagerup Conformal Field Theory, Phys. Rev. Lett. 128, 231603 (2022).
Given a fusion category (the algebraic data defining the anyon model) and a chain geometry, the solver:
- Constructs the Hamiltonian as a matrix product operator (MPO) directly from the category's F-symbols — no hard-coded constants.
- Runs DMRG to find the ground state and low-lying excited states, targeting excited states via orthogonality penalties.
- Measures translation and topological-symmetry eigenvalues alongside the energy spectrum, so that states can be organized into momentum and symmetry sectors.
- Supports multiple boundary conditions: periodic, open, Dirichlet, and sine-squared deformed (SSD), including the SSD-to-periodic "hot start" protocol.
- Handles quantum-number (QN) conservation where the category admits a grading, which dramatically reduces bond dimension at fixed accuracy.
Built-in models: golden (Fibonacci), Haagerup, Haagerup with QN conservation. The Julia side additionally supports user-defined fusion categories via a generic AnyonModel interface.
Anyonic Hilbert spaces are labeled by fusion trees rather than local spin configurations. This means:
- Local operators don't decompose as tensor products; every term in the Hamiltonian involves an F-move that depends on the global fusion-tree state.
- The MPO construction has to be generated from categorical data at runtime.
- Symmetry sectors are labeled by non-invertible operators (e.g., the
$\rho$ line of the Haagerup category), which the code diagonalizes jointly with energy and translation.
The solver reaches bond dimensions of
| Layer | Tool |
|---|---|
| Core solver | C++17, ITensor v3 |
| Linear algebra backend | OpenBLAS / MKL (configurable at build time) |
| Build system | CMake ≥ 2.8 |
| Data format | ITensor binary (C++), JLD2 (Julia) |
| Prototyping / generic categories | Julia 1.x |
| Output analysis | Mathematica-compatible matrix dumps (.m) |
src/ C++ DMRG driver, MPO construction, measurement modes
julia/ Julia port with generic AnyonModel interface
extern/ Vendored ITensor headers and libraries (see INSTALL.md)
CMakeLists* Build configuration (template + Mac variant)
See INSTALL.md for the full build procedure. In short: vendor ITensor under extern/itensor/, point CMakeLists.txt at your BLAS installation, then:
mkdir build && cd build
cmake ..
makeThe Julia version has no build step:
julia --project=julia -e 'using Pkg; Pkg.instantiate()'Simulate a length-6 periodic Haagerup chain with QN conservation under the pure-$\rho$ projector, in the neutral sector, and measure the energy / translation /
./Chain -s haagerupq -b p -l 6 -d 1600 -c 1e-8 -p 1e-2 -j 0,-1,0 -u 2 -q 0 -n 1 -m 5Output files:
| Extension | Contents |
|---|---|
.an |
Diagonalized spectrum: {energy, momentum, ρ} |
.ee |
Entanglement entropy curve |
.en |
Raw (undiagonalized) energies |
.m |
Energy / translation / ρ matrices in Mathematica format |
Full CLI reference is in INSTALL.md.
julia --project=julia julia/run_chain.jl -l 6 -d 100 -s 5 -b p -j 1.0 -u 2.0 -m haagerup -o results.jld2Or, using the generic interface to run a Fibonacci chain:
using Chain
energy = run_dmrg(L=6, model=Model.fibonacci_model(), U=2.0)Define your own fusion category by supplying F-symbols and quantum dimensions:
using Chain.Model
m = AnyonModel(2; fsymbols=myF, qdims=[1.0, phi])If this code is useful for your work, please cite:
@article{HuangLinOhmoriTachikawaTezuka2022,
title = {Numerical Evidence for a Haagerup Conformal Field Theory},
author = {Huang, Tzu-Chen and Lin, Ying-Hsuan and Ohmori, Kantaro
and Tachikawa, Yuji and Tezuka, Masaki},
journal = {Phys. Rev. Lett.},
volume = {128},
number = {23},
pages = {231603},
year = {2022},
doi = {10.1103/PhysRevLett.128.231603},
}