qiskit-aqua:已弃用的量子算法应用库,含化学、金融等领域功能及迁移指南

Quantum Algorithms & Applications (**DEPRECATED** since April 2021 - see readme for more info)

分支4Tags36
文件最后提交记录最后更新时间
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
6 年前
5 年前
5 年前
4 年前
6 年前
5 年前
5 年前
7 年前
5 年前
5 年前
5 年前
4 年前
6 年前
4 年前
4 年前
5 年前
5 年前

Qiskit Aqua(已废弃)

许可证 构建状态 最新版本 PyPI下载量 覆盖率状态


请注意: 自2021年4月2日发布的0.9.0版本起,Qiskit Aqua已被废弃, 其支持将在该日期后不超过3个月结束并最终归档。Qiskit Aqua提供的功能不会消失, 而是被拆分到单独的应用程序存储库中,核心算法和操作符功能移动到了qiskit-terra。 我们鼓励您尽快迁移。详情请参阅下方的[迁移指南]部分。


Qiskit 是一个开源框架,用于在脉冲、电路和算法层面与嘈杂的量子计算机交互。

Qiskit由协同工作的各个组成部分构成,其中Aqua(应用于量子计算的算法)提供了跨域算法库,用以构建特定领域的应用程序。

Aqua支持以下领域的应用开发:

注意: 化学模块是最先发展的领域。Aqua从0.7.0版本开始引入了解决二次问题的新优化模块。 截至撰写时,其他领域包含了一些逻辑但尚未完全实现。未来的工作预计将进一步扩展所有应用领域的功能。

Aqua设计为可扩展的,使用一个框架,在这个框架中,算法和算法使用的辅助对象(如优化器、变分形式、预言机等) 都派生自定义的基础类。这些以及其他构建块为终端用户和开发者提供了灵活性,并促进了不同配置和能力的构建及实验。

注意: Aqua还提供了一些经典算法,它们接受与解决相同问题的量子算法相同的输入数据。 例如,VQE中的哈密顿算子输入也可以作为NumPyEigensolver的输入。对于近中期量子实验来说,这可能很有用, 特别是对于仍能经典求解的问题,因为它们的结果可以轻松地与经典对等物进行比较,因为使用的是相同的输入数据。

迁移指南

自2021年4月2日发布的0.9.0版本起,Qiskit Aqua已被废弃, 其支持将于该日期后不超过3个月终止并最终存档。

Qiskit Aqua提供的所有功能都被迁移到了新的包或其它Qiskit包中。Aqua提供的应用模块被拆分为几个新包:

这些新包可以单独安装(通过标准的pip install命令,例如pip install qiskit-nature), 或者作为Qiskit元包的可选附加组件与其他包一起安装(例如pip install 'qiskit[finance,optimization]'pip install 'qiskit[all]')。

算法的核心构建块和操作符流已经被移动,成为了Qiskit的核心功能的一部分,并现在是

  • qiskit-terra

    分别查看qiskit.algorithmsqiskit.opflow包。创建了一个Qiskit Algorithms迁移指南 来指导和协助迁移过程,从在Aqua中使用算法到它们在新位置的重构等价物。

按包/类迁移

下表提供了更详细的分解,说明了Aqua中存在的功能迁移至何处。

老版 新版
qiskit.aqua.algorithms.* qiskit.algorithms.* 或相应新库 qiskit-terra, qiskit-machine-learning等
qiskit.aqua.operators qiskit.opflow qiskit-terra
其他具体迁移细节,请参考官方文档的迁移指南。

安装

我们推荐通过pip工具(Python包管理器)安装Qiskit,包括所有的组件,如Aqua。

pip install qiskit

pip会自动处理所有依赖项,并确保您始终安装最新的稳定版本。

如果您想使用最新的开发版本以尝试未正式发布的新特性,或者如果您想贡献于Aqua的开发, 则可以从源代码安装。为此,请遵循 文档中的指示。

**注意:**存在一些可选包的安装,例如IBM CPLEX用于Aqua以及从头计算的化学库/程序。有关可选安装的信息,请参考下面的相应部分。

水(Aqua)

qiskit.aqua 包含核心跨域算法及其支持逻辑,使这些算法能够在量子后端上运行,无论是真实的设备还是模拟器。

可选安装

注意: 尽管可以直接通过 pip install 安装如下包(如 pip install cplex),但使用 Aqua 的 extra_requirements,例如 pip install qiskit-aqua[cplex],可以确保安装一个与 Qiskit 兼容的版本。

  • IBM CPLEX 可以安装,以便使用经典求解器算法 CplexOptimizer。 可通过 pip 'install qiskit-aqua[cplex]' 来安装社区版。
  • PyTorch 可通过 pip install 'qiskit-aqua[torch]' 安装,或者参阅 PyTorch 的开始指南。安装PyTorch将启用与QGAN算法一起使用的神经网络组件 PyTorchDiscriminator
  • CVXPY 使用命令 pip install 'qiskit-aqua[cvx]' 可以安装,以启用使用 QSVM 和经典 SklearnSVM 算法。

在Qiskit Aqua中创建您的第一个量子程序

现在已安装Qiskit,是时候开始使用Aqua了。让我们尝试使用Grover算法来解决一个满足性(SAT)问题的实验。

$ python
from qiskit import Aer
from qiskit.aqua.components.oracles import LogicalExpressionOracle
from qiskit.aqua.algorithms import Grover

sat_cnf = """
c Example DIMACS 3-sat
p cnf 3 5
-1 -2 -3 0
1 -2 3 0
1 2 -3 0
1 -2 -3 0
-1 2 3 0
"""

backend = Aer.get_backend('qasm_simulator')
oracle = LogicalExpressionOracle(sat_cnf)
algorithm = Grover(oracle)
result = algorithm.run(backend)
print(result.assignment)

这段代码展示了如何使用 Grover 搜索算法配合 LogicalExpressionOracle 找到满足特定编码在DIMACS CNF格式的满足性问题的一个赋值。输入字符串sat_cnf对应以下合取范式(CNF):

(!x₁ ∨ !x₂ ∨ !x₃) ∧ (x₁ ∨ !x₂ ∨ x₃) ∧ (x₁ ∨ x₂ ∨ !x₃) ∧ (x₁ ∨ !x₂ ∨ !x₃) ∧ (!x₁ ∨ x₂ ∨ x₃)

上述Python代码会打印出这个CNF的一个可能解决方案。例如,“1, -2, 3”表示逻辑表达式(x₁ ∨ !x₂ ∨ x₃)满足给定的CNF。

更多示例

可以在算法教程部分找到学习路径笔记本,这是个很好的起点。

更多包含在Qiskit Aqua中的示例,可在Qiskit的GitHub仓库中的以下位置找到: qiskit-tutorials/tutorials/algorithms 以及 qiskit-community-tutorials/aqua


化学(Chemistry)

qiskit.chemistry 包旨在处理包括基态能量计算、分子的激发态和偶极矩等问题,适用于开放和闭壳体系。

该代码集成了化学驱动器,当提供分子配置时,它们返回一电子和两电子积分以及其他数据,这些数据可以高效地通过经典计算获得。来自驱动器的输出数据随后被用于化学模块中包含的逻辑,该逻辑能够将其转换成适合量子算法的形式。首先,创建一个费米子算子,然后必须映射到如约旦-维格纳映射下的量子比特算子,准备进行量子计算。

可选安装

要使用Qiskit的化学模块进行化学实验,建议您安装一个由Qiskit接口的经典化学计算软件/库。下面列出的几个都得到支持,并且虽然化学模块提供了与这些程序交互的逻辑,但程序/库本身需要单独安装。

  1. Gaussian 16®,一个商业化学软件
  2. PSI4,一个具有Python接口的化学程序,允许访问内部对象
  3. PySCF,一个开源的Python化学程序
  4. PyQuante,一个纯粹的跨平台开源Python化学程序

HDF5驱动器

Qiskit化学模块集成的一个有用功能是能够序列化代表来自化学驱动器的所有输出数据的分层数据格式5(HDF5)文件。

HDF5驱动器 接受这样的HDF5文件作为输入,使得可以运行分子实验,尽管是在文件中存储的固定数据基础上。因此,如果您有从Qiskit Chemistry生成的一些预创建的HDF5文件,即使没有安装上述任何一个经典计算包,也可以使用它们与HDF5驱动器一起工作。

不同的HDF5样本文件在Qiskit社区教程化学文件夹中提供。这个HDF5驱动器教程包含了创建和使用这类HDF5文件的更多信息。

在Qiskit中创建您的首个化学编程实验

既然已经安装了Qiskit,现在就开始使用化学模块吧。尝试使用VQE(变分量子本征求解器)算法来计算分子的基态(最小)能量。

from qiskit.chemistry import FermionicOperator
from qiskit.chemistry.drivers import PySCFDriver, UnitsType
from qiskit.aqua.operators import Z2Symmetries

# 使用PySCF这一经典计算化学软件来计算分子轨道基础的一体化和二体化积
driver = PySCFDriver(atom='H .0 .0 .0; H .0 .0 0.735',
                     unit=UnitsType.ANGSTROM,
                     basis='sto3g')
molecule = driver.run()
num_particles = molecule.num_alpha + molecule.num_beta
num_spin_orbitals = molecule.num_orbitals * 2

# 构建qubit操作符,这是Aqua中的VQE算法的输入
ferm_op = FermionicOperator(h1=molecule.one_body_integrals, h2=molecule.two_body_integrals)
map_type = 'PARITY'
qubit_op = ferm_op.mapping(map_type)
qubit_op = Z2Symmetries.two_qubit_reduction(qubit_op, num_particles)
num_qubits = qubit_op.num_qubits

# 设置VQE的古典优化器
from qiskit.aqua.components.optimizers import L_BFGS_B
optimizer = L_BFGS_B()

# 设置变分形式的初始状态
from qiskit.chemistry.circuit.library import HartreeFock
init_state = HartreeFock(num_spin_orbitals, num_particles)

# 设置VQE的变分形式
from qiskit.circuit.library import TwoLocal
var_form = TwoLocal(num_qubits, ['ry', 'rz'], 'cz')

# 添加初始状态
var_form.compose(init_state, front=True)

# 设置并运行VQE
from qiskit.aqua.algorithms import VQE
algorithm = VQE(qubit_op, var_form, optimizer)

# 设置量子计算的后端
from qiskit import Aer
backend = Aer.get_backend('statevector_simulator')

result = algorithm.run(backend)
print(result.eigenvalue.real)

以上程序利用量子计算机计算氢分子H₂的基态能量,其中两个原子设置为相距0.735埃。分子输入规格通过PySCF驱动器处理,产生包括一电子和二电子分子轨道积分的数据。从这些数据中创建了一个费米子操作符,然后进行了奇偶映射生成量子比特操作符。奇偶映射允许保精度的简化——即可以消去一对量子位,对于NISQ计算机而言,这是一种特别有利的复杂度降低。

接着,将量子比特操作符作为输入传给变分量子本征求解器(VQE)算法,该算法实例化了一个经典的优化器和一个RyRz变分形式(假设)。使用Hartree-Fock初态作为变分形式的起始点。

量子化学示例

VQE(变分量子 Eigensolver)算法随后在Qiskit Aer的状态向量模拟器后端上运行。

在这里,我们传递了一个后端,但它可以被封装到一个QuantumInstance中,然后传给run方法。QuantumInstance接口允许您自定义后端的运行时属性,如采样次数、最大使用信用数、模拟器设置、映射中的量子比特初始布局以及处理电路编译的Terra PassManager。像上面那样直接传递后端,它会被内部包装成一个QuantumInstance,当默认设置足够时,这是一种便利的方式。

更多示例

可以在文档的化学教程部分找到学习路径笔记本,是开始的好地方。

包含更多化学示例的Jupyter笔记本可以在以下Qiskit GitHub存储库中找到:


金融

qiskit.finance包包含股票/证券问题的不确定性组件,投资组合优化的Ising翻译器和数据提供者,用于获取真实或随机数据以供金融实验使用。

在Qiskit中创建第一个金融编程实验

