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=⎣⎢⎢⎡−30002−10020−10200−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 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 的 ExactSolver
reference 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