kaiwu.preprocess._utils 源代码

# -*- coding: utf-8 -*-
"""
模块: dynamic_range

功能: 局部赋值
"""
import numpy as np

from kaiwu.license import track_data


def _partial_assignment(ising_mat, indices, values):
    """
    抽取变量,生成subQUBO对应的子矩阵
    Args:

        ising_mat: Ising矩阵, 必须是对称矩阵,否则会出现错误

        indices: 赋值变量

        values: 为变量所赋的值,只能为0或1

    Returns:
        sub_mat, bias(tuple): sub_mat为被赋值变量固定后的矩阵,bias为产生的偏置项
    """
    indices = np.array(indices)
    values = np.array(values)

    sub_size = ising_mat.shape[0] - indices.shape[0]
    sub_index = np.array([i for i in range(ising_mat.shape[0]) if i not in indices])
    sub_mat = np.zeros((sub_size + 1, sub_size + 1))
    sub_mat[:sub_size, :sub_size] = ising_mat[np.ix_(sub_index, sub_index)]
    solution_clamp = np.zeros(ising_mat.shape[0])
    solution_clamp[indices] = values

    c_linear = ising_mat.dot(solution_clamp)
    bias = solution_clamp.dot(c_linear)
    c_linear = c_linear[sub_index]

    sub_mat[-1, :sub_size] = c_linear
    sub_mat[:sub_size, -1] = c_linear
    return sub_mat, bias


[文档] @track_data() def get_min_diff(mat): """计算最小差值 Args: mat: Ising或QUBO矩阵 Returns: float: 最小差值 Examples: >>> import numpy as np >>> mat = np.array([[0, 8, 1 ,1], ... [0, 0, 2, -1], ... [0, 0, 0, -8], ... [0, 0, 0, 0]]) >>> import kaiwu as kw >>> kw.preprocess.get_min_diff(mat) np.int64(1) """ params = np.unique(mat) # <- doing this includes 0; result is sorted return np.diff(params).min()
[文档] @track_data() def get_dynamic_range_metric(mat): """计算动态范围值(dynamic range, DR) :math:`DR(Q) = log(max_{i,j}|Q_i - Q_j|/min_{Q_i \\neq Q_j}|Q_i-Q_j|)` Args: mat: Ising或QUBO矩阵 Returns: float: 动态范围 Examples: >>> import numpy as np >>> mat = np.array([[0, 8, 1 ,1], ... [0, 0, 2, -1], ... [0, 0, 0, -8], ... [0, 0, 0, 0]]) >>> import kaiwu as kw >>> kw.preprocess.get_dynamic_range_metric(mat) np.float64(4.0) """ return _get_dynamic_range_metric(mat)
def _get_dynamic_range_metric(mat): """计算动态范围值(dynamic range, DR)""" params = np.unique(mat) # <- doing this includes 0; result is sorted max_diff = params[-1] - params[0] min_diff = np.diff(params).min() return np.log2(max_diff / min_diff) if __name__ == "__main__": import doctest doctest.testmod()