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.]))