我有一种非常紧凑的方法来使用 itertools、lambda 函数和大型 NumPy 数组来计算类似 Ising 的模型的分区函数。给定一个由N
节点和Q
“状态”/节点组成的网络,我有两个数组,h
-fields 和J
-couplings,大小分别为(N,Q)
和(N,N,Q,Q)
。然而,J 是上三角形。使用这些数组,我一直在Z
使用以下方法计算分区函数:
# Set up lambda functions and iteration tuples of the form (A_1, A_2, ..., A_n)
iters = itertools.product(range(Q),repeat=N)
hf = lambda s: h[range(N),s]
jf = lambda s: np.array([J[fi,fj,s[fi],s[fj]] \
for fi,fj in itertools.combinations(range(N),2)]).flatten()
# Initialize and populate partition function array
pf = np.zeros(tuple([Q for i in range(N)]))
for it in iters:
hterms = np.exp(hf(it)).prod()
jterms = np.exp(-jf(it)).prod()
pf[it] = jterms * hterms
# Calculates partition function
Z = pf.sum()
这种方法适用于小型N
,Q
比如说(N,Q) = (5,2)
。但是,对于较大的系统,由于内存问题(N,Q) = (18,3)
,此方法甚至无法创建数组,因为它具有非平凡元素。关于如何克服此内存问题或如何更改代码以在子数组上工作的任何想法?pf
Q^N
编辑:在定义中犯了一个小错误jf
。它已得到纠正。