如何为D-Wave设备编写简单的程序?


27

我想知道D-Wave设备的工作是如何用代码编写并提交到设备的。

在答案中,最好是针对一个简单的问题看一个具体的例子。我猜想D-Wave设备的“ Hello World” 就像找到一个简单的2D Ising模型的基态一样,因为这是硬件直接实现的问题。因此,也许这将是一个很好的例子。但是,如果那些有专业知识的人可以使用替代示例,那么我很乐意看到替代方案。

Answers:


24

D-Wave世界中的“ Hello World”等效物是2D棋盘格示例。在此示例中,将为您提供以下带有4个节点的正方形图:

                                                  方图

让我们定义一下,如果,则将顶点着色为黑色,如果,则着色为白色。目标是使用图中的四个顶点创建棋盘格图案。有多种定义 和来实现此结果。首先,有两种可能的解决方案: σ = - 1 σ = + 1 ħσiσi=1σi=+1hJ

               checkerboard_solutions

D波量子退火炉将我们定义的伊辛哈密顿量最小化,了解不同耦合器设置的影响非常重要。考虑例如耦合器:J0,1

如果我们将其设置为,则当两个量子位取相同值时,哈密顿量最小。我们说负耦合器相互关联。而如果将其设置为,则如果两个量子位取相反的值,则哈密顿量将最小化。因此,正耦合器是反相关的J0,1=1J0,1=+1

在棋盘格示例中,我们想对每对相邻的量子位进行反相关,从而产生以下哈密顿量:

H=σ0σ1+σ0σ2+σ1σ3+σ2σ3

为了演示起见,我们还在第个量子比特上添加了一个偏置项,这样我们只能得到解决方案#1。该解决方案要求,因此我们将其偏差设置为。现在,最终的哈密顿量为:0σ0=1h0=1

H=σ0+σ0σ1+σ0σ2+σ1σ3+σ2σ3

因此,让我们对其进行编码!

注意:您需要访问D-Wave的Cloud Service才能正常工作。

首先,确保已安装dwave_sapi2https://cloud.dwavesys.com/qubist/downloads/)Python软件包。由于D-Wave当前不支持任何更高版本的Python,因此一切都将是Python 2.7。话虽如此,让我们导入要点:

from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection

为了连接到D-Wave解算器API,您将需要为其SAPI求解器,SAPI URL提供有效的API令牌,并且需要确定要使用的量子处理器:

DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'

我建议使用D-Wave 2000Q虚拟全产量嵌合体(VFYC),它是功能齐全的芯片,没有死量子位!这是Chimera芯片的布局:

dwave_chimera

现在,我将本教程分为两个不同的部分。在第一部分中,我们将问题手动嵌入到Chimera硬件图上,在第二部分中,我们使用D-Wave的嵌入试探法来查找硬件嵌入。

手动嵌入


上方D-Wave 2000Q芯片布局左上角的单位单元看起来像这样:

physical_qubits

注意,并非所有耦合器在此图像中都可视化。如您所见,在qubit和qubit之间没有耦合器,我们需要直接实现上面的正方形图。这就是为什么我们现在正在重新定义,,和。然后,我们继续将定义为列表,将定义为字典:0100142733hJ

J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]

h由于我们使用的是量子比特0至7,因此具有8个条目。现在,我们建立与规划求解API的连接,并请求D-Wave 2000Q VFYC求解器:

connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)

现在,我们可以定义读数的数量,并选择answer_mode为“直方图”,它已经为我们按出现次数对结果进行了排序。现在,我们准备使用D-Wave量子退火仪解决Ising实例:

params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results

您应该得到以下结果:

