Q-Panda 2 SDK(Quantum Panda 2 Software Development Kit)是由本源量子推的开源量子程序开发工具包。其支持主流的量子逻辑门操作,并且可对不同平台下的量子程序进行针对性优化,可适配多种量子芯片。QPanda 2 使用C++语言作为经典宿主语言,并支持以QRunes和QASM书写的量子语言。
目前,QPanda 2.0支持本地仿真运行模式,最高可支持到32位,它集成了量子虚拟机,封装了主流的量子算法。可在无芯片支持的情况下验证量子应用的可靠性和有效性。加上增加了控制流的概念使得量子程序可进行逻辑判断,从而符合高级语言的编程习惯。
QPanda提供基于量子编程的开发环境,可以被应用于各类量子算法(Quantum algorithm )的编程实现,或用于部署于各类量子计算机或量子虚拟机进行计算,还可以应用于量子计算领域的研究和产品开发。
QPanda2的github地址:https://github.com/OriginQ/QPanda-2
QPanda2的readthedocs地址:https://qpanda-2.readthedocs.io/zh_CN/latest/
QPanda2的教学视频地址:https://qcode.qubitonline.cn/QCode/videoLibrary.html
量子教育B站网址:https://www.bilibili.com/video/av42348900
首先从github上下载源码,windows下推荐使用visual stdio编译,QPanda2代码的组成结构大致分为以下几块。
QPanda2核心目录,该部分包括量子逻辑门,量子线路,量子程序以及模拟量子计算的量子虚拟机部分
该部分表示python版本的QPanda,通过编译该模块的封装代码,可以生成python下的QPanda2库
量子应用算法程序
这一部分是架构在QPanda2上的量子机器学习框架。
量子算法演示相关函数
第三库,包括用于矩阵运算的Eigen库,封装解析json文件的rapidjson库以及xml工具tingxml等。
经典计算中,最基本的单元是比特,最基本的控制模式是逻辑门。类似地,在量子计算中,特别是量子线路计算模型中,处理量子比特的基本方式就是量子逻辑门。
量子逻辑门由酉矩阵表示。具体矩阵形式参考量子逻辑门矩阵形式
构建量子逻辑门可直接根据量子逻辑门名称来构建,例如
auto gate0 = H(q[0]);
auto gate1 = CNOT(q[0], q[1]);
auto gate2 = CNOT(q[1], q[2]);
需要注意的是,QGate构建时必须接受参数,否则是没有意义的,参数一般是Qubit类型和浮点数类型,浮点数类型一般象征着可变的角度。
量子线路本质上来说是一系列量子逻辑门或其他量子线路的集合
构建量子线路的例子:
circuit << H(qvec[0]) << CNOT(qvec[0], qvec[1])
<< CNOT(qvec[1], qvec[2]) << CNOT(qvec[2], qvec[3]);
量子线路节点中只能插入其他量子线路或量子逻辑门,不能插入QMeasure类型
量子程序是量子编程过程中的最高单位,它的构建过程类似量子线路
prog << H(qvec[0]) << circuit << Measure(qvec[0], cvec[0]);
量子程序中可以插入测量节点,也可以插入用于逻辑判断的QIf,QWhile节点
通过量子虚拟机,可以在经典计算机上模拟量子计算机的计算过程,比如一个简单的例子
#include "QPanda.h"
USING_QPANDA
int main(void)
{
init(QuantumMachine_type::CPU); // 初始化量子虚拟机
auto c = cAllocMany(2); // 申请经典寄存器
auto q = qAllocMany(2); // 申请量子比特
QProg prog;
prog << H(q[0])
<< H(q[1])
<< Measure(q[0],c[0])
<< Measure(q[1],c[1]);
auto result = runWithConfiguration(prog,c,100);
for(auto & aiter : result)
{
std::cout << aiter.first << " : " << aiter.second << std::endl;
}
finalize(); // 释放量子虚拟机
return 0;
}
量子虚拟机的核心任务就是执行量子程序并获取计算结果
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语句中部分关键词作用如下:
%
的作用是从%开始,到该行的结尾,是程序的行注释,就类似于C语言的”//”,注释的语句会被完全忽略。QUINT
的作用是在量子程序中第一行(除注释之外)显式定义量子比特数,这一行定义将被自动附带到程序的开头。CREG
的作用是在一个量子程序中第二行(除注释之外)显式定义经典寄存器数。在量子计算机运行时,所有的测量值都会被保存到经典计算机上并且导出。这一行定义将被自动附带到程序的第二行。H
的作用是对目标量子比特进行Hadamard门操作,与之类似的关键词有X、Y、NOT等等。CNOT
的作用是对两个量子比特执行CNOT操作。输入参数为控制量子比特序号和目标量子比特序号,与之类似的关键词有CZ,ISWAP等。MEASURE
的作用对目标量子比特进行测量并将测量结果保存在对应的经典寄存器里面,输入参数为目标量子比特序号和保存测量结果的经典寄存器序号。CONTROL & ENDCONTROL
的作用是根据经典寄存器的值对CONTROL与ENDCONTROL语句之间的操作进行受控操作DAGGER & ENDDAGGER
的作用是对DAGGER与ENDDAGGER语句之间的操作进行转置共轭操作
上述语句只是QRunes语法中的一小部分,QRunes支持更多的逻辑门种类同时还包含每个量子线路和每个量子逻辑门中是否包含受控量子比特信息以及是否Dagger。
关于QRunes更多详细信息的介绍、使用与体验请参考 本源量子计算云平台官网