kaiwu.core._get_val 源代码
# -*- coding: utf-8 -*-
"""
模块: qubo
功能: QUBO还原变量值
"""
import numbers
import numpy as np
[文档]
def 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.core.Binary("a")
>>> b = kw.core.Binary("b")
>>> c = kw.core.Binary("c")
>>> d = a + 2 * b + 4 * c
>>> d = kw.core.QuboModel(d)
>>> d_ising = kw.core.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)}
"""
# 除了虚拟变量以外,遍历vars_dict字典,对每个键都找到其位置,并在bin_c中取值。
return dict(
(k, (solution[index] + 1) / 2)
for k, index in vars_dict.items()
if k != "__spin__"
)
[文档]
def get_val(qubo, sol_dict):
"""根据结果字典将spin值带入qubo变量.
Args:
qubo (BinaryExpression or BinaryExpressionNDArray): QUBO表达式
sol_dict (dict): 由get_sol_dict生成的结果字典。
Returns:
float: 带入qubo后所得的值
Examples:
>>> import kaiwu as kw
>>> import numpy as np
>>> a = kw.core.Binary("a")
>>> b = kw.core.Binary("b")
>>> c = kw.core.Binary("c")
>>> d = a + 2 * b + 4 * c
>>> qubo_model = kw.core.QuboModel(d)
>>> d_ising = kw.core.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)
"""
if isinstance(qubo, numbers.Number):
return qubo
if isinstance(qubo, np.ndarray):
return _get_val(qubo, sol_dict)
value = qubo.offset # 结果加上offset
for k, val in qubo.coefficient.items(): # 遍历所有键值对
for var in k: # 对于每个键也遍历元组
val *= sol_dict.get(var, 0.0)
value += val # 累加一项的结果
return value
def _get_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.core.ndarray((2, 2), "x", kw.core.Binary)
>>> y = x.sum()
>>> y = kw.core.QuboModel(y)
>>> y_ising = kw.core.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_val(x, sol_dict)
array([[1., 0.],
[1., 0.]])
"""
val_array = np.zeros(array.shape) # 创建与qubo数组相同形状的空数组
for index in np.ndindex(array.shape): # 遍历数组的所有下标
val_array[index] = get_val(array[index], sol_dict) # 每个下标都调用get_val
return val_array
if __name__ == "__main__":
import doctest
doctest.testmod()