Skip to content

📝 convert nodes_id to edges_id and convert back #102

@Yonv1943

Description

@Yonv1943

仿真环境需要一个功能:

把储存了节点收缩顺序的list,从 记录两个节点收缩顺序,到记录这两个节点对应的边的收缩顺序。

见代码TNCO_env.py中的:

先创建仿真环境这个类,选择想要转换的电路

def unit_test_convert_node2s_to_edge_sorts():
    gpu_id = int(sys.argv[1]) if len(sys.argv) > 1 else 0
    device = th.device(f'cuda:{gpu_id}' if th.cuda.is_available() and gpu_id >= 0 else 'cpu')

    nodes_list, ban_edges = NodesSycamoreN12M14, 0
    # nodes_list, ban_edges = NodesSycamoreN14M14, 0
    # nodes_list, ban_edges = NodesSycamoreN53M12, 0
    # nodes_list, ban_edges = get_nodes_list_of_tensor_train(len_list=8), 8
    # nodes_list, ban_edges = get_nodes_list_of_tensor_train(len_list=100), 100
    # nodes_list, ban_edges = get_nodes_list_of_tensor_train(len_list=2000), 2000
    # from TNCO_env import get_nodes_list_of_tensor_tree
    # nodes_list, ban_edges = get_nodes_list_of_tensor_tree(depth=3), 2 ** (3 - 1)

    env = TensorNetworkEnv(nodes_list=nodes_list, ban_edges=ban_edges, device=device)
    print(f"\nnum_nodes      {env.num_nodes:9}"
          f"\nnum_edges      {env.num_edges:9}"
          f"\nban_edges      {env.ban_edges:9}")

下面演示了把 edge_ary 转化成 node2s 转化回 edge_ary 的过程,调用了两个函数:

  • edge_ary → edge_sort → node2s node2s = env.convert_edge_sort_to_node2s(edge_sort=edge_ary.argsort(dim=0))
  • node2s → edge_sort edge_sort = env.convert_node2s_to_edge_sort(node2s=node2s).to(device)
    num_envs = 6

    # th.save(edge_arys, 'temp.pth')
    # edge_arys = th.load('temp.pth', map_location=device)

    edge_arys = th.rand((num_envs, env.num_edges - env.ban_edges), device=device)
    edge_ary = edge_arys[0]
    print(edge_ary.argsort().shape)
    print(edge_ary.argsort())
    node2s = env.convert_edge_sort_to_node2s(edge_sort=edge_ary.argsort(dim=0))
    edge_sort = env.convert_node2s_to_edge_sort(node2s=node2s).to(device)
    print(edge_sort.shape)
    print(edge_sort)

    print(edge_sort - edge_ary.argsort())
    edge_sorts = edge_sort.unsqueeze(0)
    multiple_times = env.get_log10_multiple_times(edge_sorts=edge_sorts)
    print(f"multiple_times(log10) {multiple_times.numpy()}")

输出是:(在这个电路下,nodes_list, ban_edges = NodesSycamoreN12M14, 0

num_nodes             51
num_edges             99
ban_edges              0
torch.Size([99])
tensor([30, 36, 49, 35, 55, 65,  0, 28, 61, 52, 45, 69, 10, 21, 83, 18, 56,  9,
        14, 70, 39, 19, 74, 43, 68, 75, 60, 81, 29, 47, 94, 24, 58, 77, 64, 15,
        13, 72, 87, 32, 71, 51, 85,  6, 44, 34, 96, 40, 38, 97, 46, 53, 82, 84,
        22, 90, 25, 23, 33, 92,  1, 62, 42, 91, 67, 93, 26, 98, 79, 12, 16, 27,
        78, 95,  8, 11, 80, 20,  4, 57, 73, 54,  2,  7, 66,  3,  5, 88, 37, 59,
        17, 48, 50, 41, 86, 89, 76, 63, 31])
torch.Size([99])
tensor([30, 36, 49, 35, 55, 65,  0, 28, 61, 52, 45, 69, 10, 21, 83, 18, 56,  9,
        14, 70, 39, 19, 74, 43, 68, 75, 60, 81, 29, 47, 94, 24, 58, 77, 64, 15,
        13, 72, 87, 32, 71, 51, 85,  6, 44, 34, 96, 40, 38, 97, 46, 53, 82, 84,
        22, 90, 25, 23, 33, 92,  1, 62, 42, 91, 67, 93, 26, 98, 79, 12, 16, 27,
        78, 95,  8, 11, 80, 20,  4, 57, 73, 54,  2,  7, 66,  3,  5, 88, 37, 59,
        17, 48, 50, 41, 86, 89, 76, 63, 31], dtype=torch.int32)
tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0])
multiple_times(log10) [12.06995569]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions