查看原文
其他

QPanda 2教程资源 | 量子程序转化为QRunes、Quil

OriginQ 本源量子 2021-02-13


hi~

上篇为大家推送了

QRunes转化为量子程序、量子程序转化QASM

今天小编要介绍的是

量子程序转化为QRunes、Quil

跟我们一起来学习吧!




在上一篇文章中,小编已经就QRunes转化为量子程序、量子程序转化QASM这部分内容作了详细的说明。

QRunes转化为量子程序即通过该功能模块,你可以解析QRunes文本文件,将其中的量子逻辑门操作信息提取出来,得到QPanda 2内部可操作的量子程序。

量子程序转化QASM即通过该功能模块,你可以解析通过QPanda 2构建的量子程序,将其中包含的量子比特信息以及量子逻辑门操作信息提取出来,得到按固定格式存储的QASM指令集。

今天,小编将为大家介绍的量子程序如何转化为QRunes、Quil的

量子程序转化QRunes

通过该功能模块,你可以解析通过QPanda 2构建的量子程序,将其中包含的量子比特信息以及量子逻辑门操作信息提取出来,得到按固定格式存储的QRunes指令集。

//QRunes介绍//

QRunes是本源量子推出的量子指令集,是一种运行在量子计算机上的一组基本指令,它可以直接控制量子计算机的运行。QRunes可以从一个很低级的层次直接描述量子程序、量子算法,它的地位类似于经典计算机中的硬件描述语言或者汇编语言。

特别要提到的是,QRunes的设计目的是为了直接操纵量子计算机的动作。在一个QRunes程序中,只包含了量子计算机一次执行所需要进行的动作。也就是说,这一组指令集不包含任何逻辑判断。语言所不具备的变量系统,都将以更高层次的量子语言去封装。

QRunes的语法十分直接,基本采用了指令加参数列表的设计方法。几乎对于每一条指令而言,第一个单词或字母是操作的标识符,后面是需要操作的目标,一个简单的量子程序的例子如下:

QINIT 6 

CREG 2 

H 0 

CNOT 0,1 

CONTROL 1 

X 1 

Y 2 

ENDCONTROL 1 

DAGGER 

X 2 

CZ 0,1 

ENDDAGGER 

MEASURE 0,$0 

MEASURE 1,$1

QRunes语句中部分关键词作用如下:

1、%的作用是从%开始,到该行的结尾,是程序的行注释,就类似于C语言的"//",注释的语句会被完全忽略。

2、QINIT的作用是在量子程序中第一行(除注释之外)显式定义量子比特数,这一行定义将被自动附带到程序的开头。

3、CREG的作用是在一个量子程序中第二行(除注释之外)显式定义经典寄存器数。在量子计算机运行时,所有的测量值都会被保存到经典计算机上并且导出。这一行定义将被自动附带到程序的第二行。

4、H的作用是对目标量子比特进行Hadamard门操作,与之类似的关键词有X、Y、NOT等等。

5、CNOT的作用是对两个量子比特执行CNOT操作。输入参数为控制量子比特序号和目标量子比特序号,与之类似的关键词有CZ,ISWAP等。

6、MEASURE的作用对目标量子比特进行测量,并将测量结果保存在对应的经典寄存器里面,输入参数为目标量子比特序号和保存测量结果的经典寄存器序号。

7、CONTROL&ENDCONTROL的作用是根据经典寄存器的值对CONTROL与ENDCONTROL语句之间的操作进行受控操作。

8、DAGGER&ENDDAGGER的作用是对DAGGER与ENDDAGGER语句之间的操作进行转置共轭操作。

上述语句只是QRunes语法中的一小部分,QRunes支持更多的逻辑门种类,同时还包含每个量子线路和每个量子逻辑门中是否包含受控量子比特信息以及是否处于转置共轭形式。

关于QRunes更多详细信息的介绍、使用与体验请参考本源量子计算云平台官网。

QPanda 2提供了QRunes转换工具接口

std::string transformQProgToQRunes(QProg &, QuantumMachine*),该接口使用非常简单,具体可参考下方示例程序。

//实例//

下面的例程通过简单的接口调用,演示了量子程序转化QRunes指令集的过程。

#include "Core/QPanda.h"

USING_QPANDA


int main(void)

     auto qvm = initQuantumMachine(); 


     auto prog = CreateEmptyQProg(); 

     auto cir = CreateEmptyCircuit();

      

     auto q = qvm->allocateQubits(6); 

     auto c = qvm->allocateCBits(6); 

     


     cir << Y(q[2]) << H(q[2]); 

     cir.setDagger(true); 


     auto h1 = H(q[1]); 

     h1.setDagger(true); 


     prog << H(q[1]) 

            << X(q[2]) 

            << h1 

            << RX(q[1], 2 / PI) 

            << cir 

            << CR(q[1], q[2], PI / 2) 

