第1章 Quick Start

1.1 QRunes简介

QRunes是一种面向过程、命令式的量子编程语言Imperative language(这也是当前主流的一种编程范式),它的出现是为了实现量子算法。QRunes根据量子计算的经典与量子混合(Quantum-Classical Hybrid)特性,在程序编译之后可以操纵经典计算机与量子芯片来实现量子计算。

QRunes通过提供高级语言的形式(类C的编程风格)来量子算法的实现和程序逻辑控制。其丰富的类型系统(Quantum Type,Auxiliary Type,Classical Type)可以实现量子计算中数据对象的绑定和行为控制, 可以满足各类量子算法开发人员的算法实现需求。

QRunes构成:Settings, QCodes和Script。其中Settings部分定义了关于QRunes编译的全局信息;QCodes部分是具体的对于量子比特操作和行为的控制;Script部分是宿主程序的实现,它的实现依赖于经典编程语言(C++,Python等)和相关联的量子程序开发工具包(比如:QPanda/pyQPanda)。

1.2 QRunes开发环境

1.2.1 QRunes与QPanda/pyQPanda

QPanda

QPanda SDK是由本源量子推出的,基于量子云服务的,开源的量子软件开发包。用户可基于此开发包开发在云端执行的量子程序。QPanda使用C++语言作为经典宿主语言,支持以QRunes书写的量子语言。 目前,QPanda支持本地仿真运行模式和云仿真运行模式,最高可支持到32位。Q-Panda提供了一个可执行的命令行程序,通过指令控制量子程序的加载、运行和读出。另外,QPanda提供了一组API,可供用户自行定制功能。

QPanda 2

QPanda 2(Quantum Programming Architecture for NISQ Device Applications)是一个高效的量子计算开发工具库,可用于实现各种量子算法,QPanda 2基于C++实现,并可扩展到Python。

PyQPanda

PyQPanda是我们通过pybind11工具,以一种直接和简明的方式,对QPanda2中的函数、类进行封装,并且提供了几乎完美的映射功能。 封装部分的代码在QPanda2编译时会生成为动态库,从而可以作为python的包引入。

1.2.2 开发环境配置与运行

为了兼容高效与便捷,我们为您提供了C++ 和 Python(pyQPanda)两个版本,pyQPanda封装了C++对外提供的接口。

C++的使用

使用QPanda 2相对于pyQPanda会复杂一些,不过学会编译和使用QPanda 2,您会有更多的体验,更多详情可以阅读 使用文档。话不多说,我们先从介绍Linux下的编译环境开始。

编译环境

在下载编译之前,我们需要:

software version
GCC >= 5.4.0
CMake >= 3.1
Python >= 3.6.0

下载和编译

我们需要在Linux终端下输入以下命令:

安装

编译完成后,安装就简单的多,只需要输入以下命令:

  • $ make install

开始量子编程

现在我们来到最后一关,创建和编译自己的量子应用。 我相信对于关心如何使用QPanda 2的朋友来说,如何创建C++项目,不需要我多说。不过,我还是需要提供CMakelist的示例,方便大家参考。

cmake_minimum_required(VERSION 3.1)
project(testQPanda)
SET(CMAKE_INSTALL_PREFIX "/usr/local")
SET(CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH} "${CMAKE_INSTALL_PREFIX} lib/cmake")

add_definitions("-std=c++14 -w -DGTEST_USE_OWN_TR1_TUPLE=1")
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3")
add_compile_options(-fPIC -fpermissive)
find_package(QPANDA REQUIRED)
if (QPANDA_FOUND)

    include_directories(${QPANDA_INCLUDE_DIR}
                    ${THIRD_INCLUDE_DIR})
    add_executable(${PROJECT_NAME} test.cpp)
    target_link_libraries(${PROJECT_NAME} ${QPANDA_LIBRARIES})
endif (QPANDA_FOUND)

我们接下来通过一个示例介绍QPanda 2的使用,此例子构造了一个量子叠加态。在量子程序中依次添加H门和CNOT门,最后对所有的量子比特进行测量操作。此时,将有50%的概率得到00或者11的测量结果。

