查看原文
其他

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

OriginQ 本源量子 2021-02-13

hi~

上周为大家推送了

量子程序序列化以及

解析量子程序的二进制文件

今天小编要介绍的是

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

跟我们一起来学习吧!




在上一篇文章中,小编已经就量子程序序列化以及解析量子程序的二进制文件这部分内容作了详细的说明。

量子程序序列化即定义一种协议将量子程序序列化为二进制数据,方便量子程序的存储与传输。解析量子程序二进制文件即解析序列化的量子程序。

在今天,小编将为大家解读QRunes是如何转化为量子程序、量子程序转化QASM的。

QRunes转化为量子程序

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

QRunes

QRunes的书写格式规范与例程,可以参考量子程序转化QRunes模块中的QRunes介绍部分。

QPanda 2提供了QRunes文件转换工具接

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

实例

在使用该功能之前,需要先书写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指令集转化量子程序的过程。

#include "Core/QPanda.h"

USING_QPANDA


const string sQRunesPath("D:\\QRunes");


int main(void)

{

    auto qvm = initQuantumMachine();

    auto prog = CreateEmptyQProg();
    transformQRunesToQProg(
"D:\\QRunes", prog,qvm);

    destroyQuantumMachine(qvm);    

return 0;

}

具体步骤如下:

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

2、接着,用CreateEmptyQProg()创建一个空的量子程序,用于接收QRunes指令集转化后的量子程序;

3、然后,调用transformQRunesToQProg(sQRunesPath, prog,qvm)转化。该接口需要三个参数,依次是QRunes指令集文本文件的地址,空的量子程序以及当前的量子虚拟机指针;

4、最后,使用destroyQuantumMachine结束,释放系统资源。

小技巧

我们可以调用量子程序转化QRunes函数接口transformQProgToQRunes(QProg & ,Quantummachine *)来验证是否转化成功。

错误提示

假如在解析QRunes文件直到生成量子程序的过程中发生错误,你可以根据控制台打印的错误信息来判断出错的类型,以下是错误信息及描述。



量子程序转化QASM

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

QASM介绍

QASM(Quantum Assembly Language)是IBM公司提出的量子汇编语言,与QRunes介绍中的语法规则类似,一段QASM代码如下所示:

OPENQASM 2.0;

include "qelib1.inc";

qreg q[10];

creg c[10];


x q[0];

h q[1];

tdg q[2];

sdg q[2];

cx q[0],q[2];

cx q[1],q[4];

u1(pi) q[0];

u2(pi,pi) q[1];

u3(pi,pi,pi) q[2];

cz q[2],q[5];

ccx q[3],q[4],q[6];

cu3(pi,pi,pi) q[0],q[1];

measure q[2] -> c[2];

measure q[0] -> c[0];

需要注意的是,QASM的语法格式与QRunes形相似而神不同,主要区别有以下几点:

1、QRunes对于需要进行转置共轭操作的量子逻辑门与量子线路,需要将目标置于DAGGER与ENDAGGER语句之间,而QASM会直接进行转化。

2、QRunes支持对量子逻辑门与量子线路施加控制操作,而QASM不支持,在对量子程序转化QASM指令集之前,会对其中包含的控制操作进行分解。

关于QASM更多详细信息的介绍、使用与体验请参考IBM Q Experience量子云平台。

QPanda2提供了QASM转换工具接口std::string transformQProgToQASM(QProg &, QuantumMachine*)。该接口使用非常简单,具体可参考下方示例程序。

实例

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

#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 << transformQProgToQASM(prog,qvm);  

 

     destroyQuantumMachine(qvm);

     return 0;

}

具体步骤如下:

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

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

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

4、最后,调用接口transformQProgToQASM输出QASM指令集。该接口需要两个参数,分别是待转换的量子程序以及当前的量子虚拟机指针;

5、最后,使用destroyQuantumMachine结束,释放系统资源。

运行结果如下:

openqasm 2.0;

qreg q[6];

creg c[6];

h q[1];

x q[2];

hdg q[1];

rx(0.636620) q[1];

hdg q[2];

ydg q[2];

cr(1.570796) q[1],q[2];

measure q[0] -> c[0];

measure q[1] -> c[1];

measure q[2] -> c[2];

measure q[3] -> c[3];

measure q[4] -> c[4];

measure q[5] -> c[5];

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

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

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

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

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


往期精彩回顾

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

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

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

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

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

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


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

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