kaiwu.common._util 源代码
"""
一些简单的工具
"""
import numpy as np
[文档]
def check_symmetric(mat, tolerance=1e-8):
"""检查矩阵是否为对称矩阵,允许一定误差"""
result = np.all(np.abs(mat - mat.T) < tolerance)
return result
[文档]
def hamiltonian(ising_matrix, c_list):
"""计算哈密顿量.
Args:
ising_matrix (np.ndarray): Ising 矩阵.
c_list (np.ndarray): 要计算哈密顿量的变量组合集合.
Returns:
np.ndarray: 哈密顿量集合.
Examples:
>>> import numpy as np
>>> from kaiwu.common import hamiltonian
>>> ising_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. ]])
>>> c_list = np.array([[1, 1, 1, 1, 1], [1, -1, 1, -1, 1]])
>>> h = hamiltonian(ising_matrix, c_list) # doctest: +SKIP
"""
# 方法1 by 王勇 邵帅 (最快版)
return -np.einsum("ij,ij->i", (c_list.dot(ising_matrix)), c_list)
# 方法2 by 王勇 邵帅
# return ((c_list.dot(matrix))*c_list).sum(axis=1)
#
# 方法3 by 王勇
# temp = c_list.dot(matrix)
# return -np.array([temp[i] * c_list[i] for i in range(len(c_list))])
#
# 方法4 by 王勇
# return -np.diag((c_list.dot(matrix)).dot(c_list.T)) # 空间复杂度高
#
# 方法5 by 邵帅
# return -np.einsum('ij,ik,jk->i', c_list, c_list, matrix)
if __name__ == "__main__":
import doctest
doctest.testmod()