From 1fa643c898d8cc3f8e9858ec49aa3d74338b649a Mon Sep 17 00:00:00 2001 From: ben18785 Date: Sun, 29 Sep 2019 19:38:00 +0100 Subject: [PATCH 1/4] Added MV Gaussian sensitivities and tests --- pints/_log_priors.py | 5 +++++ pints/tests/test_log_priors.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/pints/_log_priors.py b/pints/_log_priors.py index e318678b3..5cc00fdd9 100644 --- a/pints/_log_priors.py +++ b/pints/_log_priors.py @@ -660,12 +660,17 @@ def __init__(self, mean, cov): self._mean = mean self._cov = cov self._n_parameters = mean.shape[0] + self._cov_inverse = np.linalg.inv(self._cov) def __call__(self, x): return np.log( scipy.stats.multivariate_normal.pdf( x, mean=self._mean, cov=self._cov)) + def evaluateS1(self, x): + """ See :meth:`LogPDF.evaluateS1()`. """ + return self(x), -np.matmul(self._cov_inverse, x - self._mean) + def mean(self): """ See :meth:`LogPrior.mean()`. """ return self._mean diff --git a/pints/tests/test_log_priors.py b/pints/tests/test_log_priors.py index 47661b881..87f49307d 100755 --- a/pints/tests/test_log_priors.py +++ b/pints/tests/test_log_priors.py @@ -604,7 +604,13 @@ def test_multivariate_normal_prior(self): # Basic test covariance = [[1]] p = pints.MultivariateGaussianLogPrior(mean, covariance) - self.assertEqual(p([0]), -0.5 * np.log(2 * np.pi)) + x = [0] + y = p(x) + self.assertEqual(y, -0.5 * np.log(2 * np.pi)) + y1, dy = p.evaluateS1(x) + self.assertEqual(y, y1) + self.assertTrue(len(dy), 1) + self.assertEqual(dy[0], 0) # 5d tests mean = [1, 2, 3, 4, 5] @@ -623,6 +629,28 @@ def test_multivariate_normal_prior(self): ValueError, pints.MultivariateGaussianLogPrior, [1, 2], [[1, 0, 0], [0, 1, 0], [0, 0, 1]]) + # Test sensitivities + mean = [1, 3] + covariance = [[2, 0.5], [0.5, 2]] + p = pints.MultivariateGaussianLogPrior(mean, covariance) + y, dy = p.evaluateS1([4, 5]) + self.assertEqual(len(dy), 2) + self.assertAlmostEqual(y, -5.165421653067172, places=6) + dy_test = [-float(4 / 3), -float(2 / 3)] + self.assertAlmostEqual(dy[0], dy_test[0], places=6) + self.assertAlmostEqual(dy[1], dy_test[1], places=6) + + mean = [-5.5, 6.7, 3.2] + covariance = [[3.4, -0.5, -0.7], [-0.5, 2.7, 1.4], [-0.7, 1.4, 5]] + p = pints.MultivariateGaussianLogPrior(mean, covariance) + y, dy = p.evaluateS1([4.4, 3.5, -3]) + self.assertEqual(len(dy), 3) + self.assertAlmostEqual(y, -20.855279298674258, places=6) + dy_test = [-2.709773397444412, 0.27739553170576203, 0.7829609754801692] + self.assertAlmostEqual(dy[0], dy_test[0], places=6) + self.assertAlmostEqual(dy[1], dy_test[1], places=6) + self.assertAlmostEqual(dy[2], dy_test[2], places=6) + def test_multivariate_normal_sampling(self): d = 1 mean = 2 From 2718dc3d59d8ca5c1b7265e94e9ca2eb10d6055b Mon Sep 17 00:00:00 2001 From: ben18785 Date: Mon, 30 Sep 2019 10:47:11 +0100 Subject: [PATCH 2/4] Update test_log_priors.py --- pints/tests/test_log_priors.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pints/tests/test_log_priors.py b/pints/tests/test_log_priors.py index 87f49307d..cb5cbe707 100755 --- a/pints/tests/test_log_priors.py +++ b/pints/tests/test_log_priors.py @@ -601,17 +601,6 @@ def test_multivariate_normal_prior(self): self.assertRaises( ValueError, pints.MultivariateGaussianLogPrior, mean, covariance) - # Basic test - covariance = [[1]] - p = pints.MultivariateGaussianLogPrior(mean, covariance) - x = [0] - y = p(x) - self.assertEqual(y, -0.5 * np.log(2 * np.pi)) - y1, dy = p.evaluateS1(x) - self.assertEqual(y, y1) - self.assertTrue(len(dy), 1) - self.assertEqual(dy[0], 0) - # 5d tests mean = [1, 2, 3, 4, 5] covariance = np.diag(mean) @@ -651,6 +640,17 @@ def test_multivariate_normal_prior(self): self.assertAlmostEqual(dy[1], dy_test[1], places=6) self.assertAlmostEqual(dy[2], dy_test[2], places=6) + # 1d sensitivity test + covariance = [[1]] + p = pints.MultivariateGaussianLogPrior(mean, covariance) + x = [0] + y = p(x) + self.assertEqual(y, -0.5 * np.log(2 * np.pi)) + y1, dy = p.evaluateS1(x) + self.assertEqual(y, y1) + self.assertTrue(len(dy), 1) + self.assertEqual(dy[0], 0) + def test_multivariate_normal_sampling(self): d = 1 mean = 2 From e73566ee481520b8951e3f54bc05989e75081e20 Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Mon, 30 Sep 2019 11:00:33 +0100 Subject: [PATCH 3/4] Fixed log prior tests --- pints/tests/test_log_priors.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/pints/tests/test_log_priors.py b/pints/tests/test_log_priors.py index cb5cbe707..9909be256 100755 --- a/pints/tests/test_log_priors.py +++ b/pints/tests/test_log_priors.py @@ -590,16 +590,16 @@ def test_log_normal_prior_sampling(self): self.assertTrue(0.9 * analyt_mean < sample_mean < 1.1 * analyt_mean) def test_multivariate_normal_prior(self): - # 1d test - mean = 0 - covariance = 1 # Input must be a matrix self.assertRaises( - ValueError, pints.MultivariateGaussianLogPrior, mean, covariance) - covariance = [1] + ValueError, pints.MultivariateGaussianLogPrior, 0, 1) self.assertRaises( - ValueError, pints.MultivariateGaussianLogPrior, mean, covariance) + ValueError, pints.MultivariateGaussianLogPrior, 0, [1]) + + # 1d test + p = pints.MultivariateGaussianLogPrior(0, [[1]]) + self.assertEqual(p([0]), -0.5 * np.log(2 * np.pi)) # 5d tests mean = [1, 2, 3, 4, 5] @@ -641,8 +641,7 @@ def test_multivariate_normal_prior(self): self.assertAlmostEqual(dy[2], dy_test[2], places=6) # 1d sensitivity test - covariance = [[1]] - p = pints.MultivariateGaussianLogPrior(mean, covariance) + p = pints.MultivariateGaussianLogPrior(0, [[1]]) x = [0] y = p(x) self.assertEqual(y, -0.5 * np.log(2 * np.pi)) From 94c429c5aaae0927acf4e4f59e24022f205c5903 Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Mon, 30 Sep 2019 11:02:18 +0100 Subject: [PATCH 4/4] Simplified log prior tests --- pints/tests/test_log_priors.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pints/tests/test_log_priors.py b/pints/tests/test_log_priors.py index 9909be256..863c6ae68 100755 --- a/pints/tests/test_log_priors.py +++ b/pints/tests/test_log_priors.py @@ -643,10 +643,8 @@ def test_multivariate_normal_prior(self): # 1d sensitivity test p = pints.MultivariateGaussianLogPrior(0, [[1]]) x = [0] - y = p(x) - self.assertEqual(y, -0.5 * np.log(2 * np.pi)) - y1, dy = p.evaluateS1(x) - self.assertEqual(y, y1) + y, dy = p.evaluateS1(x) + self.assertEqual(y, p(x)) self.assertTrue(len(dy), 1) self.assertEqual(dy[0], 0)