如题,最近重归学习ITensors,这个系列会断断续续记录一些学习使用ITensors时的ideas or points。
1、Introduction
张量网络是一种处理具有许多指标的张量的技术。一个优雅的替代方法是张量图符号。

ITensor是智能张量的缩写,是一个受张量图符号启发的软件库。
第一个问题是,在使用库时,任何不是概念算法的一部分的实现细节都应该尽可能地对用户隐藏。
第二个关键的原则是,该软件应该允许人们在不同的级别上与它进行交互。
2、 Interface Examples
2.1、Installing ITensor
$ julia
julia> ]
pkg> add ITensors
2.2、Obtaining Help
julia> using ITensors
julia> ?
help?> Index
search: Index indexin IndexStyle IndexLinear ...
An Index represents a single tensor index with fixed
dimension dim. Copies of an Index compare equal unless
their tags are different.
...
2.3、Basic ITensor Usage(基本的ITensor用法)
使用前输入下行代码
using ITensors
在创建ITensor之前,首先要创建其索引
i = Index(3)
创建一个维数为3的张量索引,并将此索引对象分配给引用i。将i的结果打印出来可以得到
i = (dim=3|id=804)
在定义一些索引对象i、j、k、l之后,可以定义ITensor:
A = ITensor(i)
B = ITensor(j,i)
C = ITensor(l,j,k)
由于匹配的索引对可以通过它们的id数自动识别彼此,因此张量收缩可以进行为:
D = A * B * C
*运算符找到两个指数之间的所有匹配指数,并对这些指数进行总和或收缩。
2.4、Setting ITensor Elements(定义ITensor元素)
定义ITensor元素是通过如下方式
A[i=>2,j=>3,k=>1] = 0.837
它将值0.837赋给A的元素,其中索引i的值是2,j的值是3,k的值是1。因为索引对象及其值一起提供,所以它们可以以任何顺序传递。因此,
A[i=>2,j=>3,k=>1] = 0.837
A[k=>1,i=>2,j=>3] = 0.837
这两种语法将会构建两个完全一样的ITensor。
要使用正态分布的随机元素而不是特定的值创建ITensor,可以使用构造函数
T = randomITensor(i,j,k)
上面创建的是实数值张量,也可以定义复数值张量
T = randomITensor(ComplexF64,i,j,k)
只需要定义数据类型是ComplexF64。
2.5、Matrix Example(矩阵实例)
定义两个二阶矩阵
A = ITensor(i,j)
B = ITensor(k,j)
缩并这两个二阶张量
C = A * B
这里并不需要像其他语言一样进行额外的操作,*操作会自动识别相同的索引。
2.6、Summing ITensors(求和ITensor)
只要它们有相同的指数集,就可以添加和减去它们。即使指数的顺序不同,加法也总是可以直接工作的,因为ITensor系统能够在内部推断出所需的数据排列:
A = randomITensor(i,j,k)
B = randomITensor(k,i,j)
C = A + B
它也可以减去和乘以标量,包括复标量,例如:
D = 4*A - B/2
F = A + 3.0im * B
2.7、Priming Indices(引导索引)(没找到合适的翻译)
Ap = prime(A,i)
简单来说就是生成一个索引的副本,让他和之前的索引被区分。比如
julia> ip = prime(i)
(dim=3|id=350|"i")'julia> ipp = ip'
(dim=3|id=350|"i")''julia> ippp = i''
(dim=3|id=350|"i")''julia> hasind(ipp,i'')
truejulia> hasind(ipp,i')
falsejulia> i != ip
true
2.8、Compiling ITensor(编译ITensor)
预编译,每个ITensor版本更新后运行一次,生成编译映像。
julia> using ITensors
julia> ITensors.compile()