<<MeasureAll(q,c);

 

     cout << transformQProgToQRunes(prog,qvm);  


     destroyQuantumMachine(qvm); 

return 0;                         

}

具体步骤如下:

1、首先,在主程序中用initQuantumMachine()初始化一个量子虚拟机对象;

2、接着,用allocateQubits()和allocateCBits()初始化量子比特与经典寄存器数目;

3、然后,调用CreateEmptyQProg()构建量子程序;

4、最后,调用接口transformQProgToQRunes输出QRunes指令集,该接口需要两个参数,分别是待转换的量子程序以及当前的量子虚拟机指针,并用finalize()释放系统资源。

运行结果如下:

QINIT 6 

CREG 6 

H 1 

X 2 

DAGGER 

H 1 

ENDAGGER 

RX 1,"0.636620" 

DAGGER 

Y 2 

H 2 

ENDAGGER 

CR 1,2,"1.570796" 

MEASURE 0,$0 

MEASURE 1,$1 

MEASURE 2,$2 

MEASURE 3,$3 

MEASURE 4,$4

MEASURE 5,$5

注解

对于暂不支持的操作类型,QRunes会显示UnSupported XXXNode,其中XXX为具体的节点类型。

量子程序转化为Quil
//简介//

Quil指令集语法与QRunes基本相似。也是采用了指令集加参数列表的设计方法。一个简单的量子程序例子如下:

X 0

Y 1

CNOT 0 1

H 0

RX(-3.141593) 0

MEASURE 1 [0]

1、X的作用是对目标量子比特进行Pauli-X门操作。与之类似的关键词有Y、Z、H等等。

2、Y的作用是对目标量子比特进行Pauli-Y门操作。

3、CNOT的作用是对两个量子比特执行CNOT操作。输入参数为控制量子比特序号和目标量子比特序号。

4、H的作用是对目标量子比特进行Hadamard门操作。

5、MEASURE的作用对目标量子比特进行测量,并将测量结果保存在对应的经典寄存器里面,输入参数为目标量子比特序号和保存测量结果的经典寄存器序号。

上述仅为Quil指令集语法的一小部分, 详细介绍请参考pyQuil

//接口介绍//

QProgToQuil类是QPanda 2提供的一个将量子程序转换为Quil指令集的工具类,我们先用QPanda 2构建一个量子程序:

QProg prog;

auto qubits = qvm->allocateQubits(4);

auto cbits = qvm->allocateCBits(4);


prog << X(qvec[0]) 

         << Y(qvec[1]) 

         << H(qvec[0]) 

         << RX(qvec[0], 3.14) 

         << Measure(qvec[1], cvec[0]);

然后调用QProgToQuil类实现转化,

QProgToQuil t(qvm);

t.transform(prog);

std::string instructions = t.getInsturctions();

我们还可以使用QPanda 2封装的一个接口:

std::string instructions = transformQProgToQuil(prog, qvm);

该接口需要两个参数,分别是待转换的量子程序以及当前的量子虚拟机指针。

//实例//

#include "Core/QPanda.h"

USING_QPANDA



int main(void)

     auto qvm = initQuantumMachine(QMachineType::CPU); 

     auto qubits = qvm->allocateQubits(4); 

     auto cbits = qvm->allocateCBits(4); 

     QProg prog; 

     prog << X(qubits[0]) 

              << Y(qubits[1]) 

              << H(qubits[2]) 

              << RX(qubits[3], 3.14

              << Measure(qubits[0], cbits[0]); 


std::string instructions = transformQProgToQuil(prog, qvm); 

std::cout << instructions << std::endl; 

destroyQuantumMachine(qvm); 

return 0;

}

运行结果:

X 0

Y 1

H 2

RX(3.140000) 3

MEASURE 0 [0]  

★以上即为QPanda 2量子程序转化为QRunes、Quil部分的详细内容介绍。

★感兴趣的欢迎加入"QPanda 2开发交流群"。(关注“本源量子”公众号,回复“加群”,联系小编即可)

★PC端学习量子计算请登录learn-quantum.com 

★掌上学习请下载"本源溯知APP"

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



往期精彩回顾

量子程序序列化以及解析量子程序的二进制文件

逻辑门以及量子程序时钟周期统计

量子门的有效性及判断方法

量子比特的测量方法:量子测量和概率测量

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

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


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

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