QPanda 2教程资源 | 构建量子程序、QWhile与QIf的方法
hi~大家周末好
继上篇推出的量子线路后
小编将为大家持续蓄能啦
今天为你们带来的是
量子程序、QWhile、QIf的构建方法
请随我们一起充电加油吧
在上一篇文章中,小编已经为大家具体介绍了量子线路部分。量子线路是最常用的量子计算模型,它是对量子比特进行操作的线路,由量子逻辑门组成。量子线路是量子程序的一部分,量子程序设计研究的是如何为将来的量子计算机设计程序。接下来我们将为大家讲讲量子程序、QWhile、QIf的构建方法。
量子程序设计用于量子程序编写与构造,一般可理解为一个操作序列。由于量子算法中也包含了经典计算,因此业界设想,将来出现的量子计算机是混合结构的。它包含两大部分:一部分是经典计算机,负责执行经典计算与控制;另一部分是量子设备,负责执行量子计算。QPanda 2将量子程序的编程过程视作经典程序运行的一部分,在整个外围的宿主机程序中,一定包含创建量子程序的部分。
在QPanda 2中,QProg是量子编程的一个容器类,是一个量子程序的最高单位,初始化一个空的QProg对象有以下两种:
C++风格
QProg prog = QProg();
C语言风格
QProg prog = CreateEmptyQProg();
QProg的构造函数还有以下几种:
1.通过QNode*构造量子程序:
auto qubit = qAlloc();
auto gate = H(qubit);
auto pnode = &gate;
QProg prog(pnode);
2.通过shared_ptr<QNode>构造量子程序:
auto qubit = qAlloc();
auto gate = H(qubit);
auto pnode = gate.getImplementationPtr();
QProg prog(pnode);
3.通过量子线路构造量子程序:
auto qubit = qAlloc();
QCircuit circuit;
circuit << H(qubit);
QProg prog(circuit);
4.通过QIf构造量子程序:
auto qubit = qAlloc();
auto cbit = cAlloc();
cbit.setValue(3);
QCircuit circuit;
circuit << H(qubit);
QIfProg qif(cbit > 3, circuit);
QProg prog(qif);
5.通过QWhile构造量子程序:
auto qubit = qAlloc();
auto cbit = cAlloc();
cbit.setValue(3);
QCircuit circuit;
circuit << H(qubit);
QWhileProg qwhile(cbit > 3, circuit);
QProg prog(qwhile);
6.通过QGate构造量子程序:
auto qubit = qAlloc();
auto gate = H(qubit);
QProg prog(gate);
7.通过QMeasure构建量子程序:
auto qubit = qAlloc();
auto cbit = cAlloc();
auto measure = Measure(qubit, cbit);
QProg prog(measure);
8.通过ClassicalCondition构建量子程序:
auto cbit = cAlloc();
QProg prog(cbit);
实现QProg的多种构造函数,主要是为实现各种节点类型向QProg的隐式转换。如:
auto qubit = qAlloc();
auto cbit = cAlloc();
cbit.setValue(1);
auto gate = H(qubit);
auto qif = QIfProg(cbit > 1, gate);
构建QIf的第二个参数本应传入QProg的,但由于QGate可构造QProg,在使用时传入参数QGate就会隐式转换为QProg,使用起来更便捷。
你可以通过如下方式,向QProg尾部填充节点。
QProg << QNode;
或
QProg.pushBackNode(QNode *);
QNode的类型有QGate、QPorg、QIf、QMeasure等,QProg支持插入所有类型的QNode。
以下实例,主要展现了QProg类型接口的使用方式。
1、初始化虚拟机环境:使用init接口初始化一个量子虚拟机,向量子虚拟机申请4个量子比特和4个经典寄存器;
2、构建量子程序:调用CreateEmptyQProg构建一个量子线路prog,通过 << 操作符把量子逻辑门插入到prog中;
3、运行量子程序:调用runWithConfiguration测量运行接口,让量子程序运行1000遍,就可以得到计算结果了。
运行结果:
1000, 242
1001, 277
1110, 254
1111, 227
以上为量子程序的详细介绍,接下来小编将为大家重点介绍执行量子程序的While和If循环操作。
量子程序循环控制操作,输入参数为条件判断表达式,功能是执行while循环操作。
在QPanda 2中,QWhileProg类用于表示执行量子程序while循环操作,初始化一个QWhileProg对象有以下两种方式:
C++风格
QWhileProg qwile = QWhileProg(ClassicalCondition, QProg);
C语言风格
QWhileProg qwile = CreateWhileProg(ClassicalCondition, QProg);
上述函数需要提供两个参数,即ClassicalCondition(量子表达式)与QProg(量子程序)。
注解
由于QNode*、 shared_ptr<QNode>、QCircuit、QIfProg、QWhileProg、QGate、QMeasure、ClassicalCondition可以隐式转换为QProg, 所以在构建QWhile时,第二个参数也可以传入上述中的任意一种节点。
同时,通过该类内置的函数,可以轻松获取QWhile操作正确分支。
QWhileProg qwhile = CreateWhileProg(ClassicalCondition, QProg);
QNode* true_branch = qwhile.getTrueBranch();
也可以获取量子表达式。
QWhileProg qwhile = CreateWhileProg(ClassicalCondition, QProg);
ClassicalCondition* expr = qwhile.getCExpr();
具体操作流程,可参考下方示例。
以下实例,主要展现了QWhile的使用方式。
1、初始化虚拟机环境:使用init接口初始化一个量子虚拟机,构建一个量子程序prog,用来保存QWhile,向量子虚拟机申请3个量子比特和3个经典寄存器,并设置第一个经典寄存器cvec[0]的值为0;
2、构建QWhile:构建一个量子线路prog_in,通过<< 操作符把量子逻辑门和经典表达式插入到prog_in中(这里需要特殊介绍H(qvec[cvec[0]]),它的意思是从qvec的cvec[0]位置取对应量子比特,并对该量子比特进行H门操作),然后通过CreateWhileProg接口构造一个qwhile,这个qwhile的判断条件是cvec[0]<3;
3、运行量子程序:把qwhile插入到prog中,调用probRunTupleList概率测量运行接口,就可以得到计算结果了。
运行结果:
0, 0.125
1, 0.125
2, 0.125
3, 0.125
4, 0.125
5, 0.125
6, 0.125
7, 0.125
QIf表示量子程序条件判断操作,输入参数为条件判断表达式,功能是执行条件判断。
在QPanda 2中,QIfProg类用于表示执行量子程序条件判断操作,初始化一个QIfProg对象有以下两种方式:
C++风格
QIfProg qif = QIfProg(ClassicalCondition, QProg);
QIfProg qif = QIfProg(ClassicalCondition, QProg, QProg);
C语言风格
QIfProg qif = CreateIfProg(ClassicalCondition, QProg);
QIfProg qif = CreateIfProg(ClassicalCondition, QProg, QProg);
上述函数需要提供两种类型参数,即ClassicalCondition与QProg。当传入1个QProg参数时,QProg表示正确分支;当传入2个QProg参数时,第一个表示正确分支,第二个表示错误分支。
注解
由于QNode*、 shared_ptr<QNode>、QCircuit、QIfProg、QWhileProg、QGate、QMeasure、ClassicalCondition可以隐式转换为QProg,所以在构建QIf时第二个参数或第三个参数也可以传入上述中的任意一种节点。
同时,通过该类内置的函数,可以轻松获取QIf操作正确分支与错误分支。
QIfProg qif = CreateIfProg(ClassicalCondition, QProg, QProg);
QNOde* true_branch = qif.getTrueBranch();
QNode* false_branch = qif.getFalseBranch();
也可以获取量子表达式。
QIfProg qif = CreateIfProg(ClassicalCondition, QProg, QProg);
ClassicalCondition* expr = qif.getCExpr();
以下实例,主要展现了QIf的使用方式。
1、 初始化虚拟机环境:使用init接口初始化一个量子虚拟机,构建一个量子程序prog ,用来保存QIf,向量子虚拟机申请3个量子比特和3个经典寄存器,并设置第一个和第二个经典寄存器的值为0 ;
2、 构建QIf:构建两个量子线路branch_true、branch_false,通过 << 操作符把量子逻辑门和经典表达式插入到branch_true和branch_false中,然后通过CreateIfProg接口构造一个qif,这个qif的判断条件是cvec[1]>5;
3、 运行量子程序:把qif插入到prog中,调用probRunTupleList概率测量运行接口,就可以得到计算结果了。
运行结果:
0, 0.5
7, 0.5
1, 0
2, 0
3, 0
4, 0
5, 0
6, 0
★以上即为QPanda 2量子程序、QWhile、QIf三个部分的详细内容介绍。
★感兴趣的欢迎加入"QPanda 2开发交流群"。(关注“本源量子”公众号,回复“加群”,联系小编即可)
★PC端学习量子计算请登录learn-quantum.com
★掌上学习请下载"本源溯知APP"
★如有疑问可上量子互动论坛,与我们的大神进行交流讨论。
往期精彩回顾