上一节中提到,QRunes文本是用于表述量子程序的指令集文本,所以在使用QPanda2的过程中不可避免的牵扯到量子程序的转化问题,在QPanda2中提供相关的函数接口支持转化功能的实现。
欲使用这一功能,我们先进行量子程序的构建。具体看下面这一段简单的示例代码
init();
auto prog = CreateEmptyQProg();
auto cir = CreateEmptyCircuit();
auto q0 = qAlloc();
auto q1 = qAlloc();
auto q2 = qAlloc();
auto c0 = cAlloc();
cir << Y(q2) << CNOT(q0,q1) << H(q2);
auto h1 = H(q1);
h1.setDagger(true);
prog << CZ(q0, q2) << H(q1) << CZ(q1, q2) << X(q2) << h1 <<RX(q1,2/PI);
cout << qProgToQRunes(prog);
finalize();
需要注意的是为了模拟量子计算环境,一定要在程序开始前用init()初始化全局系统资源,在程序结束后用finalize()释放系统资源。
通过CreateEmptyQProg()与CreateEmptyCircuit()创建空的量子程序与量子线路
通过qAlloc()与cAlloc()申请量子比特与经典内存,当然也可以用qAllocmany()与cAllocmany()一次性申请多个
接着就是构建量子程序,值得一提的是量子线路节点中仅包含量子逻辑门节点与其他量子线路节点
然后调用QPanda2的接口来输出量子程序指令集
输出的结果如下:
QINIT 3
CREG 1
CZ 0,2
H 1
CZ 1,2
X 2
DAGGER
H 1
ENDAGGER
RX 1,"0.636620"
Y 2
CNOT 0,1
H 2
QASM的语法格式与QRunes类似,但是存在些许不同,具体可以参考 QASM介绍
它的转化过程可以参考如下示例代码
init();
auto prog = CreateEmptyQProg();
auto cir = CreateEmptyCircuit();
auto q0 = qAlloc();
auto q1 = qAlloc();
auto q2 = qAlloc();
auto c0 = cAlloc();
cir << Y(q2) << CNOT(q0, q1) << H(q2);
auto h1 = H(q1);
h1.setDagger(true);
prog << CZ(q0, q2) << H(q1) << CZ(q1, q2) << X(q2) << h1<<RX(q1,2/PI) << cir;
cout << qProgToQASM(prog);
finalize();
同时转化的结果如下
openqasm 2.0;
qreg q[3];
creg c[1];
h q[1];
x q[2];
hdg q[1];
rx(0.636620) q[1];
y q[2];
rxdg(1.570796) q[0];
rydg(1.570796) q[0];
rxdg(-1.570796) q[0];
rzdg(3.141593) q[1];
rydg(1.570796) q[1];
cnotdg q[0],q[1];
rydg(-1.570796) q[1];
rzdg(-1.570796) q[1];
cnotdg q[0],q[1];
rzdg(-1.570796) q[1];
h q[2];
通过结果可以发现,输出结果较为复杂,这是因为QASM的语法规则对于某些量子逻辑门支持不完善,在QPanda2内部需要通过转化算法将不支持的量子逻辑门转化成支持的量子逻辑门。
该功能相当于量子程序转化QRunes的逆过程,借助该功能可以直接书写QRunes量子程序文本文件,然后调用qRunesToQProg()接口完成转换,这样可以省去复杂的量子程序构建过程,提高开发效率
init();
auto prog = CreateEmptyQProg();
qRunesToQProg("D:\\QRunes", prog);
finalize();