def test_full_adapt_not_invertible(): window = 10 pot = quadpotential.QuadPotentialFullAdapt( 2, np.zeros(2), np.eye(2), 0, adaptation_window=window ) for i in range(window + 1): pot.update(np.ones(2), None, True) with pytest.raises(ValueError): pot.raise_ok(None)
def test_full_adapt_adaptation_window(seed=8978): np.random.seed(seed) window = 10 pot = quadpotential.QuadPotentialFullAdapt( 2, np.zeros(2), np.eye(2), 1, adaptation_window=window ) for i in range(window + 1): pot.update(np.random.randn(2), None, True) assert pot._previous_update == window assert pot.adaptation_window == window * pot.adaptation_window_multiplier pot = quadpotential.QuadPotentialFullAdapt( 2, np.zeros(2), np.eye(2), 1, adaptation_window=window ) for i in range(window + 1): pot.update(np.random.randn(2), None, True) assert pot._previous_update == window assert pot.adaptation_window == window * pot.adaptation_window_multiplier
def test_full_adapt_update_window(seed=1123): np.random.seed(seed) init_cov = np.array([[1.0, 0.02], [0.02, 0.8]]) pot = quadpotential.QuadPotentialFullAdapt(2, np.zeros(2), init_cov, 1, update_window=50) assert np.allclose(pot._cov, init_cov) for i in range(49): pot.update(np.random.randn(2), None, True) assert np.allclose(pot._cov, init_cov) pot.update(np.random.randn(2), None, True) assert not np.allclose(pot._cov, init_cov)
def test_full_adapt_sampling(seed=289586): np.random.seed(seed) L = np.random.randn(5, 5) L[np.diag_indices_from(L)] = np.exp(L[np.diag_indices_from(L)]) L[np.triu_indices_from(L, 1)] = 0.0 with pymc3.Model() as model: pymc3.MvNormal("a", mu=np.zeros(len(L)), chol=L, shape=len(L)) pot = quadpotential.QuadPotentialFullAdapt(model.ndim, np.zeros(model.ndim)) step = pymc3.NUTS(model=model, potential=pot) pymc3.sample(draws=10, tune=1000, random_seed=seed, step=step, cores=1, chains=1)
def test_full_adapt_sample_p(seed=4566): # ref: https://github.com/stan-dev/stan/pull/2672 np.random.seed(seed) m = np.array([[3.0, -2.0], [-2.0, 4.0]]) m_inv = np.linalg.inv(m) var = np.array([ [2 * m[0, 0], m[1, 0] * m[1, 0] + m[1, 1] * m[0, 0]], [m[0, 1] * m[0, 1] + m[1, 1] * m[0, 0], 2 * m[1, 1]], ]) n_samples = 1000 pot = quadpotential.QuadPotentialFullAdapt(2, np.zeros(2), m_inv, 1) samples = [pot.random() for n in range(n_samples)] sample_cov = np.cov(samples, rowvar=0) # Covariance matrix within 5 sigma of expected value # (comes from a Wishart distribution) assert np.all(np.abs(m - sample_cov) < 5 * np.sqrt(var / n_samples))
def test_full_adapt_sampling(seed=289586): np.random.seed(seed) L = np.random.randn(5, 5) L[np.diag_indices_from(L)] = np.exp(L[np.diag_indices_from(L)]) L[np.triu_indices_from(L, 1)] = 0.0 with pymc3.Model() as model: pymc3.MvNormal("a", mu=np.zeros(len(L)), chol=L, size=len(L)) initial_point = model.initial_point initial_point_size = sum(initial_point[n.name].size for n in model.value_vars) pot = quadpotential.QuadPotentialFullAdapt( initial_point_size, np.zeros(initial_point_size)) step = pymc3.NUTS(model=model, potential=pot) pymc3.sample(draws=10, tune=1000, random_seed=seed, step=step, cores=1, chains=1)
def test_full_adapt_warn(): with pytest.warns(UserWarning): quadpotential.QuadPotentialFullAdapt(2, np.zeros(2), np.eye(2), 0)