MindQuantum 目前只支持量子模拟器,如果需要获得量子算法在真机上的实测数据,可以借助“天衍”量子云平台提供的真机。本文将介绍如何基于 MindQuantum 绘制“天衍”真机的拓扑图,并进而实现比特映射。
关于 MindQuantum 涉及比特映射的教程可参考 比特映射。而 Cqlib 的使用可参考 Cqlib 入门教程 。
1. 获取真机参数
在绘制拓扑图之前,需要先获取真机的参数。如何获取,以及参数的形式,可参考我之前的一篇文章 如何本地查看“天衍”云平台真机参数?
下面以绘制 tianyan24 的拓扑图为例。官方给出的真实拓扑图如下图所示。
from cqlib import TianYanPlatform
from mindquantum.device import QubitsTopology, QubitNodelogin_key = "your_key"## 构造 tianyan24 拓扑图
platform = TianYanPlatform(login_key=login_key, machine_name="tianyan24")
config = platform.download_config() # 下载参数
2. 提取有效耦合边
从真机参数中,将可用的耦合提取出来。
couplers_map: dict = config['overview']['coupler_map'] # {'G0':['Q1', 'Q0'], ...}
disable_couplers = config['disabledCouplers'].split(",") # ['G0', ...] # 不能用的耦合
for Gi in disable_couplers: couplers_map.pop(Gi) # 删掉不能用的耦合couplers = [] # [[4,3], ..]
for k, v in couplers_map.items():couplers.append([int(v[0][1:]), int(v[1][1:])])print(couplers)
[[4, 3], [5, 4], [6, 5], [7, 6], [8, 7], [9, 8], [15, 3], [16, 4], [17, 5], [18, 6], [19, 7], [20, 8], [21, 9], [23, 11], [13, 12], [16, 15], [17, 16], [18, 17], [19, 18], [20, 19], [21, 20], [22, 21], [23, 22]]
3. 创建并填充拓扑图
由于 tianyan24 具有 24 个物理比特,拓扑结构为 2 × 12 2\times12 2×12,所以基于 MindQuantum 先创建一个只有 24 个物理比特而无连线的拓扑图,并将可用耦合逐个填充进去。
topology = QubitsTopology([QubitNode(i, poi_x=i%12, poi_y=i>=12) for i in range(24)])for pair in couplers:topology[pair[0]] >> topology[pair[1]] # type:ignoretopology.show()
4. 删除不可用的物理比特
有一些物理比特是不可用的,我们需要进一步将其从拓扑图中删除。
# 删除不可用的物理比特
disable_qubits = [int(item[1:]) for item in config['disabledQubits'].split(",")]
for i in disable_qubits:topology.remove_qubit_node(i)topology.show()
此时,得到的拓扑图就与官方图一致了。
类似地,我们进一步处理 tianyan176 和 tianyan176-2 这两个 66 量子比特的真机拓扑图。
## 构造 tianyan176 拓扑图from cqlib import TianYanPlatform
from mindquantum.device import QubitsTopology, QubitNodelogin_key = "your_key"
machine_name = "tianyan176"
platform = TianYanPlatform(login_key=login_key, machine_name=machine_name)config = platform.download_config() # 下载参数couplers_map: dict = config['overview']['coupler_map'] # {'G0':['Q1', 'Q0'], ...}
disable_couplers = config['disabledCouplers'].split(",") # ['G0', ...]
for Gi in disable_couplers: # 删掉不能用的耦合couplers_map.pop(Gi)couplers = [] # [[4,3], ..]
for k, v in couplers_map.items():couplers.append([int(v[0][1:]), int(v[1][1:])])topology = QubitsTopology([QubitNode(i, poi_x = 2*(i%6)+(1-(i//6)%2), poi_y = i//6) for i in range(66)])for pair in couplers:topology[pair[0]] >> topology[pair[1]] # type:ignore# 删除不可用的物理比特
disable_qubits = [int(item[1:]) for item in config['disabledQubits'].split(",")]for i in disable_qubits:topology.remove_qubit_node(i)topology.show()
## 构造 tianyan176-2 拓扑图from cqlib import TianYanPlatform
from mindquantum.device import QubitsTopology, QubitNodelogin_key = "your_key"
machine_name = "tianyan176-2"
platform = TianYanPlatform(login_key=login_key, machine_name=machine_name)config = platform.download_config() # 下载参数couplers_map: dict = config['overview']['coupler_map'] # {'G0':['Q1', 'Q0'], ...}
disable_couplers = config['disabledCouplers'].split(",") # ['G0', ...]
for Gi in disable_couplers: # 删掉不能用的耦合couplers_map.pop(Gi)couplers = [] # [[4,3], ..]
for k, v in couplers_map.items():couplers.append([int(v[0][1:]), int(v[1][1:])])topology = QubitsTopology([QubitNode(i, poi_x = 2*(i%6)+(1-(i//6)%2), poi_y = i//6) for i in range(66)])for pair in couplers:topology[pair[0]] >> topology[pair[1]] # type:ignore# 删除不可用的物理比特
disable_qubits = [int(item[1:]) for item in config['disabledQubits'].split(",")]for i in disable_qubits:topology.remove_qubit_node(i)topology.show()
最后,我们将上述功能封装为一个函数,从而可一键生成想要的拓扑图。
## 构造 tianyan176 拓扑图from cqlib import TianYanPlatform
from mindquantum.device import QubitsTopology, QubitNodelogin_key = "your_key"def get_topology(machine_name:str):"""根据给定的真机名称,自动下载参数,并生成拓扑图。machine_name 可选:'tianyan24', 'tianyan176', 'tianyan176-2'。"""platform = TianYanPlatform(login_key=login_key, machine_name=machine_name)config = platform.download_config() # 下载参数couplers_map: dict = config['overview']['coupler_map'] # {'G0':['Q1', 'Q0'], ...}disable_couplers = config['disabledCouplers'].split(",") # ['G0', ...]for Gi in disable_couplers: # 删掉不能用的耦合couplers_map.pop(Gi)couplers = [] # [[4,3], ..]for k, v in couplers_map.items():couplers.append([int(v[0][1:]), int(v[1][1:])])if "176" in machine_name:topology = QubitsTopology([QubitNode(i, poi_x = 2*(i%6)+(1-(i//6)%2), poi_y = i//6) for i in range(66)])else:topology = QubitsTopology([QubitNode(i, poi_x=i%12, poi_y=i>=12) for i in range(24)])for pair in couplers:topology[pair[0]] >> topology[pair[1]] # type:ignore# 删除不可用的物理比特disable_qubits = [int(item[1:]) for item in config['disabledQubits'].split(",")]for i in disable_qubits:topology.remove_qubit_node(i)return topologytopology = get_topology("tianyan24")
topology.show()
比特映射
在绘制完拓扑图之后,即可参照教程 比特映射 对量子算法实行比特映射,进而在硬件上执行获得实测数据。
注意:在实际测试中,使用上面构造的拓扑图进行比特映射时,会出现崩溃,目前尚未搞清原因所在。希望读者在参照本文实操时,我或者 MindQuantum 团队已经修复了该 bug。