def test_can_specify_a_gaussian_proposal_distribution(net: BayesNet) -> None: algo = MetropolisHastingsSampler(proposal_distribution="gaussian", latents=net.iter_latent_vertices(), proposal_distribution_sigma=np.array(1.)) generate_samples(net=net, sample_from=net.iter_latent_vertices(), sampling_algorithm=algo)
def test_can_iter_through_samples(algo: str, net: BayesNet) -> None: draws = 10 samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), algo=algo, down_sample_interval=1) count = 0 for sample in islice(samples, draws): count += 1 assert count == draws
def test_iter_returns_same_result_as_sample() -> None: draws = 100 model = thermometers.model() net = BayesNet(model.temperature.iter_connected_graph()) set_starting_state(model) sampler = MetropolisHastingsSampler(proposal_distribution='prior', latents=net.iter_latent_vertices()) samples = sample(net=net, sample_from=net.iter_latent_vertices(), sampling_algorithm=sampler, draws=draws) set_starting_state(model) sampler = MetropolisHastingsSampler(proposal_distribution='prior', latents=net.iter_latent_vertices()) iter_samples = generate_samples(net=net, sample_from=net.iter_latent_vertices(), sampling_algorithm=sampler) samples_dataframe = pd.DataFrame() for iter_sample in islice(iter_samples, draws): samples_dataframe = samples_dataframe.append(iter_sample, ignore_index=True) for vertex_label in samples_dataframe: np.testing.assert_almost_equal(samples_dataframe[vertex_label].mean(), np.average(samples[vertex_label]))
def test_iter_with_live_plot(net: BayesNet) -> None: KeanuRandom.set_default_random_seed(1) _, ax = plt.subplots(3, 1, squeeze=False) samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), live_plot=True, refresh_every=5, ax=ax) for sample in islice(samples, 5): pass reorder_subplots(ax) assert len(ax) == 3 assert all(len(ax[i][0].get_lines()) == 1 for i in range(3)) assert np.allclose( ax[0][0].get_lines()[0].get_ydata(), [0.49147822, 0.49147822, 0.49147822, 0.20033212, 0.20033212]) assert np.allclose( ax[1][0].get_lines()[0].get_ydata(), [0.87268333, 1.10409369, 1.10409369, 1.10409369, 0.69098161]) assert np.allclose( ax[2][0].get_lines()[0].get_ydata(), [-14.46166855, -14.46166855, 0.32305686, 0.32305686, 0.32305686])
def test_can_track_acceptance_rate_when_iterating(net: BayesNet) -> None: acceptance_rate_tracker = AcceptanceRateTracker() latents = list(net.get_latent_vertices()) algo = MetropolisHastingsSampler(proposal_distribution='prior', proposal_listeners=[acceptance_rate_tracker]) samples = generate_samples(net=net, sample_from=latents, sampling_algorithm=algo, drop=3) draws = 100 for _ in islice(samples, draws): for latent in latents: rate = acceptance_rate_tracker.get_acceptance_rate(latent) assert 0 <= rate <= 1
def test_generate_samples_throws_if_vertices_in_sample_from_are_missing_labels( ) -> None: sigma = Gamma(1., 1) vertex = Gaussian(0., sigma, label="gaussian") assert sigma.get_label() is None net = BayesNet([sigma, vertex]) with pytest.raises(ValueError, match=r"Vertices in sample_from must be labelled."): samples = generate_samples(net=net, sample_from=net.iter_latent_vertices())
def test_iter_with_live_plot(net: BayesNet) -> None: KeanuRandom.set_default_random_seed(1) _, ax = plt.subplots(3, 1, squeeze=False) samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), live_plot=True, refresh_every=5, ax=ax) for sample in islice(samples, 5): pass reorder_subplots(ax) assert len(ax) == 3 assert all(len(ax[i][0].get_lines()) == 1 for i in range(3)) assert all(len(ax[i][0].get_lines()[0].get_ydata() == 5) for i in range(3))
def test_can_iter_through_samples(algo: Callable[[BayesNet], PosteriorSamplingAlgorithm], net: BayesNet) -> None: draws = 10 samples = generate_samples(net=net, sample_from=net.iter_latent_vertices(), sampling_algorithm=algo(net), down_sample_interval=1) count = 0 for sample in islice(samples, draws): count += 1 assert count == draws
def test_iter_returns_same_result_as_sample(algo: str) -> None: draws = 100 model = thermometers.model() net = BayesNet(model.temperature.get_connected_graph()) set_starting_state(model) samples = sample(net=net, sample_from=net.get_latent_vertices(), algo=algo, draws=draws) set_starting_state(model) iter_samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), algo=algo) samples_dataframe = pd.DataFrame() [samples_dataframe.append(pd.DataFrame(list(next_sample.items()))) for next_sample in islice(iter_samples, draws)] for vertex_id in samples_dataframe: np.testing.assert_almost_equal(samples_dataframe[vertex_id].mean(), np.average(samples[vertex_id]))
def test_can_iter_through_tensor_samples(algo: Callable[ [BayesNet], PosteriorSamplingAlgorithm], tensor_net: BayesNet) -> None: draws = 10 samples = generate_samples(net=tensor_net, sample_from=tensor_net.iter_latent_vertices(), sampling_algorithm=algo(tensor_net), down_sample_interval=1) count = 0 for sample in islice(samples, draws): count += 1 for distribution in ('exp', 'gamma'): for i in (0, 1): for j in (0, 1): assert ((distribution, (i, j)) in sample) assert count == draws
def test_iter_with_live_plot(net: BayesNet) -> None: num_plots = 3 _, ax = plt.subplots(num_plots, 1, squeeze=False) samples = generate_samples(net=net, sample_from=net.iter_latent_vertices(), live_plot=True, refresh_every=5, ax=ax) for sample in islice(samples, 5): pass reorder_subplots(ax) assert len(ax) == num_plots assert all(len(ax[i][0].get_lines()) == 1 for i in range(num_plots)) assert all( len(ax[i][0].get_lines()[0].get_ydata() == 5) for i in range(num_plots))
def test_autocorrelation_same_for_streaming_as_batch() -> None: with Model() as model: model.uniform = Uniform(0, 1000) net = model.to_bayes_net() draws = 15 set_starting_state(model) samples = sample(net=net, sample_from=net.get_latent_vertices(), algo="metropolis", draws=draws) set_starting_state(model) iter_samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), algo="metropolis") samples_dataframe = pd.DataFrame() for next_sample in islice(iter_samples, draws): samples_dataframe = samples_dataframe.append(next_sample, ignore_index=True) for vertex_id in samples_dataframe: autocorr_streaming = stats.autocorrelation(list(samples_dataframe[vertex_id].values)) autocorr_batch = stats.autocorrelation(samples[vertex_id]) np.testing.assert_array_equal(autocorr_batch, autocorr_streaming)
def test_can_specify_a_gaussian_proposal_distribution(net: BayesNet) -> None: generate_samples(net=net, sample_from=net.get_latent_vertices(), proposal_distribution="gaussian", proposal_distribution_sigma=np.array(1.))