TeNPy 调研

DMRG / MPS / 张量网络的开源库有很多,例如 TeNPy, ITensor, TensorKit, QSpace, DMRG++, uni10, PyTeNet, quimb, mpnum, ALPS project, TeNeS, SyTen, 等等。 这个系列文章将会从这些库中选择几个来学习和分析一下。

standards.png

Figure 1: 让我们再造个轮子🤣

TeNPyJohannes Hauschild主要开发并维护,Hauschild 的博士导师是 Frank Pollmann,现在在到处做博后。 考虑到 Hauschild 一作的文章没有几个,发表情况并不是很好,所以某种程度上他是在全职做 TeNPy 的开发。

安装

# 安装依赖
pip install -U pip numpy scipy cython setuptools wheel build
# 下载源码
git clone https://github.com/tenpy/tenpy.git
# 安装
cd tenpy
pip install -e .
# 测试
cd tests
pip install pytest
pytest

代码层级

TeNPy 的代码层级如图2

  • tenpy.simulations 是程序的入口,提供运行程序(进行读取参数、运行计算、执行测量、保存结果和中间过程等等)的功能
  • tenpy.algorithms 中实现了多种算法,包括 DMRG、iDMRG、TEBD和TDVP
  • tenpy.models 中实现了各种模型包括自旋、费米、波色和各种晶格结构。二维晶格通过映射到一维来实现。
  • tenpy.networks 中实现了 MPS 和 MPO 类型
  • tenpy.linalg 中实现了带有守恒量的张量以及迭代对角化算法 Lanczos 和 Arnoldi
  • tenpy.tools 中包括一些需要用到其它功能

overview.png

Figure 2: TeNPy 的代码层级

tenpy.linalg.np_conserved.Array

TeNPy 的基本数据结构是 tenpy.linalg.np_conserved.Array, 带有守恒荷的张量。 TeNPy 采用带有箭头的 MPS 记号来表示一个张量。 张量的每个指标有若干可能的量子数,这些信息记录在 Array.legs 属性里。 对于一个有 \(n\) 个指标的张量, Array.legs 是长度为 \(n\) 的数组,每个元素都是 tenpy.linalg.charges.LegCharge , 这里记录了这个指标所有可能的荷以及它是入指标还是出指标。 张量的属性 Array.qtotal 记录总量子数,只有那些和等于总量子数的块才会被保存。 每个保存的张量块的数据是数组 Array._data 的一个元素,它对于的量子数则是矩阵 Array._qdata 的一行。

class Array{
    legs   : List[LegCharge],
    qtotal : Charge,
    _data  : List[numpy.ndarray],
    _qdata : numpy.ndarray[len(​_data), len(legs)],
}

tenpy.networks.site.Site

tenpy.networks.site.Site 是一个格点或者一个物理指标所需要的数据。 它保存了物理指标所需要的信息 LegCharge, 以及作用在一个格点上的所有局域算符 Site.ops, 写模型的哈密顿量所需要的所有算符都是从这里得到的。 除了一般的算符之外还有 Jordan-Wigner 变换(如果需要)要用到的信息。

TeNPy 中实现的 Site 有如下这些

  • BosonSite
  • ClockSite
  • FermionSite
  • GroupedSite
  • SpinHalfFermionSite
  • SpinHalfHoleSite
  • SpinHalfSite
  • SpinSite

tenpy.networks.mps.MPS

对于 \(n\) 格点的链, tenpy.networks.mps.MPS 就是 \(n\) 个 Site 和 \(n\) 个 Array, 这些 Array 都是三阶张量. TeNPy 的 MPS 表示记录了每个块的形式(左正则、右正则、对称形式或者叫 Vidal 的 \(\Gamma \Lambda\) 形式)以及需要的奇异值。

class MPS{
    sites: List[Site],
    _B: List[Array],
    _S: List[numpy.ndarray[1d]],
    form: List[form],
}

tenpy.networks.mpo.MPO

tenpy.networks.mpo.MPO 与 MPS 表示类似,只不过每个块现在是四阶张量。

tenpy.models.model.Model

tenpy.models.model.Model 用来表示模型的哈密顿量,需要指定元胞格点的信息 Site 以及晶格结构如何映射到一维链 tenpy.models.lattice.Lattice. TeNPy 提供的构造模型的方法是通过 add_onsite, add_coupling 等设置哈密顿量里的各项,然后根据需要自动构造 MPO。

DMRG 算法

TeNPy 的抽象层次是

  • tenpy.algorithms.algorithm.Algorithm 提供运行、重启等功能
  • 然后由 tenpy.algorithms.mps_common.Sweep 提供扫描的抽象
  • 每个扫描步骤则使用 tenpy.algorithms.dmrg.DMRGEngine 它可以是 SingleSiteDMRGEngine 或者 TwoSiteDMRGEngine

评论

Comments powered by Disqus