def test_lognormal_distribution(moment): num_samples = 100000 inputs = OrderedDict(batch=bint(10)) loc = random_tensor(inputs) scale = random_tensor(inputs).exp() log_measure = dist.LogNormal(loc, scale)(value='x') probe = Variable('x', reals())**moment with monte_carlo_interpretation(particle=bint(num_samples)): with xfail_if_not_implemented(): actual = Integrate(log_measure, probe, frozenset(['x'])) samples = torch.distributions.LogNormal(loc, scale).sample((num_samples, )) expected = (samples**moment).mean(0) assert_close(actual.data, expected, atol=1e-2, rtol=1e-2)
def test_lognormal_density(batch_shape): batch_dims = ('i', 'j', 'k')[:len(batch_shape)] inputs = OrderedDict((k, bint(v)) for k, v in zip(batch_dims, batch_shape)) @funsor.torch.function(reals(), reals(), reals(), reals()) def log_normal(loc, scale, value): return torch.distributions.LogNormal(loc, scale).log_prob(value) check_funsor(log_normal, { 'loc': reals(), 'scale': reals(), 'value': reals() }, reals()) loc = Tensor(torch.randn(batch_shape), inputs) scale = Tensor(torch.randn(batch_shape).exp(), inputs) value = Tensor(torch.randn(batch_shape).exp(), inputs) expected = log_normal(loc, scale, value) check_funsor(expected, inputs, reals()) actual = dist.LogNormal(loc, scale, value) check_funsor(actual, inputs, reals()) assert_close(actual, expected)