量子比特池¶
简介¶
QPanda之前版本中量子比特和经典寄存器都是通过虚拟机进行申请,管理,控制。 现在提供独立于虚拟机的方法,即量子比特、经典寄存器不通过虚拟机管理,可以由提供的比特池直接申请、释放。 为了更好的使用量子比特和经典寄存器,我们进一步支持以物理地址代表相应比特使用。
接口说明¶
量子比特池:
OriginQubitPool
获取单例的量子比特池, 通过该池对象申请释放量子比特
get_capacity
获取最大容量
set_capacity
设置容量
get_qubit_by_addr
通过物理地址获取量子比特
经典寄存器池:
OriginCMem
获取单例的经典寄存器池,通过该池对象申请释放经典寄存器
get_capacity
获取最大容量
set_capacity
设置容量
get_cbit_by_addr
通过物理地址获取量子比特
由于申请释放方法均和虚拟机提供的方法相同。 在 量子虚拟机 中有详细介绍。 同时对于量子比特和经典寄存器的使用,现在也可以直接通过对应比特的地址传参。
例如 :
H(1)
可以理解在物理地址为1的量子比特上作用H门。
Measure(1, 1)
可以理解在物理地址为1的量子比特施加Meausre测量,并将结果保存在地址为1的经典寄存器上。
实例¶
from pyqpanda import *
from numpy import pi
if __name__=="__main__":
# 量子比特可以和虚拟机 脱离关系,获取对应池的单例,这里和QPanda不同,构建的对象就是单例的池
qpool = OriginQubitPool()
qpool_1 = OriginQubitPool()
cmem = OriginCMem()
# 获取量子比特池容量
print("get_capacity : ", qpool.get_capacity())
# 设置量子比特池容量
qpool.set_capacity(20)
print("qpool get_capacity : ", qpool.get_capacity())
#由于获取量子比特池是单例对象,上面设置容量为20,这里qool_1 获取容量也会为20
print("qpool_1 get_capacity : ", qpool_1.get_capacity())
# 通过比特池申请比特,由于是单例模式,要保证申请的比特数量不超过最大容量
qv = qpool.qAlloc_many(6)
cv = cmem.cAlloc_many(6)
# 构建虚拟机
qvm = CPUQVM()
qvm.init_qvm()
prog = QProg()
# 直接使用物理地址作为量子比特信息入参
prog << H(0)\
<< H(1)\
<< H(2)\
<< H(4)\
<< X(5)\
<< X1(2)\
<< CZ(2, 3)\
<< RX(3, pi / 4)\
<< CR(4, 5, pi / 2)\
<< SWAP(3, 5)\
<< CU(1, 3, pi / 2, pi / 3, pi / 4, pi / 5)\
<< U4(4, 2.1, 2.2, 2.3, 2.4)\
<< BARRIER([0, 1,2,3,4,5])\
<< BARRIER(0)
#print(prog)
# 测量方法也可以使用比特物理地址
res_0 = qvm.prob_run_dict(prog, [ 0,1,2,3,4,5 ])
#res_1 = qvm.prob_run_dict(prog, qv) #同等上述方法
#print(res_0)
# 同样经典比特地址也可以作为经典比特信息入参
prog << Measure(0, 0)\
<< Measure(1, 1)\
<< Measure(2, 2)\
<< Measure(3, 3)\
<< Measure(4, 4)\
<< Measure(5, 5)
# 使用经典比特地址入参
res_2 = qvm.run_with_configuration(prog, [ 0,1,2,3,4,5 ], 5000)
# res_3 = qvm.run_with_configuration(prog, cv, 5000) #同等上述方法
#print(res_2)
# 同时我们还可以再次利用这里申请的qv,避免多次使用虚拟机多次申请比特的问题发生
qvm_noise = NoiseQVM()
qvm_noise.init_qvm()
res_4 = qvm_noise.run_with_configuration(prog, [ 0,1,2,3,4,5 ], 5000)
运行结果:
get_capacity : 29
qpool get_capacity : 20
qpool_1 get_capacity : 20