示例#1
0
def test_conditioning():
    m = Measure()
    p1 = GP(EQ(), measure=m)
    p2 = GP(Exp(), measure=m)
    p_sum = p1 + p2

    # Sample some data to condition on.
    x1 = B.linspace(0, 2, 2)
    y1 = p1(x1).sample()
    x_sum = B.linspace(3, 5, 3)
    y_sum = p_sum(x_sum).sample()

    # Determine FDDs to check.
    x_check = B.linspace(0, 5, 5)
    fdds_check = [
        cross(p1, p2, p_sum)(x_check),
        p1(x_check),
        p2(x_check),
        p_sum(x_check),
    ]

    assert_equal_measures(
        fdds_check,
        m.condition(p_sum(x_sum), y_sum),
        m.condition((p_sum(x_sum), y_sum)),
        m | (p_sum(x_sum), y_sum),
        m | ((p_sum(x_sum), y_sum), ),
        m | Obs(p_sum(x_sum), y_sum),
        m | Obs((p_sum(x_sum), y_sum)),
    )

    assert_equal_measures(
        fdds_check,
        m.condition((p1(x1), y1), (p_sum(x_sum), y_sum)),
        m | ((p1(x1), y1), (p_sum(x_sum), y_sum)),
        m | Obs((p1(x1), y1), (p_sum(x_sum), y_sum)),
    )
示例#2
0
def test_sparse_conditioning_and_elbo():
    m = Measure()
    p1 = GP(EQ(), measure=m)
    p2 = GP(Exp(), measure=m)
    e = GP(Delta(), measure=m)
    p_sum = p1 + p2

    # Sample some data to condition on.
    x1 = B.linspace(0, 2, 2)
    y1 = (p1 + e)(x1).sample()
    x_sum = B.linspace(3, 5, 3)
    y_sum = (p_sum + e)(x_sum).sample()

    # Determine FDDs to check.
    x_check = B.linspace(0, 5, 5)
    fdds_check = [
        cross(p1, p2, p_sum)(x_check),
        p1(x_check),
        p2(x_check),
        p_sum(x_check),
    ]

    # Check conditioning and ELBO on one data set.
    assert_equal_measures(
        fdds_check,
        m | ((p_sum + e)(x_sum), y_sum),
        m | SparseObs(p_sum(x_sum), e, p_sum(x_sum), y_sum),
        m | SparseObs((p_sum(x_sum), ), e, p_sum(x_sum), y_sum),
        m | SparseObs((p_sum(x_sum), p1(x1)), e, p_sum(x_sum), y_sum),
        m | SparseObs(p_sum(x_sum), (e, p_sum(x_sum), y_sum)),
        m | SparseObs((p_sum(x_sum), ), (e, p_sum(x_sum), y_sum)),
        m.condition(
            SparseObs(
                (p_sum(x_sum), p1(x1)),
                (e, p_sum(x_sum), y_sum),
            )),
    )
    approx(
        m.logpdf(Obs((p_sum + e)(x_sum), y_sum)),
        SparseObs(p_sum(x_sum), (e, p_sum(x_sum), y_sum)).elbo(m),
    )

    # Check conditioning and ELBO on two data sets.
    assert_equal_measures(
        fdds_check,
        m | (((p_sum + e)(x_sum), y_sum), ((p1 + e)(x1), y1)),
        m.condition(
            SparseObs((p_sum(x_sum), p1(x1)), (e, p_sum(x_sum), y_sum),
                      (e, p1(x1), y1))),
    )
    approx(
        m.logpdf(Obs(((p_sum + e)(x_sum), y_sum), ((p1 + e)(x1), y1))),
        SparseObs((p_sum(x_sum), p1(x1)), (e, p_sum(x_sum), y_sum),
                  (e, p1(x1), y1)).elbo(m),
    )

    # The following lose information, so check them separately.
    assert_equal_measures(
        fdds_check,
        m | SparseObs(p_sum(x_sum), (e, p_sum(x_sum), y_sum), (e, p1(x1), y1)),
        m | SparseObs((p_sum(x_sum), ), (e, p_sum(x_sum), y_sum),
                      (e, p1(x1), y1)),
    )

    # Test lazy computation.
    obs = SparseObs(p_sum(x_sum), e, p_sum(x_sum), y_sum)
    for name in ["K_z", "elbo", "mu", "A"]:
        approx(
            getattr(SparseObs(p_sum(x_sum), e, p_sum(x_sum), y_sum), name)(m),
            getattr(obs, name)(m),
        )

    # Test requirement that noise must be diagonal.
    with pytest.raises(RuntimeError):
        SparseObs(p_sum(x_sum), p_sum, p_sum(x_sum), y_sum).elbo(m)