From 42ffa0dbc260fd9608a3b9bd4185b2bcbbb83023 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Tue, 13 Nov 2018 11:23:35 -0500 Subject: [PATCH 01/32] changed default values for TruncatedNormal lower and upper to -np.inf and np.inf --- pymc3/distributions/continuous.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 984ca3e577..3f08b056a7 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -575,8 +575,8 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, tau, sd = get_tau_sd(tau=tau, sd=sd) self.sd = tt.as_tensor_variable(sd) self.tau = tt.as_tensor_variable(tau) - self.lower = tt.as_tensor_variable(lower) if lower is not None else lower - self.upper = tt.as_tensor_variable(upper) if upper is not None else upper + self.lower = tt.as_tensor_variable(lower) if lower is not None else -np.inf + self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf self.mu = tt.as_tensor_variable(mu) if self.lower is None and self.upper is None: From 51fd1fb51ea94fadb9ca45156065aa68073fc161 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Tue, 13 Nov 2018 16:23:09 -0500 Subject: [PATCH 02/32] inserted an idea for testing in test_distributions_random.py --- pymc3/tests/test_distributions_random.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 9bc2841624..71327f6202 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -138,6 +138,15 @@ def get_random_variable(self, shape, with_vector_params=False, name=None): else: return self.distribution(name, shape=shape, transform=None, **params) + def get_random_variable_default_params(self, shape, name=None): + if name is None: + name = self.distribution.__name__ + with self.model: + if shape is None: + return self.distribution(name, transform=None) + else: + return self.distribution(name, shape=shape, transform=None) + @staticmethod def sample_random_variable(random_variable, size): try: @@ -145,6 +154,10 @@ def sample_random_variable(random_variable, size): except AttributeError: return random_variable.distribution.random(size=size) + def test_sample_random_variable_default_params(self, size): + rv = self.get_random_variable_default_params(None) + self.sample_random_variable(rv, size) + @pytest.mark.parametrize('size', [None, 5, (4, 5)], ids=str) def test_scalar_parameter_shape(self, size): rv = self.get_random_variable(None) From 2e6444bfe22596da0bfbb0a26c744b390442bade Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 09:40:48 -0500 Subject: [PATCH 03/32] included a standalone test test_truncated_normal_sample_random_variable_default_params --- pymc3/tests/test_distributions_random.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 71327f6202..9ff8901e88 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -138,15 +138,6 @@ def get_random_variable(self, shape, with_vector_params=False, name=None): else: return self.distribution(name, shape=shape, transform=None, **params) - def get_random_variable_default_params(self, shape, name=None): - if name is None: - name = self.distribution.__name__ - with self.model: - if shape is None: - return self.distribution(name, transform=None) - else: - return self.distribution(name, shape=shape, transform=None) - @staticmethod def sample_random_variable(random_variable, size): try: @@ -154,10 +145,6 @@ def sample_random_variable(random_variable, size): except AttributeError: return random_variable.distribution.random(size=size) - def test_sample_random_variable_default_params(self, size): - rv = self.get_random_variable_default_params(None) - self.sample_random_variable(rv, size) - @pytest.mark.parametrize('size', [None, 5, (4, 5)], ids=str) def test_scalar_parameter_shape(self, size): rv = self.get_random_variable(None) @@ -432,7 +419,6 @@ def ref_rand(size, tau): def test_uniform(self): def ref_rand(size, lower, upper): return st.uniform.rvs(size=size, loc=lower, scale=upper - lower) - pymc3_random(pm.Uniform, {'lower': -Rplus, 'upper': Rplus}, ref_rand=ref_rand) def test_normal(self): @@ -892,3 +878,7 @@ def test_density_dist_without_random_not_sampleable(): samples = 500 with pytest.raises(ValueError): pm.sample_posterior_predictive(trace, samples=samples, model=model, size=100) + +def test_truncated_normal_sample_random_variable_default_params(self, size) + rv = pm.TruncatedNormal.dist(transform=None) + rv.random(size=size) From 52714335623b17e16d51ffad0c1361f911550afd Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 09:43:32 -0500 Subject: [PATCH 04/32] minor --- pymc3/tests/test_distributions_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 9ff8901e88..1f02c03dff 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -879,6 +879,6 @@ def test_density_dist_without_random_not_sampleable(): with pytest.raises(ValueError): pm.sample_posterior_predictive(trace, samples=samples, model=model, size=100) -def test_truncated_normal_sample_random_variable_default_params(self, size) +def test_truncated_normal_sample_random_variable_default_params(self, size): rv = pm.TruncatedNormal.dist(transform=None) rv.random(size=size) From 893414fdbada86a9741553563ab725028864e319 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 09:59:23 -0500 Subject: [PATCH 05/32] minor --- pymc3/tests/test_distributions_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 1f02c03dff..ea82f04452 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -879,6 +879,6 @@ def test_density_dist_without_random_not_sampleable(): with pytest.raises(ValueError): pm.sample_posterior_predictive(trace, samples=samples, model=model, size=100) -def test_truncated_normal_sample_random_variable_default_params(self, size): +def test_truncated_normal_sample_random_variable_default_params(size=None): rv = pm.TruncatedNormal.dist(transform=None) rv.random(size=size) From 28350869e4047f0561d327025483091a1af7f5af Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 13:47:57 -0500 Subject: [PATCH 06/32] changed _default value cases in continuous.TruncatedNormal to avoid np.isfinite error in distribution.Distribution --- pymc3/distributions/continuous.py | 6 +++--- pymc3/tests/test_distributions_random.py | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 3f08b056a7..792310987e 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -579,11 +579,11 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf self.mu = tt.as_tensor_variable(mu) - if self.lower is None and self.upper is None: + if not np.isfinite(self.lower) and not np.isfinite(self.upper): self._defaultval = mu - elif self.lower is None and self.upper is not None: + elif not np.isfinite(self.lower) and np.isfinite(self.upper): self._defaultval = self.upper - 1. - elif self.lower is not None and self.upper is None: + elif np.isfinite(self.lower) and not np.isfinite(self.upper): self._defaultval = self.lower + 1. else: self._defaultval = (self.lower + self.upper) / 2 diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index ea82f04452..52846dafc7 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -221,6 +221,10 @@ class TestTruncatedNormal(BaseTestCases.BaseTestCase): distribution = pm.TruncatedNormal params = {'mu': 0., 'tau': 1., 'lower':-0.5, 'upper':0.5} +class TestTruncatedNormalLower(BaseTestCases.BaseTestCase): + distribution = pm.TruncatedNormal + params = {'mu': 0., 'tau': 1., 'lower':-0.5} + class TestSkewNormal(BaseTestCases.BaseTestCase): distribution = pm.SkewNormal params = {'mu': 0., 'sd': 1., 'alpha': 5.} @@ -432,6 +436,12 @@ def ref_rand(size, mu, sd, lower, upper): pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) + def test_truncated_normal_lower(self): + def ref_rand(size, mu, sd, lower, upper): + return st.truncnorm.rvs((lower-mu)/sd, (np.inf-mu)/sd, size=size, loc=mu, scale=sd) + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig}, + ref_rand=ref_rand) + def test_skew_normal(self): def ref_rand(size, alpha, mu, sd): return st.skewnorm.rvs(size=size, a=alpha, loc=mu, scale=sd) @@ -878,7 +888,3 @@ def test_density_dist_without_random_not_sampleable(): samples = 500 with pytest.raises(ValueError): pm.sample_posterior_predictive(trace, samples=samples, model=model, size=100) - -def test_truncated_normal_sample_random_variable_default_params(size=None): - rv = pm.TruncatedNormal.dist(transform=None) - rv.random(size=size) From ff5826cb01da535b0fdaf89c4b780d75e543ff69 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 14:16:44 -0500 Subject: [PATCH 07/32] minor --- pymc3/distributions/continuous.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 792310987e..08524cf38a 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -579,11 +579,11 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf self.mu = tt.as_tensor_variable(mu) - if not np.isfinite(self.lower) and not np.isfinite(self.upper): + if tt.isinf(self.lower) and tt.isinf(self.upper): self._defaultval = mu - elif not np.isfinite(self.lower) and np.isfinite(self.upper): + elif tt.isinf(self.lower) and not tt.isinf(self.upper): self._defaultval = self.upper - 1. - elif np.isfinite(self.lower) and not np.isfinite(self.upper): + elif not tt.isinf(self.lower) and tt.isinf(self.upper): self._defaultval = self.lower + 1. else: self._defaultval = (self.lower + self.upper) / 2 From 590ed88d10f895877860ae3d0c9b6bbc95362fc8 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 14:38:10 -0500 Subject: [PATCH 08/32] removed test_truncated_normal_lower from TestScalarParameterSamples since pymc3_random sets paramdomains points anyway --- pymc3/tests/test_distributions_random.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 52846dafc7..136a81a4e1 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -436,12 +436,6 @@ def ref_rand(size, mu, sd, lower, upper): pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) - def test_truncated_normal_lower(self): - def ref_rand(size, mu, sd, lower, upper): - return st.truncnorm.rvs((lower-mu)/sd, (np.inf-mu)/sd, size=size, loc=mu, scale=sd) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig}, - ref_rand=ref_rand) - def test_skew_normal(self): def ref_rand(size, alpha, mu, sd): return st.skewnorm.rvs(size=size, a=alpha, loc=mu, scale=sd) From e9d892ceda642cb09c7772bc776c5388a0ce370d Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Wed, 14 Nov 2018 16:52:20 -0500 Subject: [PATCH 09/32] added TestTruncatedNormalUpper and addressed TruncatedNormal _normalization errors --- pymc3/distributions/continuous.py | 6 +++--- pymc3/tests/test_distributions_random.py | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 08524cf38a..b469e1abbe 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -653,10 +653,10 @@ def logp(self, value): def _normalization(self): mu, sd = self.mu, self.sd - if self.lower is None and self.upper is None: + if tt.isinf(self.lower) and tt.isinf(self.upper): return 0. - if self.lower is not None and self.upper is not None: + if not tt.isinf(self.lower) and not tt.isinf(self.upper): lcdf_a = normal_lcdf(mu, sd, self.lower) lcdf_b = normal_lcdf(mu, sd, self.upper) lsf_a = normal_lccdf(mu, sd, self.lower) @@ -668,7 +668,7 @@ def _normalization(self): logdiffexp(lcdf_b, lcdf_a), ) - if self.lower is not None: + if not tt.isinf(self.lower): return normal_lccdf(mu, sd, self.lower) else: return normal_lcdf(mu, sd, self.upper) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 136a81a4e1..c91215ad66 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -225,6 +225,10 @@ class TestTruncatedNormalLower(BaseTestCases.BaseTestCase): distribution = pm.TruncatedNormal params = {'mu': 0., 'tau': 1., 'lower':-0.5} +class TestTruncatedNormalUpper(BaseTestCases.BaseTestCase): + distribution = pm.TruncatedNormal + params = {'mu': 0., 'tau': 1., 'upper':0.5} + class TestSkewNormal(BaseTestCases.BaseTestCase): distribution = pm.SkewNormal params = {'mu': 0., 'sd': 1., 'alpha': 5.} From 05b5c4cd4618e63554c780685aa81f4c58ab6f46 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 09:49:07 -0500 Subject: [PATCH 10/32] changed TruncatedNormal.logp to check for infs instead of Nones --- pymc3/distributions/continuous.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index b469e1abbe..fc8267f4a6 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -644,9 +644,9 @@ def logp(self, value): logp = Normal.dist(mu=mu, sd=sd).logp(value) - norm bounds = [sd > 0] - if self.lower is not None: + if not tt.isinf(self.lower): bounds.append(value >= self.lower) - if self.upper is not None: + if not tt.isinf(self.upper): bounds.append(value <= self.upper) return bound(logp, *bounds) From 68dae58ce634c9edcd9a33f5aa60a7dce850bcab Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 11:10:31 -0500 Subject: [PATCH 11/32] debugging --- pymc3/distributions/continuous.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index fc8267f4a6..5302f91412 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -645,9 +645,11 @@ def logp(self, value): bounds = [sd > 0] if not tt.isinf(self.lower): + print('setting lower', value >= self.lower) bounds.append(value >= self.lower) if not tt.isinf(self.upper): bounds.append(value <= self.upper) + print('setting upper', value <= self.upper) return bound(logp, *bounds) def _normalization(self): From 7d03359cbb878c42e563521b6a07fcbf10d271cb Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 11:12:17 -0500 Subject: [PATCH 12/32] debugging --- pymc3/distributions/continuous.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 5302f91412..6d75c7e646 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -644,9 +644,11 @@ def logp(self, value): logp = Normal.dist(mu=mu, sd=sd).logp(value) - norm bounds = [sd > 0] + print('not tt.isinf(self.lower)', not tt.isinf(self.lower)) if not tt.isinf(self.lower): print('setting lower', value >= self.lower) bounds.append(value >= self.lower) + print('not tt.isinf(self.upper)', not tt.isinf(self.upper)) if not tt.isinf(self.upper): bounds.append(value <= self.upper) print('setting upper', value <= self.upper) From a58e8cb59160d87b003881e2c5588119b71589eb Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 11:14:29 -0500 Subject: [PATCH 13/32] debugging --- pymc3/distributions/continuous.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 6d75c7e646..b7f8e9945c 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -644,10 +644,12 @@ def logp(self, value): logp = Normal.dist(mu=mu, sd=sd).logp(value) - norm bounds = [sd > 0] + print('self.lower', self.lower) print('not tt.isinf(self.lower)', not tt.isinf(self.lower)) if not tt.isinf(self.lower): print('setting lower', value >= self.lower) bounds.append(value >= self.lower) + print('self.upper', self.upper) print('not tt.isinf(self.upper)', not tt.isinf(self.upper)) if not tt.isinf(self.upper): bounds.append(value <= self.upper) From ae90f8fcac1594409aa397a8100a4a370f62b035 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 11:17:23 -0500 Subject: [PATCH 14/32] debugging --- pymc3/distributions/continuous.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index b7f8e9945c..6201dfa5d8 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -645,11 +645,13 @@ def logp(self, value): bounds = [sd > 0] print('self.lower', self.lower) + print('tt.isinf(self.lower)', tt.isinf(self.lower)) print('not tt.isinf(self.lower)', not tt.isinf(self.lower)) if not tt.isinf(self.lower): print('setting lower', value >= self.lower) bounds.append(value >= self.lower) print('self.upper', self.upper) + print('tt.isinf(self.upper)', tt.isinf(self.upper)) print('not tt.isinf(self.upper)', not tt.isinf(self.upper)) if not tt.isinf(self.upper): bounds.append(value <= self.upper) From 8ea31bf05da3f22324c2615ea09c55e2145c81a5 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 11:18:56 -0500 Subject: [PATCH 15/32] debugging --- pymc3/distributions/continuous.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 6201dfa5d8..d8c3667f32 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -645,13 +645,13 @@ def logp(self, value): bounds = [sd > 0] print('self.lower', self.lower) - print('tt.isinf(self.lower)', tt.isinf(self.lower)) + print('tt.isinf(self.lower)', tt.isinf(self.lower).eval()) print('not tt.isinf(self.lower)', not tt.isinf(self.lower)) if not tt.isinf(self.lower): print('setting lower', value >= self.lower) bounds.append(value >= self.lower) print('self.upper', self.upper) - print('tt.isinf(self.upper)', tt.isinf(self.upper)) + print('tt.isinf(self.upper)', tt.isinf(self.upper).eval()) print('not tt.isinf(self.upper)', not tt.isinf(self.upper)) if not tt.isinf(self.upper): bounds.append(value <= self.upper) From 77a0e8cac834bb921d2e0ae09958ba16b0db3f9b Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Thu, 15 Nov 2018 11:25:07 -0500 Subject: [PATCH 16/32] debugging --- pymc3/distributions/continuous.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index d8c3667f32..2bbe5ab403 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -647,12 +647,14 @@ def logp(self, value): print('self.lower', self.lower) print('tt.isinf(self.lower)', tt.isinf(self.lower).eval()) print('not tt.isinf(self.lower)', not tt.isinf(self.lower)) + print('tt.neg(tt.isinf(self.lower))', tt.neg(tt.isinf(self.lower))) if not tt.isinf(self.lower): print('setting lower', value >= self.lower) bounds.append(value >= self.lower) print('self.upper', self.upper) print('tt.isinf(self.upper)', tt.isinf(self.upper).eval()) print('not tt.isinf(self.upper)', not tt.isinf(self.upper)) + print('tt.neg(tt.isinf(self.upper))', tt.neg(tt.isinf(self.upper))) if not tt.isinf(self.upper): bounds.append(value <= self.upper) print('setting upper', value <= self.upper) From af89cba48681e91b5accec1f4a26680256d3627e Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 30 Nov 2018 12:57:29 -0500 Subject: [PATCH 17/32] tried np.isinf and put in the requested test_truncated_normal_lower test_truncated_normal_upper tests --- pymc3/distributions/continuous.py | 26 ++++++++---------------- pymc3/tests/test_distributions_random.py | 12 +++++++++++ 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 2bbe5ab403..5f9ad7729f 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -579,11 +579,11 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf self.mu = tt.as_tensor_variable(mu) - if tt.isinf(self.lower) and tt.isinf(self.upper): + if np.isinf(self.lower) and np.isinf(self.upper): self._defaultval = mu - elif tt.isinf(self.lower) and not tt.isinf(self.upper): + elif np.isinf(self.lower) and not np.isinf(self.upper): self._defaultval = self.upper - 1. - elif not tt.isinf(self.lower) and tt.isinf(self.upper): + elif not np.isinf(self.lower) and np.isinf(self.upper): self._defaultval = self.lower + 1. else: self._defaultval = (self.lower + self.upper) / 2 @@ -644,29 +644,19 @@ def logp(self, value): logp = Normal.dist(mu=mu, sd=sd).logp(value) - norm bounds = [sd > 0] - print('self.lower', self.lower) - print('tt.isinf(self.lower)', tt.isinf(self.lower).eval()) - print('not tt.isinf(self.lower)', not tt.isinf(self.lower)) - print('tt.neg(tt.isinf(self.lower))', tt.neg(tt.isinf(self.lower))) - if not tt.isinf(self.lower): - print('setting lower', value >= self.lower) + if not np.isinf(self.lower): bounds.append(value >= self.lower) - print('self.upper', self.upper) - print('tt.isinf(self.upper)', tt.isinf(self.upper).eval()) - print('not tt.isinf(self.upper)', not tt.isinf(self.upper)) - print('tt.neg(tt.isinf(self.upper))', tt.neg(tt.isinf(self.upper))) - if not tt.isinf(self.upper): + if not np.isinf(self.upper): bounds.append(value <= self.upper) - print('setting upper', value <= self.upper) return bound(logp, *bounds) def _normalization(self): mu, sd = self.mu, self.sd - if tt.isinf(self.lower) and tt.isinf(self.upper): + if np.isinf(self.lower) and np.isinf(self.upper): return 0. - if not tt.isinf(self.lower) and not tt.isinf(self.upper): + if not np.isinf(self.lower) and not np.isinf(self.upper): lcdf_a = normal_lcdf(mu, sd, self.lower) lcdf_b = normal_lcdf(mu, sd, self.upper) lsf_a = normal_lccdf(mu, sd, self.lower) @@ -678,7 +668,7 @@ def _normalization(self): logdiffexp(lcdf_b, lcdf_a), ) - if not tt.isinf(self.lower): + if not np.isinf(self.lower): return normal_lccdf(mu, sd, self.lower) else: return normal_lcdf(mu, sd, self.upper) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index c91215ad66..82fa907510 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -440,6 +440,18 @@ def ref_rand(size, mu, sd, lower, upper): pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) + def test_truncated_normal_lower(self): + def ref_rand(size, mu, sd, lower, upper): + return st.truncnorm.rvs((lower-mu)/sd, np.inf, size=size, loc=mu, scale=sd) + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + ref_rand=ref_rand) + + def test_truncated_normal_upper(self): + def ref_rand(size, mu, sd, lower, upper): + return st.truncnorm.rvs(-np.inf, (upper-mu)/sd, size=size, loc=mu, scale=sd) + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + ref_rand=ref_rand) + def test_skew_normal(self): def ref_rand(size, alpha, mu, sd): return st.skewnorm.rvs(size=size, a=alpha, loc=mu, scale=sd) From 3febdd3e6875a92835dc0c91874724dd558107e5 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 10:31:43 -0700 Subject: [PATCH 18/32] added extra members self.lower_np self.upper_np for checking values --- pymc3/distributions/continuous.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 5f9ad7729f..fbff4f7d9e 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -577,13 +577,15 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, self.tau = tt.as_tensor_variable(tau) self.lower = tt.as_tensor_variable(lower) if lower is not None else -np.inf self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf + self.lower_np = lower if lower is not None else -np.inf + self.upper_np = upper if upper is not None else np.inf self.mu = tt.as_tensor_variable(mu) - if np.isinf(self.lower) and np.isinf(self.upper): + if np.isinf(self.lower_np) and np.isinf(self.upper_np): self._defaultval = mu - elif np.isinf(self.lower) and not np.isinf(self.upper): + elif np.isinf(self.lower_np) and not np.isinf(self.upper_np): self._defaultval = self.upper - 1. - elif not np.isinf(self.lower) and np.isinf(self.upper): + elif not np.isinf(self.lower_np) and np.isinf(self.upper_np): self._defaultval = self.lower + 1. else: self._defaultval = (self.lower + self.upper) / 2 @@ -644,19 +646,19 @@ def logp(self, value): logp = Normal.dist(mu=mu, sd=sd).logp(value) - norm bounds = [sd > 0] - if not np.isinf(self.lower): + if not np.isinf(self.lower_np): bounds.append(value >= self.lower) - if not np.isinf(self.upper): + if not np.isinf(self.upper_np): bounds.append(value <= self.upper) return bound(logp, *bounds) def _normalization(self): mu, sd = self.mu, self.sd - if np.isinf(self.lower) and np.isinf(self.upper): + if np.isinf(self.lower_np) and np.isinf(self.upper_np): return 0. - if not np.isinf(self.lower) and not np.isinf(self.upper): + if not np.isinf(self.lower_np) and not np.isinf(self.upper_np): lcdf_a = normal_lcdf(mu, sd, self.lower) lcdf_b = normal_lcdf(mu, sd, self.upper) lsf_a = normal_lccdf(mu, sd, self.lower) @@ -668,7 +670,7 @@ def _normalization(self): logdiffexp(lcdf_b, lcdf_a), ) - if not np.isinf(self.lower): + if not np.isinf(self.lower_np): return normal_lccdf(mu, sd, self.lower) else: return normal_lcdf(mu, sd, self.upper) From 343b6d0d91cb3baa96f72234100c6bd09f4fc9cf Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 12:55:41 -0700 Subject: [PATCH 19/32] changed to upper_check and lower_check members, with None checks --- pymc3/distributions/continuous.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index fbff4f7d9e..0f750e460a 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -575,17 +575,17 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, tau, sd = get_tau_sd(tau=tau, sd=sd) self.sd = tt.as_tensor_variable(sd) self.tau = tt.as_tensor_variable(tau) + self.lower_check = tt.as_tensor_variable(lower) if lower is not None else lower + self.upper_check = tt.as_tensor_variable(upper) if upper is not None else upper self.lower = tt.as_tensor_variable(lower) if lower is not None else -np.inf self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf - self.lower_np = lower if lower is not None else -np.inf - self.upper_np = upper if upper is not None else np.inf self.mu = tt.as_tensor_variable(mu) - if np.isinf(self.lower_np) and np.isinf(self.upper_np): + if self.lower_check is None and self.upper_check is None: self._defaultval = mu - elif np.isinf(self.lower_np) and not np.isinf(self.upper_np): + elif self.lower_check is None and self.upper_check is not None: self._defaultval = self.upper - 1. - elif not np.isinf(self.lower_np) and np.isinf(self.upper_np): + elif self.lower_check is not None and self.upper_check is None: self._defaultval = self.lower + 1. else: self._defaultval = (self.lower + self.upper) / 2 @@ -646,19 +646,19 @@ def logp(self, value): logp = Normal.dist(mu=mu, sd=sd).logp(value) - norm bounds = [sd > 0] - if not np.isinf(self.lower_np): + if self.lower_check is not None: bounds.append(value >= self.lower) - if not np.isinf(self.upper_np): + if self.upper_check is not None: bounds.append(value <= self.upper) return bound(logp, *bounds) def _normalization(self): mu, sd = self.mu, self.sd - if np.isinf(self.lower_np) and np.isinf(self.upper_np): + if self.lower_check is None and self.upper_check is None: return 0. - if not np.isinf(self.lower_np) and not np.isinf(self.upper_np): + if self.lower_check is not None and self.upper_check is not None: lcdf_a = normal_lcdf(mu, sd, self.lower) lcdf_b = normal_lcdf(mu, sd, self.upper) lsf_a = normal_lccdf(mu, sd, self.lower) @@ -670,7 +670,7 @@ def _normalization(self): logdiffexp(lcdf_b, lcdf_a), ) - if not np.isinf(self.lower_np): + if self.lower_check is not None: return normal_lccdf(mu, sd, self.lower) else: return normal_lcdf(mu, sd, self.upper) From f08299fd7c17ebe402957dcc4bbbe29fc498af71 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 15:11:54 -0700 Subject: [PATCH 20/32] minor --- pymc3/distributions/continuous.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/distributions/continuous.py b/pymc3/distributions/continuous.py index 0f750e460a..be4eff0ff3 100644 --- a/pymc3/distributions/continuous.py +++ b/pymc3/distributions/continuous.py @@ -577,8 +577,8 @@ def __init__(self, mu=0, sd=None, tau=None, lower=None, upper=None, self.tau = tt.as_tensor_variable(tau) self.lower_check = tt.as_tensor_variable(lower) if lower is not None else lower self.upper_check = tt.as_tensor_variable(upper) if upper is not None else upper - self.lower = tt.as_tensor_variable(lower) if lower is not None else -np.inf - self.upper = tt.as_tensor_variable(upper) if upper is not None else np.inf + self.lower = tt.as_tensor_variable(lower) if lower is not None else tt.as_tensor_variable(-np.inf) + self.upper = tt.as_tensor_variable(upper) if upper is not None else tt.as_tensor_variable(np.inf) self.mu = tt.as_tensor_variable(mu) if self.lower_check is None and self.upper_check is None: From def32d336ec634eeb309f2f94c8332c7f98f46b8 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 15:48:56 -0700 Subject: [PATCH 21/32] minor --- pymc3/tests/test_distributions_random.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 64d4652613..de770f096d 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -481,13 +481,13 @@ def ref_rand(size, mu, sigma, lower, upper): def test_truncated_normal_lower(self): def ref_rand(size, mu, sd, lower, upper): return st.truncnorm.rvs((lower-mu)/sd, np.inf, size=size, loc=mu, scale=sd) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_upper(self): def ref_rand(size, mu, sd, lower, upper): return st.truncnorm.rvs(-np.inf, (upper-mu)/sd, size=size, loc=mu, scale=sd) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sd': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) def test_skew_normal(self): From 80161053be12694d853865c193483fef2d102c9e Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 15:49:59 -0700 Subject: [PATCH 22/32] minor --- pymc3/tests/test_distributions_random.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index de770f096d..66099ab675 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -479,13 +479,13 @@ def ref_rand(size, mu, sigma, lower, upper): ref_rand=ref_rand) def test_truncated_normal_lower(self): - def ref_rand(size, mu, sd, lower, upper): + def ref_rand(size, mu, sigma, lower, upper): return st.truncnorm.rvs((lower-mu)/sd, np.inf, size=size, loc=mu, scale=sd) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_upper(self): - def ref_rand(size, mu, sd, lower, upper): + def ref_rand(size, mu, sigma, lower, upper): return st.truncnorm.rvs(-np.inf, (upper-mu)/sd, size=size, loc=mu, scale=sd) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) From 1e0c6aab6f2f4756dfce730933f93a08467d8afd Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 16:16:35 -0700 Subject: [PATCH 23/32] minor --- pymc3/tests/test_distributions_random.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 66099ab675..779a66354b 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -480,13 +480,13 @@ def ref_rand(size, mu, sigma, lower, upper): def test_truncated_normal_lower(self): def ref_rand(size, mu, sigma, lower, upper): - return st.truncnorm.rvs((lower-mu)/sd, np.inf, size=size, loc=mu, scale=sd) + return st.truncnorm.rvs((lower-mu)/sigma, np.inf, size=size, loc=mu, scale=sigma) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_upper(self): def ref_rand(size, mu, sigma, lower, upper): - return st.truncnorm.rvs(-np.inf, (upper-mu)/sd, size=size, loc=mu, scale=sd) + return st.truncnorm.rvs(-np.inf, (upper-mu)/sigma, size=size, loc=mu, scale=sigma) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) From b18623bb3a7f230fd54e3321f8e85be30435c4b0 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Fri, 4 Jan 2019 22:20:38 -0700 Subject: [PATCH 24/32] removed corresponding paramdomains from upper and lower tests --- pymc3/tests/test_distributions_random.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 779a66354b..2fe17ae7e7 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -481,13 +481,13 @@ def ref_rand(size, mu, sigma, lower, upper): def test_truncated_normal_lower(self): def ref_rand(size, mu, sigma, lower, upper): return st.truncnorm.rvs((lower-mu)/sigma, np.inf, size=size, loc=mu, scale=sigma) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_upper(self): def ref_rand(size, mu, sigma, lower, upper): return st.truncnorm.rvs(-np.inf, (upper-mu)/sigma, size=size, loc=mu, scale=sigma) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) def test_skew_normal(self): From 2cd14ab545e994753434b1da414060b5848c5a5e Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Mon, 25 Mar 2019 09:38:08 -0400 Subject: [PATCH 25/32] removed upper positional arg from test_truncated_normal_lower and vice versa --- pymc3/tests/test_distributions_random.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 0240731b4c..e52e926799 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -483,13 +483,13 @@ def ref_rand(size, mu, sigma, lower, upper): ref_rand=ref_rand) def test_truncated_normal_lower(self): - def ref_rand(size, mu, sigma, lower, upper): + def ref_rand(size, mu, sigma, lower): return st.truncnorm.rvs((lower-mu)/sigma, np.inf, size=size, loc=mu, scale=sigma) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_upper(self): - def ref_rand(size, mu, sigma, lower, upper): + def ref_rand(size, mu, sigma, upper): return st.truncnorm.rvs(-np.inf, (upper-mu)/sigma, size=size, loc=mu, scale=sigma) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) From 303843f3b8a3313fe8d6c22fefad776a2e7f42c7 Mon Sep 17 00:00:00 2001 From: Thomas Wiecki Date: Tue, 26 Mar 2019 10:21:41 -0400 Subject: [PATCH 26/32] Update pymc3/tests/test_distributions_random.py minor syntax Co-Authored-By: gilliss --- pymc3/tests/test_distributions_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index e52e926799..d5f8cbcbe5 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -484,7 +484,7 @@ def ref_rand(size, mu, sigma, lower, upper): def test_truncated_normal_lower(self): def ref_rand(size, mu, sigma, lower): - return st.truncnorm.rvs((lower-mu)/sigma, np.inf, size=size, loc=mu, scale=sigma) + return st.truncnorm.rvs((lower - mu) / sigma, np.inf, size=size, loc=mu, scale=sigma) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig}, ref_rand=ref_rand) From dd9d2f657dfdedd9d3e6edd2a19c005c96f56d38 Mon Sep 17 00:00:00 2001 From: Thomas Wiecki Date: Tue, 26 Mar 2019 10:22:05 -0400 Subject: [PATCH 27/32] Update pymc3/tests/test_distributions_random.py minor syntax Co-Authored-By: gilliss --- pymc3/tests/test_distributions_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index d5f8cbcbe5..78f38c6acf 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -490,7 +490,7 @@ def ref_rand(size, mu, sigma, lower): def test_truncated_normal_upper(self): def ref_rand(size, mu, sigma, upper): - return st.truncnorm.rvs(-np.inf, (upper-mu)/sigma, size=size, loc=mu, scale=sigma) + return st.truncnorm.rvs(-np.inf, (upper - mu) / sigma, size=size, loc=mu, scale=sigma) pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'upper':Rplusbig}, ref_rand=ref_rand) From ae73bc0cdc763cda845164a7000ac3ee41ad2054 Mon Sep 17 00:00:00 2001 From: Thomas Wiecki Date: Tue, 26 Mar 2019 10:22:29 -0400 Subject: [PATCH 28/32] Update pymc3/tests/test_distributions_random.py minor syntax Co-Authored-By: gilliss --- pymc3/tests/test_distributions_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 78f38c6acf..10eb077124 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -485,7 +485,7 @@ def ref_rand(size, mu, sigma, lower, upper): def test_truncated_normal_lower(self): def ref_rand(size, mu, sigma, lower): return st.truncnorm.rvs((lower - mu) / sigma, np.inf, size=size, loc=mu, scale=sigma) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig}, + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower': -Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_upper(self): From 2146664b679e316912c847b31388debcdc0007bc Mon Sep 17 00:00:00 2001 From: Thomas Wiecki Date: Tue, 26 Mar 2019 10:22:57 -0400 Subject: [PATCH 29/32] Update pymc3/tests/test_distributions_random.py minor syntax Co-Authored-By: gilliss --- pymc3/tests/test_distributions_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index 10eb077124..a71c0bd83a 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -491,7 +491,7 @@ def ref_rand(size, mu, sigma, lower): def test_truncated_normal_upper(self): def ref_rand(size, mu, sigma, upper): return st.truncnorm.rvs(-np.inf, (upper - mu) / sigma, size=size, loc=mu, scale=sigma) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'upper':Rplusbig}, + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'upper': Rplusbig}, ref_rand=ref_rand) def test_skew_normal(self): From 2c3d1e2399e8c886f546f0918cb22619317558a0 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Tue, 26 Mar 2019 10:37:01 -0400 Subject: [PATCH 30/32] minor syntax --- pymc3/tests/test_distributions_random.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pymc3/tests/test_distributions_random.py b/pymc3/tests/test_distributions_random.py index a71c0bd83a..ab8988ef9f 100644 --- a/pymc3/tests/test_distributions_random.py +++ b/pymc3/tests/test_distributions_random.py @@ -257,15 +257,15 @@ class TestNormal(BaseTestCases.BaseTestCase): class TestTruncatedNormal(BaseTestCases.BaseTestCase): distribution = pm.TruncatedNormal - params = {'mu': 0., 'tau': 1., 'lower':-0.5, 'upper':0.5} + params = {'mu': 0., 'tau': 1., 'lower': -0.5, 'upper': 0.5} class TestTruncatedNormalLower(BaseTestCases.BaseTestCase): distribution = pm.TruncatedNormal - params = {'mu': 0., 'tau': 1., 'lower':-0.5} + params = {'mu': 0., 'tau': 1., 'lower': -0.5} class TestTruncatedNormalUpper(BaseTestCases.BaseTestCase): distribution = pm.TruncatedNormal - params = {'mu': 0., 'tau': 1., 'upper':0.5} + params = {'mu': 0., 'tau': 1., 'upper': 0.5} class TestSkewNormal(BaseTestCases.BaseTestCase): distribution = pm.SkewNormal @@ -478,8 +478,8 @@ def ref_rand(size, mu, sigma): def test_truncated_normal(self): def ref_rand(size, mu, sigma, lower, upper): - return st.truncnorm.rvs((lower-mu)/sigma, (upper-mu)/sigma, size=size, loc=mu, scale=sigma) - pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower':-Rplusbig, 'upper':Rplusbig}, + return st.truncnorm.rvs((lower - mu) / sigma, (upper - mu) / sigma, size=size, loc=mu, scale=sigma) + pymc3_random(pm.TruncatedNormal, {'mu': R, 'sigma': Rplusbig, 'lower': -Rplusbig, 'upper': Rplusbig}, ref_rand=ref_rand) def test_truncated_normal_lower(self): From a63961f0110da8259e774fbf74a0649c34bc99d7 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Tue, 26 Mar 2019 12:46:27 -0400 Subject: [PATCH 31/32] added line to docs/release-notes/pymc3-3.0.md --- docs/release-notes/pymc3-3.0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/pymc3-3.0.md b/docs/release-notes/pymc3-3.0.md index e69de29bb2..6d0b821987 100644 --- a/docs/release-notes/pymc3-3.0.md +++ b/docs/release-notes/pymc3-3.0.md @@ -0,0 +1 @@ +Resolved issue #3248. Set default lower and upper values of -inf and inf for pm.distributions.continuous.TruncatedNormal. This avoids errors caused by their previous values of None. From a60bbd0a048d87d0747d6270a09575d3eeffda99 Mon Sep 17 00:00:00 2001 From: Tom Gilliss Date: Tue, 26 Mar 2019 12:54:34 -0400 Subject: [PATCH 32/32] moved release notes line to RELEASE-NOTES.md --- RELEASE-NOTES.md | 1 + docs/release-notes/pymc3-3.0.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 753f00b45a..1bb05cd86f 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -29,6 +29,7 @@ - Changed initialization of `Categorical.p`. `p` is now normalized to sum to `1` inside `logp` and `random`, but not during initialization. This could hide negative values supplied to `p` as mentioned in #2082. - `Categorical` now accepts elements of `p` equal to `0`. `logp` will return `-inf` if there are `values` that index to the zero probability categories. - Add `sigma`, `tau`, and `sd` to signature of `NormalMixture`. +- Resolved issue #3248. Set default lower and upper values of -inf and inf for pm.distributions.continuous.TruncatedNormal. This avoids errors caused by their previous values of None. ### Deprecations diff --git a/docs/release-notes/pymc3-3.0.md b/docs/release-notes/pymc3-3.0.md index 6d0b821987..8b13789179 100644 --- a/docs/release-notes/pymc3-3.0.md +++ b/docs/release-notes/pymc3-3.0.md @@ -1 +1 @@ -Resolved issue #3248. Set default lower and upper values of -inf and inf for pm.distributions.continuous.TruncatedNormal. This avoids errors caused by their previous values of None. +