Source code for ttnopt.src.functionTTN

import numpy as np
import tensornetwork as tn


[docs]def get_renormalization_sequence(edges, top_edge_id): tensor_flag = [0 for _ in range(len(edges))] top_child_ids = [i for i in range(len(edges)) if edges[i][2] == top_edge_id] stack = [(-1, top_child_ids)] sequence = [] while stack: parent_id, child_ids = stack[-1] if all(tensor_flag[child_id] == 1 for child_id in child_ids) or not child_ids: if parent_id != -1: sequence.append(parent_id) tensor_flag[parent_id] = 1 stack.pop() else: for child_id in child_ids: if tensor_flag[child_id] == 0: stack.append((child_id, get_child_tensor_id(child_id, edges))) return sequence
[docs]def get_child_tensor_id(tensor_id, edges): child_tensor_id = [] for i, edge in enumerate(edges): if edge[2] in edges[tensor_id][:2]: child_tensor_id.append(i) return child_tensor_id
[docs]def get_bare_edges(edge_id, edges, physical_edges): bare_spins = [] if edge_id in physical_edges: return [edge_id] else: child_ids = [i for i, edge in enumerate(edges) if edge_id == edge[2]] while len(child_ids) > 0: new_child = [] for child_id in child_ids: for edge in edges[child_id][:2]: if edge in physical_edges: bare_spins.append(edge) new_child += get_child_tensor_id(child_id, edges) child_ids = new_child return bare_spins
[docs]def inner_product(u, v): u = u.copy(conjugate=True) u[0] ^ v[0] u[1] ^ v[1] u[2] ^ v[2] u[3] ^ v[3] return tn.contractors.auto([u, v]).get_tensor()
[docs]def inner_product_sparse(u, v): u = u.copy(conjugate=True) u[0] ^ v[0] u[1] ^ v[1] u[2] ^ v[2] u[3] ^ v[3] u[4] ^ v[4] prod = tn.contractors.auto([u, v]).tensor.todense() return np.real(prod)[0]