示例#1
0
def test_variance_condition():
    base_conditions = [
        MaxEntropyCondition(weight=0.001),
        SmoothnessCondition(),
        IntervalCondition(p=0.95, min=0.3, max=0.7),
    ]
    base_dist = PointDensity.from_conditions(base_conditions,
                                             verbose=True,
                                             scale=Scale(0, 1))
    base_variance = base_dist.variance()
    increased_variance = base_variance + 0.01

    # Increase in variance should decrease peak
    var_condition = VarianceCondition(variance=increased_variance, weight=1)
    var_conditions = base_conditions + [var_condition]
    var_dist = PointDensity.from_conditions(var_conditions,
                                            verbose=True,
                                            scale=Scale(0, 1))
    assert np.max(var_dist.normed_densities) < np.max(
        base_dist.normed_densities)

    # Highly weighted variance condition should make var very close to specified var
    strong_condition = VarianceCondition(variance=increased_variance,
                                         weight=100000)
    strong_var_conditions = base_conditions + [strong_condition]
    strong_var_dist = PointDensity.from_conditions(strong_var_conditions,
                                                   verbose=True,
                                                   scale=Scale(0, 1))
    assert strong_var_dist.variance() == pytest.approx(
        float(increased_variance), abs=0.001)
示例#2
0
def test_variance_condition():
    def get_variance(dist):
        xs = np.linspace(dist.scale.low, dist.scale.high, dist.ps.size)
        mean = np.dot(dist.ps, xs)
        return np.dot(dist.ps, np.square(xs - mean))

    base_conditions = [
        MaxEntropyCondition(weight=0.1),
        SmoothnessCondition(),
        IntervalCondition(p=0.95, min=0.3, max=0.7),
    ]
    base_dist = HistogramDist.from_conditions(base_conditions, verbose=True)
    base_variance = get_variance(base_dist)
    increased_variance = base_variance + 0.01

    # Increase in variance should decrease peak
    var_condition = VarianceCondition(variance=increased_variance, weight=1)
    var_conditions = base_conditions + [var_condition]
    var_dist = HistogramDist.from_conditions(var_conditions, verbose=True)
    assert np.max(var_dist.ps) < np.max(base_dist.ps)

    # Highly weighted variance condition should make var very close to specified var
    strong_condition = VarianceCondition(variance=increased_variance,
                                         weight=1000)
    strong_var_conditions = base_conditions + [strong_condition]
    strong_var_dist = HistogramDist.from_conditions(strong_var_conditions,
                                                    verbose=True)
    assert get_variance(strong_var_dist) == pytest.approx(
        float(increased_variance), abs=0.001)
示例#3
0
def test_interval_plus_entropy(scale: Scale):
    conditions = [
        IntervalCondition(p=0.5, max=scale.denormalize_point(0.3)),
        MaxEntropyCondition(weight=0.01),
    ]

    fitted_dist = PointDensity.from_conditions(
        conditions,
        scale=scale,
    )

    # We expect at most 3 different densities: one for inside the interval, one for outside,
    # and one between.
    assert np.unique(fitted_dist.normed_densities).size <= 3
示例#4
0
def test_density_cdf(scale: Scale):
    uniform_dist = PointDensity.from_conditions([MaxEntropyCondition()],
                                                scale=scale)

    # Off of scale
    assert uniform_dist.cdf(scale.denormalize_point(-0.5)) == 0
    assert uniform_dist.cdf(scale.denormalize_point(1.5)) == 1

    # Edges of scale
    assert uniform_dist.cdf(scale.denormalize_point(0.005)) < uniform_dist.cdf(
        scale.denormalize_point(0.015))
    assert uniform_dist.cdf(scale.denormalize_point(0.985)) < uniform_dist.cdf(
        scale.denormalize_point(0.995))

    # Denormalized onto a different scale
    denormalized_dist = uniform_dist.denormalize(Scale(0, 2))
    assert denormalized_dist.cdf(1) == pytest.approx(0.5, abs=0.01)
    assert denormalized_dist.cdf(1.5) != 0
    assert denormalized_dist.cdf(2.5) == 1
