def expectation_tv(self, data_list):
N, F = read_data(data_list, self.nmix, self.ndim)
nfiles = F.shape[0]
nframes = N.sum()
LU = np.zeros((self.nmix, self.tv_dim * (self.tv_dim + 1) // 2))
RU = np.zeros((self.tv_dim, self.nmix * self.ndim))
LLK = 0.
T_invS = self.Tm / self.Sigma
T_iS_Tt = self.comp_T_invS_Tt()
parts = 2500 # modify this based on your HW resources (e.g., memory)
nbatch = int(nfiles / parts + 0.99999)
for batch in range(nbatch):
start = batch * parts
fin = min((batch + 1) * parts, nfiles)
length = fin - start
N1 = N[start:fin]
F1 = F[start:fin]
L1 = N1.dot(T_iS_Tt)
B1 = F1.dot(T_invS.T)
Ex = np.empty((length, self.tv_dim))
Exx = np.empty((length, self.tv_dim * (self.tv_dim + 1) // 2))
llk = np.zeros((length, 1))
for ix in range(length):
L = np.zeros((self.tv_dim, self.tv_dim))
L[self.itril] = L1[ix]
L += np.tril(L, -1).T + self.Im
Cxx = inv(L)
B = B1[ix][:, np.newaxis]
this_Ex = Cxx.dot(B)
llk[ix] = self.res_llk(this_Ex, B)
Ex[ix] = this_Ex.T
Exx[ix] = (Cxx + this_Ex.dot(this_Ex.T))[self.itril]
RU += Ex.T.dot(F1)
LU += N1.T.dot(Exx)
LLK += llk.sum()
self.Tm = None
tmp_string = ''.join(random.choices(string.ascii_uppercase + string.digits, k=16))
tmpfile = self.tmpdir + 'tmat_' + tmp_string + '.h5'
h5write(tmpfile, LU, 'LU')
return RU, LLK, nframes
评论列表
文章目录