HUAWEI HiQ使用手册

华为量子软件HiQ目前包含一套从量子线路图形和程序输入,到编译、模拟的整套量子计算编程框架。HiQ基于并兼容ProjectQ。目前HiQ支持多硬件后端和多API前端扩展,并在华为云上提供HiQ量子计算模拟器仿真平台服务。其中华为云上的模拟器前端包括量子线路编程API、经典-量子混合编程BlockUI以及量子线路编排GUI;后端兼容ProjectQ API,可以支持编译成多种量子计算芯片指令集接口语言、提供华为云上的高性能C++并行和分布式量子计算模拟服务等。HiQ量子计算模拟平台(simulator),从功能上又包括单幅度模拟器、全幅度模拟器,以及量子纠错线路模拟器等。

第一部分:通过HiQ云平台图形界面创建量子模拟项目

利用图形界面进行量子电路图输入的操作比较直观。以下我们按照创建和运行量子电路的一个实例来阐述图形界面上的基本操作。

I. 登陆

登陆HUAWEI HiQ主页,点击 “体验量子编程” 或者主菜单的 “量子计算模拟平台”, 进入编程界面。

../images/loginfrontpage.png

输入测试账号和密码登陆。 如果你没有华为云的账号,请按照页面上的提示进行注册。

../images/loginprompt.png

选择编程环境(图形界面或者代码程界面),输入项目名,点击 “Create Project”。

../images/createproject.png

II. 设置

a. 工程管理

如果你在图形界面(IDE),点击 Menu/New Project,选择编程环境,创建工程(项目)

../images/projmanagement.png

点击 Menu/Open Project,打开工程

../images/openproj.png

点击 Menu/Save Project,保存工程。

../images/saveproj.png

b. 量子电路编辑器图形界面

设置需要的量子比特数:

../images/GUIqubitsetting.png

鼠标置于右端量子电路元件图标上,可以了解每个元件代表的意义

../images/GUIrightclickqubit.png

拖拽增加或者删除量子电路元件

../images/GUImovequbit.png

c. 编程界面

创建新工程,选择 “Code Environment

../images/createcodingproj.png

编程界面输入执行代码

../images/codingenv.png

III. 运行

点击 右上角的执行 (播放) 按钮运行代码或者图形电路

../images/runproj.png

等待执行结果的显示

../images/GUIresult1.png ../images/GUIresult2.png

IV. 一个简单的HiQ Python编程实例

对于HiQ编程的Python接口API,我们先通过一个实例演示其使用方式,然后再详细讲解HiQ前端和后端的连接问题:

实例:随机数生成器

我们演示的第一个例子是随机数生成器,这是基于hiq实现的最简单的量子程序,类似于经典程序中的”Hello World”。我们假设程序的源代码在examples目录下。程序代码如下:

from projectq.ops import H, Measure
from hiq.projectq.backends import SimulatorMPI
from hiq.projectq.cengines import GreedyScheduler, HiQMainEngine

# 创建主引擎。所有的量子程序都必须创建一个主引擎,用于解析后续指令(required)
eng = HiQMainEngine(SimulatorMPI(gate_fusion=True))

# 使用主引擎提供的方法创建一个量子比特
q1 = eng.allocate_qubit()

# 将Hadamard门作用到该量子比特上,创建叠加态
H | q1

# 测量该量子比特。测量基为 {|0>, |1>}
Measure | q1

# 调用主引擎的刷新操作,使得所有指令被执行
eng.flush()

# 输出测量结果。注意到测量结果依然存储在比特中,只是该比特已经塌缩成经典比特
print("Measured: {}".format(int(q1)))

运行该程序,我们可以得到如下的输出:

$ python examples/quantum\_random\_numbers.py
Measured: 0
$ python examples/quantum\_random\_numbers.py
Measured: 0
$ python examples/quantum\_random\_numbers.py
Measured: 1

这些值都是使用HiQ后端C++模拟器在计算机上模拟得到的结果,每次输出0/1都是(伪)随机的。

第二部分:通过HiQ软件接入后端支持

I. 使用编译器接入量子芯片后端平台(在线版本暂不支持)

