From c75583a15dff174ec47ee2ef8b47aa9a4ef238b0 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Thu, 4 Nov 2021 10:12:49 +0100 Subject: [PATCH] Partially revert #5131 Allow Metropolis proposals to depend on global seeding by default --- pymc/step_methods/metropolis.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pymc/step_methods/metropolis.py b/pymc/step_methods/metropolis.py index 532a5edaf1..b5b64225bb 100644 --- a/pymc/step_methods/metropolis.py +++ b/pymc/step_methods/metropolis.py @@ -50,36 +50,35 @@ class Proposal: - def __init__(self, s, rng_seed: Optional[int] = None): + def __init__(self, s): self.s = s - self.rng = np.random.default_rng(rng_seed) class NormalProposal(Proposal): def __call__(self, rng: Optional[np.random.Generator] = None): if rng is None: - rng = self.rng + rng = nr return rng.normal(scale=self.s) class UniformProposal(Proposal): def __call__(self, rng: Optional[np.random.Generator] = None): if rng is None: - rng = self.rng + rng = nr return rng.uniform(low=-self.s, high=self.s, size=len(self.s)) class CauchyProposal(Proposal): def __call__(self, rng: Optional[np.random.Generator] = None): if rng is None: - rng = self.rng + rng = nr return rng.standard_cauchy(size=np.size(self.s)) * self.s class LaplaceProposal(Proposal): def __call__(self, rng: Optional[np.random.Generator] = None): if rng is None: - rng = self.rng + rng = nr size = np.size(self.s) return (rng.standard_exponential(size=size) - rng.standard_exponential(size=size)) * self.s @@ -87,22 +86,21 @@ def __call__(self, rng: Optional[np.random.Generator] = None): class PoissonProposal(Proposal): def __call__(self, rng: Optional[np.random.Generator] = None): if rng is None: - rng = self.rng + rng = nr return rng.poisson(lam=self.s, size=np.size(self.s)) - self.s class MultivariateNormalProposal(Proposal): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - n, m = self.s.shape + def __init__(self, s): + n, m = s.shape if n != m: raise ValueError("Covariance matrix is not symmetric.") self.n = n - self.chol = scipy.linalg.cholesky(self.s, lower=True) + self.chol = scipy.linalg.cholesky(s, lower=True) def __call__(self, num_draws=None, rng: Optional[np.random.Generator] = None): if rng is None: - rng = self.rng + rng = nr if num_draws is not None: b = rng.normal(size=(self.n, num_draws)) return np.dot(self.chol, b).T