安装了Qiskit之后,现在开始使用金融模块。让我们尝试一个实验,使用幅度估计算法来评估利率不确定的固定收入资产。

import numpy as np
from qiskit import BasicAer
from qiskit.aqua.algorithms import AmplitudeEstimation
from qiskit.circuit.library import NormalDistribution
from qiskit.finance.applications import FixedIncomeExpectedValue

# 创建合适的多元分布
num_qubits = [2, 2]
bounds = [(0, 0.12), (0, 0.24)]
mvnd = NormalDistribution(num_qubits,
                          mu=[0.12, 0.24], sigma=0.01 * np.eye(2),
                          bounds=bounds)

# 创建固定收入成分
fixed_income = FixedIncomeExpectedValue(num_qubits, np.eye(2), np.zeros(2),
                                        cash_flow=[1.0, 2.0], rescaling_factor=0.125,
                                        bounds=bounds)

# 固定收入预期值为我们提供了必要的重新调整
post_processing = fixed_income.post_processing

# 通过前置正常分布来创建幅度估计的A操作符
state_preparation = fixed_income.compose(mvnd, front=True)

# 设置评估量子比特(样本)的数量
num_eval_qubits = 5

# 构建并运行幅度估计
backend = BasicAer.get_backend('statevector_simulator')
algo = AmplitudeEstimation(num_eval_qubits, state_preparation,
                            post_processing=post_processing)
result = algo.run(backend)

print('预计价值:\t%.4f' % result.estimation)
print('概率:        \t%.4f' % result.max_probability)

运行上述代码时,预计价值结果应为2.46,概率为0.8487。

更多示例

学习路径笔记本可以在文档的金融教程部分找到,是很好的起点。

包含更多金融示例的Jupyter笔记本可以在以下Qiskit GitHub存储库中找到:


机器学习

qiskit.ml包目前仅包含示例数据集。qiskit.aqua有一些分类算法,如QSVM和VQC(变分量子分类器),这些数据可用于实验,还有QGAN(量子生成对抗网络)算法。

在Qiskit中创建第一个机器学习编程实验

现在Qiskit已经安装好,开始使用机器学习吧。尝试一个实验,使用VQC(变分量子分类器)算法训练和测试数据集中的样本,看看测试集能被分类得有多准确。

from qiskit import BasicAer
from qiskit.aqua import QuantumInstance, aqua_globals
from qiskit.aqua.algorithms import VQC
from qiskit.aqua.components.optimizers import COBYLA
from qiskit.aqua.components.feature_maps import RawFeatureVector
from qiskit.ml.datasets import wine
from qiskit.circuit.library import TwoLocal

seed = 1376
aqua_globals.random_seed = seed

# 使用Wine数据集进行训练和测试数据
feature_dim = 4  # 每个数据点的维度
_, training_input, test_input, _ = wine(training_size=12,
                                        test_size=4,
                                        n=feature_dim)

feature_map = RawFeatureVector(feature_dimension=feature_dim)
vqc = VQC(COBYLA(maxiter=100),
          feature_map,
          TwoLocal(feature_map.num_qubits, ['ry', 'rz'], 'cz', reps=3),
          training_input,
          test_input)
result = vqc.run(QuantumInstance(BasicAer.get_backend('statevector_simulator'),
                                 shots=1024, seed_simulator=seed, seed_transpiler=seed))

print('测试准确性: \t{:.2f}'.format(result['testing_accuracy']))

更多示例

学习路径笔记本可以在文档的机器学习教程部分找到,是很好的起点。

包含更多机器学习示例的Jupyter笔记本可以在以下Qiskit GitHub存储库中找到:


优化

qiskit.optimization包涵盖了从高级优化问题建模到一系列易于使用的量子优化算法的整个范围,这些算法准备好在经典模拟器以及通过Qiskit在真实的量子设备上运行。

这个优化模块使用docplex使优化问题的建模变得简单高效。统一的接口以及不同问题表示之间的自动转换让用户能够使用大量算法解决问题,包括使用量子近似优化算法QAOA的变分量子算法,以及使用GroverOptimizer实现的格罗弗适应搜索,该算法利用Aqua提供的基础算法。此外,优化模块的模块化设计使其易于扩展,并促进了新算法的快速开发和测试。还提供了兼容的古典优化器,用于测试、验证和基准测试。

