Example #1
0
    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
Example #2
0
    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
Example #3
0
        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():
Example #4
0
        #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???')
Example #5
0
    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))