Exemplo n.º 1
0
 def _create_tensor(self, l1: int, l2: int) -> Tensor:
     name_list = ["Left", "Right", "Up", "Down"]
     if l1 == 0:
         name_list.remove("Up")
     if l2 == 0:
         name_list.remove("Left")
     if l1 == self.L1 - 1:
         name_list.remove("Down")
     if l2 == self.L2 - 1:
         name_list.remove("Right")
     dimension_list = [2, *[self.D for _ in name_list]]
     name_list = ["Phy", *name_list]
     result = Tensor(name_list, dimension_list)
     result.block()[:] = np.random.rand(*dimension_list)
     return result
Exemplo n.º 2
0
 def __init__(self, node_names, approximate_energy=0):
     self.node_number = len(node_names)
     self.state_vector = Tensor(node_names,
                                [2
                                 for _ in range(self.node_number)]).randn()
     self.bonds = []
     self.energy = 0.
     self.approximate_energy = abs(approximate_energy)
Exemplo n.º 3
0
class SpinLattice():
    def __init__(self, node_names, approximate_energy=0):
        self.node_number = len(node_names)
        self.state_vector = Tensor(node_names,
                                   [2
                                    for _ in range(self.node_number)]).randn()
        self.bonds = []
        self.energy = 0.
        self.approximate_energy = abs(approximate_energy)

    def update(self):
        norm_max = float(self.state_vector.norm_max())
        self.energy = self.approximate_energy - norm_max
        self.state_vector /= norm_max
        state_vector_temporary = self.state_vector.same_shape().zero()
        for i in self.bonds:
            sn1, sn2 = (j for j in i.name if j.name[0] != "_")
            this_term = self.state_vector.contract_all_edge(i).edge_rename({
                f"_{sn1}":
                sn1,
                f"_{sn2}":
                sn2
            })
            state_vector_temporary += this_term
        self.state_vector *= self.approximate_energy
        self.state_vector -= state_vector_temporary  # v <- (1-H)v

    def observe(self, operator):
        names = [i.name for i in operator.name if i.name[0] != "_"]
        Ov = self.state_vector.to(complex).contract_all_edge(
            operator).edge_rename({f"_{n}": n
                                   for n in names})
        vOv = Ov.contract_all_edge(self.state_vector.to(complex))
        vv = self.state_vector.contract_all_edge(self.state_vector)
        return complex(vOv).real / float(vv)

    def set_bond(self, ps, operator):
        self.bonds.append(translate(ps, operator))
Exemplo n.º 4
0
    # print(fuse_leg_A)
    # print(fuse_leg_B)

    name_list_A = [f"A.{i}" for i in range(rank_A)]
    name_list_B = [f"B.{i}" for i in range(rank_B)]
    for i in range(rank_fuse):
        name_list_A[fuse_leg_A[i]] = f"{i}"
        name_list_B[fuse_leg_B[i]] = f"{i}"

    dim_A = np.random.randint(1, max_random, rank_A).tolist()
    dim_B = np.random.randint(1, max_random, rank_B).tolist()
    for i in range(rank_total):
        dim_A[total_leg_A[i]] = dim_B[total_leg_B[i]] = np.random.randint(
            2, max_random)

    A = Tensor(name_list_A, dim_A).test()
    B = Tensor(name_list_B, dim_B).test()
    C = A.contract(
        B, {(f"A.{contract_leg_A[i]}", f"B.{contract_leg_B[i]}")
            for i in range(rank_contract)})
    # print(repr(A))
    # print(repr(B))
    # print(repr(C))
    a = A.block[{}]
    b = B.block[{}]

    index_A = [chr(ord('a') + i) for i in range(rank_A)]
    index_B = [chr(ord('A') + i) for i in range(rank_B)]
    index_C = []
    for i in range(rank_total):
        index_A[total_leg_A[i]] = index_B[total_leg_B[i]]
Exemplo n.º 5
0
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#

import numpy as np
from TAT.Tensor import DNo as Tensor

max_random = 8

