Ejemplo n.º 1
0
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])
Ejemplo n.º 2
0
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))
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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"
Ejemplo n.º 5
0
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"
Ejemplo n.º 6
0
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"
Ejemplo n.º 7
0
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))
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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.))