我们知道已经有一些公司(IBM/Rigetti/et al.)提供了小型量子计算机硬件平台。我们自然会问:使用hiq写的程序可以直接放到这些硬件平台上运行吗?答案是肯定的,只要我们在写程序的时候指定相应的后端。下面这个程序是对随机数生成器程序做的改进,使得该随机数生成器可以在 IBM Quantum Experience 上运行:

import projectq.setups.ibm
from projectq.ops import H, Measure
from projectq import MainEngine
from projectq.backends import IBMBackend

# 创建主引擎,指定所使用的后端为IBM后端。默认情况下后端为模拟器
# 注意到这行代码是和上面随机数生成器代码的唯一区别,后续代码完全一样
eng = MainEngine(IBMBackend(), engine_list = projectq.setups.ibm.get_engine_list())

q1 = eng.allocate_qubit()

H | q1

Measure | q1

eng.flush()

print("Measured: {}".format(int(q1)))

运行该程序,我们可以得到如下的输出(我们假设用户已经申请了试用IBM Quantum Experiment所需要的用户名和密码):

$ python examples/quantum\_random\_numbers\_ibm.py
IBM QE user (e-mail) >  # 在这里输入申请IBM Quantum Experiment时使用的email
IBM QE password >       # 在这里输入申请IBM Quantum Experiment时使用的password
Measured: 1
$ python examples/quantum\_random\_numbers\_ibm.py
IBM QE user (e-mail) >  # 在这里输入申请IBM Quantum Experiment时使用的email
IBM QE password >       # 在这里输入申请IBM Quantum Experiment时使用的password
Measured: 0

II. 使用华为云HiQ量子计算模拟平台作为后端

a. 全幅度模拟器及一般编程基本语法

全幅度量子计算模拟器是HiQ软件模拟量子计算的一种基本功能。它可以计算系统经过演化后的全部量子态密度矩阵元素的幅值。我们借此模拟器的介绍,先对HiQ编程的基本语法做一些展开说明。

HiQ的设计理念是提供尽可能直观的语法让用户写量子程序,使得学习曲线相对平滑。基于此理念,hiq的语法和量子计算中的数学符号用法十分相似。 比如说,我们现在要将x-旋转门作用到某个比特上,该旋转门的旋转角度为 \(\theta\) 。 数学上,这个操作表达为

\[Rx(\theta) \left | \psi \right \rangle\]

其中 \(\left | \psi \right \rangle \) 表示量子比特的状态。在HiQ中对应的实现为

Rx(theta) | qubit

上面,\(Rx\) 是一个量子门类,它重载了 | (或运算) 操作符。重载后的语义是将 \(Rx\) 门作用到qubit上。 更关键的是,| 操作符将经典参数 ( | 左边的内容,这里是 Rx(theta) ) 和量子参数 ( | 右边的内容,这里是qubit) 独立出来,方便编译器的分开处理。

下面,介绍下编译环境:

1. 导入我们在要实现的算法所需要环境包

from projectq.ops import H, Z, X, Measure, All, Ph
from projectq.meta import Loop, Compute, Uncompute, Control
from projectq.cengines import (MainEngine,
                                AutoReplacer,
                                LocalOptimizer,
                                TagRemover,
                                DecompositionRuleSet)
import projectq.setups.decompositions

from hiq.projectq.backends import SimulatorMPI
from hiq.projectq.cengines import GreedyScheduler, HiQMainEngine

from mpi4py import MPI

(1) 包ops包含HiQ支持的一些量子门操作

(2) 包meta包含一些实现的操作优化

(3) backends里面包含我们支持的所有模拟器

(4) cengines包含编译引擎的所有模块

(5) setups可以配置系统主引擎

(6) ctypes是用来访问我们依赖的MPI库

2. 指定后端模拟器,创建主引擎

# create a main compiler engine with a simulator backend:
cache_depth = 10
rule_set = DecompositionRuleSet(modules  = [projectq.setups.decompositions])
engines = [TagRemover(),
            LocalOptimizer(cache_depth),
            AutoReplacer(rule_set),
            TagRemover(),
            LocalOptimizer(cache_depth),
            GreedyScheduler()]