{
  'timing': {
    'total_real_time': 1655206,
    'anneal_time_per_run': 20,
    'post_processing_overhead_time': 13588,
    'qpu_sampling_time': 1640000,
    'readout_time_per_run': 123,
    'qpu_delay_time_per_sample': 21,
    'qpu_anneal_time_per_sample': 20,
    'total_post_processing_time': 97081,
    'qpu_programming_time': 8748,
    'run_time_chip': 1640000,
    'qpu_access_time': 1655206,
    'qpu_readout_time_per_sample': 123
  },
  'energies': [-5.0],
  'num_occurrences': [10000],
  'solutions': [
      [1, 3, 3, 1, -1, 3, 3, -1, {
          lots of 3 's that I am omitting}]]}

如您所见,我们获得了的正确基态能量(energies)。该解决方案串是充满的是未使用/未测量量子位的默认结果,如果我们运用逆向转换-,,和 -我们得到正确的解决方案字符串。做完了!5.0300417233[1,1,1,1]

启发式嵌入


如果开始创建越来越大的Ising实例,则将无法执行手动嵌入。因此,假设我们无法手动嵌入2D棋盘格示例。然后,和与我们的初始定义保持不变:Jh

J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]

我们再次建立远程连接,并获得D-Wave 2000Q VFYC求解器实例:

connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)

为了找到我们问题的嵌入,我们需要首先获取当前硬件图的邻接矩阵:

adjacency = get_hardware_adjacency(solver)

现在,让我们尝试找到问题的嵌入:

embedding = find_embedding(J.keys(), adjacency)

如果要处理大型Ising实例,则可能需要在多个线程中搜索嵌入(在多个CPU上并行化),然后选择链长最小的嵌入!甲是当多个量子位被迫以增加连接的程度,以充当单个量子比特。但是,链条越长,断裂的可能性就越大。断链会带来不好的结果!

现在我们准备将问题嵌入到图形中:

[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)

j0包含我们定义的原始耦合,并jc包含增强链完整性的耦合(它们与链中的量子位相关)。因此,我们需要将它们再次组合成一个大的字典:J

J = j0.copy()
J.update(jc)

现在,我们准备解决嵌入式问题:

params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)

print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])

raw_results会没有意义的,除非我们我们解除嵌入的问题。万一某些链条破裂,我们将通过可选参数定义的多数表决来解决问题broken_chains

unembedded_results = unembed_answer(raw_results['solutions'],
                                    embedding, broken_chains='vote')

print 'Solution string: {}'.format(unembedded_results)

如果运行此命令,则应在所有读数中获得正确的结果:

Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]

我希望这能回答您的问题,强烈建议您检查所有可以传递给solve_ising函数的其他参数,以提高解决方案的质量,例如num_spin_reversal_transformspostprocess


9

标题和问题正文似乎提出了两个不同的问题。在标题中询问“如何为D-Wave设备编写简单程序?”,而在问题正文中询问如何使用D-Wave的底层硬件查找简单2D Ising模型的基态。设备,以及相应的代码是什么(这是一个更具体的问题)。

我将回答前者,因为这是一个更普遍的问题。

根据D-Wave软件页面

D-Wave 2000Q系统提供了标准的Internet API(基于RESTful服务),并且客户端库可用于C / C ++,Python和MATLAB。该界面使用户可以通过网络上的云资源或集成到其高性能计算(HPC)环境和数据中心的方式访问系统。还可以通过D-Wave的托管云服务进行访问。使用D-Wave的开发工具和客户端库,开发人员可以使用行业标准工具在其现有环境中创建算法和应用程序。

尽管用户可以通过多种不同方式向系统提交问题,但最终问题代表了一组与qubit的权重和耦合器的强度相对应的值。系统将这些值与其他用户指定的参数一起使用,并向QPU发送单个量子机指令(QMI)。问题解决方案对应于找到的量子位的最佳配置。也就是说,能源领域的最低点。这些值通过网络返回给用户程序。

因为量子计算机是概率性的而不是确定性的,所以可以返回多个值,不仅提供找到的最佳解决方案,而且还提供其他非常好的选择。用户可以指定他们希望系统返回的解决方案的数量。

用户可以通过几种方式向D-Wave量子计算机提交问题:

  1. 使用C,C ++,Python或MATLAB中的程序创建和执行QMI
  2. 使用D-Wave工具,例如:

    • QSage,专为优化问题设计的翻译器

    • ToQ,一种用于约束满足问题的高级语言翻译器,旨在让用户以其问题域的语言“发言”

    • qbsolv,一个开源的混合分区优化求解器,用于解决比QPU本身所能解决的问题更大的问题。Qbsolv可以
      这里下载。

    • dw,它执行通过文本编辑器创建的QMI

  3. 通过QMI直接对系统进行编程

下载此白皮书以了解有关D-Wave系统编程模型的更多信息


5

D-Wave的输入是相互作用的列表,最近是量子位的退火时间。

正如您提到的,在哈密顿问题中,,伊辛问题是最简单的问题之一,但这并不是很有趣。Jij=1

我建议使用本文的附录,以简要描述D-Wave硬件的工作方式。(完全公开:我是合著者。)


2
如果您在此处(而不是在链接中)包含更多答案,可能会更好。作为本文的合著者,您可能最适合作一个很好的总结。
agaitaarino '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.