for _ in range(100):
    rank_A = np.random.randint(2, max_random)
    rank_B = np.random.randint(2, max_random)
    rank_contract = np.random.randint(1, np.min([rank_A, rank_B]))
    # print(rank_A, rank_B, rank_contract)

    contract_name_A = np.random.choice(range(rank_A), rank_contract, False)
    contract_name_B = np.random.choice(range(rank_B), rank_contract, False)

    dim_A = np.random.randint(1, max_random, size=rank_A)
    dim_B = np.random.randint(1, max_random, size=rank_B)
    dim_contract = np.random.randint(1, max_random, size=rank_contract)

    dim_A = [j if i not in contract_name_A else dim_contract[contract_name_A.tolist().index(i)] for i, j in enumerate(dim_A)]
    dim_B = [j if i not in contract_name_B else dim_contract[contract_name_B.tolist().index(i)] for i, j in enumerate(dim_B)]

    A = Tensor([f"A.{i}" for i in range(rank_A)], dim_A).randn()
    B = Tensor([f"B.{i}" for i in range(rank_B)], dim_B).randn()
    v_t = A.contract(B, {(f"A.{i}", f"B.{j}") for i, j in zip(contract_name_A, contract_name_B)}).block[{}]
    v_n = np.tensordot(A.block[{}], B.block[{}], [contract_name_A, contract_name_B])
    v_d = v_t - v_n
    print(np.max(np.abs(v_d)))
Exemplo n.º 6
0
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#

import numpy as np
from TAT.Tensor import DNo as Tensor

max_random = 8

for _ in range(1000):
    rank_A = np.random.randint(2, max_random)
    rank_contract = np.random.randint(1, rank_A)
    U_leg = np.random.choice(range(rank_A), rank_contract, False)

    dim_A = np.random.randint(1, max_random, size=rank_A)

    A = Tensor([f"A.{i}" for i in range(rank_A)], dim_A.tolist()).randn()

    U, S, V = A.svd({f"A.{i}" for i in U_leg}, "SVD.U", "SVD.V")
    re_A = U.multiple(S, "SVD.U", "U").contract(V, {("SVD.U", "SVD.V")})
    diff = re_A - A

    UTU = U.contract_all_edge(U.edge_rename({"SVD.U": "new"})).block[{}]
    VTV = V.contract_all_edge(V.edge_rename({"SVD.V": "new"})).block[{}]

    diff_U = UTU - np.identity(len(UTU))
    diff_V = VTV - np.identity(len(VTV))

    print(np.max([diff.norm_max(), np.max(np.abs(diff_U)), np.max(np.abs(diff_V))]))
Exemplo n.º 7
0
for _ in range(1000):
    rank_A = np.random.randint(3, max_random)
    rank_trace = np.random.randint(1, rank_A // 2 + 1)
    pair_leg = np.random.choice(range(rank_A), [rank_trace, 2], False)

    name_list = [f"A.{i}" for i in range(rank_A)]
    dim_list = np.random.randint(2, max_random, rank_A)
    dim_trace = np.random.randint(2, max_random, rank_trace)
    for i, (j, k) in enumerate(pair_leg):
        dim_list[j] = dim_trace[i]
        dim_list[k] = dim_trace[i]

    trace_conf = {(f"A.{i}", f"A.{j}") for i, j in pair_leg}

    A = Tensor(name_list, dim_list.tolist()).test()
    B = A.trace(trace_conf)

    res = A.block[{}]
    for i in range(rank_trace):
        res = res.trace(0, pair_leg[i, 0], pair_leg[i, 1])
        for j in range(i + 1, rank_trace):
            if pair_leg[j, 0] > pair_leg[i, 0]:
                pair_leg[j, 0] -= 1
            if pair_leg[j, 1] > pair_leg[i, 0]:
                pair_leg[j, 1] -= 1
            if pair_leg[i, 1] > pair_leg[i, 0]:
                pair_leg[i, 1] -= 1
            if pair_leg[j, 0] > pair_leg[i, 1]:
                pair_leg[j, 0] -= 1
            if pair_leg[j, 1] > pair_leg[i, 1]: