kaiwu.sampler package#

Module contents#

模块: sampler

功能: 提供一系列数据后处理工具

kaiwu.sampler.binary_to_spin(c_set)#

二进制转自旋.

Args:

c_set (np.ndarray): 二进制变量配置.

Returns:

np.ndarray: 自旋变量配置.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> output = np.array([[0, 0, 0, 0],
...                    [0, 0, 0, 1],
...                    [0, 0, 1, 0],
...                    [0, 0, 1, 1],
...                    [0, 1, 0, 0],
...                    [0, 1, 0, 1],
...                    [0, 1, 1, 0],
...                    [0, 1, 1, 1],
...                    [1, 0, 0, 0],
...                    [1, 0, 0, 1],
...                    [1, 0, 1, 0],
...                    [1, 0, 1, 1],
...                    [1, 1, 0, 0],
...                    [1, 1, 0, 1],
...                    [1, 1, 1, 0],
...                    [1, 1, 1, 1]])
>>> kw.sampler.binary_to_spin(output)
array([[-1, -1, -1, -1],
       [-1, -1, -1,  1],
       [-1, -1,  1, -1],
       [-1, -1,  1,  1],
       [-1,  1, -1, -1],
       [-1,  1, -1,  1],
       [-1,  1,  1, -1],
       [-1,  1,  1,  1],
       [ 1, -1, -1, -1],
       [ 1, -1, -1,  1],
       [ 1, -1,  1, -1],
       [ 1, -1,  1,  1],
       [ 1,  1, -1, -1],
       [ 1,  1, -1,  1],
       [ 1,  1,  1, -1],
       [ 1,  1,  1,  1]])
kaiwu.sampler.spin_to_binary(c_set)#

自旋转二进制.

Args:

c_set (np.ndarray): 自旋变量配置.

Returns:

np.ndarray: 二进制变量配置.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> output = np.array([[-1, -1, -1, -1],
...                    [-1, -1, -1,  1],
...                    [-1, -1,  1, -1],
...                    [-1, -1,  1,  1],
...                    [-1,  1, -1, -1],
...                    [-1,  1, -1,  1],
...                    [-1,  1,  1, -1],
...                    [-1,  1,  1,  1],
...                    [ 1, -1, -1, -1],
...                    [ 1, -1, -1,  1],
...                    [ 1, -1,  1, -1],
...                    [ 1, -1,  1,  1],
...                    [ 1,  1, -1, -1],
...                    [ 1,  1, -1,  1],
...                    [ 1,  1,  1, -1],
...                    [ 1,  1,  1,  1]])
>>> kw.sampler.spin_to_binary(output)
array([[0., 0., 0., 0.],
       [0., 0., 0., 1.],
       [0., 0., 1., 0.],
       [0., 0., 1., 1.],
       [0., 1., 0., 0.],
       [0., 1., 0., 1.],
       [0., 1., 1., 0.],
       [0., 1., 1., 1.],
       [1., 0., 0., 0.],
       [1., 0., 0., 1.],
       [1., 0., 1., 0.],
       [1., 0., 1., 1.],
       [1., 1., 0., 0.],
       [1., 1., 0., 1.],
       [1., 1., 1., 0.],
       [1., 1., 1., 1.]])
kaiwu.sampler.random_sampler(matrix, negtail_ff=False)#

随机采样器.

Args:

matrix (np.ndarray): CIM Ising矩阵.

negtail_ff (bool): negtail_flip flag 负尾翻转, Ising模型线性项二次化的矩阵需要负尾翻转.

Returns:

np.ndarray: 一组解.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> matrix = -np.array([[ 0. ,  1. ,  0. ,  1. ,  1. ],
...                     [ 1. ,  0. ,  0. ,  1.,   1. ],
...                     [ 0. ,  0. ,  0. ,  1.,   1. ],
...                     [ 1. ,  1.,   1. ,  0. ,  1. ],
...                     [ 1. ,  1.,   1. ,  1. ,  0. ]])
>>> kw.sampler.random_sampler(matrix, False)  
array([[ 1,  1, -1, -1,  1]])
kaiwu.sampler.negtail_flip(c_list)#

负尾翻转, 通过 kaiwu.qubo 生成的 CIM Ising 采样结果时候都需要negtail flip. 直接输入矩阵求解的不需要 negtail flip.

Args:

c_list (np.ndarray): 要negtail flip的变量组合集合.

Returns:

无: 该方法使用原地算法, 直接修改输入.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> mat = np.array([[ 1, -1, -1, -1,  1],
...                 [-1, -1,  1,  1, -1],
...                 [-1, -1,  1,  1,  1],
...                 [ 1,  1,  1,  1,  1],
...                 [-1,  1,  1, -1, -1],
...                 [ 1,  1,  1,  1, -1],
...                 [-1,  1,  1, -1,  1],
...                 [ 1, -1,  1,  1, -1],
...                 [-1, -1, -1,  1,  1]])
>>> kw.sampler.negtail_flip(mat)
>>> mat
array([[ 1, -1, -1, -1,  1],
       [ 1,  1, -1, -1,  1],
       [-1, -1,  1,  1,  1],
       [ 1,  1,  1,  1,  1],
       [ 1, -1, -1,  1,  1],
       [-1, -1, -1, -1,  1],
       [-1,  1,  1, -1,  1],
       [-1,  1, -1, -1,  1],
       [-1, -1, -1,  1,  1]])
