kaiwu.core package#

Module contents#

模块: core

功能: 基础类的定义

class kaiwu.core.OptimizerBase#

Bases: object

Ising求解器基类

set_matrix(ising_matrix)#

设置矩阵并更新相关内容

on_matrix_change()#

更新矩阵相关信息, 继承OptimizerBase时可以实现。当处理的ising矩阵发生变化时,这个函数的实现会被调用,从而有机会做相应动作

solve(ising_matrix=None)#

求解

exception kaiwu.core.KaiwuError#

Bases: Exception

Base class for exceptions in this module.

args#
with_traceback()#

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

class kaiwu.core.SolverBase(optimizer)#

Bases: object

Solver基类

Args:

optimizer (OptimizerBase): Ising求解器

solve_qubo(*args, **kwargs)#
kaiwu.core.ising_matrix_to_qubo_matrix(ising_mat, remove_linear_bit=True)#

Ising矩阵转QUBO矩阵

Args:

ising_mat (np.ndarray): Ising矩阵

remove_linear_bit (bool): QUBO转Ising时会增加一个辅助变量表示线性项。是否移除最后一个自旋变量。默认为True。

Returns:

tuple: QUBO矩阵和bias

  • qubo_mat (np.ndarray): QUBO矩阵

  • bias (float): QUBO与Ising相差的常数项

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. ]])
>>> _qubo_mat, _ = kw.core.ising_matrix_to_qubo_matrix(matrix)
>>> _qubo_mat
array([[-4.,  8.,  0.,  8.],
       [-0., -4.,  0.,  8.],
       [-0., -0., -0.,  8.],
       [-0., -0., -0., -8.]])
kaiwu.core.qubo_matrix_to_ising_matrix(qubo_mat)#

QUBO矩阵转Ising矩阵

Args:

qubo_mat (np.ndarray): QUBO矩阵

Returns:
tuple: Ising矩阵和bias
  • ising_mat (np.ndarray): Ising矩阵

  • bias (float): QUBO与Ising相差的常数项

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> matrix = -np.array([[-4.,  8.,  0.,  8.],
...                     [-0., -4.,  0.,  8.],
...                     [-0., -0., -0.,  8.],
...                     [-0., -0., -0., -8.]])
>>> _ising_mat, _ = kw.core.qubo_matrix_to_ising_matrix(matrix)
>>> _ising_mat
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.]])
class kaiwu.core.ConstraintRelation(value)#

Bases: Enum

约束所有的等式或不等式关系

EQUAL = 0#
LESS = 1#
GREATER = 2#
LESS_EQUAL = 3#
GREATER_EQUAL = 4#
class kaiwu.core.Constraint(constraint_expr, penalty, expected_value)#

Bases: object

约束信息

verify(solution_dict)#

验证约束满足情况

set_penalty(penalty)#

设置惩罚系数

penalize_more()#

增加惩罚系数

penalize_less()#

降低惩罚系数

class kaiwu.core.RelationConstraint(qubo_left, relation, penalty=None, expected_value=0, slack_expr=None)#

Bases: Constraint

关系约束信息

penalize_less()#

降低惩罚系数

penalize_more()#

增加惩罚系数

set_penalty(penalty)#

设置惩罚系数

verify(solution_dict)#

验证约束满足情况

kaiwu.core.get_sol_dict(solution, vars_dict)#

根据解向量和变量字典生成结果字典.

Args:

solution (np.ndarray): 解向量(spin)。

vars_dict (dict): 变量字典,用cim_ising_model.get_variables()生成。

Returns:

dict: 结果字典。键为变量名,值为对应的spin值。

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> a = kw.qubo.Binary("a")
>>> b = kw.qubo.Binary("b")
>>> c = kw.qubo.Binary("c")
>>> d = a + 2 * b + 4 * c
>>> d = kw.qubo.QuboModel(d)
>>> d_ising = kw.conversion.qubo_model_to_ising_model(d)
>>> vars = d_ising.get_variables()
>>> s = np.array([1, -1, 1])
>>> kw.core.get_sol_dict(s, vars)
{'a': np.float64(1.0), 'b': np.float64(0.0), 'c': np.float64(1.0)}
kaiwu.core.get_array_val(array, sol_dict)#

根据结果字典将spin值带入qubo数组变量.

Args:

array (QUBOArray): QUBO数组

sol_dict (dict): 由get_sol_dict生成的结果字典。

Returns:

np.ndarray: 带入qubo数组后所得的值数组

Examples:
>>> import kaiwu as kw
>>> import numpy as np
>>> x = kw.qubo.ndarray((2, 2), "x", kw.qubo.Binary)
>>> y = x.sum()
>>> y = kw.qubo.QuboModel(y)
>>> y_ising = kw.conversion.qubo_model_to_ising_model(y)
>>> ising_vars = y_ising.get_variables()
>>> s = np.array([1, -1, 1, -1])
>>> sol_dict = kw.core.get_sol_dict(s, ising_vars)
>>> kw.core.get_array_val(x, sol_dict)
array([[1., 0.],
       [1., 0.]])
kaiwu.core.get_val(expr, sol_dict)#

根据结果字典将spin值带入qubo变量.

Args:

expr (QUBO表达式): QUBO表达式

sol_dict (dict): 由get_sol_dict生成的结果字典。

Returns:

float: 带入qubo后所得的值

Examples:
>>> import kaiwu as kw
>>> import numpy as np
>>> a = kw.qubo.Binary("a")
>>> b = kw.qubo.Binary("b")
>>> c = kw.qubo.Binary("c")
>>> d = a + 2 * b + 4 * c
>>> qubo_model = kw.qubo.QuboModel(d)
>>> d_ising = kw.conversion.qubo_model_to_ising_model(qubo_model)
>>> ising_vars = d_ising.get_variables()
>>> s = np.array([1, -1, 1])
>>> sol_dict = kw.core.get_sol_dict(s, ising_vars)
>>> kw.core.get_val(d, sol_dict)
np.float64(5.0)
kaiwu.core.update_constraint(qubo_origin, qubo_result)#

将qexp的约束以及降阶约束信息更新到q

class kaiwu.core.Expression(coefficient: dict | None = None, offset: float = 0)#

Bases: dict

QUBO/Ising 通用表达式基类(提供默认二次表达式实现)

clear() None.  Remove all items from D.#
fromkeys(value=None, /)#

Create a new dictionary with keys from iterable and values set to value.

kaiwu.core.expr_add(expr_left, expr_right, expr_result)#

通用二次表达式相加

kaiwu.core.expr_mul(expr_left, expr_right, expr_result)#

通用二次表达式相乘

kaiwu.core.expr_neg(expr_origin, expr_result)#

通用二次表达式取负

kaiwu.core.expr_pow(expr_left, expr_right, expr_result)#

通用二次表达式乘方,要求expr_right只能为1或者2