示例#5
0
def test_mean_condition():
    def get_mean(dist):
        xs = np.linspace(dist.scale.low, dist.scale.high, dist.ps.size)
        return np.dot(dist.ps, xs)

    base_conditions = [MaxEntropyCondition(weight=0.1)]
    base_dist = HistogramDist.from_conditions(base_conditions, verbose=True)
    base_mean = get_mean(base_dist)

    # Mean condition should move mean closer to specified mean
    mean_conditions = base_conditions + [MeanCondition(mean=0.25, weight=1)]
    mean_dist = HistogramDist.from_conditions(mean_conditions, verbose=True)
    assert abs(get_mean(mean_dist) - 0.25) < abs(base_mean - 0.25)

    # Highly weighted mean condition should make mean very close to specified mean
    strong_condition = MeanCondition(mean=0.25, weight=1000)
    strong_mean_conditions = base_conditions + [strong_condition]
    strong_mean_dist = HistogramDist.from_conditions(strong_mean_conditions,
                                                     verbose=True)
    assert get_mean(strong_mean_dist) == pytest.approx(0.25, rel=0.01)
示例#6
0
def test_mean_condition():
    base_conditions = [MaxEntropyCondition(weight=0.1)]
    base_dist = PointDensity.from_conditions(base_conditions,
                                             verbose=True,
                                             scale=Scale(0, 1))
    base_mean = base_dist.mean()

    # Mean condition should move mean closer to specified mean
    mean_conditions = base_conditions + [MeanCondition(mean=0.25, weight=1)]
    mean_dist = PointDensity.from_conditions(mean_conditions,
                                             verbose=True,
                                             scale=Scale(0, 1))
    assert abs(mean_dist.mean() - 0.25) < abs(base_mean - 0.25)

    # Highly weighted mean condition should make mean very close to specified mean
    strong_condition = MeanCondition(mean=0.25, weight=100000)
    strong_mean_conditions = base_conditions + [strong_condition]
    strong_mean_dist = PointDensity.from_conditions(strong_mean_conditions,
                                                    verbose=True,
                                                    scale=Scale(0, 1))
    assert strong_mean_dist.mean() == pytest.approx(0.25, rel=0.01)
示例#7
0
def test_fit_hist_regression_1():
    """
    Regression test for bug: "This custom question has a weird histogram - why?"

    see https://elicit.ought.org/builder/gflpsSBAb

    for more on the bug, see
    https://docs.google.com/document/d/1CFklTKtbKzXi6-lRaEsX4ZiY3Yzpbfdg7i2j1NvKP34/edit#heading=h.ph1huakxn33f
    """
    conditions = [
        IntervalCondition(p=0.25, max=2.0),
        IntervalCondition(p=0.75, max=4.0),
        IntervalCondition(p=0.9, max=6.0),
        MaxEntropyCondition(weight=0.1),
    ]

    histogram_dist = HistogramDist.from_conditions(conditions,
                                                   scale=Scale(low=0, high=52))

    assert histogram_dist.cdf(2) == pytest.approx(0.25, abs=0.05)
    assert histogram_dist.ppf(0.9) == pytest.approx(6, abs=1)
示例#8
0
def test_density_pdf(scale: Scale):
    uniform_dist = PointDensity.from_conditions([MaxEntropyCondition()],
                                                scale=scale)

    assert uniform_dist.pdf(scale.denormalize_point(0.5)) != 0
    assert uniform_dist.pdf(scale.denormalize_point(1.5)) == 0
示例#9
0
def test_hist_pdf(scale: Scale):
    uniform_dist = HistogramDist.from_conditions([MaxEntropyCondition()], scale=scale)

    assert uniform_dist.pdf(scale.denormalize_point(0.5)) != 0
    assert uniform_dist.pdf(scale.denormalize_point(1.5)) == 0