考虑保真度的初始映射选择方法¶
本节将介绍初始映射选择算法及使用方法。该初始映射算法的核心目的是同时考虑物理设备保真度和物理设备拓扑和电路双比特门连接拓扑的匹配度,找到多个好的初始映射区域和初始映射方式。
算法原理¶
该初始映射算法的基本原理是基于最大同构子图在物理拓扑中找到一块包含该子图的区域作为初始映射区域,这样能够最大程度保障连通性,并且由于一个物理拓扑中可能包含多个这样的区域,基于单双比特门保真度进行区域选择能够最大程度保障映射后电路的保真度
构建电路拓扑¶
-
顶点:逻辑量子比特位
-
边:双比特门操作
-
边权重:电路中同一对比特之间的双比特门操作数在电路中总双比特门数中的占比
获得近似最大子图¶
将近似最大子图G初始化为空,按照电路拓扑的边权重由大到小将电路中所有边排序,并依次加入到待求的图G中,每加入一条边就判断图G是否是物理拓扑的子图,若是则继续加入下一条边,若不是,则从G中删除刚加入的边,再继续加入下一条边,最终所有的边都被加入过图G中之后,获得最终的近似最大子图G。
获得初始映射区域¶
在物理拓扑中找到包含近似最大子图G的区域作为初始映射区域,首先找到与近似最大子图G完全同构的区域,然后拓展该区域,拓展思路如下:
-
仅考虑拓展当前区域的邻居节点
-
每尝试拓展一个邻居节点都计算一次当前初始区域的评分:区域内所有边的平均双比特门保真度+所有点的单比特门保真度之和
-
最终根据电路总比特数与当前区域的比特数差值,选择对应数目的,评分最高的节点进行拓展,构成最终的初始映射区域
-
由于包含近似最大子图G的区域可能含有多个,因此上述计算会进行多次,最终选择所有区域中平分最高的那个座位最终初始映射区域
代码实例¶
以以下5比特随机电路和5x5网格拓扑为例,运行初始映射算法
from QuICT.core import Circuit, Layout
from QuICT.core.utils import GateType
from QuICT.qcda.mapping.common import InitialMapping
layout = Layout.load_file("example/layout/grid_5x5.json")
circuit = Circuit(5)
circuit.random_append(20, typelist=[GateType.cx])
circuit.draw(method="command", flatten=True)
原电路结构为:
┌────┐ ┌────┐ ┌────┐ ┌────┐┌────┐┌────┐ ┌────┐┌────┐ ┌────┐
q_0: |0>┤ cx ├──────┤ cx ├──■───┤ cx ├──■───┤ cx ├┤ cx ├┤ cx ├────────────────────────────────────┤ cx ├┤ cx ├──────┤ cx ├
└─┬──┘ └─┬──┘┌─┴──┐└─┬──┘ │ └─┬──┘└─┬──┘└─┬──┘┌────┐ ┌────┐ └─┬──┘└─┬──┘┌────┐└─┬──┘
q_1: |0>──┼───────────┼───┤ cx ├──┼─────┼─────■─────┼─────┼───┤ cx ├──■───┤ cx ├────────■─────■─────┼─────■───┤ cx ├──┼───
│ │ └────┘ │ │ │ │ └─┬──┘ │ └─┬──┘ ┌─┴──┐ │ │ └─┬──┘ │
q_2: |0>──┼─────■─────┼───────────■─────┼───────────■─────┼─────■─────┼─────┼─────■───┤ cx ├──┼─────■───────────┼─────┼───
│ │ │ ┌─┴──┐ │ │ │ │ └────┘┌─┴──┐ │ │
q_3: |0>──┼─────┼─────■───────────────┤ cx ├──────────────┼─────■─────┼─────■─────┼─────────┤ cx ├──────────────■─────■───
│ ┌─┴──┐ └────┘ │ ┌─┴──┐┌─┴──┐ ┌─┴──┐ └────┘
q_4: |0>──■───┤ cx ├──────────────────────────────────────■───┤ cx ├┤ cx ├──────┤ cx ├────────────────────────────────────
└────┘ └────┘└────┘ └────┘
initial_mp = InitialMapping(layout)
initial_region, initial_mapping = initial_mp.run(circuit)
print(initial_region, initial_mapping)
初始映射结果为: