def get_phiinv_byfreq_cliques(self, params, logdet=False, cholesky=False):
phi = self.get_phi(params, cliques=True)
if isinstance(phi, list):
return [None if phivec is None else phivec.inv(logdet)
for phivec in phi]
else:
ld = 0
# first invert all the cliques
for clcount in range(self._clcount):
idx = (self._cliques == clcount)
if np.any(idx):
idx2 = np.ix_(idx,idx)
if cholesky:
cf = sl.cho_factor(phi[idx2])
if logdet:
ld += 2.0*np.sum(np.log(np.diag(cf[0])))
phi[idx2] = sl.cho_solve(
cf, np.identity(cf[0].shape[0]))
else:
phi2 = phi[idx2]
if logdet:
ld += np.linalg.slogdet(phi2)[1]
phi[idx2] = np.linalg.inv(phi2)
# then do the pure diagonal terms
idx = (self._cliques == -1)
if logdet:
ld += np.sum(np.log(phi[idx,idx]))
phi[idx,idx] = 1.0/phi[idx,idx]
return (phi, ld) if logdet else phi
# we use "cliques" to account for sparse non-diagonal Phi matrices
# for each value in self._cliques, the matrix indices with that value form
# an independent submatrix that can be inverted separately
# reset clique index
评论列表
文章目录