kaiwu.core._model_converter 源代码
# -*- coding: utf-8 -*-
"""
模块: qubo
功能: QUBO模型和Ising模型转换
"""
import numpy as np
from kaiwu.core._ising import IsingModel, IsingExpression
def _to_ising(qubo_expr):
"""QUBO表达式转化为Ising模型"""
variables_set = set()
quadratic = {}
linear = {}
bias = 0
for key in qubo_expr.coefficient:
variables_set.add(key[0])
if len(key) == 2:
variables_set.add(key[1])
coefficient = qubo_expr.coefficient[key] / 4
quadratic[key] = coefficient
if key[0] in linear:
linear[key[0]] += coefficient
else:
linear[key[0]] = coefficient
if key[1] in linear:
linear[key[1]] += coefficient
else:
linear[key[1]] = coefficient
bias += coefficient
else:
coefficient = qubo_expr.coefficient[key] / 2
if key[0] in linear:
linear[key[0]] += coefficient
else:
linear[key[0]] = coefficient
bias += coefficient
bias += qubo_expr.offset
variables_set = list(variables_set)
variables_set.sort()
variables_set = tuple(variables_set)
return IsingExpression(variables_set, quadratic, linear, bias)
[文档]
def qubo_model_to_ising_model(qubo_model):
"""QUBO转Ising模型.
Args:
qubo_model (QuboModel): QUBO Model.
Returns:
CimIsing: Ising模型.
Examples:
>>> import kaiwu as kw
>>> b1, b2 = kw.core.Binary("b1"), kw.core.Binary("b2")
>>> q = b1 + b2 + b1*b2
>>> q_model = kw.core.QuboModel(q)
>>> ci = kw.core.qubo_model_to_ising_model(q_model)
>>> print(str(ci))
Ising Details:
Ising Matrix:
[[-0. -0.125 -0.375]
[-0.125 -0. -0.375]
[-0.375 -0.375 -0. ]]
Ising Bias: 1.25
Ising Variables: b1, b2, __spin__
<BLANKLINE>
"""
qubo_model.compile_constraints()
qubo_expr = qubo_model.make()
ising_expression = _to_ising(qubo_expr)
variable_index = dict(
zip(ising_expression.variables, range(len(ising_expression.variables)))
)
variable_index["__spin__"] = len(ising_expression.variables)
cim_matrix = np.zeros(
(len(ising_expression.variables) + 1, len(ising_expression.variables) + 1)
)
for key in ising_expression.quadratics:
cim_matrix[variable_index[key[0]], variable_index[key[1]]] = (
ising_expression.quadratics[key]
)
for key in ising_expression.linear:
cim_matrix[variable_index[key], len(ising_expression.variables)] = (
ising_expression.linear[key]
)
cim_matrix = cim_matrix + cim_matrix.T
return IsingModel(variable_index, -0.5 * cim_matrix, ising_expression.bias)
if __name__ == "__main__":
import doctest
doctest.testmod()