eng = HiQMainEngine(SimulatorMPI, engines)

3. 编写算法逻辑

# make a Bell-pair
b1, b2 = _create_bell_pair(eng)

# Alice creates a nice state to send
psi = eng.allocate_qubit()

print("= Step 1. Alice creates the state to be sent from \|0>")
state_creation_function(eng, psi)

# entangle it with Alice's b1
CNOT | (psi, b1)
print("= Step 2. Alice entangles the state with her share of the Bell-pair")

# measure two values (once in Hadamard basis) and send the bits to Bob
H | psi
Measure | psi
Measure | b1
msg_to_bob = [int(psi), int(b1)]
print("= Step 3. Alice sends the classical message {} to Bob".format(msg_to_bob))

# Bob may have to apply up to two operation depending on the message sent
# by Alice:
with Control(eng, b1):
    X | b2
with Control(eng, psi):
    Z | b2

# try to uncompute the psi state
print("= Step 4. Bob tries to recover the state created by Alice")
with Dagger(eng):
    state_creation_function(eng, b2)

# check whether the uncompute was successful. The simulator only allows to
# delete qubits which are in a computational basis state.
del b2
eng.flush()

print("\\t Bob successfully arrived at \|0>")

b. 单幅度模拟器(Single amplitude simulator)

在华为云HiQ模拟器网上界面engine选择里可以对应选择单幅度模拟器。这种情况下,程序仿真不再计算全部的量子态密度矩阵所有的元素,而是择其一或者按照某个测量量进行特定的简化计算。 其可以计算的比特数规模相应的要比全幅度的模拟要大得多。整体而言,其语法跟全振幅模拟器类似。一些常见的应用场景如下(网站模拟器入口页面可以找到对应的编程实例,这里不再累述):

  1. 生成随机电路:可以利用提供的随机电路生成代码设置量子比特数(N*M),以及电路深度Depth。

2. 设置运行环境参数

amp_number = 1
target = format(amp\_number, '0{}b'.format(nqubits))
source = format(0, '0{}b'.format(nqubits))
kwargs = {'treewidth': 25, 'qbb\_time': 60}

amp_number 设置需要计算的单振福位置;treewidth设置计算树宽; qbb_time 设置quickBB运行时间。

c. 量子纠错(包括编码器和解码器等)线路模拟器(Stabilizer Circuit Simulator)

Stabilizer Circuit Simulator是可以有效模拟只包含CNOT、Hadamard和Phase-gate等Stabilizer gate set及测量的量子电路。 这类量子电路统称为Stabilizer circuit,是量子纠错和抗错量子电路设计的一个基础工具,也是进行纠错编码器和解码器研究的有效手段。通过HiQ软件包内部的算法优化和分布式计算能力,该模拟器通常可以轻而易举的模拟数十万量子比特规模的Stabilizer量子电路。基本使用步骤如下:

1. 导入模拟器包

from hiq.projectq.backends import StabilizerSimulator

2. 初始化模拟器

simulator = StabilizerSimulator()

3. 编写算法逻辑

#allocate
simulator.allocate_qureg(9)

#prepares a uniform superposition over 5-bit strings in qubits 0 to 4
simulator.h(0)
simulator.h(1)
simulator.h(2)
simulator.h(3)
simulator.h(4)

#computes f in qubits 5 to 8
simulator.cnot(0, 5)
simulator.cnot(1, 5)
simulator.cnot(1, 6)
simulator.cnot(2, 6)
simulator.cnot(2, 7)
simulator.cnot(3, 7)
simulator.cnot(3, 8)
simulator.cnot(4, 8)

#measures those qubits "for pedagogical purposes."
print("= The qubits5-8 state:{}{}{}{} ".format(simulator.measure(5),
simulator.measure(6), simulator.measure(7), simulator.measure(8)))

#performs a Fourier transform on qubits 0 to 4
simulator.h(0)
simulator.h(1)
simulator.h(2)
simulator.h(3)
simulator.h(4)

#measure
print("= The qubits0-4 state: {}{}{}{}{}".format(simulator.measure(0),simulator.measure(1), simulator.measure(2), simulator.measure(3),simulator.measure(4)))

#sync
simulator.sync()