From f5427bf26fba54512e138a5a8c65313773572a84 Mon Sep 17 00:00:00 2001 From: John McFarland Date: Wed, 23 Nov 2022 17:01:27 -0600 Subject: [PATCH 1/2] Add test case for shape error when no user gradient New test cases illustrates an error when calling compute_gradient on a Model instance that has frozen parameters and does not have a user-defined gradient. The error occurs because get/set parameter vector is called without including frozen parameters, whereas the indexing in get_gradient expects the result to include all parameters. --- tests/test_modeling.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/test_modeling.py b/tests/test_modeling.py index 050871ce..43457bbb 100644 --- a/tests/test_modeling.py +++ b/tests/test_modeling.py @@ -72,6 +72,13 @@ def compute_gradient(self, x): return dict(m=x, b=np.ones(len(x))) +class LinearWhiteNoiseWithoutGrad(Model): + parameter_names = ("m", "b") + + def get_value(self, x): + return self.m * x + self.b + + def test_gp_callable_white_noise(N=50, seed=1234): np.random.seed(seed) x = np.random.uniform(0, 5) @@ -86,6 +93,20 @@ def test_gp_callable_white_noise(N=50, seed=1234): check_gradient(gp, y) +def test_gp_callable_white_noise_without_grad(N=50, seed=1234): + np.random.seed(seed) + x = np.random.uniform(0, 5) + y = 5 + np.sin(x) + gp = GP(10. * kernels.ExpSquaredKernel(1.3), mean=5.0, + white_noise=LinearWhiteNoiseWithoutGrad(-6, 0.01), + fit_white_noise=True) + gp.compute(x) + check_gradient(gp, y) + + gp.freeze_parameter("white_noise:m") + check_gradient(gp, y) + + def test_parameters(): kernel = 10 * kernels.ExpSquaredKernel(1.0) kernel += 0.5 * kernels.RationalQuadraticKernel(log_alpha=0.1, metric=5.0) From f28f50ec5fc87790429aba9e0b3c4363b551ad26 Mon Sep 17 00:00:00 2001 From: John McFarland Date: Wed, 23 Nov 2022 17:06:40 -0600 Subject: [PATCH 2/2] Fix compute_gradient to include frozen parameters Fixes newly added test case. --- src/george/modeling.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/george/modeling.py b/src/george/modeling.py index 6fe441b6..44a48ed5 100644 --- a/src/george/modeling.py +++ b/src/george/modeling.py @@ -115,15 +115,15 @@ def compute_gradient(self, *args, **kwargs): """ _EPS = 1.254e-5 - vector = self.get_parameter_vector() + vector = self.get_parameter_vector(include_frozen=True) value0 = self.get_value(*args, **kwargs) grad = np.empty([len(vector)] + list(value0.shape), dtype=np.float64) for i, v in enumerate(vector): vector[i] = v + _EPS - self.set_parameter_vector(vector) + self.set_parameter_vector(vector, include_frozen=True) value = self.get_value(*args, **kwargs) vector[i] = v - self.set_parameter_vector(vector) + self.set_parameter_vector(vector, include_frozen=True) grad[i] = (value - value0) / _EPS return grad