def test_scalar_normal_prior(self): prior = NormalPrior(0, 1) self.assertFalse(prior.log_transform) self.assertTrue(prior.is_in_support(torch.rand(1))) self.assertEqual(prior.shape, torch.Size([1])) self.assertEqual(prior.loc.item(), 0.0) self.assertEqual(prior.scale.item(), 1.0) self.assertAlmostEqual(prior.log_prob(prior.loc.new([0.0])).item(), math.log(1 / math.sqrt(2 * math.pi)), places=5)
def test_vector_normal_prior_size(self): prior = NormalPrior(0, 1, size=2) self.assertFalse(prior.log_transform) self.assertTrue(prior.is_in_support(torch.zeros(1))) self.assertEqual(prior.shape, torch.Size([2])) self.assertTrue(torch.equal(prior.loc, torch.tensor([0.0, 0.0]))) self.assertTrue(torch.equal(prior.scale, torch.tensor([1.0, 1.0]))) parameter = torch.tensor([1.0, 2.0]) self.assertAlmostEqual( prior.log_prob(parameter).item(), 2 * math.log(1 / math.sqrt(2 * math.pi)) - 0.5 * (parameter ** 2).sum().item(), places=5, )
def test_vector_normal_prior(self): prior = NormalPrior(torch.tensor([-0.5, 0.5]), torch.tensor([0.5, 1.0])) self.assertFalse(prior.log_transform) self.assertTrue(prior.is_in_support(torch.rand(1))) self.assertEqual(prior.shape, torch.Size([2])) self.assertTrue(torch.equal(prior.loc, prior.loc.new([-0.5, 0.5]))) self.assertTrue(torch.equal(prior.scale, prior.scale.new([0.5, 1.0]))) parameter = prior.loc.new([1.0, 2.0]) expected_log_prob = ( ((1 / math.sqrt(2 * math.pi) / prior.scale).log() - 0.5 / prior.scale**2 * (prior.loc.new_tensor(parameter) - prior.loc)**2).sum().item()) self.assertAlmostEqual(prior.log_prob( prior.loc.new_tensor(parameter)).item(), expected_log_prob, places=5)