kaiwu.sampler.binarizer(c_list, var_type='spin', unique=True)#

二值化.

Args:

c_list (np.ndarray): 从求解器中获得的要二值化的数据.

var_type (str): 变量类型.

unique (bool): 去重.

Returns:

np.ndarray: 二值化后的结果.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> solutions = np.array([[-0.0032379, -0.00302381, -0.00080672, -0.00226754, 0.00400546],
...                      [-0.00063725, -0.00769352, 0.00140344, -0.00234206, -0.00034028],
...                      [0.0040677, -0.01139299, 0.00474858, 0.00274578, -0.00405366],
...                      [0.00765783, -0.00636498, 0.00964927, 0.00262433, -0.00175035],
...                      [0.01104296, -0.00444736, 0.01377671, 0.0061532, 0.00074683]])
>>> c_set = kw.sampler.binarizer(solutions)
>>> c_set
array([[-1, -1, -1, -1,  1],
       [-1, -1,  1, -1, -1],
       [ 1, -1,  1,  1, -1],
       [ 1, -1,  1,  1, -1],
       [ 1, -1,  1,  1,  1]])
kaiwu.sampler.optimal_sampler(matrix, c_set, bias=0.0, negtail_ff=False)#

最优解采样.

Args:

matrix (np.ndarray): CIM Ising 矩阵.

c_set (np.ndarray): 变量配置.

bias (float): 常数项.

negtail_ff (bool): negtail_flip flag 负尾翻转, Ising模型线性项二次化的矩阵需要负尾翻转.

Returns:

output (np.ndarray, np.ndarray): 按能量排序的变量配置, 能量.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> matrix = -np.array([[ 0. ,  1. ,  0. ,  1. ,  1. ],
...                     [ 1. ,  0. ,  0. ,  1.,   1. ],
...                     [ 0. ,  0. ,  0. ,  1.,   1. ],
...                     [ 1. ,  1.,   1. ,  0. ,  1. ],
...                     [ 1. ,  1.,   1. ,  1. ,  0. ]])
>>> c_set = np.array([[ 1, -1,  1, -1, -1],
...                   [-1, -1,  1, -1, -1],
...                   [-1, -1, -1,  1,  1],
...                   [ 1,  1,  1, -1, -1],
...                   [ 1,  1,  1, -1, -1],
...                   [ 1,  1,  1, -1, -1]])
>>> kw.sampler.optimal_sampler(matrix, c_set, 0)
(array([[-1, -1, -1,  1,  1],
       [ 1,  1,  1, -1, -1],
       [ 1,  1,  1, -1, -1],
       [ 1,  1,  1, -1, -1],
       [ 1, -1,  1, -1, -1],
       [-1, -1,  1, -1, -1]]), array([-8., -8., -8., -8., -4.,  8.]))
kaiwu.sampler.constraint_sampler(matrix, offset, var_index, c_set)#

约束采样.

Args:

matrix (np.ndarray): 约束的 QUBO 矩阵.

offset (float): 常数项.

var_index (list): 约束包含的变量, 在全部变量中的索引表.

c_set (np.ndarray): 变量配置.

Returns:

output (np.ndarray, np.ndarray): 按松弛度排序的变量配置, 松弛度.

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> output = np.array([[0, 0, 0, 0],
...                    [0, 0, 0, 1],
...                    [0, 0, 1, 0],
...                    [0, 0, 1, 1],
...                    [0, 1, 0, 0],
...                    [0, 1, 0, 1],
...                    [0, 1, 1, 0],
...                    [0, 1, 1, 1],
...                    [1, 0, 0, 0],
...                    [1, 0, 0, 1],
...                    [1, 0, 1, 0],
...                    [1, 0, 1, 1],
...                    [1, 1, 0, 0],
...                    [1, 1, 0, 1],
...                    [1, 1, 1, 0],
...                    [1, 1, 1, 1]])
>>> matrix = np.array([[1., 0., 0.],
...                    [0., 1., 0.],
...                    [0., 0., 1.]])
>>> offset = -3
>>> var_index = [1, 2, 3]
>>> kw.sampler.constraint_sampler(matrix, offset, var_index, output)
(array([[0, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 0, 1, 1],
       [0, 1, 0, 1],
       [0, 1, 1, 0],
       [1, 0, 1, 1],
       [1, 1, 0, 1],
       [1, 1, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [1, 1, 0, 0],
       [0, 0, 0, 0],
       [1, 0, 0, 0]]), array([0., 0., 1., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 2., 3., 3.]))