kaiwu_community.qubo package#
Module contents#
模块: qubo
功能: QUBO建模工具
- exception kaiwu_community.qubo.QuboError(error_info)#
基类:
KaiwuErrorExceptions in qubo module.
- class kaiwu_community.qubo.QuboModel(objective=None)#
基类:
BinaryModel支持添加约束的QUBO模型类
- Args:
objective (QuboExpression, optional): 目标函数. 默认为None
- get_matrix()#
获取QUBO矩阵
- Returns:
numpy.ndarray: QUBO矩阵
- get_offset()#
获取qubo模型的offset
- get_sol_dict(qubo_solution)#
根据解向量生成结果字典.
- get_variables()#
获取qubo模型的variables
- invalidate_made_state()#
Invalidate the made state when the model changes
- make()#
返回合并后的QUBO表达式
- Returns:
BinaryExpression: 合并的约束表达式
- kaiwu_community.qubo.adjust_qubo_matrix_precision(qubo_matrix, bit_width=8)#
调整矩阵精度, 通过此接口调整后矩阵可能会有较大的精度损失,比如矩阵有一个数远大于其它数时,调整后矩阵精度损失严重无法使用
- Args:
qubo_matrix (np.ndarray): 目标矩阵
bit_width (int): 精度范围,目前只支持8位,有一位是符号位
- Returns:
np.ndarray: 符合精度要求的QUBO矩阵
- Examples:
>>> import numpy as np >>> import kaiwu_community as kw >>> ori_qubo_mat1 = np.array([[0.89, 0.22, 0.198], ... [0.22, 0.23, 0.197], ... [0.198, 0.197, 0.198]]) >>> qubo_mat1 = kw.qubo.adjust_qubo_matrix_precision(ori_qubo_mat1) >>> qubo_mat1 array([[348., 168., 152.], [ -0., 92., 152.], [ -0., -0., 80.]]) >>> ori_qubo_mat2 = np.array([[0.89, 0.22, 0.198], ... [0.22, 0.23, 0.197], ... [0.198, 0.197, 100]]) >>> qubo_mat2 = kw.qubo.adjust_qubo_matrix_precision(ori_qubo_mat2) >>> qubo_mat2 # The solutions obtained by qubo_mat2 and ori_qubo_mat2 matrices are quite different array([[ 8., -0., -0.], [ -0., 4., -0.], [ -0., -0., 508.]])
- kaiwu_community.qubo.calculate_qubo_value(qubo_matrix, offset, binary_configuration)#
Q值计算器.
- Args:
qubo_matrix (np.ndarray): QUBO矩阵.
offset (float): 常数项
binary_configuration (np.ndarray): 二进制配置
- Returns:
output (float): Q值.
- Examples:
>>> import numpy as np >>> import kaiwu_community as kw >>> matrix = np.array([[1., 0., 0.], ... [0., 1., 0.], ... [0., 0., 1.]]) >>> offset = 1.8 >>> binary_configuration = np.array([0, 1, 0]) >>> qubo_value = kw.qubo.calculate_qubo_value(matrix, offset, binary_configuration) >>> print(qubo_value) 2.8
- kaiwu_community.qubo.check_qubo_matrix_bit_width(qubo_matrix, bit_width=8)#
校验QUBO矩阵元素位宽
将QUBO矩阵转为伊辛矩阵,通过校验伊辛矩阵的元素位宽来实现对QUBO矩阵的校验
- Args:
qubo_matrix (np.ndarray): QUBO矩阵
bit_width (int): 位宽
- Raises:
ValueError: 当矩阵元素位宽超过指定位宽时抛出异常
- Examples1:
>>> import numpy as np >>> import kaiwu_community as kw >>> _matrix = -np.array([[-480., 508., -48.], ... [ 508., -508., -48.], ... [ -48., -48., 60.]]) >>> kw.qubo.check_qubo_matrix_bit_width(_matrix)
- Examples2(缩放后符合要求):
>>> import numpy as np >>> import kaiwu_community as kw >>> _matrix = -np.array([[-512., 520., -48.], ... [ 520., -520., -48.], ... [ -48., -48., 40.]]) >>> kw.qubo.check_qubo_matrix_bit_width(_matrix)
- Examples3(缩放后也不符合要求):
>>> import numpy as np >>> import kaiwu_community as kw >>> _matrix = -np.array([[-488., 516., -48.], ... [ 516., -516., -48.], ... [ -48., -48., 60.]]) >>> kw.qubo.check_qubo_matrix_bit_width(_matrix) Traceback (most recent call last): ... ValueError: CIM only supports signed 8-bit number
- kaiwu_community.qubo.qubo_matrix_to_qubo_model(qubo_mat)#
将qubo矩阵转化为qubo模型
- Args:
qubo_mat (np.ndarray): QUBO矩阵
- Returns:
QuboModel: QUBO模型
- Examples:
>>> import numpy as np >>> import kaiwu_community as kw >>> matrix = -np.array([[0, 8], ... [0, 0]]) >>> kw.qubo.qubo_matrix_to_qubo_model(matrix).objective -8*b[0]*b[1]