#include "QPanda.h"
#include <stdio.h>
using namespace QPanda;
int main()
{
    init(QMachineType::CPU);
    QProg prog;
    auto q = qAllocMany(2);
    auto c = cAllocMany(2);
    prog << H(q[0])
        << CNOT(q[0],q[1])
        << MeasureAll(q, c);
    auto results = runWithConfiguration(prog, c, 1000);
    for (auto result : results){
        printf("%s : %d\n", result.first.c_str(), result.second);
    }
    finalize();
}

最后,编译,齐活。

$ mkdir build
$ cd build
$ cmake ..
$ make

运行结果如下:

00 : 512
11 : 488

python的使用

pyQPanda只需要通过pip就可安装使用。

  • -pip install pyqpanda

我们接下来通过一个示例介绍pyQPanda的使用,此例子构造了一个量子叠加态。在量子程序中依次添加H门和CNOT门,最后对所有的量子比特进行测量操作。此时,将有50%的概率得到00或者11的测量结果。

from pyqpanda import *

init(QMachineType.CPU)
prog = QProg()
q = qAlloc_many(2)
c = cAlloc_many(2)
prog.insert(H(q[0]))
prog.insert(CNOT(q[0],q[1]))
prog.insert(measure_all(q,c))
result = run_with_configuration(prog, cbit_list = c, shots = 1000)
print(result)
finalize()

运行结果如下:

{'00': 493, '11': 507}

1.3 Qurator介绍

qurator-vscode 是本源量子推出的一款可以开发量子程序的 VS Code 插件。其支持 QRunes2 语言量子程序开发,并支持 Python 和 C++ 语言作为经典宿主语言。

在 qurator-vscode 中,量子程序的开发主要分为编写和运行两个部分。

  • 编写程序:插件支持模块化编程,在不同的模块实现不同的功能,其中量子程序的编写主要在 qcodes 模块中;
  • 程序运行:即是收集结果的过程,插件支持图表化数据展示,将运行结果更加清晰的展现在您的面前。

1.3.1 qurator-vscode 设计思想

考虑到目前量子程序的开发离不开经典宿主语言的辅助,qurator-vscode 插件设计时考虑到一下几点:

1. 模块编程: qurator-vscode 插件支持模块编程,将整体程序分为三个模块:settings、qcodes 和 script 模块。在不同的模块完成不同的功能。 在 settings 模块中,您可以进行宿主语言类型、编译还是运行等设置;在 qcodes 模块中, 您可以编写 QRunes2 语言程序; 在 script 模块中,您可以编写相应的宿主语言程序。

2. 切换简单: qurator-vscode 插件目前支持两种宿主语言,分别为 Python 和 C++。您可以在两种宿主语言之间自由的切换,您只需要在 settings 模块中设置 language 的 类型,就可以在 script 模块中编写对应宿主语言的代码。插件会自动识别您所选择的宿主语言,并在 script 模块中提供相应的辅助功能。

3. 图形展示: qurator-vscode 插件提供图形化的结果展示,程序运行后会展示 json 格式的运行结果,您可以点击运行结果,会生成相应的柱状图,方便您对运行结果的分析。

1.4 初窥QRunes

1.4.1 QRunes关键字

int Hamiltionian
float variationalCircuit
double var
bool circuitGen
map  
qubit  
cbit  
vector  

1.4.2 QRunes程序结构

QRunes由三部分组成

settings 模块中可以设置宿主语言,编译还是运行;

@settings:
    language = Python;
    autoimport = True;
    compile_only = False;

qcodes 模块中可以编写 QRunes2 量子语言代码;

D_J(qvec q,cvec c){
    RX(q[1],Pi);
    H(q[0]);
    H(q[1]);
    CNOT(q[0],q[1]);
    H(q[0]);
    Measure(q[0],c[0]);
}

script 模块中可以编写宿主语言代码,目前支持 Python 和 C++ 两种宿主语言。

init(QuantumMachine_type.CPU_SINGLE_THREAD)
q = qAlloc_many(2)
c = cAlloc_many(2)
qprog1 = D_J(q,c)
result = directly_run(qprog1)
print(result)
finalize()

1.4.3 Oops!你的第一个量子程序

点击右上方 Run this QRunes 运行程序,或者使用命令提示符 qurator-vscode: Run this QRunes 来运行程序(快捷键 F5),点击运行结果可以以柱状图的的形式展示。

../_images/run.jpg

小结