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_sample_with_plot(net: BayesNet) -> None: KeanuRandom.set_default_random_seed(1) _, ax = plt.subplots(3, 1, squeeze=False) sample(net=net, sample_from=net.get_latent_vertices(), draws=5, plot=True, ax=ax) 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_get_acceptance_rates(net: BayesNet) -> None: acceptance_rate_tracker = AcceptanceRateTracker() latents = list(net.get_latent_vertices()) algo = MetropolisHastingsSampler(proposal_distribution='prior', proposal_listeners=[acceptance_rate_tracker]) samples = sample(net=net, sample_from=latents, sampling_algorithm=algo, drop=3) for latent in latents: rate = acceptance_rate_tracker.get_acceptance_rate(latent) assert 0 <= rate <= 1
def test_it_throws_if_you_pass_in_a_proposal_listener_but_you_didnt_specify_the_proposal_type( net: BayesNet) -> None: with pytest.raises(TypeError) as excinfo: sample(net=net, sample_from=net.get_latent_vertices(), proposal_listeners=[AcceptanceRateTracker()], drop=3) assert str( excinfo.value ) == "If you pass in proposal_listeners you must also specify proposal_distribution"
def test_it_throws_if_you_pass_in_a_proposal_listener_but_the_algo_isnt_metropolis( net: BayesNet) -> None: with pytest.raises(TypeError) as excinfo: sample(net=net, sample_from=net.get_latent_vertices(), algo="hamiltonian", proposal_listeners=[AcceptanceRateTracker()], drop=3) assert str( excinfo.value ) == "Only Metropolis Hastings supports the proposal_listeners parameter"
def test_it_throws_if_you_pass_in_a_proposal_distribution_but_the_algo_isnt_metropolis( net: BayesNet) -> None: with pytest.raises(TypeError) as excinfo: sample(net=net, sample_from=net.get_latent_vertices(), algo="hamiltonian", proposal_distribution="prior", drop=3) assert str( excinfo.value ) == "Only Metropolis Hastings supports the proposal_distribution parameter"
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_construct_bayes_net() -> None: uniform = UniformInt(0, 1) graph = set(uniform.get_connected_graph()) vertex_ids = [vertex.get_id() for vertex in graph] assert len(vertex_ids) == 3 assert uniform.get_id() in vertex_ids net = BayesNet(graph) latent_vertex_ids = [ vertex.get_id() for vertex in net.get_latent_vertices() ] assert len(latent_vertex_ids) == 1 assert uniform.get_id() in latent_vertex_ids
def test_can_track_acceptance_rate_when_iterating(net: BayesNet) -> None: acceptance_rate_tracker = AcceptanceRateTracker() latents = list(net.get_latent_vertices()) samples = generate_samples(net=net, sample_from=latents, proposal_distribution='prior', proposal_listeners=[acceptance_rate_tracker], 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_sampling_returns_dict_of_list_of_ndarrays_for_vertices_in_sample_from(algo: PosteriorSamplingAlgorithm, net: BayesNet) -> None: draws = 5 sample_from = list(net.get_latent_vertices()) vertex_labels = [vertex.get_label() for vertex in sample_from] samples = sample(net=net, sample_from=sample_from, sampling_algorithm=algo, draws=draws) assert len(samples) == len(sample_from) assert type(samples) == dict for label, vertex_samples in samples.items(): assert label in vertex_labels assert len(vertex_samples) == draws assert type(vertex_samples) == list assert all(type(sample) == np.ndarray for sample in vertex_samples) assert all(sample.dtype == float for sample in vertex_samples) assert all(sample.shape == () for sample in vertex_samples)
def test_coalmining() -> None: KeanuRandom.set_default_random_seed(1) coal_mining = CoalMining() model = coal_mining.model() model.disasters.observe(coal_mining.training_data()) net = BayesNet(model.switchpoint.get_connected_graph()) samples = sample(net=net, sample_from=net.get_latent_vertices(), draws=50000, drop=10000, down_sample_interval=5) vertex_samples: List[numpy_types] = samples["switchpoint"] vertex_samples_primitive: List[List[primitive_types]] = list(map( lambda a: a.tolist(), vertex_samples)) # because you can't concatenate 0-d arrays vertex_samples_concatentated: np.ndarray = np.array(vertex_samples_primitive) switch_year = np.argmax(np.bincount(vertex_samples_concatentated)) assert switch_year == 1890
def test_can_specify_a_gaussian_proposal_distribution(net: BayesNet) -> None: algo = MetropolisHastingsSampler(proposal_distribution="gaussian", proposal_distribution_sigma=np.array(1.)) generate_samples(net=net, sample_from=net.get_latent_vertices(), sampling_algorithm=algo)
def test_can_specify_nuts_params(net: BayesNet) -> None: algo = NUTSSampler(1000, 0.65, True, 0.1, 10) samples = sample(net, list(net.get_latent_vertices()), algo, draws=500, drop=100)
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.))