可选安装

  • IBM CPLEX 可以通过 pip install 'qiskit-aqua[cplex]' 安装,这样就可以使用经典的求解器算法 CplexOptimizer,以及读取 LP 文件的功能。

在 Qiskit 中创建首个优化编程实验

既然已经安装了 Qiskit,现在是时候开始使用优化模块了。让我们尝试一个优化实验,来解决 最大割问题(Max-Cut)。最大割问题可以表示为二次规划问题,在 Qiskit 中可以通过多种不同的算法来解决。在这个示例中,我们将使用 MinimumEigenOptimizer,结合量子近似优化算法(QAOA)作为最小特征值求解程序。

import networkx as nx
import numpy as np

from qiskit.optimization import QuadraticProgram
from qiskit.optimization.algorithms import MinimumEigenOptimizer

from qiskit import BasicAer
from qiskit.aqua.algorithms import QAOA
from qiskit.aqua.components.optimizers import SPSA

# 创建包含4个节点的图
n = 4
graph = nx.Graph()
graph.add_nodes_from(np.arange(0, n, 1))
elist = [(0, 1, 1.0), (0, 2, 1.0), (0, 3, 1.0), (1, 2, 1.0), (2, 3, 1.0)]
graph.add_weighted_edges_from(elist)

# 从图中计算权重矩阵
w = nx.adjacency_matrix(graph)

# 将问题表述为二次规划问题
problem = QuadraticProgram()
_ = [problem.binary_var('x{}'.format(i)) for i in range(n)]  # 创建 n 个二进制变量
linear = w.dot(np.ones(n))
quadratic = -w
problem.maximize(linear=linear, quadratic=quadratic)

# 固定节点 0 的值为 1,打破最大割解的对称性
problem.linear_constraint([1, 0, 0, 0], '==', 1)

# 在 QASM 模拟器上运行量子算法 QAOA
spsa = SPSA(max_trials=250)
backend = BasicAer.get_backend('qasm_simulator')
qaoa = QAOA(optimizer=spsa, p=5, quantum_instance=backend)
algorithm = MinimumEigenOptimizer(qaoa)
result = algorithm.solve(problem)
print(result)  # 输出解决方案,x=[1, 0, 1, 0],成本函数值 fval=4

更多示例

在文档的 优化教程 部分可以找到学习路径笔记本,这是开始的好地方。

包含更多关于优化模块示例的 Jupyter 笔记本可以在以下 Qiskit GitHub 存储库中找到:


使用真实设备

您也可以使用 Qiskit 在 真实的量子芯片 上执行代码。为此,需要配置 Qiskit 使用您的 IBM 量子体验(IBM Quantum Experience) 账户中的凭证。有关详细信息,请参阅 Qiskit Terra GitHub 存储库 中的相关说明。

贡献指南

如果你想为 Qiskit 做贡献,请查看我们的 贡献指南。该项目遵循 Qiskit 的 行为准则。参与此项目意味着你同意遵守这个准则。

我们使用 GitHub issues 来跟踪请求和错误。请加入 Qiskit Slack 社区 并在 Aqua Slack 频道 进行讨论和提问。对于更适合论坛的问题,我们推荐在 Stack Overflow 中使用 Qiskit 标签。

下一步

现在你已准备就绪,可以探索 Qiskit 教程 存储库中的其他示例,它们用于 IBM 量子体验,以及 Qiskit 社区教程

作者与引用

Aqua 是由一群研究人员集体努力创造和实现的。Aqua 由于许多人的贡献而不断发展,他们在项目的不同层面进行工作。如果你使用 Qiskit,请按照提供的 BibTeX 文件 引用。

请注意,如果你不喜欢在 BibTeX 文件中你的名字被引用的方式,请参考 .mailmap 文件中找到的信息。

许可证

该项目使用 Apache 许可证 2.0

但是,其中包含了一些采用其他许可的代码如下:

项目介绍

Quantum Algorithms & Applications (**DEPRECATED** since April 2021 - see readme for more info)

定制我的领域