#Tensor Networks
Implementations of 1D tensor networks algorithms in python.
Basic tensor network algorithm that decomposes an n-rank tensor into a mixed canonical matrix product state (MPS). In diagrammatic form, it looks like this
import mps
import state_tensor
n = 10 # rank of the initial tensor (number of spins)
j = 6 # orthogonality centre cite
bond_d = 2 #truncated bond dimension of the MPS
psi = state_tensor.random(n) # random state in form of a tensor
MPS = mps.MixedCanonical(psi, j, bond_d)
This form of representing many-body states allows us to perform useful calculations.For example, we can easily calculate expectation values of one-site local operator
pauli_Z = np.array([[1.0, 0.0], [0.0, -1.0]])
MPS.ev_1site(pauli_Z) # = -0.02813418284300012 for parameters as above
or two-site
pauli_ZZ = np.tensordot(pauli_Z, pauli_Z, axes=0)
MPS.ev_2site(pauli_ZZ) # = 0.003394449492646695 for parameters as above
A lot of Hamiltonians from many-body quantum mechanics can be represented using matrix product states. This representation is called a Matrix Product Operator (MPO) and is useful for calculating expectation values in a given MPS state or finding eigenstates of the operator. As an example, I have used the Quantum Transverse 1D Ising Model (QTIM) Hamiltonian in my code
import mpo
n = 10 # rank of the MPO
h = 0.1
hz = 1.0
MPO = mpo.QTIM(n, h, hz)
Expectation value of the MPO in a given MPS state
can be efficiently calculated using following scheme
MPS.ev_mpo(MPO) # = -0.7637637108962172 in the MPS state as above
To find eigenstate of our MPO we are gonna minimize <A|H|A> with respect to the bra <A| by zeroing corresponding derivative (A is a random state MPS in a mixed canonical gauge). It will lead to an eigen problem in a tensor form
The main part of the algorithm for finding the lowest eigenstates involves an iterative minimization process, where each matrix product state A^k (represented in vectorized form) is minimized using the Lanczos algorithm. The Lanczos algorithm is a numerical method used to find the lowest eigenstate of a matrix. In the first left and right sweeps, we start with previously calculated L and R tensors. After each Lanczos step, we update these tensors using the following scheme:
(similar procedure for R).
After a few sweeps it will converge, and we will obtain lowest eigenstate of our MPO.
energy, lowest_eigenstate = mpo.ground_system(MPO) # energy = -19.01833205830135
Main goals for now (in priority order):
- MPS decomposition algorithm
- MPO Lanczos based algorithms
- TDVP