查看原文
其他

QPanda 2教程资源​ | 构建量子程序、QWhile与QIf的方法

OriginQ 本源量子 2021-02-13

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循环操作


QWhile


量子程序循环控制操作,输入参数为条件判断表达式,功能是执行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


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_truebranch_false,通过 << 操作符把量子逻辑门和经典表达式插入到branch_truebranch_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"

★如有疑问可上量子互动论坛,与我们的大神进行交流讨论。


往期精彩回顾

QPanda 2最常用的量子计算模型——量子线路

嗨玩本源QPanda 2,从量子逻辑门实例开始学起!

本源QPanda全装备教你量子软件编程

QPanda更新带来4种量子虚拟机+2种开发工具

【新品】国内首款量子软件开发包QPanda 2.0 升级发布!

Origin Q发布国内首款量子软件开发包Q-Panda


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存