QPanda3
Supported by OriginQ
载入中...
搜索中...
未找到
动态线路


上一章: 量子程序

下一章: 量子线路与量子程序


简介

动态线路(Dynamic Circuits)是量子计算中的一种新型线路设计,其核心在于在线路执行过程中引入中间测量,并将测量结果(经典信息)实时反馈至后续 操作。这一设计突破了传统静态量子线路的固定结构,使量子计算能够根据中间结果动态调整逻辑门操作,从而优化资源利用并提升算法效率。

QPanda3目前支持的动态线路特性包括

  • 使用简洁的经典比特索引列表作为动态流程控制的判断条件(当列表中所有索引对应的经典比特的值都为1时,条件判真)
  • 允许根据中间测量的结果选择后续分支线路继续执行
  • 允许根据中间测量的结果循环执行某段子线路

分支型动态线路

条件执行

from pyqpanda3.core import QProg,X,Y,Z,S,T,H,measure,qif,CPUQVM
prog = QProg()
prog << X(0) << measure(0,0)#索引为0的cbit值最终为1
branch_prog = QProg()
branch_prog << X(2)
branch_prog2 = QProg()
branch_prog2 << X(3)
prog << (
qif([0]).then(branch_prog)
.qendif()#此段线路会得到执行
)
prog << measure(1,1) #索引为1的cbit的值最终为0
prog <<(
qif([1]).then(branch_prog2)
.qendif()#此段线路不会得到执行
)
#理论的的演化结果,
#q0被翻转为1,q1保持0,q2为翻转为1,q3保持0,末态为0101,即态矢量中索引为5的元素值为1
qvm = CPUQVM()
qvm.run(prog,1)
stv = qvm.result().get_state_vector()
print('stv:',stv)
定义 __init__.py:1

输出结果

stv: [0j, 0j, 0j, 0j, 0j, (1+0j), 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j]

二分支

from pyqpanda3.core import QProg,X,Y,Z,S,T,H,measure,qif,CPUQVM
prog = QProg()
prog << X(0) << measure(0,0)#索引为0的cbit值最终为1
branch_prog = QProg()
branch_prog << X(2)
branch_prog2 = QProg()
branch_prog2 << X(3)
prog << (
qif([0]).then(branch_prog) #此分支的子线路会被执行
.qelse(branch_prog2) #此分支的子线路不会被执行
)
#理论的的演化结果,
#q0被翻转为1,q1保持0,q2为翻转为1,q3保持0,末态为0101,即态矢量中索引为5的元素值为1
qvm = CPUQVM()
qvm.run(prog,1)
stv = qvm.result().get_state_vector()
print('stv:',stv)

输出结果

stv: [0j, 0j, 0j, 0j, 0j, (1+0j), 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j]

多分支

from pyqpanda3.core import QProg,X,Y,I,Z,S,T,H,measure,qif,CPUQVM
prog = QProg()
prog << X(1)
branch_prog01 = QProg()
branch_prog01 << X(2)<<X(3)
branch_prog0 = QProg()
branch_prog0 << X(2)
branch_prog1 = QProg()
branch_prog1 << X(3)
branch_prog = QProg()
branch_prog <<I(0)
prog << measure(0,0)<<measure(1,1)<<measure(2,2)<<measure(3,3)
prog << (
qif([0,1]).then(branch_prog01)
.qelseif([0]).then(branch_prog0)
.qelseif([1]).then(branch_prog1)#此分支的子线路会被执行
.qelse(branch_prog)
)
#理论的的演化结果,
#q0保持0,q1被翻转为1,q2保持0,q3被翻转为1,末态为1010,即态矢量中索引为10的元素值为1
qvm = CPUQVM()
qvm.run(prog,1)
stv = qvm.result().get_state_vector()
print('stv:',stv)

输出结果

stv: [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, (1+0j), 0j, 0j, 0j, 0j, 0j]

循环型动态线路

from pyqpanda3.core import QProg,X,Y,I,Z,S,T,H,measure,qwhile,CPUQVM
prog = QProg()
prog << X(0)
loop_prog = QProg()
loop_prog <<H(0)<<measure(0,0)
prog << measure(0,0)
prog << qwhile([0]).loop(loop_prog)#第一次一定会执行次循环,当qbit 0概率性的出现值为0的时候,循环终止
for i in range(10):
qvm = CPUQVM()
qvm.run(prog,1)
res = qvm.result().get_state_vector()
print(f'#{i} res:',res)

输出结果(测量结果具有概率性,下边的结果不一定每次一样)

#0 res: [(1+0j), 0j]
#1 res: [(1+0j), 0j]
#2 res: [(1+0j), 0j]
#3 res: [(-1+0j), 0j]
#4 res: [(1+0j), 0j]
#5 res: [(1+0j), 0j]
#6 res: [(-1+0j), 0j]
#7 res: [(-1+0j), 0j]
#8 res: [(1+0j), 0j]
#9 res: [(1+0j), 0j]