def getHamilton(self): # spin operator sz = torch.tensor([[1, 0], [0, -1]], dtype=dtype, device=device) / 2 sx = torch.tensor([[0, 1], [1, 0]], dtype=dtype, device=device) / 2 sy = torch.tensor([[0, -1], [1, 0]], dtype=dtype, device=device) / 2 if self.model == "Ising": H = kron(sz, sz) elif self.model == "XY": H = kron(sx, sx) - kron(sy, sy) return H
def fit_transform(self, X): N = X.shape[0] # perform KNN N = X.shape[0] pdist = (X[:, None, :] - X[None, :, :]).norm(2, -1) knn = pdist.topk(self.k, 1, largest=False)[1] # compute weigths matrix W W = torch.zeros(N, self.k) for i in range(N): Z = X[knn[i]] - kron(torch.ones(self.k, 1), X[i]) C = Z @ Z.t() C += torch.eye(self.k) * 1e-3 * C.trace() w = torch.gesv(torch.ones(self.k, 1), C)[0].t() W[i] = w / w.sum() # compute Y M = torch.eye(N) for i in range(N): w = W[i:i + 1].t() ww = w @ w.t() for k in range(self.k): M[i, knn[i, k]] -= w[k].item() M[knn[i, k], i] -= w[k].item() for l in range(self.k): M[knn[i, k], knn[i, l]] += ww[k, l] eigvals, eigvecs = M.eig(True) indices = eigvals[:, 0].sort()[1][1:self.n_dims + 1] y = eigvecs[:, indices] return y
key += '_float32' cmd = ['mkdir', '-p', key] subprocess.check_call(cmd) if args.model == 'J1J2': #Hamiltonian operators on a bond sx = torch.tensor([[0, 1], [1, 0]], dtype=dtype, device=device) * 0.5 sy = torch.tensor([[0, -1], [1, 0]], dtype=dtype, device=device) * 0.5 sp = torch.tensor([[0, 1], [0, 0]], dtype=dtype, device=device) sm = torch.tensor([[0, 0], [1, 0]], dtype=dtype, device=device) sz = torch.tensor([[1, 0], [0, -1]], dtype=dtype, device=device) * 0.5 id2 = torch.tensor([[1, 0], [0, 1]], dtype=dtype, device=device) # supply just S.S Hnn = args.J1 * ( 2 * kron(sz, 4 * sx @ sz @ sx) - (kron(sm, 4 * sx @ sp @ sx) + kron(sp, 4 * sx @ sm @ sx))) Hnnn = args.J2 * (2 * kron(sz, sz) + (kron(sm, sp) + kron(sp, sm))) H = torch.cat((Hnn, Hnnn)) Mpx = kron(sx, id2) Mpy = kron(sy, id2) Mpz = kron(sz, id2) else: print('what model???') sys.exit(1) print('Hamiltonian:\n', H) def closure():
#sx = torch.from_numpy(su2.get_su2_op(""), dtype=dtype, device=device)*0.5 #sy = torch.tensor([[0, -1], [1, 0]], dtype=dtype, device=device)*0.5 sp = torch.from_numpy(su2.get_su2_op( "sp", dimS)) #, dtype=dtype, device=device) sm = torch.from_numpy(su2.get_su2_op( "sm", dimS)) #, dtype=dtype, device=device) sz = torch.from_numpy(su2.get_su2_op( "sz", dimS)) #, dtype=dtype, device=device)*0.5 sx = 0.5 * (sp + sm) sy = 0.5 * (sp - sm) idop = torch.from_numpy(su2.get_su2_op( "I", dimS)) #, dtype=dtype, device=device) rot = torch.from_numpy(su2.get_rot_op(dimS)) # supply just S.S SS = kron(sz, rot.t() @ sz @ rot) + 0.5 * (kron(sm, rot.t() @ sp @ rot) + kron(sp, rot.t() @ sm @ rot)) H = (1.0/14.0) * (SS + (7.0/10.0)*SS@SS + (7.0/45.0)*SS@SS@SS \ + (1.0/90.0)*SS@SS@SS@SS) D, U = torch.eig(H, eigenvectors=False) print(D) Mpx = kron(sx, idop) Mpy = kron(sy, idop) Mpz = kron(sz, idop) else: print('what model???')
key += args.model \ + '_D' + str(args.D) \ + '_chi' + str(args.chi) if (args.float32): key += '_float32' cmd = ['mkdir', '-p', key] subprocess.check_call(cmd) if args.model == 'TFIM': sx = torch.tensor([[0, 1], [1, 0]], dtype=dtype, device=device) sy = torch.tensor([[0, -1], [1, 0]], dtype=dtype, device=device) sz = torch.tensor([[1, 0], [0, -1]], dtype=dtype, device=device) id2 = torch.tensor([[1, 0], [0, 1]], dtype=dtype, device=device) H = - 2*args.Jz*kron(sz,sz)-args.hx*(kron(sx,id2)+kron(id2,sx))/2 Mpx = (kron(id2,sx) + kron(sx,id2))/2 Mpy = (kron(id2,sy) + kron(sy,id2))/2 Mpz = (kron(id2,sz) + kron(sz,id2))/2 elif args.model == 'Heisenberg': #Hamiltonian operators on a bond sx = torch.tensor([[0, 1], [1, 0]], dtype=dtype, device=device)*0.5 sy = torch.tensor([[0, -1], [1, 0]], dtype=dtype, device=device)*0.5 sp = torch.tensor([[0, 1], [0, 0]], dtype=dtype, device=device) sm = torch.tensor([[0, 0], [1, 0]], dtype=dtype, device=device) sz = torch.tensor([[1, 0], [0, -1]], dtype=dtype, device=device)*0.5 id2 = torch.tensor([[1, 0], [0, 1]], dtype=dtype, device=device) # now assuming Jz>0, Jxy > 0 H = 2*args.Jz*kron(sz,4*sx@sz@sx)-args.Jxy*(kron(sm, 4*sx@sp@sx)+kron(sp,4*sx@sm@sx))