关于 DWave dimod 使用详解

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=3000210020102001
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 elsewhere
        energy = dimod.ising_energy(sample, h, J)
        return dimod.SampleSet.from_samples(sample, vartype=dimod.SPIN, energy=energy)

    @property
    def properties(self):
        return dict()

    @property
    def 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


版权声明:本文为econe_wei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。