kaiwu_community.qubo package#

Module contents#

模块: qubo

功能: QUBO建模工具

exception kaiwu_community.qubo.QuboError(error_info)#

基类:KaiwuError

Exceptions 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]