def fvar(self):
"""Estimate the variances of the reduced free energies."""
# Shorthand indices - notation similiar to Ref. 1
n, m, mpk = self.total_samples, self.nstates_sampled, self.nstates
k = mpk - m
mask0, maskn0 = self.mask_zero, self.mask_nonzero
_W_nj = self._W_nj
O = _W_nj.T.dot(_W_nj) / n
Os = O[:, :m]
B1 = (hstack((Os.dot(self.PIs), zeros((mpk, k))))
- identity(mpk))[1:, 1:]
A1 = (O - Os.dot(self.PIs).dot(Os.T))[1:, 1:]
V = solve(B1, A1).dot(inv(B1.T)) / n
# if any(diagonal(V) < 0.):
# D = _W_nj.T.dot(self._R_nj) / n
# A1 = (O - D.dot(self.PIs).dot(D.T))[1:, 1:]
# V = solve(B1, A1).dot(inv(B1.T)) / n
# Unshuffle the state indices. Note that the variance of state 0 is
# zero by construction and thus is omitted from V - since the user
# selected state 0 may be different from the lowest indexed sample
# state, re-adjust so that the actual state 0 has zero variance.
#
V_full = zeros((mpk, mpk))
V_full[1:, 1:] = V
var = zeros(mpk)
var[maskn0] += diagonal(V_full)[:m]
var[mask0] += diagonal(V_full)[m:]
var += var[0]
var[0] = 0.0
return var
评论列表
文章目录