def test_computeLogPDF_diagonal_case(self): """Test InverseWishart.computeLogPDF in the case of diagonal matrices""" dimension, DoF = self.dimension, self.DoF k = 0.5 * (DoF + dimension - 1) diagX = ot.Uniform(0.5, 1.).getSample(dimension) Scale = ot.CovarianceMatrix(dimension) X = ot.CovarianceMatrix(dimension) for d in range(dimension): Scale[d, d], X[d, d] = self.Scale[d, d], diagX[d, 0] inverse_wishart = ot.InverseWishart(Scale, DoF) logdensity = inverse_wishart.computeLogPDF(X) logratio = - self.logmultigamma(dimension, 0.5 * DoF) \ + dimension * ot.SpecFunc_LnGamma(0.5 * (DoF + dimension - 1)) for d in range(dimension): inverse_gamma = ot.InverseGamma(k, 2. / Scale[d, d]) logdensity = logdensity - inverse_gamma.computeLogPDF(diagX[d, 0]) logratio = logratio + 0.5 * \ (1 - dimension) * log(0.5 * Scale[d, d]) assert_almost_equal(logdensity, logratio)
def logmultigamma(self, p, x): """Computes the logarithm of the multi-gamma function at x""" logmgpx = 0.25 * p * (p - 1) * log(pi) for i in range(1, p + 1): logmgpx = logmgpx + ot.SpecFunc_LnGamma(x + 0.5 * (1 - i)) return logmgpx