Open-source software and notebooks

Our group has developed several publicly available (and thus open source) software packages using the scientific programming language Julia. We also have an extensive amount of actively developed tensor network code using MATLAB; contact Laurens Vanderstraeten or Bram Vanhecke for more information.

Physics and tensor network packages


A package for efficient and large-scale tensor computations, where tensors take a very general definition (inspired from the theory of monoidal categories). Provides support for tensors with arbitrary symmetries (abelian, non-abelian, anyonic and categorical symmetries, a.k.a. fusion categories).



A package with tensor network algorithms based on matrix product states and matrix product operators, useful for one-dimensional quantum systems and two-dimensional partition functions. Contains algorithms for ground states and fixed points, excitations, time evolution and thermal states, for finite as well as infinite systems.



A package for calculations with the multiscale entanglement renormalization ansatz. It has implementations of ternary, binary, and modified binary MERA (assuming translation and scale invariance) with functions for doing energy minimization, evaluating local expectation values, and computing scaling dimensions.



A package with tensor network algorithms based on projected entangled-pair states for both finite and infinite systems. Work in progress…



A package to compute Wigner’s 3j and 6j symbols (and related quantities such as Clebsch-Gordan coefficients and Racah coefficients) to arbitrary precision. The result is computed as the square root of a rational of arbitrary-precision integers.



A package to compute Clebsch-Gordan coefficients for the special unitary group SU(N) of arbitrary dimension N. Recoupling coefficients (known as F-symbols, related to Wigner’s 6j symbols) can also be computed, and an interface to TensorKit.jl is provided.


General purpose packages


A package to efficiently contract and permute multidimensional arrays using a convenient syntax based on Einstein’s summation convention. Provides an extensible API (used by e.g. TensorKit.jl) and tools to optimize contraction order and to cache storage buffers for temporaries.



A package for sparse arrays, stored using a “dictionary of keys” format. SparseArrayKit.jl supports basic array operations and provides compatibility with TensorOperations.jl.



Iterative Krylov-based routines for linear systems, eigenvalue problems and singular values, and matrix functions (such as the exponential function). KrylvoKit.jl accepts a very general class of user types to act as “vector” and arbitrary functions to act as linear operators on those vectors.



A package for gradient based optimization with extreme flexibility towards parameterization of the problem. OptimKit.jl supports optimization on manifolds (i.e. Riemannian optimization) using gradient descent, conjugate gradient and limited-memory quasi newton methods, where custom retractions and vector transports can be specified.



An accelorator package to work with strided arrays, i.e. dense arrays whose memory layout has a fixed stride along every dimension. Strided.jl does not make any assumptions about the strides (such as stride 1 along first dimension, or monotonously increasing strides) and provides multithreaded and cache friendly implementations for mapping, reducing, broadcasting such arrays, as well as taking views, reshaping and permuting dimensions.



A package for matrix free computations with linear maps. LinearMaps.jl provides a type to wrap an arbitrary function (which represents the action of a linear map on a vector) in a structure that behaves similar to a matrix, in that it has a two-dimensional shape. Linear maps can be multiplied and added and combined with other matrices or linear maps, without ever doing the explicit computation, but such that an efficient implementation of the resulting matrix vector product is provided.