Advanced Computing Platform for Theoretical Physics

test_grad.py 965 Bytes
Newer Older
Lei Wang's avatar
Lei Wang committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'''
Three different ways of computing gradient of infinite matrix product trace 
Z = Tr(T*T...*T)
'''

import torch 
torch.manual_seed(42)

N = 10
Niter = 20
A = torch.rand(N, N, dtype=torch.float64)
T = torch.nn.Parameter(A@A.t()) # a symmetric positive definite transfer matrix 

lnZ = 0.0 
M = T.clone() # M is the converged envioment tensor
for i in range(Niter):
    s = M.norm() 
    lnZ = lnZ + torch.log(s)/2**i
    M = M/s
    M = M@M 
Lei Wang's avatar
Lei Wang committed
21
lnZ = lnZ + torch.log(torch.trace(M))/(2**Niter)
Lei Wang's avatar
Lei Wang committed
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

#(1) impurity grad 
impurity_grad = (M@M).t()/torch.trace(M@T@M)

#(2) autograd on lnZ
lnZ.backward()
lnZ_grad = T.grad.clone()

#(3) direct compute dominant eigenvalue 
w, v = torch.symeig(T, eigenvectors=True)
T.grad.zero_()
loss = torch.log(w[-1])
loss.backward()
exact_grad = ((T.grad + T.grad.t())/2) # need to symmetrize since it is an upper triangular matrix

print ((impurity_grad-exact_grad).abs().max().item())
print ((lnZ_grad-exact_grad).abs().max().item())