dimod

dimod 是采样器的一个共享 API,提供了:

  • BQM(binary quadratic model )类,BQM其包含了如使用了 D-Wave 系统的采样器的 Ising 和 QUBO(quadratic unconstrained binary optimization);
  • DQM(discrete quadratic model)类和高阶(non-quadratic)模型;
  • 采样器和组合采样器的参考例子;
  • abstract base classes 用于构建新采样器和组合采样器;

Introduction

关于 Ocean 编程模型(BQM的使用和求解 hard 问题的采样器)参见 Ocean’s Programming Model。

Binary Quadratic Models

dimod 可以用适合不同性能和易用性需求的类来表示 BQM。BQM支持的所有表达参见Binary Quadratic Models。

BQM Generation

如图四个节点的 maximum cut 问题,


Star graph with four nodes.

QUBO矩阵如下表示:
Q = [ − 3 2 2 2 0 − 1 0 0 0 0 − 1 0 0 0 0 − 1 ] Q = \left[ \begin{matrix} -3 & 2 & 2 & 2 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & -1 \end{matrix} \right] Q=⎣⎢⎢⎡​−3000​2−100​20−10​200−1​⎦⎥⎥⎤​
BQM 的 python dict 表示比较方便:

qubo = {(0, 0): -3, (1, 1): -1, (0, 1): 2, (2, 2): -1,(0, 2): 2, (3, 3): -1, (0, 3): 2}
dict_bqm = dimod.BQM.from_qubo(qubo)

大范围且是混合结构的BQMs可以用 AdjArrayBQM 类表示。

import numpy as np
q_array = np.array([[-3.0, 2, 2, 2],[0, -1.0, 0.0, 0.0],[0, 0, -1.0, 0.0],[0, 0, 0, -1.0]])
array_bqm = dimod.AdjArrayBQM(q_array, 'BINARY')

超大范围的BQMs可以利用 methods 从文件中读数据,如 from_file() 或其他,每个类文件中会有描述。

此外,dimod 还提供了多种 BQM 生成器。

map_bqm = dimod.generators.random.ran_r(1, 7, cls=dimod.AdjVectorBQM)

BQM Attributes

dimod 的 BQM 对象提供了对一些属性和视图的访问接口。参见 Binary Quadratic Models 中特定类型的文档。

dict_bqm.shape
(4,3)
list(map_bqm.variables)
[0, 1, 2, 3, 4, 5, 6]

BQM Methods

BQM 支持大量方法,大都很常用,有些是特定于某个类的,在每个类的文档中进行了描述,方便构建和操作 BQM。

map_bqm.num_interactions
21
map_bqm.remove_interaction(5, 6)
map_bqm.num_interactions
20

Samplers and Composites

dimod 包括供参考的采样器和组合器用于处理二元二次模型(或高阶模型)和提炼采样( refining sampling),用来测试开发代码。

采样器和组合器介绍参见 Samplers and Composites。

所有支持的采样器参见 Samplers and Composites。

Using Samplers

利用ExactSolver测试采样器计算上述 maximum cut 问题所有可能的样本的能量如下:

qubo = {(0, 0): -3, (1, 1): -1, (0, 1): 2, (2, 2): -1,(0, 2): 2, (3, 3): -1, (0, 3): 2}
dict_bqm = dimod.BQM.from_qubo(qubo)
sampler_exact = dimod.ExactSolver()
sampleset = sampler_exact.sample(dict_bqm)
print(sampleset)0  1  2  3 energy num_oc.
1   1  0  0  0   -3.0       1
11  0  1  1  1   -3.0       1
2   1  1  0  0   -2.0       1
...
10  1  1  1  1    0.0       1
['BINARY', 16 rows, 16 samples, 4 variables]

Using Composed Samplers

该例子使用了一个 Boolean NOT Gate 的组合采样器, Getting Started 文档中有具体描述。

FixedVariableComposite函数在提交给采样器之前,组合设置了值并删除了指定变量。

from dimod import FixedVariableComposite, ExactSolver
Q = {('x', 'x'): -1, ('x', 'z'): 2, ('z', 'x'): 0, ('z', 'z'): -1}
composed_sampler = FixedVariableComposite(ExactSolver())
sampleset = composed_sampler.sample_qubo(Q, fixed_variables={'x': 1})
print(sampleset)x  z energy num_oc.
0  1  0   -1.0       1
1  1  1    0.0       1
['BINARY', 2 rows, 2 samples, 2 variables]

Creating Samplers

API for Samplers and Composites 可以创建自己的 dimod 采样器和组合采样器。

该例子通过实现单个方法(如 sample_ising)创建 dimod 采样器。

class LinearIsingSampler(dimod.Sampler):def sample_ising(self, h, J, **kwargs):kwargs = self.remove_unknown_kwargs(**kwargs)sample = linear_ising(h, J, **kwargs)  # Defined elsewhereenergy = dimod.ising_energy(sample, h, J)return dimod.SampleSet.from_samples(sample, vartype=dimod.SPIN, energy=energy)@propertydef properties(self):return dict()@propertydef parameters(self):return dict()

Samples

dimod 提供的SampleSet类包含了一些采样器。返回的结果和样本在 Solutions 中有介绍。支持的 sampleset 方法在 Samples 中有说明。

以下例子创建了以恶个样本集,然后描述了一些 SampleSet 的参数和方法。

bqm = dimod.generators.random.ran_r(1, 7)
sampler = dimod.ExactSolver()
sampleset = sampler.sample(bqm)

打印最优解的能量:

print(sampleset.first.energy)
-9.0

打印最优解:

print(sampleset.lowest())           0  1  2  3  4  5  6 energy num_oc.
0 +1 -1 +1 -1 +1 -1 -1   -9.0       1
1 +1 +1 +1 -1 +1 -1 -1   -9.0       1
...
7 -1 +1 -1 +1 -1 -1 +1   -9.0       1
['SPIN', 8 rows, 8 samples, 7 variables]

转换格式

sampleset.to_pandas_dataframe()       0  1  2  3  4  5  6  energy  num_occurrences
0   -1 -1 -1 -1 -1 -1 -1     3.0                1
1    1 -1 -1 -1 -1 -1 -1     7.0                1
2    1  1 -1 -1 -1 -1 -1     7.0                1
...

Non-Binary and Non-Quadratic Models

dimod 也提供了DQMs discrete quadratic models 和一些 Higher-Order Composites 以及把高阶多项式转换为 BQMs 的功能。

Discrete Quadratic Models

DQMs 的介绍参见 Discrete Quadratic Models。使用 Leap hybrid DQM 求解器的例子参见 dwave-examples GitHub repository。

Higher-Order Models

该例子使用了 dimod 的 ExactSolverreference samper 解决了高阶无约束二次优化模型(higher-order unconstrained binary optimization (HUBO) model)。

import dimod
poly = dimod.BinaryPolynomial.from_hubo({('a', 'a'): -1,('a', 'b'): -0.5,('a', 'b', 'c'): -2})
sampler = dimod.HigherOrderComposite(dimod.ExactSolver())
sampleset = sampler.sample_poly(poly)
print(sampleset.first.sample["a"])
1

Reference Documentation

一些例子参见如下文档:https://docs.ocean.dwavesys.com/en/stable/docs_dimod/reference/index.html

关于 DWave dimod 使用详解相关推荐

  1. 前瞻: 拥抱量子计算时代!详解2020年全球十大杰出量子计算公司

    拥抱量子计算时代!详解2020年全球十大杰出量子计算公司 https://blog.csdn.net/Qtumist/article/details/105462463 分类专栏: 新闻资讯 文章标签 ...

  2. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  3. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  4. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  5. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  6. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  7. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  8. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  9. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

最新文章

  1. javascript函数全解
  2. Linux 管理员手册(2)
  3. phpStudy for Linux (lnmp+lamp一键安装包)
  4. mysql输出非零列_如何只提取mysql和php中具有非零值的列?
  5. stm32编译时报错 ..........ER_IROM1: File exists 的问题
  6. java md5 密钥_java加密算法--MD5加密和哈希散列带秘钥加密算法源码
  7. addConditionWaiter
  8. ShapeNet:超实时人脸特征点检测与形状拟合开源库
  9. cmd 220 ftp 远程主机关闭连接_下载ftp软件,下载ftp软件需要注意3点
  10. 学生学籍管理系统页面源代码html_学生信息管理系统-系统源代码
  11. AD19---彻底解决原理图转PCB时,出现failed to add class member及Unknown Pin的问题
  12. 树莓派学习2-连接蓝牙音箱进行语音播放
  13. 分布式定时任务框架---Uncode Schedule
  14. mysql 破坏索引_mysql表索引被破坏的问题及解决
  15. Android自定义控件开发入门与实战(7)SVG动画,android底层架构
  16. input type=file 禁止让用户手动输入
  17. 将微信聊天记录转成txt文件的最实用方法
  18. 程序设计课程设计报告(学生成绩管理系统)
  19. 深度 | 智慧城市背景下的“多规合一”标准探究
  20. 数据结构魔王语言问题

热门文章

  1. Android开发 - 线程和服务
  2. 欢迎来到wxWindows
  3. 服务器游戏列表为空,游戏服务器列表为空
  4. 深入了解中文版AutoCAD 2022:功能、优势和应用
  5. 数据结构:实现图书信息管理系统
  6. 干货 | 这可能是最详细的「阻抗匹配」介绍
  7. IC验证-寄存器专项测试
  8. .net 2.0 下的FTP搜索引擎实现
  9. 微信小程序:音乐播放器带进度条
  10. DB2如何修改某个字段由非空转变为可以为空